Jan

DI TEMA Trendfollowing strategy on DAX 5 min

Category: Strategies By: Jan Created: May 10, 2019, 8:02 AM
May 10, 2019, 8:02 AM
Strategies
9 Comments
DI TEMA Trendfollowing strategy on DAX 5 min

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 !

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

Download
Filename: 190506-TEMA-DI-SL.itf
Downloads: 839
Download
Filename: Backtest-results-DAX-5-min-sep17-mei19.png
Downloads: 423
Jan
Jan Veteran
This author is like an anonymous function, present but not directly identifiable. More details on this code architect as soon as they exit 'incognito' mode.
Author’s Profile

Comments

Matt66612
7 years ago
#

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

oakenstream
7 years ago
#

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.

nfulcher
7 years ago
#

Please could someone explain how the following code is calculated:- iDI = TEMA[3](DI[DI2](close)) //default TEMA 14

GraHal
7 years ago
#

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??

Jan Wind
7 years ago
#

A discussion Topic is opened, and can be found at https://www.prorealcode.com/topic/di-tema-trendfollowing-strategy-on-dax-5-min/

fatcat
7 years ago
#

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!

Jan Wind
7 years ago
#

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

Jan Wind
7 years ago
#

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

fatcat
7 years ago
#

Thanks Jan. But unfortunately I cannot confirm your backtesting results! Much worse!

ProRealCode ProRealCode
Loading...