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.


×
×
  • Create New...

Important Information

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