This internet has very less resource on how to backtest a strategy on intraday basis as most of the strategy adapted so far in marketcalls are carry forward strategy. Strategies like Ichimoku Cloud TSL, SDA2 Trend Trading System and Supertrend etc are mostly carry forward strategy. And to implement a pratical intraday strategy you need to mix mathematical models with time based strategies (i.e) when to initiate a position ,when to exit and whent to stop the trade during the day.
In any carryforward strategies you need to carry forward your positions every overnight and every week even if the strategies are adopted in lower timeframes. Some people feel that carry forward strategies involves lots of overnight carry forward risk so they try to play intraday mostly. In a intraday strategy positions will be covered of mostly on the same day. Say you are adopting a certain mathematical model in your intraday trading How
did you validate whether the intraday strategy you adopted works good or not? How to backtest such intraday strategies?
Strong Disclaimer before starting with the strategy
1)This strategy has been built as a prototype to build complex mathematical models binded with intraday rules in the future.
2)This strategy is not tradeable as it involves lots of whipsaws. Here the strategy is posted just to educate the people not for involving in speculation based on the strategy
To solve the above issues i thought of making a prototype with a simple ema crossover strategy with time based rules. This strategy will start trade the EMA crossovers only between 9:45a.m and 3:00:p.m and close the postion by 3:20p.m. The following code defines the time based rules
FirstTradeTime = 094500;
LastTradeTime = 150000;
ExitAllPositionsTime = 152500;
Buy and Sell Rules
1)Initiate Buy if there is a bullish EMA crossover and time is greater than FirstTradeTime and less than LastTradeTime
2)Cover the buy (i.e) sell if there is a bearish EMA crossover or if time is 3:25p.m
3)Initiate Short if there is a bearish EMA crossover and time is greater than FirstTradeTime and less than LastTradeTime
4)Cover the short (i.e) cover if there is a bullish EMA crossover or if time is 3:25p.m
Short=Sell AND (TimeNum() >= FirstTradeTime AND TimeNum() <= LastTradeTime ); Cover=Buy OR TimeNum() >= ExitAllPositionsTime;
And Pratically speaking I mostly test my strategies with fixed lotsize initially without any money management principles involved in it.
For example : Nifty futures i often test with 2 lots of nifty i,e 100 shares This is achieved by the following code
Choosing the timeframe
Since EMA crossovers involves lots of whipsaws. I generally prefer to test my strategies in 10min, 15min for intraday basis to avoid too much whipsaws during intraday but still whipsaws are unavoidable. Choosing the timeframe often depends upon what kind of strategy you are adopting and what king of trader you are!
In case of Nifty futures in 10min timeframe we prefer parameters EMA1=3 and EMA2=50
In case of Nifty futures in 15min timeframe we prefer parameters EMA1=2 and EMA2=36
Goto Amibroker->Symbols->Information and enter the values of Round Lot size=50 and Margin Deposit = -15 (i.e 15% ) and follow the backtesting settings for 15min timeframe as shown below in the image
5 Years of Nifty futures bactesting Results in a 15min timeframe
Simple EMA Crossover Intraday Strategy – Amibroker AFL Code
SetBarsRequired(100000,0); GraphXSpace = 15; SetChartOptions(0,chartShowArrows|chartShowDates); SetChartBkColor(ParamColor("bkcolor",ColorRGB(0,0, 0))); GfxSetBkMode(0); GfxSetOverlayMode(1); SetBarFillColor(IIf(C>O,ParamColor("Candle UP Color", colorGreen),IIf(C<=O,ParamColor("Candle Down Color", colorRed),colorLightGrey))); Plot(C,"nPrice",IIf(C>O,ParamColor("Wick UP Color", colorDarkGreen),IIf(C<=O,ParamColor("Wick Down Color", colorDarkRed),colorLightGrey)),64,0,0,0,0); //SetTradeDelays(1,1,1,1); SetPositionSize(100,spsShares); FirstTradeTime = 094500; // Earliest time to take a trade LastTradeTime = 150000; // Latest time to take new trades ExitAllPositionsTime = 152500; // Exit all trades //parameters //10min - 3,50 //15min - 2,36 P = ParamField("Price field",-1); per1 = Param("EMA1",2,1,20,1); per2 = Param("EMA2",36,1,50,1); Buy = Cross(EMA(C,per1),EMA(C,per2)) AND (TimeNum() >= FirstTradeTime AND TimeNum() <= LastTradeTime ); Sell= Cross(EMA(C,per2),EMA(C,per1)) OR TimeNum() >= ExitAllPositionsTime; Buy=ExRem(Buy,Sell) ; Sell=ExRem(Sell,Buy); Short=Sell AND (TimeNum() >= FirstTradeTime AND TimeNum() <= LastTradeTime ); Cover=Buy OR TimeNum() >= ExitAllPositionsTime; BuyPrice=ValueWhen(Buy,C); SellPrice=ValueWhen(Sell,C); ShortPrice=ValueWhen(Short,C); CoverPrice=ValueWhen(Cover,C); Plot( EMA( P, per1 ), "EMA1", ParamColor( "Color1", colorCycle ), ParamStyle("Style") ); Plot( EMA( P, per2 ), "EMA2", ParamColor( "Color2", colorCycle ), ParamStyle("Style") ); PlotShapes(IIf(Buy, shapeSquare, shapeNone),colorGreen, 0, L, Offset=-40); PlotShapes(IIf(Buy, shapeSquare, shapeNone),colorLime, 0,L, Offset=-50); PlotShapes(IIf(Buy, shapeUpArrow, shapeNone),colorWhite, 0,L, Offset=-45); PlotShapes(IIf(Sell, shapeSquare, shapeNone),colorRed, 0, H, Offset=40); PlotShapes(IIf(Sell, shapeSquare, shapeNone),colorOrange, 0,H, Offset=50); PlotShapes(IIf(Sell, shapeDownArrow, shapeNone),colorWhite, 0,H, Offset=-45); PlotShapes(IIf(TimeNum() >= ExitAllPositionsTime,5,-1e10),colorGreen,0 ,H,5); PlotShapes(IIf(TimeNum() >= ExitAllPositionsTime,6,-1e10),colorRed,0,L,5);