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
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
Hi Rajandran,
Do we have back tested results for this, how have you found them, if you could please share.
Thanks for your efforts.
Yes we do have will share the reports shortly.
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
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);
sir i have amibroker 5.2. can u help by providing it for older version.
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.
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!
Yes it is different from supertrend afl code and code is proprietery of marketcalls.
fine, thanks. is it possible for you to share it with us?
Its proprietary of Marketcalls not for public download
Dear Sir,
Whenever you done new post for AFLs then please notify me by email given above
Can this afl be used as auto robo
Yes you can. But do some due diligence before trying out algo trading
Thank You Very Much Mr. Rajandran R Your AFL is Very Very Good…..
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
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.
HOW TRAILING SL WORKING THIS AFL SIR
ATUL KUMAR JAIN