Jump to content

Welcome to the new Traders Laboratory! Please bear with us as we finish the migration over the next few days. If you find any issues, want to leave feedback, get in touch with us, or offer suggestions please post to the Support forum here.

  • Welcome Guests

    Welcome. You are currently viewing the forum as a guest which does not give you access to all the great features at Traders Laboratory such as interacting with members, access to all forums, downloading attachments, and eligibility to win free giveaways. Registration is fast, simple and absolutely free. Create a FREE Traders Laboratory account here.

darthtrader2.0

Ninja Traders...lets Build a Better Mousetrap

Recommended Posts

The logic looks fine but I think you should use this indicator from start of day till end of day without any refresh. Otherwise on historical data your code will return Close[0] / 1.

 

I'm not really sure what you mean...could you restate that as code? :)

Also this is kind of an early experiment in what I ultimately want my charts to look like...

Have you ever checked out box plots from a stats book?

http://en.wikipedia.org/wiki/Box_plot

 

To me the optimal chart would take every tick into consideration, but assume no distribution to the data, and not weight any tick more than any other tick no matter how you decided to chop up the data to make your summary of that data...

For a double auction market...it would seem to me the optimal way to do this would be with a box plot that scales how it chops up things to volatility...how to get to that point is what I'm trying to figure out with these early experiments.

Share this post


Link to post
Share on other sites

Ok I'll try to be a bit clearer (english is not my native language).

 

If you apply the indicator on a chart, because of no tick backfill, OnBarUpdate will be called only once at the close of the bar and not at every tick so because of that, your average will be: Close[0]/1 as you enter only once in OnBarUpdate.

 

Now if you apply your indicator before start of day, all values before open won't be accurate but as the ticks come through (If CalculateOnBarClose=false), you should see accurate values for your indicator, as OnBarUpdate will be called several times for the same bar.

Hope this makes sense now?

 

As for box plot, yes I do use it in S-Plus at work, it can be quite useful. But I'm not sure I understand what you'd like to do with it...

How would you measure the volatility?

Share this post


Link to post
Share on other sites

thanks Ryker, yes that makes perfect sense theory wise and as far as what I see on my chart in real time vs backfilled.

oh S-plus, your hardcore :) I tried to get into R last year but never got very far with it.

Scaling to volatility would probly be after I get a minute bar box plot going or certain number of tick box plot. To measure volatility the best things to me are the VIX...the average range of a 5 minute bar seems to be a decent measure of volatility for longer time frames, really I'm not quite sure the direction of that idea at the present.

 

Have you done anything with random numbers in C#? I got stuff like this to compile but I have not been able to get a random number on a tick by tick basis..

Randvar = rand.Sample(NN);

Print(Randvar);

Random RandomClass = new Random();

int RandomNumber = RandomClass.Next(1, 2);

 

My idea here is that instead of using a static stop, you can probly back out a decent scaling stop using a random trading system and a multiplier that scales to the vix tick by tick.

What I would like to do here is have a random trading system that randomly enters say 200 trades a day, randomly long or short, at a random time during the day, holds for a random amount of time between 1-5 minutes and then have a multiplier of the vix that sets the stop amount for each trade.

Then use the optimizer to march through different values of the multiplier and see what system performed the best. Kind of back out of the market information what the best dynamic stop size is to use for my trading time. Then maybe each day back test a week back and use that to set my stop instead of a hard arbitrary "20 point" level.

I guess this assumes though that there is a correlation between between the VIX and a 1 minute bar range or whatnot. If that doesn't hold water you could still march through a stop size with the random system, would seem better than nothing.

Edited by darthtrader3.0beta

Share this post


Link to post
Share on other sites

nevermind, I got random variables to seed now on each update. Just have to make the system now.

In case anyone finds this in the future, for some reason you have to define things like

in user variables

private Random rand = new Random();

private Random rand2 = new Random();

 

in onbarupdate

x = rand.Next(1,5);

Print(x);

x2 = rand2.Next(100,500);

Print(x2);

 

If you define the variables in onbarupdate it will only give you a new random number at the start of the day...no clue why.

Share this post


Link to post
Share on other sites

I've spent the last week trying to figure out the sorteddictionary in C# and finally got something to look like its doing something. This is an incredible datastructure, since once you get this cooking it makes market profile type stuff rather easy data wise. Here is some code that should look to see if a price is in the dictionary, if its not add it with the volume of the bar, then looks to add the additional volume if the price comes up again. Then spit it to the output window:

 

variables

private SortedDictionary<double, double> PriceVol = new SortedDictionary<double, double>();

 

private double price = 0;

private double volume = 0;

private double tmpprice = 0;

private double tmpvolume = 0;

private int count = 0;

 

 

protected override void OnBarUpdate()

{

price = Close[0];

volume = Volume[0];

 

if (!PriceVol.ContainsKey(price))

{

PriceVol.Add(price, volume);

}

if (PriceVol.ContainsKey(price))

{

double volume2 = PriceVol[price];

volume2 += volume;

PriceVol[price] = volume2;

}

 

count = 0;

foreach (KeyValuePair<double, double> keyValue in PriceVol)

{

tmpprice = keyValue.Key;

tmpvolume = keyValue.Value;

Print(count + ". " + tmpprice + " - " + tmpvolume);

count++;

}

Print("------------------------------");

sortedictionary.jpg.760ce95b28b57a97a8b4888f6e09c10e.jpg

Share this post


Link to post
Share on other sites

Just a thought.. wouldn't this have trouble with historical data, which is not updated per tick? To fix this, you could a) check if it's live or not, b) if not, cycle through every tick in (High-Low) and assign that tick's volume to be Volume/(High-Low). It wouldn't be exact, but it would be a good estimate.

Share this post


Link to post
Share on other sites

Saw you post about this structure elsewhere. Certainly seems quite elegant code wise :D I have to say I am an 'old school' type of coder and have always used arrays in the past. Mind you I predominantly coded in assembler, and built any structures and routines for manipulating them from the ground up. Actually they (arrays) work remarkably well and are a very fast a way of doing things when it comes to execution speed. Of course you pay a bit for this in storage by pre-allocating. Dividing the price by tick size gives the array index, quick and easy. Actually I tend to use relative price (from the first tick in the series).

 

Sometimes I get a bit nostalgic for the old days, still, hopefully the above might prove useful or interesting to someone :) Actually by pre-processing the price data as above you could use an integer dictionary which is likely to be much more efficient when it comes to how the compiler hashes things.

Share this post


Link to post
Share on other sites

Well I should add all this slop I'm posting is namely getting ready for Ninja 7..Maybe someone in the future is learning C#/ninja and can find it usefull..also its incase I lose something in all the junk half finished indicators/strategies on my machine now..

I certainly want to convert this to onmarketdata or however they are going to be handling tick back fills in NT7. The volumeprofile indicator that comes with ninja uses the sorteddictionary and is tick by tick if you want a proper example. With all the graphics override though its hard to understand if you just want to see how sorteddictionary works.

As far as the speed, I guess you could do it faster if you knew alot about hashing. There is no way though I could do it faster though, I'm sure my sorting algorithm would be terribly slow and totally wrong. Having that done behind the scenes is just awesome if your not a real programmer. Especially when you consider adding new elements that need to go between 2 that already exists..you don't have to mess with moving the array all over the place.

Next I'm going to try to make a version of market profile with this and to learn to override plot. One thing I dont get is why they didnt make a big custom function library for plot overrides. Draw lines, draw rectangles, get X Y coordinates, last bar painted, first bar painted...there is only a few things you would want to do but have to dig through all this convoluted code in the indicators right now.

Share this post


Link to post
Share on other sites

Well here I proudly present the most useless indicator ever made...load up the chart, load the indicator and it puts a black box over your entire chart...

Really though, I guess Ninja doesn't have documents for the stuff they are doing as far plot overrides?

If you put this in an empty indicator, then put the output window next to the chart and play with it you can get a feel for what these methods are doing.

 

public override void Plot(Graphics graphics, Rectangle bounds, double min, double max)

{

 

 

Print("ChartControl.BarSpace" + " : " + ChartControl.BarSpace);

Print("ChartControl.CanvasRight" + " : " + ChartControl.CanvasRight);

Print("ChartControl.CanvasLeft" + " : " + ChartControl.CanvasLeft);

Print("ChartControl.BarMarginRight" + " : " + ChartControl.BarMarginRight);

Print("ChartControl.BarMarginLeft" + " : " + ChartControl.BarMarginLeft);

Print("ChartControl.BarsPainted" + " : " + ChartControl.BarsPainted);

Print("ChartControl.BarWidth" + " : " + ChartControl.BarWidth);

Print("bounds.X" + " : " + bounds.X);

Print("bounds.Y" + " : " + bounds.X);

Print("bounds.Height" + " : " + bounds.Height);

Print("bounds.Width" + " : " + bounds.Width);

 

Print("-----------------");

 

System.Drawing.SolidBrush myBrush;

myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Black);

graphics.FillRectangle(myBrush, new Rectangle(ChartControl.CanvasLeft,ChartControl.CanvasLeft,ChartControl.CanvasRight,bounds.Height ));

 

}

chartcontrol.jpg.db2a63ab0d50f1ddbd48060dffc8688f.jpg

Share this post


Link to post
Share on other sites

Hi Darth version 3.0b,

 

Not meaning to detract from the thread intent. But may I ask why all the effort here when something reasonably priced will easily do all this and more? Self-punishment? :confused:

 

All my best,

MK

Share this post


Link to post
Share on other sites

Well I don't see learning new things as self-punishment..I also still will probly want to trade for a few more decades and it seems learning C# to some degree is kind of inevitable. Honestly, figuring this stuff out is quite a bit of fun. I also hope this thread is of use to someone in the future. Ninja's forum is great but they are so quick to respond to issues that when the question is not supported it fragments self learning IMO. Hopefully I will also be able to post complete indicators here at some point, currently though I don't want to mess up someones library incase I do something wrong.

I'm not sure if you mean finalg's market profile? I'm mostly interested in being able to do whatever I want with my charts, not really interested in market profile per se.

 

Adding on to that last post, once you get a feel for the coordinates of the chart the next logical step would seem to be getting a feel for how things are handled per bar, which seems to be what the getYposition function is for that is added on as an extra function in alot of the indicators that override plot.

 

private int GetYPos(double price, Rectangle bounds, double min, double max)

{

return (int) ((bounds.Y + bounds.Height) -

((price - min) / ChartControl.MaxMinusMin(max, min)) * bounds.Height);

}

 

When you pass in the price variable you can get things moving..

 

int ypos = GetYPos(Close[0], bounds, min, max);

If you then change the above rectange fill by passing in ypos

Rectangle(ChartControl.CanvasLeft,ypos,......

 

You then get a blackbox that shades everything out below the current close of the bar.

This is also a good little reference for how drawing rectangles works

http://www.informit.com/articles/article.aspx?p=25357&seqNum=5

Edited by darthtrader3.0beta

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Topics

  • Posts

    • CVNA Carvana stock, nice top of range breakout at https://stockconsultant.com/?CVNA
    • GDRX GoodRx stock, good day, watch for a bottom range breakout at https://stockconsultant.com/?GDRX
    • Date: 14th February 2025.   Can The NASDAQ Maintain Momentum at Key Resistance Level?     The price of the NASDAQ throughout the week rose more than 3.00% to bring the price back up to the instrument’s resistance level. However, while taking into consideration higher inflation, tariffs and the resistance level, could the index maintain momentum?   US Inflation Rises For a 4th Consecutive Month The US Consumer Price Index, or inflation, rose for a 4th consecutive month taking the rate even further away from the Federal Reserve’s target. Analysts were expecting the US inflation rate to remain unchanged at 2.9%. However, consumer inflation rose to 3.00%, the highest since July 2024, while Producer inflation rose to 3.5%. Higher inflation traditionally triggers lower sentiment towards the stock market as investors' risk appetite falls and they prefer the US Dollar. However, on this occasion bullish volatility rose. For this reason, some traders may be considering if the price is overbought in the short term.   Addressing these statistics, US Federal Reserve Chair Jerome Powell acknowledged that the Fed has yet to achieve its goal of curbing inflation, adding further hawkish signals regarding the monetary policy. Other members of the FOMC also share this view. Today, Raphael Bostic, President of the Federal Reserve Bank of Atlanta, stated that the Fed is unlikely to implement interest rate cuts in the near future. This is due to ongoing economic uncertainty following the introduction of trade tariffs on imported goods and other policies from the Republican-led White House.   Most of the Federal Open Market Committee emphasizes additional time is needed to fully assess the situation. According to the Chicago Exchange FedWatch Tool, interest rate cuts may not start until September 2025.   What’s Driving The NASDAQ Higher? Earnings data this week has continued to support the NASDAQ. Early this morning Airbnb made public their quarterly earnings report whereby they beat both earnings per share and revenue expectations. The Earnings Per Share read 25% higher than expectations and Revenue was more than 2% higher. As a result, the stock rose more than 14%. Another company this week that made public positive earnings data is Cisco which rose by more than 2% on Thursday. Another positive factor continues to be the positive employment data. Even though the positive employment data can push back interest rate cuts, the stability in the short term continues to serve the interests of higher consumer demand. The US Unemployment Rate fell to 4.00% the lowest in 8 months. Lastly, investors are also increasing their exposure to the index due to sellers not being able to maintain control or momentum. Some economists also increase their confidence in economic growth if Trump can obtain a positive outcome from the Ukraine-Russia negotiations.   However, during Friday’s pre-US session trading, 80% of the most influential stocks are witnessing a decline. The NASDAQ itself is trading more or less unchanged. Therefore, the question again arises as to whether the NASDAQ can maintain momentum above this area.   NASDAQ - News and Technical analysis In terms of technical analysis, the NASDAQ is largely witnessing mainly bullish indications on the 2-hour chart. However, the main concern for traders is the resistance level at $21,960. On the 5-minute timeframe, the price is mainly experiencing bearish signals as the price moves below the 200-period simple moving average.   The VIX, which is largely used as a risk indicator, is currently trading 0.75% higher which indicates a lower risk appetite. In addition to this, bond yields trade 6 points higher. If both the VIX and Bond yields rise further, further pressure may be witnessed for index traders.   Always trade with strict risk management. Your capital is the single most important aspect of your trading business.   Please note that times displayed based on local time zone and are from time of writing this report.   Click HERE to access the full HFM Economic calendar.   Want to learn to trade and analyse the markets? Join our webinars and get analysis and trading ideas combined with better understanding of how markets work. Click HERE to register for FREE!   Click HERE to READ more Market news.   Michalis Efthymiou HFMarkets   Disclaimer: This material is provided as a general marketing communication for information purposes only and does not constitute an independent investment research. Nothing in this communication contains, or should be considered as containing, an investment advice or an investment recommendation or a solicitation for the purpose of buying or selling of any financial instrument. All information provided is gathered from reputable sources and any information containing an indication of past performance is not a guarantee or reliable indicator of future performance. Users acknowledge that any investment in Leveraged Products is characterized by a certain degree of uncertainty and that any investment of this nature involves a high level of risk for which the users are solely responsible and liable. We assume no liability for any loss arising from any investment made based on the information provided in this communication. This communication must not be reproduced or further distributed without our prior written permission.
    • LUNR Intuitive Machines stock watch, attempting to move higher off 18.64 support, target 26 area at https://stockconsultant.com/?LUNR
    • CNXC Concentrix stock watch, pullback to 47.16 triple support area with bullish indicators at https://stockconsultant.com/?CNXC
×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.