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

    • Date: 29th March 2024. GBPUSD Analysis: The Pound Trades Higher But For How Long? The global Stocks Markets are closed due to Easter Friday (Good Friday). The NASDAQ continued to follow the sideways trend while other indices again rose. The SNP500 reaches an all-time high, but the NASDAQ remains under pressure from Tesla, Meta and Apple. The Euro continues to trade lower against all major currencies including the US Dollar, Euro and Japanese Yen. The British Pound is the best performing currency during this morning’s Asian session. However, investors are largely fixing their attention on this afternoon’s Core PCE Price Index. GBPUSD – The Pound Trades Higher but For How Long? The GBPUSD is slightly higher than the day’s open and is primary due to the Pound’s strong performance. At the moment, the British Pound is increasing in value against all major currencies. However, the US Dollar Index is also trading 0.10% higher and for this reason there is a slight conflict here. If investors wish to avoid this conflict, the EURUSD is a better option. This is because, the Euro depreciating against the whole currency market avoiding the “tug-of-war” scenario. The GBPUSD is trading slightly lower than the 2-month’s average price and is trading at 49.10 on the RSI. For this reason, the price of the exchange is at a “neutral” level and is signalling neither a buy nor a sell. The day’s price action and future signals are possibly likely to be triggered by this afternoon’s Core PCE Price Index. Analysts expect the Core PCE Price Index to read 0.3% which is slightly lower than the previous month but will result in the annual figure remaining at 2.85%. The PCE rate is different to the inflation rate and the Fed aims for a rate between 1.5% to 2.00%. Therefore, even if the annual rate remains at 2.85%, as analysts expect, it would be too high for the Fed. If the rate increases, even if only slightly, the US Dollar can again renew bullish momentum and the stock market can come under pressure. This includes the SNP500. Investors are focused on the publication of data on the UK’s gross domestic product (GDP) for the last quarter of 2023: the quarterly figures decreased by 0.3%, and 0.2% over the past 12-months. This confirms the state of a shallow recession and the need for stimulation. The data, combined with a cooling labor market and a steady decline in inflation, increase the likelihood that the Bank of England will soon begin interest rate cuts. In the latest meeting the Bank of England representatives did not see any members vote for a hike. USA500 – The SNP500 Rises to New Highs, But Cannot Hold Onto Gains! The price of the SNP500 rises to an all-time high, before correcting 0.33% and ending the day slightly lower than the open price. Nonetheless, the index performs better than the NASDAQ which came under pressure from Tesla, Meta and Apple which hold a higher weight compared to the SNP500. For the SNP500, these 3 stocks hold a weight of 9.25%, whereas the 3 stocks make up 14.63% of the NASDAQ. The SNP500 is also supported by ExxonMobil’s gains due to higher energy prices. The market will remain closed on Friday due to Easter. However, the market will reopen on Monday for the US and investors can expect high volatility. Investors will also need to take into consideration how the PCE Price Index and the changed value of the US Dollar is likely to affect the stock market next week. 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 on how markets work. Click HERE to register for FREE! Click HERE to READ more Market news. Michalis Efthymiou Market Analyst 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 FX and CFDs 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.
    • MT4 is good and will be good until their parent company keep updating the software, later mt4 users will have to switch to mt5.
    • $SOUN SoundHound AI stock at 5.91 support area , see https://stockconsultant.com/?SOUN
    • $ELEV Elevation Oncology stock bull flag breakout watch , see https://stockconsultant.com/?ELEV
    • $AVDX AvidXchange stock narrow range breakout watch above 13.32 , see https://stockconsultant.com/?AVDX
×
×
  • Create New...

Important Information

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