Please find below a simple strategy based on a combination of the DI and TEMA indicators.
It performs quite well on the DAX 5 minutes (7:00-22:00 trading), for 100.000 bars, spread 5 pips.
Conditions to OPEN positions (see settings in the code)
1 TEMA trend turn into positive (for long) or turns into negative (for short)
2 the DI increases, but starts from below zero (Long) or decreases, but starts from above zero (short)
The only CLOSE conditions are a Trailing stop loss, whereby the Trailing stop is reduced after 12 trading bars.
I tried it on several indices in different timeframes, I only got good results for the DAX, 5 minutes bar.
Disadvantage of this strategy is the long TTM, Time in the Market, of at least 65 %, obviously also overnight.
As a spread I have taken into account 5 pips, which should include 3 pips for interest to be paid (estimation 4% x exposure 12.000 Euro for 1 contract x 65% in the market / 120 trades per year)
This strategy requires a bit different settings for 2019 alone (for better results) compared to the settings set in the code for the whole period of 100.000 bars. I am (obviously!) looking for automated setting adjustments during different structures of market movements, any suggestions are more then welcome.
Any suggestions for improvement welcome !
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 |
DEFPARAM CumulateOrders = false // Cumulating positions deactivated //VARIABLES once SLperc = 105 // Stoploss percentage 105/10000 * Close once TrailSLPerc = 85 // Trailng Stoploss percentage 85/10000 * Close once Tema2 = 30 // Tema setting for opening long/short positions once DI2 = 7 //DI setting for opening long/short positions once Duration = 12 // number of bars in trade before reducing the trailing stop once Factor = 7/10//factor to reduce trailing stoploss after some time in the trade once StartE = 74500 //start time for opening positions once StartL = 103000 //ending time for opening positions (only trading in the morning) once N = 1 // initieel aantal contracten OTD = Barindex - TradeIndex(1) > IntradayBarIndex // limits the (opening) trades till 1 per day //Setting Stop loss and trailing stop loss //Dynamic for indices once SL = round(close * SLPerc/10000) once trailingstop = round(close * (TrailSLPerc)/10000) // Conditions to OPEN positions //1/TEMA trend turn into positive(long) or turns into negative (short) //2/ DI increases, but starts negative (Long) or decreases, but starts with positive value (short) // Conditions to CLOSE positions //1/Trailing stop loss hit //2 Trailing stop is reduced after 12 trading bars iTema = TEMA[Tema2](close) //default TEMA 20 iDI = TEMA[3](DI[DI2](close)) //default TEMA 14 if time >= StartE And time <= StartL and OTD and not onmarket then IF iTema > iTema[1] and iTema[1] < iTema[2] and iDI > iDI[1] and iDI < 0 then BUY N shares AT MARKET SET STOP ploss SL // long sell conditie (bovengeschikt aan short sell and dligneJ < Avd else IF iTema < iTema[1] and iTema[1] > iTema[2] and iDI < iDI[1] and iDI > 0 THEN SELLSHORT N shares AT MARKET //short sell conditie SET STOP pLOSS SL endif endif endif // einde aankoop //resetting variables when no trades are on market if not onmarket then MAXPRICE = 0 MINPRICE = close priceexit = 0 endif //case SHORT order if shortonmarket then MINPRICE = MIN(MINPRICE,close) //saving the MFE of the current trade if barindex - tradeindex(1) > Duration then //normal trailing stop adjusted for factor, which decreases trailing stip if tradeprice(1)-MINPRICE >= Factor * trailingstop*pointsize then //if the MFE is higher than the trailingstop then priceexit = MINPRICE + Factor * trailingstop*pointsize //set the exit price at the MFE + trailing stop price level endif else //normal trailing stop if tradeprice(1)-MINPRICE>=trailingstop*pointsize then //if the MFE is higher than the trailingstop then priceexit = MINPRICE+trailingstop*pointsize //set the exit price at the MFE + trailing stop price level endif endif endif //case LONG order if longonmarket then MAXPRICE = MAX(MAXPRICE,close) //saving the MFE of the current trade if barindex - tradeindex(1) > 12 then //normal trailing stop adjusted for factor, which decreases trailing stip if MAXPRICE-tradeprice(1)>= Factor * trailingstop*pointsize then //if the MFE is higher than the trailingstop then priceexit = MAXPRICE- Factor * trailingstop*pointsize //set the exit price at the MFE - trailing stop price level endif else //normal trailing stop if MAXPRICE-tradeprice(1)>=trailingstop*pointsize then //if the MFE is higher than the trailingstop then priceexit = MAXPRICE-trailingstop*pointsize //set the exit price at the MFE - trailing stop price level endif endif endif //exit on trailing stop price levels if onmarket and priceexit>0 then EXITSHORT AT priceexit STOP SELL AT priceexit STOP endif |
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
Thanks Jan. But unfortunately I cannot confirm your backtesting results! Much worse!
Hallo Fatcat,
1. Most important: Did you set the trading hours to 7:00 to 22:00 CET, not including the nightly hours ? (Dutch/German time, UK time one hour earlier)
Go to Options –> Platform Options –> Time Zones and Trading Hours –> (Adjust) trading hours
2. The results shown are based on a IS 66% / OOS 34%, you can simulate this with varying the TEMA variable (28/30). The results IS/OOS are better than non IS/OOS testing, with the same variable settings, which is weird (I would expect the same results for running the code for 100.000 bars with or without running an IS/OOS, if the only optimised variable TEMA appears to be 28 in both runs)
Maybe someone can explain or have experienced the same thing ?
3. The results from half March till May 2019 are not that good, which negatively influence the performance
Hope it helps you further
KR Jan
Sorry, but not working with trading hours 07:00 – 22:00 CET either. Are you sure it is exactly the code matching the results? Can anybody confirm the trading results? Thx!
fatcat,
sorry to hear. Today I did run the code for 100.000 bars (from 17 dec 2017 till 31 may 2019) with no IS/OOS , just run the code and the results are OK
1 Euro contract on the DAX, with a spread of 5 (!) points to cover the spread plus interest costs for positions overnight
Period 13 dec 2017 till 31 may 2019
Exposure +/- 12.000 Euro (1 Euro Dax contract)
Total Gain 3.566 Euro
Winning 63%
Gain/Loss 1,46
TTM 64%
Transactions 167
The last 5 months are showing negative results, however the last trades are winning again.
Not sure why it does not work with you
Again I want to mention that Walk Forward (IS/OOS) result with exactly the same setting give much better result, which is WEIRD (4.302 Euro instead of 3.566 Euro)
I only vary the TEMA value with a variable tt, which can have the value 28 and 29, and run an IS/OOS with 66% IS 34% OOS (just 1 Walk Forward), with appears an optimal setting of TEMA of 28
KR Jan
I confirm that I get almost exactly the same (+7 days difference now) results as Jan states in the post above after I deducted 1 hour off the times to allow for Jan (Netherlands ) being 1 hour ahead of me (UK).
A discussion Topic would be good so we could post images of curves etc etc??
A discussion Topic is opened, and can be found at https://www.prorealcode.com/topic/di-tema-trendfollowing-strategy-on-dax-5-min/
Please could someone explain how the following code is calculated:-
iDI = TEMA[3](DI[DI2](close)) //default TEMA 14
Jan, I find sometimes that the priceexit variable is never set. It seems to happen when the price immediately goes the wrong way, in my cases always in a short. I cant figure it out, any ideas?
if tradeprice(1)-MINPRICE >= Factor * trailingstop*pointsize then //if the MFE is higher than the trailingstop then
priceexit = MINPRICE + Factor * trailingstop*pointsize //set the exit price at the MFE + trailing stop price level
endif
..I tried to use the add code button but it failed for some reason.
I do not understand the first time I launch the backtest I got the same result as you.
but after impossible to find the same result on the other backtest