Rajandran R Creator of OpenAlgo - OpenSource Algo Trading framework for Indian Traders. Building GenAI Applications. Telecom Engineer turned Full-time Derivative Trader. Mostly Trading Nifty, Banknifty, High Liquid Stock Derivatives. Trading the Markets Since 2006 onwards. Using Market Profile and Orderflow for more than a decade. Designed and published 100+ open source trading systems on various trading tools. Strongly believe that market understanding and robust trading frameworks are the key to the trading success. Building Algo Platforms, Writing about Markets, Trading System Design, Market Sentiment, Trading Softwares & Trading Nuances since 2007 onwards. Author of Marketcalls.in

Bollinger Band Based Trailing Stop Loss – Amibroker

5 min read

BBand TSL or Bollinger Band based Trailing stop loss trading is once again a mechanical trend trading system for lower timeframes inspired by mql4 (Metatrader). The trailing stop-loss method is completely built using bollinger bands and completely fits for stop and reverse strategy.

Indications
1)The green line indicates a trailing stop for long
2)The Red line indicates a trailing stop for shorts
3)The Green Arrow indicates long
4)The Red Arrow indicates shorts

DLF Futures
[DLF Futures 10min charts]

Features
1)Trailing Stoploss Lines
2)Buy/Sell Signal Added
3)Magnified Market Price at the right top corner
4)Time left counter to identify the end of the candle
5) Non-Repainting – Arrows will form only after the end of the candle. No arrows will disappear once the signal is formed.

Recommended Timeframes
5min/10min,15min. Don’t try with higher timeframes as an increase in timeframe will increase the risk in this particular trading strategy. And moreover, it is a carryforward strategy and not a perfect intraday strategy though. But work pretty well in a high volatile environment.

Bollinger Band TSL – Amibroker AFL Code

/* Done      by    Rajandran R */
/* Founder of www.marketcalls.in  */
/* CoFounder www.algomojo.com */
/* Code Completion Date : 15th Apr 2013 */


_SECTION_BEGIN("BBand TSL");

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);


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

per=Optimize("Period",30, 5,50,1);

se = StdErr(C,per);

Bbup = BBandTop(C,per)+se;
Bbdown =BBandbot(C,per)-se;

MoneyRisk = 1.0;
iSignal = 1;
Line = 1;
Trend=0;
TrendUp=Null;
TrendDown=Null;
sig=Null;

g_ibuf_108 = 0;
g_ibuf_112 = 0;
g_ibuf_116 = 0;
g_ibuf_120 = 0;
iUp = Null;
iDown = Null;



   for(i=1;i<BarCount;i++) {

      if (Close[i] > Bbup[i - 1]) Trend = 1;
      if (Close[i] < Bbdown[i - 1]) Trend = -1;
      if (Trend > 0 && Bbdown[i] < Bbdown[i - 1]) Bbdown[i] = Bbdown[i - 1];
      if (Trend < 0 && Bbup[i] > Bbup[i - 1]) Bbup[i] = Bbup[i - 1];
      TrendUp[i] = Bbup[i] + (MoneyRisk - 1.0) / 2.0 * (Bbup[i] - Bbdown[i]);
      TrendDown[i] = Bbdown[i] - (MoneyRisk - 1.0) / 2.0 * (Bbup[i] - Bbdown[i]);
      if (Trend > 0 && TrendDown[i] < TrendDown[i - 1]) TrendDown[i] = TrendDown[i - 1];
      if (Trend < 0 && TrendUp[i] > TrendUp[i - 1]) TrendUp[i] = TrendUp[i - 1];
      if (Trend > 0) {
         if (sig > 0 && g_ibuf_108[i - 1] == -1.0) {
            g_ibuf_116[i] = TrendDown[i];
            g_ibuf_108[i] = TrendDown[i];
            if (Line > 0) iUp[i] = TrendDown[i];
         } else {
            g_ibuf_108[i] = TrendDown[i];
            if (Line > 0) iUp[i] = TrendDown[i];
            g_ibuf_116[i] = -1;
         }
         if (sig == 2) g_ibuf_108[i] = 0;
         g_ibuf_120[i] = -1;
         g_ibuf_112[i] = -1.0;
         iDown[i] = Null;
      }
      if (Trend < 0) {
         if (sig > 0 && g_ibuf_112[i - 1] == -1.0) {
            g_ibuf_120[i] = TrendUp[i];
            g_ibuf_112[i] = TrendUp[i];
            if (Line > 0) iDown[i] = TrendUp[i];
         } else {
            g_ibuf_112[i] = TrendUp[i];
            if (Line > 0) iDown[i] = TrendUp[i];
            g_ibuf_120[i] = -1;
         }
         if (sig == 2) g_ibuf_112[i] = 0;
         g_ibuf_116[i] = -1;
         g_ibuf_108[i] = -1.0;
         iUp[i] = Null;
      }
   }




Plot(iUp,"iUP",colorGreen,ParamStyle("Style", styleDots | styleNoLine, maskDefault | styleDots | styleNoLine ));

Plot(iDown,"iDown",colorRed,ParamStyle("Style", styleDots | styleNoLine, maskDefault | styleDots | styleNoLine ));


Buy = iUp>0;
Sell= iDown>0;

Buy=ExRem(Buy,Sell);

Sell=ExRem(Sell,Buy);

Short=Sell;

Cover=Buy;

//Non Repainting  - Signals happens only after the close of the current
Buy = Ref(Buy,-1);
Sell = Ref(Sell,-1);
Short = Ref(Short,-1);
Cover = Ref(Cover,-1);


SetTradeDelays(0,0,0,0);


BuyPrice=ValueWhen(Buy,open);

SellPrice=ValueWhen(Sell,open);

ShortPrice=ValueWhen(Short,open);

CoverPrice=ValueWhen(Cover,open);




BuyPrice=ValueWhen(Buy,C);

SellPrice=ValueWhen(Sell,C);

ShortPrice=ValueWhen(Short,C);

CoverPrice=ValueWhen(Cover,C);





Title = EncodeColor(colorWhite)+ "BBand TSL AFL code from www.marketcalls.in" + " - " +  Name() + " - " + EncodeColor(colorRed)+ Interval(2) + EncodeColor(colorWhite) +

 "  - " + Date() +" - "+"\n" +EncodeColor(colorRed) +"Op-"+O+"  "+"Hi-"+H+"  "+"Lo-"+L+"  "+

"Cl-"+C+"  "+ "Vol= "+ WriteVal(V)+"\n"+ 

EncodeColor(colorLime)+

WriteIf (Buy , " GO LONG / Reverse sig at "+C+"  ","")+

WriteIf (Sell , " EXIT LONG / Reverse sig at "+C+"  ","")+"\n"+EncodeColor(colorYellow)+

WriteIf(Sell , "Total Profit/Loss for the Last Trade Rs."+(C-BuyPrice)+"","")+

WriteIf(Buy  , "Total Profit/Loss for the Last trade Rs."+(SellPrice-C)+"","");



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(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);



TrendSL=IIf(C>iUp,iUp,iDown);


for(i=BarCount-1;i>1;i--)

{

if(Buy[i] == 1)

{

entry = C[i];

sig = "BUY";

sl = TrendSL[i];

STP = C[i]-0.004*BuyPrice[i];

tar1 = entry + (entry * .0050);

tar2 = entry + (entry * .0078);

tar3 = entry + (entry * .01);

 

bars = i;

i = 0;

}

if(Sell[i] == 1)

{

sig = "SELL";

entry = C[i];

sl = TrendSL[i];

STP = C[i]+0.004*SellPrice[i];

tar1 = entry - (entry * .0050);

tar2 = entry - (entry * .0078);

tar3 = entry - (entry * .01);

 

 

bars = i;

i = 0;

}

}

Offset = 20;

Clr = IIf(sig == "BUY", colorLime, colorRed);

ssl = IIf(bars == BarCount-1, TrendSL[BarCount-1], Ref(TrendSL, -1));

sl = ssl[BarCount-1];

 



//Plot(LineArray(bars-Offset, tar1, BarCount, tar1,1), "", Clr, styleLine|styleDots, Null, Null, Offset);

//Plot(LineArray(bars-Offset, tar2, BarCount, tar2,1), "", Clr, styleLine|styleDots, Null, Null, Offset);

//Plot(LineArray(bars-Offset, tar3, BarCount, tar3,1), "", Clr, styleLine|styleDots, Null, Null, Offset);

//Plot(LineArray(bars-Offset, STP, BarCount, STP,1), "", colorYellow, styleLine|styleDots, Null, Null, Offset);




//Plot(LineArray(bars-Offset, sl, BarCount, sl,1), "", colorDarkRed, styleLine|styleLine, Null, Null, Offset);

//Plot(LineArray(bars-Offset, entry, BarCount, entry,1), "", colorGreen, styleLine|styleLine, Null, Null, Offset);



/* 

for (i=bars; i <BarCount;i++)

{

PlotText(""+sig+"@"+entry, BarCount-5,entry,Null,colorBlue);

PlotText("T1@"+tar1,BarCount-5,tar1,Null,Clr);PlotText("T2@"+tar2,BarCount-5,tar2,Null,Clr);PlotText ("T3@"+tar3,BarCount-5,tar3,Null,Clr);

 

}*/

 

messageboard = ParamToggle("Message Board","Show|Hide",1);

if (messageboard == 1 )

{

GfxSelectFont( "Tahoma", 13, 100 );

GfxSetBkMode( 1 );

GfxSetTextColor( colorWhite );

 

if ( sig =="BUY")

{

GfxSelectSolidBrush( colorBlue ); // this is the box background color

}

else

{

GfxSelectSolidBrush( colorRed ); // this is the box background color

}

pxHeight = Status( "pxchartheight" ) ;

xx = Status( "pxchartwidth");

Left = 1100;

width = 310;

x = 5;

x2 = 290;

 

y = pxHeight;

 

GfxSelectPen( colorGreen, 1); // broader color

GfxRoundRect( x, y - 98, x2, y , 7, 7 ) ;

GfxTextOut( ( "Marketcalls - BBand TSL"),13,y-100);

GfxTextOut( (" "),27,y-100);

GfxTextOut( ("Last " + sig + " Signal came " + (BarCount-bars-1) * Interval()/60 + " mins ago"), 13, y-80) ; // The text format location

GfxTextOut( ("" + WriteIf(sig =="BUY",sig + " @ ",sig + " @") + " : " + entry), 13, y-60);

GfxTextOut( ("Trailing SL : " + Ref(TrendSL,-1) + " (" + WriteVal(IIf(sig == "SELL",entry-sl,sl-entry), 2.2) + ")"), 13, y-40);

/*GfxTextOut( ("TGT:1 : " + tar1), 13, y -80);

GfxTextOut( ("TGT:2 : " + tar2), 13,y-60);

GfxTextOut( ("TGT:3 : " + tar3), 13,y-40);*/

GfxTextOut( ("Current P/L : " + WriteVal(IIf(sig == "BUY",(C-entry),(entry-C)),2.2)), 13, y-22);;









//Magfied Market Price

FS=Param("Font Size",30,11,100,1);

GfxSelectFont("Times New Roman", FS, 700, True ); 

GfxSetBkMode( colorWhite );  

GfxSetTextColor( ParamColor("Color",colorGreen) ); 

Hor=Param("Horizontal Position",940,1,1200,1);

Ver=Param("Vertical Position",12,1,830,1); 

GfxTextOut(""+C, Hor , Ver );

YC=TimeFrameGetPrice("C",inDaily,-1);

DD=Prec(C-YC,2);

xx=Prec((DD/YC)*100,2);

GfxSelectFont("Times New Roman", 11, 700, True ); 

GfxSetBkMode( colorBlack );  

GfxSetTextColor(ParamColor("Color",colorYellow) ); 

GfxTextOut(""+DD+"  ("+xx+"%)", Hor , Ver+45 );

 

}



_SECTION_END();



_SECTION_BEGIN("Time Left");

function GetSecondNum()

{

Time = Now( 4 );

Seconds = int( Time % 100 );

Minutes = int( Time / 100 % 100 );

Hours = int( Time / 10000 % 100 );

SecondNum = int( Hours * 60 * 60 + Minutes * 60 + Seconds );

return SecondNum;

}

RequestTimedRefresh( 1 );

TimeFrame = Interval();

SecNumber = GetSecondNum();

Newperiod = SecNumber % TimeFrame == 0;

SecsLeft = SecNumber - int( SecNumber / TimeFrame ) * TimeFrame;

SecsToGo = TimeFrame - SecsLeft;



x=Param("xposn",50,0,1000,1);

y=Param("yposn",380,0,1000,1);



GfxSelectSolidBrush( ColorRGB( 230, 230, 230 ) );

GfxSelectPen( ColorRGB( 230, 230, 230 ), 2 );

if ( NewPeriod )

{

GfxSelectSolidBrush( colorYellow );

GfxSelectPen( colorYellow, 2 );

Say( "New period" );

}

//GfxRoundRect( x+45, y+40, x-3, y-2, 0, 0 );

//GfxSetBkMode(1);

GfxSelectFont( "Arial", 14, 700, False );

GfxSetTextColor( colorRed );

GfxTextOut( "Time Left :"+SecsToGo+"", x, y );

_SECTION_END(); 

Steps to Install
1)Download BBand TSL Trading System for Amibroker
2)Copy Bollinger-Band-Trailing-Stop-Loss-Trading-System.afl file to \program files\amibroker\formula\basic folder
3)Open Amibroker and Open a New Blank Chart
4)Goto Charts->Basic Charts and apply/drag-and-drop the BBand TSL Trading System code into the blank chart
5)Bingo you are done. Now you will be able to see the BBand TSL Trading System indicator with Buy and Sell signals.

Compatibility
Amibroker 5.5 and above

Rajandran R Creator of OpenAlgo - OpenSource Algo Trading framework for Indian Traders. Building GenAI Applications. Telecom Engineer turned Full-time Derivative Trader. Mostly Trading Nifty, Banknifty, High Liquid Stock Derivatives. Trading the Markets Since 2006 onwards. Using Market Profile and Orderflow for more than a decade. Designed and published 100+ open source trading systems on various trading tools. Strongly believe that market understanding and robust trading frameworks are the key to the trading success. Building Algo Platforms, Writing about Markets, Trading System Design, Market Sentiment, Trading Softwares & Trading Nuances since 2007 onwards. Author of Marketcalls.in

OpenAlgo Now Supports AmiQuotes for Seamless Amibroker Updates

We are excited to announce that OpenAlgo now supports AmiQuotes, making it easier than ever to update live trading data in Amibroker. This powerful...
Rajandran R
2 min read

Visualizing Intraday PNL with Amibroker AFL

Intraday traders often rely on quick decision-making supported by robust analytics. Tracking intraday profit and loss (PNL) in real-time can provide traders with essential...
Rajandran R
5 min read

CUSUM Filter Strategy in AmiBroker AFL: A Practical Implementation

Detecting meaningful shifts in price trends while filtering out market noise is a challenge many traders face. Inspired by Jakub Polec’s blog, which applies...
Rajandran R
2 min read

17 Replies to “Bollinger Band Based Trailing Stop Loss – Amibroker”

  1. Hi Rajandran,

    Do we have back tested results for this, how have you found them, if you could please share.

    Thanks for your efforts.

  2. Hi Rajendra,

    I am not able to do the backtest with the given AFL code. If possible can u please do the needful changes to AFL to do the back testing.

    Thanks
    Ravi

    1. Hi,

      Try adding the following code to the top of afl if you wanna test with 100 shares every time. Very the numbers and make sure you understand the backtesting with futures correctly.
      setpositionsize(100,spsshares);

    1. Hi Ajay,

      Most of the Graphics functions are not supported by 5.2 and it is quite meanigless to implement this indicator without dashboard. If you want to build the indicates remove all the codes below the plotshapes function. That makes the indicator to work but not the dashboard functions and timeleft features.

  3. hi rajandran, i don’t understand why my comments are not accepted by you but this is for the third time i’m asking you the same question. on your eod signals page, hourly chart shows “intra trend afl code”. so, can you please tell me is it different than “super trend afl”? thanks!

  4. Dear Sir,
    Whenever you done new post for AFLs then please notify me by email given above

  5. Hi Rajendra,

    I am not able to do the custom indicator save with won password in amibroker with the given AFL code. If possible can u please do the halp this matter.

    Thanks
    Subhankar

  6. Dear Rajendran , just now i saw ur site. tomorrow i wll see live. But any how thank u vry much dear.
    May God bless u and ur family too.

Leave a Reply

Get Notifications, Alerts on Market Updates, Trading Tools, Automation & More