Firstly, a big thank you to Nicolas for this great site and for originally introducing us to the CAC Breakout using the same code here.
I set about testing this strategy on other markets due to the fact you can backtest 8 years of data with 200,000 units on the 15Min time-frame. The other massive plus is no fake profits and only 9, 0 bars in 1700 trades! 🙂
The DOW is slightly different to the CAC and DAX breakout. It did not like the first 30 min range but prefers the first hour range BUT we exclude the first 15min candle as you can see from the modifications to the code.
In this version I am using a fixed position size but you can activate the re-invest system if you are happy with that. It makes for an interesting ride!
I stuck to the rules of not over optimising/curve fitting by using an IN/OUT sample as documented here. This ran from Jun 2009 – May 2014.
The results above are £1 Per Point, £1000 Start and 1.8 Spread.
I am live trading this with real money with minimum stakes to test.
All times in the code are UK so please adjust to your timezone.
I have some more of these ported to other markets but need to spend a little more time getting them right before posting in the library. Expect them soon.
I have not had enough time to test different time frames. Maybe I will try that next if time allows.
Good luck and enjoy your trading.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
// We do not store datas until the system starts. // If it is the first day that the system is launched and if it is afternoon, // it will be waiting until the next day for defining sell and buy orders //UK TIME ZONE DEFPARAM PreLoadBars = 0 // Position is closed at 20:30 DEFPARAM FlatAfter = 203000 // No new position will be initiated after the 19:45 candlestick. LimitHour = 200000 // Market scan begin with the 15 minute candlestick that closed at 15:30 StartHour = 151500 // The 24th and 31th days of December will not be traded because market close before 7h45 PM IF (Month = 5 AND Day = 1) OR (Month = 12 AND (Day = 24 OR Day = 25 OR Day = 26 OR Day = 30 OR Day = 31)) THEN TradingDay = 0 ELSE TradingDay = 1 ENDIF // Variables that would be adapted to your preferences if time = 144500 then //PositionSize = max(1,1+ROUND((strategyprofit-1000)/1000)) //gain re-invest trade volume PositionSize = 1 //constant trade volume over the time endif MaxAmplitude = 160 MinAmplitude = 20 OrderDistance = 4 PourcentageMin = 35 // Variable initilization once at system start ONCE StartTradingDay = -1 // Variables that can change in intraday are initiliazed // at first bar on each new day IF (Time <= StartHour AND StartTradingDay <> 0) OR IntradayBarIndex = 0 THEN BuyTreshold = 0 SellTreshold = 0 BuyPosition = 0 SellPosition = 0 StartTradingDay = 0 ELSIF Time >= StartHour AND StartTradingDay = 0 AND TradingDay = 1 THEN // We store the first trading day bar index DayStartIndex = IntradayBarIndex StartTradingDay = 1 ELSIF StartTradingDay = 1 AND Time <= LimitHour THEN // For each trading day, we define each 15 minutes // the higher and lower price value of the instrument since StartHour // until the buy and sell tresholds are not defined IF BuyTreshold = 0 OR SellTreshold = 0 THEN HighLevel = Highest[IntradayBarIndex - DayStartIndex + 2](High) LowLevel = Lowest [IntradayBarIndex - DayStartIndex + 2](Low) // Spread calculation between the higher and the // lower value of the instrument since StartHour DaySpread = HighLevel - LowLevel // Minimal spread calculation allowed to consider a significant price breakout // of the higher and lower value MinSpread = DaySpread * PourcentageMin / 100 // Buy and sell tresholds for the actual if conditions are met IF DaySpread <= MaxAmplitude THEN IF SellTreshold = 0 AND (Close - LowLevel) >= MinSpread THEN SellTreshold = LowLevel + OrderDistance ENDIF IF BuyTreshold = 0 AND (HighLevel - Close) >= MinSpread THEN BuyTreshold = HighLevel - OrderDistance ENDIF ENDIF ENDIF // Creation of the buy and sell orders for the day // if the conditions are met IF SellTreshold > 0 AND BuyTreshold > 0 AND (BuyTreshold - SellTreshold) >= MinAmplitude THEN IF BuyPosition = 0 THEN IF LongOnMarket THEN BuyPosition = 1 ELSE BUY PositionSize CONTRACT AT BuyTreshold STOP ENDIF ENDIF IF SellPosition = 0 THEN IF ShortOnMarket THEN SellPosition = 1 ELSE SELLSHORT PositionSize CONTRACT AT SellTreshold STOP ENDIF ENDIF ENDIF ENDIF // Conditions definitions to exit market when a buy or sell order is already launched IF LongOnMarket AND ((Time <= LimitHour AND SellPosition = 1) OR Time > LimitHour) THEN SELL AT SellTreshold STOP ELSIF ShortOnMarket AND ((Time <= LimitHour AND BuyPosition = 1) OR Time > LimitHour) THEN EXITSHORT AT BuyTreshold STOP ENDIF // Maximal risk definition of loss per position // in case of bad evolution of the instrument price SET STOP PLOSS MaxAmplitude //SET TAGRGET PPROFIT //70 //160 |
Share this
No information on this site is investment advice or a solicitation to buy or sell any financial instrument. Past performance is not indicative of future results. Trading may expose you to risk of loss greater than your deposits and is only suitable for experienced investors who have sufficient financial means to bear such risk.
ProRealTime ITF files and other attachments :PRC is also on YouTube, subscribe to our channel for exclusive content and tutorials
Wow! Love it!
Thank You for sharing Cosmic
GraHal
Hi Cosmic
Thanks for sharing.
I have think that you have put this line in comment
Did you try different values or ratio of target profit e.g x 1 or x 2 max amplitude ?
What were the results?
//SET TARGET PPROFIT //70 //160
@GraHal Cheers, I think it will make a nice edition to an algo portfolio 🙂
@Yannick I did add the set target profit line to see if it made a big difference. It does improve things slightly but I decided against it in the end in case of big breakout days being cut short. Feel free to uncomment and have a play. It may suit you?
thanks for this, back tested it today looks good. 1 question, if i want to use £3 point which do i change?
PositionSize = 3
Thank you, I thought it was, also whats the stop distance on the code? is it 9?
Thank you
HELLO I CAN SUGGEST THE FOLLOWING CHANGES TO INCREASE PROFIT AND LOWER DRAWDOWNStartHour = 153500if time = 153000 then..UK TIMEZONETHANKS
ANDCONSIDERING TO WORK WITH A MAXIMUM OF 20 % DRAWDOWN THE RESULT IS BETTER HAS WITH A PROFIT TARGET 40
@traderollie The stop distance is initially the MaxAmplitude (160) Say the first order is triggered long but then the market heads down, the short order would trigger and cancel the long. The stop distance then becomes the daily MaxAmplitude. So you see that it is very rare to take a 160 loss. It only happened twice in 1700 trades. If you check the closed positions list in PRT you will see what I mean. The average loss is 33 points with the above code.
@ Aleale Setting a 40 point limit creates a lot more 0 and 1 bars which is not good for PRT as it does not look inside bars and it also decreases overall profit. Let your winners run! Changing those times makes less profit and creates a horrible equity curve…
It was disappointing that this strategy did not capture Friday’s big move down. It fell outside spec and so left it no chance to get on board. Messing with this code to accommodate these days does not seem like the right approach so I am working on a separate breakout code to take care of these days at the moment.
Thanks cosmic, I find it really useful to understand how you’ve set this up. Shame it didn’t catch the drop on Friday but after back testing it preforms very well.
Hi Cosmic! I inserted the code and ran back test but its not picking up any trades, am i missing something? I’m trading in South Africa.
Hi Daniel, I think you an hour ahead of us? If so, change all times.
DEFPARAM FlatAfter = 213000
LimitHour = 210000
StartHour = 161500
if time = 154500 then
Hi Cosmic1,
Thanks alot for this & sorry for being a pest, I am in Melbourne, Australia & thought i had my time conversions down pat, however i cannot get the code to produce positive results which makes me think i have my time conversion up the shit. NY is 15 hours behind Melbourne/Sydney, I am extremely green with coding so am i entering my time here which converts to the Dow opening time.
Sorry to be asking such a simple question.
Regards,
Hi Cosmic1! Thanks for the reply, i tried changing the times but no luck. The US opens at 15h30 locally.
That’s a strange one Daniel. You may need to call IG/PRT unless @Nicolas has an idea?
Hello
why did not you use this setting , you would have problems ?
MaxAmplitude = 100MinAmplitude = 20OrderDistance = 4PourcentageMin = 20Thanks For your strategy
the strategy with this setting may have problems ?
Hi Aleale, I’m not quite sure what you are asking or mean but I will take a guess 🙂 The backtest optimisation was performed with an IN/OUT sample as described so running the backtest optimisation again with the whole data will give different results. I’m am running this live with the code above. If you think there is too much risk then of course feel free to adjust to suit your needs. I have confidence in the strategy with the variables above. Would recommend £5000 in your account to run this live. Hope that helps.
I love Lower the drawdown in the strategies
Hi cosmic1,
I’ve really enjoyed getting to grips with your code. Hows has it been with live trading. Are your results similar to your backtest. As there is so much to it if you have time and willing ! , could you run through the parameters of the code to us mere mortals…….. You ve made some fantastic coding and i just want to make sure I fully understand it.
Thanks,
John
Hi John. Thanks for the comments. The original work was done by Nicolas. This is just a port. I recommend reading these two posts as they explain everything very well.
http://www.prorealcode.com/prorealtime-trading-strategies/breakout-proorder-french-cac40/
http://www.prorealcode.com/blog/automated-breakout-trading-strategy-french-cac40/
I have been running CAC, DAX and DOW for the last 3 weeks and am up around +100 points. So far so good. I will be leaving them on for the next few months to see how they go. They appear to perform the same live as the backtest, as was expected.
googletranslator : than inport for MT4 ? thank
Hi cosmic…. thanks a lot for great strategy. I backtestested this for few days now and went live last night. It doesn’t seem to pick any live trades this morning till 11 AM. I am not even sure if this strategy is working at the back end. I am on IG. How do I validate that it is scanning the market and looking for breakout ? Should I just wait and watch ? Hope it can pick trades up anytime before 1615 on daily basis. Response will be very much appreciated. Thanks…
Sorry My comments above are meant for DAX breakout strategy
hi Cosmic1, I’m a newbie here, on IG so I can only backtest 10,000 units to May this year, which shows a 50% win/loss ratio and 82% overall gain in that period. Is that what you’d expect on this shorter timefame for backtest ?
Sorry wrong pic, DOW…
can we used it for other usa index
Sure, you will need to optimise these variables:
MaxAmplitude = 160
MinAmplitude = 20
OrderDistance = 4
PourcentageMin = 35
And possibly the start times and the amount of candles to look at the range.
Use an IN/OUT sample as suggested in the blog to avoid curve fitting as my description describes.
thank you, I have 2 breakout book in pdf 1.the logical trader by fisher mark b 2.range breakout by toby crabel
I AM NEWBE SO I ASKED THIS QUESTION , CODING IS DONE C++?
From Wikipedia:
The ProRealTime software embeds a programming language named ProBuilder derived from the language BASIC. It allows the creation of customs indicators, strategies and market scans. It is also used in the ProBacktest, ProScreener and ProOrder modules of ProRealTime.
thank you
how I can change to C## I used ninja trader all the prog have to me in C##
thank you in advance
thank you for detail I open the ac now and used it very soon
I try to run in prorealtime and it do not give any profit and loss, I change the time in computer to uk time, may be I am missing some thing
need you advise
You need to change the time in the code rather than your computer. What timezone are you in?
usa /new york
DEFPARAM FlatAfter = 153000
LimitHour = 150000
StartHour = 101500
if time = 094500 then
I think that is correct. Test and let me know.
THANK YOU , I WILL FIX IT AND RUN THE TEST ,I WILL KEEP POSTED
Hi
can someone explan to me what these variables mean
MaxAmplitude =
MinAmplitude =
OrderDistance =
PourcentageMin =or direct me to a later conversatin on this site where it is explaned?In advance, thank you/Yngve
Hi Yngve,
Amplitude relates to the range of the price action for the given times stipulated. 45mins in this case. You could relabel these to MinRange and MaxRange.
Orderdistance is the amount of points before the breakout level that the order will be set.
PourcentageMin (should be spelt PercentageMin) is the minimum % of the range that the price has to retrace to validate the breakout. Hope that helps?
I try as per your advise and change the time to usa time still no luck, may be I am doing some thing wrong? please advise ?
Post the code you are using, will try and figure it out. What broker?
Hey Cosmic,
Do you typically add a daylight savings adjustment in your code when running back tests over multiple years of data? I’m not sure if I’m the only one who does this however I hope I’m not missing out on a simpler way 🙂
Hey Sammut,
I have never done this but I thought about it before but didn’t do anything about it! I just adjust manually at those times of the year that we mismatch with the US. It does of course affect the backtest slightly.
How do you achieve it in your code? I would like to update the blackest to take account of this.
@Nicolas, any insight in to this?
I have attached my version of your DOW breakout strategy. Main bits for DLS adjustments are as follows:
IF ((Month = 3 and Day > 7) and (Month = 3 and Day < 15)) or ((Month = 11 and Day >= 1) and (Month = 11 and Day < 8)) THEN
//Period over which Daylight savings takes place, no trading during this time
TradingDay = 0
DLS = 0
elsif (Month = 3 and Day >= 15) or ((Month > 3) and (Month < 11)) THEN
//DLS applies as New York is forward an hour during this period
// New York time is (GMT - 4)
DLS = -10000
else
// No DLS
// New York time is (GMT - 5)
DLS = 0
endif
LimitHour = 204500 + DLS
I also use different variables in my code, probably as I do not have PRT professional yet and have limited data to test on 🙁
Thanks for posting your code Cosmic, it has been the first algo I have traded live with!
Looks like a good bit of code. I will take a look later. I’d really like to get this algo back on and running but over the last 10 months or so it has been flat and choppy. Same story with the DAX. I stopped it a few months ago now and have looked since but can’t find a set of variables or equity curve that I’m happy with. What variables are you running?
Hey Cosmic, I am just in the process of re-evaluating my variables due to, as you say, some recent choppy rides. The parameters I optimise are below:
MinAmplitude
OrderDistance
PourcentageMin
StartHourStep
RangeExtendStep
I dont change MaxAmplitude as I want to fix my maximum risk at this stage. I optimise additional variables StartHourStep and RangeExtendStep.I am just realising that I am not able to attach my code in this post for some reason. If you send over your email I can forward my code (.itf files) for you to check out and discuss
Lets discuss here: https://www.prorealcode.com/topic/cac-breakout-ported-to-other-markets/
hello,
anybody use thi strategy for a long time?
thanks
Hi, I have been trading this strategy and it seems to work quite well recently.
Is there anyway to insert a piece of code, to only trade, accordingly to yesterday price action. I.e: if yesterday was up, only longs and if yesterday was down, only shorts?
I did insert a piece of code, but it can’t backtest it, because there is only ever one 2100 line.
Sorry, the ADD code did not work.
defparam drawonlastbaronly=true
if time=210000 then
value=close
endif
drawhline(value)
return