Skip to main content

Welcome to this post, where we’ll delve into an effective trading strategy known as the Volume Breakout Trading Strategy. This strategy identifies stocks that break out of their price ranges with significant trading volumes. It’s a straightforward approach that doesn’t rely on complex indicators but has consistently delivered impressive profits. This strategy is applicable to a wide range of highly liquid and high-beta stocks, as proven through our testing. We’ve even coded an AFL (AmiBroker Formula Language) for this strategy and rigorously back-tested it on BankNifty futures traded at the NSE. The results show a compounded annual return of around 23% over the last 11 years of backtesting.

If you’re interested in learning how to code in AFL and create your trading systems, you can find a helpful guide here.

A Quick Overview of the AFL for the Volume Breakout Trading Strategy 

Parameter Value
Preferred Time-frame Daily
Indicators Used EMA
Buy Condition
  • Volume surpasses or equals 1.5 times the volume of the previous candle.
  • Close price exceeds the 20-period simple moving average.
  • Volume is higher than the 50-period simple moving average of volume.
Short Condition
  • Volume surpasses or equals 1.5 times the volume of the previous candle.
  • Close price is below the 20-period simple moving average.
  • Volume is higher than the 50-period simple moving average of volume.
Sell Condition
  • Same as the Short condition
  • Stop Loss is triggered
  • Target is met
Cover Condition
  • Same as the Buy condition
  • Stop Loss is triggered
  • Target is met
Stop Loss 3%
Targets 30%
Position Size 120 Quantities
Initial Equity 200,000
Brokerage 100 per order
Margin 10%

AFL Code

				
					//------------------------------------------------------
//
//  Formula Name:    Volume Breakout Trading System
//  Website:         zerobrokerageclub.com
//------------------------------------------------------
_SECTION_BEGIN("Volume Breakout Trading System");
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 ) ) ));
//Initial Parameters
SetTradeDelays( 1, 1, 1, 1 );
SetOption( "InitialEquity", 200000);
SetOption("FuturesMode" ,True);
SetOption("MinShares",1);
SetOption("CommissionMode",2);
SetOption("CommissionAmount",100);
SetOption("AccountMargin",10);
SetOption("RefreshWhenCompleted",True);
SetPositionSize(120,spsShares);
SetOption( "AllowPositionShrinking", False );
BuyPrice=Open;
SellPrice=Open;
ShortPrice=Open;
CoverPrice=Open;
//Buy-Sell Logic
range=High-Low;
VolLookback=Param("VolLookback",50,10,100,10);
MALookback=Param("MALookback",20,10,100,10);
Buy = Volume>=Ref(Volume,-1)*1.5 AND Close>MA(Close,MALookback) AND Volume>MA(Volume,VolLookback) ;
Short =Volume>=Ref(Volume,-1)*1.5 AND Close<MA(Close,MALookback) AND Volume>MA(Volume,VolLookback);
Cover = Buy; 
Sell=Short;
Buy = ExRem(Buy,Sell);
Sell = ExRem(Sell,Buy);
Short=ExRem(Short,Cover);
Cover=ExRem(Cover,Short);
printf("nBuy : " + Buy );  
printf("nSell : " + Sell );  
printf("nShort : " + Short );  
printf("nCover : " + Cover );  
printf("nVolume : " + Volume );  	
StopLoss=Param("SL",3,1,10,1);
Target=Param("Target",30,5,40,5);
ApplyStop(Type=0,Mode=1,Amount=StopLoss);
ApplyStop(Type=1,Mode=1,Amount=Target);
Plot( Close, "Price", colorWhite, styleCandle );
Plot(MA(Close,MALookback),"",colorYellow);
/* 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);
_SECTION_END();
				
			

AFL Screenshot

Backtest Report for the Volume Breakout Trading Strategy

Parameter Value
BankNifty
Initial Capital 200,000
Final Capital 1,973,764.04
Scrip Name NSE Banknifty
Backtest Period 25-Aug-2005 to 17-June-2016
Timeframe Daily
Net Profit % 886.88%
Annual Return % 23.09%
Number of Trades 78
Winning Trade % 37.18%
Average Holding Period 19.28 periods
Maximum Consecutive Losses 10
Maximum System % Drawdown -34.03%
Maximum Trade % Drawdown -75.56%

The backtest report reveals that the drawdown is relatively high. To mitigate this risk, you can implement effective Risk Management strategies. You can also download the comprehensive backtest report here.

Equity Curve

Volume-Breakout-Trading-Strategy-Equity-Curve

Profit Table

This volume breakout trading strategy has proven to be profitable in all years except for 2015 and 2012.

Volume-Breakout-Trading-Strategy-Profit-Table

Additional AmiBroker Settings for Backtesting

For more accurate backtesting, navigate to Symbol–>Information and specify the lot size and margin requirements. In the screenshot below, you can see a lot size of 40 and a margin requirement of 10% for NSE BankNifty:

2 Comments

Leave a Reply