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
You must be logged in to post a comment.
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 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??
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
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
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