Traders,
I have been working on the Trend Chaser concept for some time but always had a problem with false signals, large draw-downs, and sub-optimal stops. It had value in that it averages 50% wins on most instruments with most time-frames, so I felt it was worth persevering.
I am indebted to cfta’s idea for grid-step trading and Nicolas’ assistance and development of the code for a brilliant money-management system, as well a number of traders (and my close friend Free2Trade) for their encouragement and ideas. I have been able to find a solution to these problems through the incorporate the money management code with the Trend Chaser code.
It is early days in the testing but so far the results have been spectacular. I have attached a spreadsheet of the test results I have run on major indices, with the optimisation of some of the money management parameters: standard deviation (line 73), risk/reward (line 11) and risk percent (line 9). Please note that the formula in the spreadsheet are:
I find that the sweet spot for the code is in the shorter time frames such as 5 and 1 minute charts. The last two tests of the DAX were spectacular as I ran them over only the opening hours for that market. The negatives were the draw-downs of 11% and 17% – worth the risk, Elsborgtrading????
I have attached the code for examination and critique, please. All comments and suggestions for improvement are most welcome.
/// Definition of code parameters
defparam preloadbars = 3000
DEFPARAM CumulateOrders = false // Cumulating positions deactivated
COI= WEIGHTEDAVERAGE[14](ROC[11] +ROC[10])
MAC= MACDline[12,26,9]
STO = Stochastic[14,5]
once RRreached = 0
accountbalance = 10000 //account balance in money at strategy start
riskpercent = rp //whole account risk in percent%
amount = 1 //lot amount to open each trade
rr = rr //risk reward ratio (set to 0 disable this function)
//dynamic step grid
minSTEP = 5 //minimal step of the grid
maxSTEP = 20 //maximal step of the grid
ATRcurrentPeriod = 5 //recent volatility 'instant' period
ATRhistoPeriod = 100 //historical volatility period
ATR = averagetruerange[ATRcurrentPeriod]
histoATR= highest[ATRhistoPeriod](ATR)
resultMAX = MAX(minSTEP*pipsize,histoATR - ATR)
resultMIN = MIN(resultMAX,maxSTEP*pipsize)
gridstep = (resultMIN)
// Conditions to enter long positions
c1 = (COI > COI[1])
c2 = (MAC > MAC[1])
c3 = (STO > 20)
c4 = (STO < 40)
c5 = (STO > STO[1])
// Conditions to enter short positions
c11 = (COI< COI[1])
c12 = (MAC< MAC[1])
c13 = (STO < 80)
c14 = (STO > 60)
c15 = (STO < STO[1])
//first trade whatever condition
if NOT ONMARKET AND HIGHEST[5](c1)=1 AND HIGHEST[5](c2)=1 AND HIGHEST[5](c3)=1 AND HIGHEST[5](c4)=1 AND HIGHEST[5](c5)=1 then //close>close[1]
BUY amount LOT AT MARKET
endif
if NOT ONMARKET AND HIGHEST[5](c11)=1 AND HIGHEST[5](c12)=1 AND HIGHEST[5](c13)=1 AND HIGHEST[5](c14)=1 AND HIGHEST[5](c15)=1 then //close<close[1]
SELLSHORT amount LOT AT MARKET
endif
// case BUY - add orders on the same trend
if longonmarket and close-tradeprice(1)>=gridstep*pipsize then
BUY amount LOT AT MARKET
endif
// case SELL - add orders on the same trend
if shortonmarket and tradeprice(1)-close>=gridstep*pipsize then
SELLSHORT amount LOT AT MARKET
endif
//money management
liveaccountbalance = accountbalance+strategyprofit
moneyrisk = (liveaccountbalance*(riskpercent/100))
if onmarket then
onepointvaluebasket = pointvalue*countofposition
mindistancetoclose =(moneyrisk/onepointvaluebasket)*pipsize
endif
//floating profit
floatingprofit = (((close-positionprice)*pointvalue)*countofposition)/pipsize
//actual trade gains
MAfloatingprofit = average[20](floatingprofit)
BBfloatingprofit = MAfloatingprofit - std[20](MAfloatingprofit)*sd
//floating profit risk reward check
if rr>0 and floatingprofit>moneyrisk*rr then
RRreached=1
endif
//GRAPH floatingprofit as "float"
//GRAPH RRreached as "rr"
//GRAPH floatingprofit as "floating profit"
//GRAPH BBfloatingprofit as "BB Floating Profit"
//GRAPH positionprice-mindistancetoclose
//GRAPH moneyrisk
//GRAPH onepointvaluebasket
//GRAPH gridstep
//stoploss trigger when risk reward ratio is not met already
if onmarket and RRreached=0 then
SELL AT positionprice-mindistancetoclose STOP
EXITSHORT AT positionprice-mindistancetoclose STOP
endif
//stoploss trigger when risk reward ratio has been reached
if onmarket and RRreached=1 then
if floatingprofit crosses under BBfloatingprofit then
SELL AT MARKET
EXITSHORT AT MARKET
endif
endif
//resetting the risk reward reached variable
if not onmarket then
RRreached = 0
endif
You must be logged in to post a comment.
Hi All, apologies for the late response to your queries. I have been away and have not been trading for some months.
I posted the code I have used manually with some success, in the hope that someone might develop it further to the point that it could be run successfully in ProOrder. This has not happened and my trials in PO were not exciting.
My manual operation of this system works about 50 % of the time and depends on manual money management to make a 3:1 reward to risk.
I can't tell you how best to use a system because everyone has a different style of trading. Take the ideas, play with them and develop your own style that works best for you.
On that note I would like to close this post and will not be following it in the future.
Thank you for all contributions and your interest. May you develop a successful trading system.
Correct me if Im wrong, the idea is to use the Trend Chaser in 1 minute time frame. Turn it on and then take a profit as soon as the trade capture the short term trend, take a profit and re run it.
Is that right? Because otherwise from what I see in the recent past in the 1minutes TF it doesnt switch positions
Correct me if Im wrong, the idea is to use the Trend Chaser in 1 minute time frame. Turn it on and then take a profit as soon as the trade capture the short term trend, take a profit and re run it.
Is that right?
Thank you Mike, very interesting job, seems quite peculiar with respect to all the strategies I have seen on this forum so far, but maybe Its because I'm just a beginner.
Results looks pretty good though.
Aha! I think that was when it was entering in my tests - on a change so I guess it is working as intended! *blush* :)
Many thanks all very helpful figuring out how this is working - haven't run any tests along the way I just posted but have had a few proorders running in demo mode with some good results using your original code so perhaps I will just stick to that! :)
cheers
Max
Hi Mike
I see the HIGHEST[5] condition comes from cfta's post 'Grid orders with...' but he states he doesn't think he's quite got it figured out (and I think he/Zilliq/sylvess are right... or rather 'wrong' ;) cannot post there though for some reason)
I created new code using only the MAC and this HIGHEST[5] and it does not enter positions according to last 5 bars continuously rising
Also assuming it did work correctly then it makes sense checking the COI, MAC and STO this way but you are also 'asking the same' of conditions c3, c4, c13 and c14 which doesn't make sense/these conditions are only that the STO is greater than or less than a figure and not continuously rising (unless you are trying to 'ask' that they have remained above/below these figures for the last 5 bars?)
Probably not the most elegant way/bit long winded but the attached 'works' for continuously rising/falling over last 5 bars (but a trade can be entered then immediately exited the next bar if MAC continues to rise/fall for 6th bar whereas I think the idea would be to 'reset the clock' once a position had been entered...? Not sure how to achieve that though...!)
/// Definition of code parameters
DEFPARAM preloadbars = 3000
DEFPARAM CumulateOrders = FALSE // Cumulating positions deactivated
MAC = MACDline[12,26,9]
// Conditions to enter long/exit short
EL1 = (MAC > MAC[1])
EL2 = (MAC[1] > MAC[2])
EL3 = (MAC[2] > MAC[3])
EL4 = (MAC[3] > MAC[4])
EL5 = (MAC[4] > MAC[5])
// Conditions to enter short/exit long
ES1 = (MAC < MAC[1])
ES2 = (MAC[1] < MAC[2])
ES3 = (MAC[2] < MAC[3])
ES4 = (MAC[3] < MAC[4])
ES5 = (MAC[4] < MAC[5])
//Enter long
IF NOT LONGONMARKET AND NOT SHORTONMARKET AND EL1 AND EL2 AND EL3 AND EL4 AND EL5 THEN
BUY 1 LOT AT MARKET
ENDIF
//Enter short
IF NOT LONGONMARKET AND NOT SHORTONMARKET AND ES1 AND ES2 AND ES3 AND ES4 AND ES5 THEN
BUY 1 LOT AT MARKET
ENDIF
//Exit long
IF ONMARKET AND ES1 AND ES2 AND ES3 AND ES4 AND ES5 THEN
SELL AT MARKET
ENDIF
//Exit short
IF ONMARKET AND EL1 AND EL2 AND EL3 AND EL4 AND EL5 THEN
EXITSHORT AT MARKET
ENDIF
Hi Max,
Many thanks for your input.
The 5 bar look-back only checks that the condition was fulfilled in the last 5 bars. Your idea to check that it is continually rising/falling is good, but the entry point is when, during the last 5 bars, there is a change in the indicators. I have found that it is the turning point that is more accurate. How did your tests work out?
And the answer to all your questions from 2 days ago is "yes".
Let me know how you go.
Hi Mike
Many thanks starting to make a bit more sense now and also seen the same code used in other strategies on here/understand you are merging ideas etc.
Also wanted to confirm- the 3 .itf's posted here - the MGC is your supertrend v2.0 using the supertrend indicator for sl/tp and the Trend Chaser v3.0 is the same as the Trend Chaser v3.0 with MM just that you have made the sd parameter more convenient at the top of the code in the MM version?
And the grid ordering only works when cumulate orders are set to true but the money management is what is calculating the sl/tp yeh?
cheers
Max
Hi Mike
Thanks for the work - am relatively new to PRT but wanted to ask in reference to what Zilliq and Sylvess have said about the conditions and your comment that you think the =1 represents 'true' (I've no idea btw!) I've been playing around with the code and running some ProOrders in demo and am getting orders but not sure they're being best placed so just wanted to ask if you could clarify the conditions/logic you are after please?
I know you've said it a few times above but reading and re-reading some contradicts and I am not sure if you are after consecutively rising indicators or new highs/lows plus the COI is a Weighted Moving Average from what I understand so not sure how this could be less than zero (or I have totally misunderstood of course!) but it is not represented in the code (COI < 0) so was hoping to better understand then have a go at coding what you are after in a different way (as per Zilliq and Sylvess comments) if you could perhaps explain please..?
As I say it is generating orders so perhaps the logic as you wanted it is already there and no need to re-code but would be up for having a go if any doubt! :)
cheers
Max
Hello @Michael,
My apologies for the delay in responding to your query. When ProOrder rejects code it shows a warning yellow triangle. Hovering the mouse over the triangle will tell you the problem. I need to test the actual code to see the problem and fix it. I may be able to pick the issue with the details of the warning message, but the code would be better.
Hello @MaxT,
The code "HIGHEST[5](c1)=1" is saying look back 5 bars and pick the highest bar that complies with condition c1. Condition c1 is that the Coppock for that bar is higher than the Coppock for the previous bar. If this is true (=1), and all the other conditions are true, then do the following.....
I am looking for a confluence of the 3 indicators and 5 conditions within 5 bars as a signal to buy or sell. If you want to test the efficacy of the code, remove the "HIGHEST" phrase and run the code reading "IF c1 AND c2 AND ......etc".
There is no requirement in the code for COI<0. COI must be less than COI(1) for a short position. This means that it is sloping down from a high point.
I hope this clarifies your concerns. Let me know if I can be of further assistance.
Cheers,
Mike
Hello @Michael,
My apologies for the delay in responding to your query. When ProOrder rejects code it shows a warning yellow triangle. Hovering the mouse over the triangle will tell you the problem. I need to test the actual code to see the problem and fix it. I may be able to pick the issue with the details of the warning message, but the code would be better.
Hi MikeCG
i've problem to start the MGC Trend Chaser in 5min timeframe , because the backtest was really good . But the System gave me always an errormessage for an negative or Zero value for the last candle , i should put somewhere " close[-10] . Do you know where i have to change the code ?
BR Michael
Hi cfta, I have posted to your thread. The combination of the two systems needs a lot more testing, but I am having trouble fully understanding the logic of the code to test the alternatives. Thus the tests I have run purely optimise the the parameters. There is a spreadsheet of the test results on your thread.
Let me know your thoughts.
Thanks Mike,
When I was about to test it on live account, the following message occured and the model stopped:
This trading system was stopped because the program used a negative or zero offset (ex: close[-10]) during the evaluation of the last candlestick. Please add protections to your code to prevent negative or zero offsets.
Anyone interested in this strategy please see forum topic: https://www.prorealcode.com/topic/dow-2h-trend-chaser-v4-mm/