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

    • Agreed since some of the new traders usually lose money in start and some loses more while chasing their lost money and eventually ends up blaming to their brokers part.
    • The crypto market are also in phase of maturing like the forex and other trading assets so we can do much more accurate analysis than before since early days it was purely a luck if the investments in crypto bears results because most of the coins or tokens never come to fruition. Some early birds were also able to make profits on these tokens or coins. e,g., like turtle coin starts with 1 satoshi and go up to 7 sathoshis, quite good rewards. another token lmgx now hovering at 10 started from 1, 
    • How's about other crypto exchanges? Are all they banned in your country or only Binance?
    • Be careful who you blame.   I can tell you one thing for sure.   Effective traders don’t blame others when things start to go wrong.   You can hang onto your tendency to play the victim, or the martyr… but if you want to achieve in trading, you have to be prepared to take responsibility.   People assign reasons to outcomes, whether based on internal or external factors.   When traders face losses, it's common for them to blame bad luck, poor advice, or other external factors, rather than reflecting on their own personal attributes like arrogance, fear, or greed.   This is a challenging lesson to grasp in your trading journey, but one that holds immense value.   This is called attribution theory. Taking responsibility for your actions is the key to improving your trading skills. Pause and ask yourself - What role did I play in my financial decisions?   After all, you were the one who listened to that source, and decided to act on that trade based on the rumour. Attributing results solely to external circumstances is what is known as having an ‘external locus of control’.   It's a concept coined by psychologist Julian Rotter in 1954. A trader with an external locus of control might say, "I made a profit because the markets are currently favourable."   Instead, strive to develop an "internal locus of control" and take ownership of your actions.   Assume that all trading results are within your realm of responsibility and actively seek ways to improve your own behaviour.   This is the fastest route to enhancing your trading abilities. A trader with an internal locus of control might proudly state, "My equity curve is rising because I am a disciplined trader who faithfully follows my trading plan." Author: Louise Bedford Source: https://www.tradinggame.com.au/
    • SELF IMPROVEMENT.   The whole self-help industry began when Dale Carnegie published How to Win Friends and Influence People in 1936. Then came other classics like Think And Grow Rich by Napoleon Hill, Awaken the Giant Within by Tony Robbins toward the end of the century.   Today, teaching people how to improve themselves is a business. A pure ruthless business where some people sell utter bullshit.   There are broke Instagrammers and YouTubers with literally no solid background teaching men how to be attractive to women, how to begin a start-up, how to become successful — most of these guys speaking nothing more than hollow motivational words and cliche stuff. They waste your time. Some of these people who present themselves as hugely successful also give talks and write books.   There are so many books on financial advice, self-improvement, love, etc and some people actually try to read them. They are a waste of time, mostly.   When you start reading a dozen books on finance you realize that they all say the same stuff.   You are not going to live forever in the learning phase. Don't procrastinate by reading bull-shit or the same good knowledge in 10 books. What we ought to do is choose wisely.   Yes. A good book can change your life, given you do what it asks you to do.   All the books I have named up to now are worthy of reading. Tim Ferriss, Simon Sinek, Robert Greene — these guys are worthy of reading. These guys teach what others don't. Their books are unique and actually, come from relevant and successful people.   When Richard Branson writes a book about entrepreneurship, go read it. Every line in that book is said by one of the greatest entrepreneurs of our time.   When a Chinese millionaire( he claims to be) Youtuber who releases a video titled “Why reading books keeps you broke” and a year later another one “My recommendation of books for grand success” you should be wise to tell him to jump from Victoria Falls.   These self-improvement gurus sell you delusions.   They say they have those little tricks that only they know that if you use, everything in your life will be perfect. Those little tricks. We are just “making of a to-do-list before sleeping” away from becoming the next Bill Gates.   There are no little tricks.   There is no success-mantra.   Self-improvement is a trap for 99% of the people. You can't do that unless you are very, very strong.   If you are looking for easy ways, you will only keep wasting your time forgetting that your time on this planet is limited, as alive humans that is.   Also, I feel that people who claim to read like a book a day or promote it are idiots. You retain nothing. When you do read a good book, you read slow, sometimes a whole paragraph, again and again, dwelling on it, trying to internalize its knowledge. You try to understand. You think. It takes time.   It's better to read a good book 10 times than 1000 stupid ones.   So be choosy. Read from the guys who actually know something, not some wannabe ‘influencers’.   Edit: Think And Grow Rich was written as a result of a project assigned to Napoleon Hill by Andrew Carnegie(the 2nd richest man in recent history). He was asked to study the most successful people on the planet and document which characteristics made them great. He did extensive work in studying hundreds of the most successful people of that time. The result was that little book.   Nowadays some people just study Instagram algorithms and think of themselves as a Dale Carnegie or Anthony Robbins. By Nupur Nishant, Quora Profits from free accurate cryptos signals: https://www.predictmag.com/    
×
×
  • Create New...

Important Information

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