AFL of the week: A profitable trend following system

This strategy is based on MACD, RSI, Stochastic and Exponential moving average. Combination of all these indicators assures good returns with minimum whipsaws. In the chart, uptrends are represented by blue colour and downtrends are represented by red colour.

Read our article on AFL tutorial here.

AFL Overview

Paramter Value
Preferred Timeframe Daily, Hourly
Indicators Used MACD, Stochastic, RSI, EMA
Buy Condition RSI period 3 greater than 50, Difference between MACD and

MACD signal line is greater than 0 and also greater than that of

previous candle, Stochastic %D line is less than 80 and greater

than that of previous candle, Closing price greater than EMA

period 100.

Sell Condition RSI period 3 less than 50, Difference between MACD and

MACD signal line is less than 0 and also less than that of

previous candle, Stochastic %D line is greater than 20 and less

than that of previous candle, Closing price less than EMA

period 100.

Stop Loss 2.5%
Targets No fixed target, Stop and reverse when AFL gives opposite signal
Position Size 300(fixed)
Initial Equity 200000
Brokerage 50 per order
Margin 10%

AFL Code

//------------------------------------------------------
//
//  Formula Name:    Trend following trading System
//  Author/Uploader: Trading Tuitions
//  E-mail:          support@tradingtuitions.com
//  Website:         www.tradingtuitions.com
//------------------------------------------------------

_SECTION_BEGIN("Trend following Trading system");

SetTradeDelays( 1, 1, 1, 1 );
SetOption( "InitialEquity", 200000);
SetOption("FuturesMode" ,True);
SetOption("MinShares",1);
SetOption("CommissionMode",2);
SetOption("CommissionAmount",50);
SetOption("AccountMargin",10);
SetOption("RefreshWhenCompleted",True);
SetPositionSize(300,spsShares);
SetOption( "AllowPositionShrinking", True );
BuyPrice=Open;
SellPrice=Open;
ShortPrice=Open;
CoverPrice=Open;

SetChartOptions(0,chartShowArrows|chartShowDates);
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));

SD = StochD(8, 3, 3);
MH = MACD(8, 21) - Signal(8, 21, 5);
trendup = IIf(MH > 0 OR (MH > 0 AND MH > Ref(MH, -1)) AND RSI(3) >50 AND SD < 80 AND SD > Ref(SD, -1) AND ValueWhen(C,O<C), colorBlue, colorWhite);
trendcolor = IIf(MH < 0 OR (MH < 0 AND MH < Ref(MH, -1)) AND RSI(3) <50 AND SD > 20 AND SD < Ref(SD, -1) AND ValueWhen(C,O>C), colorRed, trendup);
EMA20=EMA(Close,100);

Buy=MH > 0 OR (MH > 0 AND MH > Ref(MH, -1)) AND RSI(3) >50 AND SD < 80 AND SD > Ref(SD, -1) AND ValueWhen(C,O<C); 
Sell=MH < 0 OR (MH < 0 AND MH < Ref(MH, -1)) AND RSI(3) <50 AND SD > 20 AND SD < Ref(SD, -1) AND ValueWhen(C,O>C);
Buy = Buy AND Close>EMA20;
Sell=Sell AND Close<EMA20;
Buy=ExRem(Buy,Sell);
Sell=ExRem(Sell,Buy);
Short = Sell;
Cover = Buy;

StopLoss=2.5;
ApplyStop(Type=0,Mode=1,Amount=StopLoss);

/* Plot Buy and Sell Signal Arrows */
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(Cover, shapeSquare, shapeNone),colorGreen, 0, L, Offset=-40);
PlotShapes(IIf(Cover, shapeSquare, shapeNone),colorLime, 0,L, Offset=-50);
PlotShapes(IIf(Cover, 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(Short, shapeSquare, shapeNone),colorRed, 0, H, Offset=40);
PlotShapes(IIf(Short, shapeSquare, shapeNone),colorOrange, 0,H, Offset=50);
PlotShapes(IIf(Short, shapeDownArrow, shapeNone),colorWhite, 0,H, Offset=-45);


Plot( C, "Close", trendcolor, styleCandle | styleThick );
Plot(EMA20,"EMA",colorBlue);

_SECTION_END();


AFL Screenshot

 

Backtest Report

 Paramter Value
  NSE BankNifty
Initial Capital  200000
Final Capital 5370094.50
Backtest Period 09-06-2000 to 26-02-2016
Timeframe Daily
Net Profit %  2585.05%
Annual Return % 22.58%
Number of Trades 110
Winning Trade % 28.18%
Average holding Period 30.73 periods
Max consecutive losses 12
Max system % drawdown -56.04%
Max Trade % drawdown -62.51%

Download the detailed backtest report here.

Please note that you can expect even better results if you allow compounding of your returns.

Equity Curve

 

Additional Amibroker settings for backtesting

Goto Symbol–>Information, and specify the lot size and margin requirement. The below screenshot shows lot size of 30 and margin requirement of 10% for Bank Nifty:

Disclaimer:

All the AFL’s posted in this section are for learning purpose. Trading Tuitions does not necessarily own these AFL’s and we don’t have any intellectual property rights on them. We might copy useful AFL’s from public forums and post it in this section in a presentable format. The intent is not to copy anybody’s work but to share knowledge. If you find any misleading or non-reproducible content then please inform us at support@tradingtuitions.com

9 Comments

  1. Hi,
    Thanks for the amazing system and other articles you’ll have been posting. I have mentioned before that this is one of the very few Indian websites which can provide such great deal of knowledge on AmiBroker. What makes it better is that you’ll encourage questions and respond to them in time. My request is if you’ll could do a small code on dynamic position sizing like anti martingale. This is one topic which is not available (easily at least) on the internet. This will help me and all other fellow traders searching for the same.

    Thanking you in anticipation,
    Neha

  2. Thank you Neha. We’ll try to cover dynamic position sizing in one of our ‘AFL of the week’ articles. Stay tuned!

  3. Ahh man.. the draw down is really huge. It would be very difficult to trade such systems. When I work on developing systems, i always focus on lower drawdown ratio. you can check my system details here http://www.squareoff.in

  4. Hi, if you did not have the tradedelays set up, then you buy=buy and c>ema20, would be buy=buy and ref(c,-1)>ema20?, because you dont know where the close will be in the open right?

    • Yes, that is true. But its better to have trade delays than referencing previous bar.

Leave a Reply

Your email address will not be published. Required fields are marked *