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
I usually let my code do the talking, which explains why my bio is as empty as a newly created file. Bio to be initialized...
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...