Author: Copyright � 2006-07, TrendLaboratory Ltd.
BBandsStop

This script is a specialized technical analysis tool designed to identify market trends and provide visual trailing stop-loss levels based on the Bollinger Bands indicator. Instead of just showing standard price volatility, it focuses on tracking "breakout" momentum to help traders manage their risk during sustained moves.

Core Logic Overview

The logic operates by monitoring two main components: Price Action relative to Bollinger Bands and a "Trailing" mechanism that ensures stop-loss levels only move in your favor.

1. Trend Identification The script constantly watches the relationship between the current market price and the upper/lower Bollinger Bands.

  • Uptrend: Triggered when the price closes above the upper band.
  • Downtrend: Triggered when the price closes below the lower band.

2. Dynamic Stop-Loss Calculation Once a trend is established, the script calculates a "Buffer Zone" (an offset). This isn't just a flat distance; it uses a mathematical formula that adjusts based on the current width of the Bollinger Bands. This means the stop-loss gap widens when the market is volatile and narrows when the market is calm, attempting to adapt to changing market conditions automatically.

3. The "Ratchet" Mechanism (Trailing Logic) A key feature of this logic is that it prevents the stop-loss from moving backward.

  • In an Uptrend, the script tracks the lowest point reached by the calculated stop level. It will only move upward as the price advances; if the price pulls back slightly, the stop remains at its highest historical point.
  • In a Downtrend, it tracks the highest point reached by the stop level, moving downward as the price drops and "locking in" gains by refusing to move back up.

4. Visual Signals and Alerts The script communicates these findings to the user through several visual layers:

  • Trend Lines: Continuous lines that show the current "safe" level for your position.
  • Directional Arrows/Dots: Specific markers that highlight the exact moment a trend flips (e.g., moving from an uptrend to a downtrend).
  • Alert System: The script can be configured to provide real-time notifications via sound or email the moment a trend reversal is detected, allowing for quicker reactions.

Summary for the User

Essentially, this tool acts as an automated "safety net." It identifies when a strong move has started, calculates a smart distance for a stop-loss based on current volatility, and then "traps" your profits by ensuring that the protective line only moves in your favor as the trend progresses.

Indicators Used
Bollinger bands indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt sends emails
16 Views
0 Downloads
0 Favorites
BBandsStop
//+------------------------------------------------------------------+
//|                                               BBands_Stop_v1.mq4 |
//|                        Copyright © 2006-07, TrendLaboratory Ltd. |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                       E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006-07, TrendLaboratory Ltd."
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Lime //uptrend dots
#property indicator_width1 2
#property indicator_color2 Magenta //downtrend dots
#property indicator_width2 2
#property indicator_color3 LawnGreen // uptrend arrow
#property indicator_width3 3
#property indicator_color4 OrangeRed // downtrend arrow
#property indicator_width4 3
#property indicator_color5 DarkGreen //uptrend line
#property indicator_width5 1
#property indicator_color6 Red //downtrend line
#property indicator_width6 1
//---- input parameters
extern string note1 = "Bollinger Bands Period";
extern int    Length=15;      // Bollinger Bands Period
extern string note2 = "Bollinger Bands Deviation";
extern double    Deviation=2.0;    // Deviation was 2
extern string note3 = "Offset Factor";
extern double MoneyRisk=1.00; // Offset Factor
extern string note4 = "1-Signals & Stops; 0-only Stops";
extern string note5 = "2-only Signals";
extern int    Signal=1;       // Display signals mode: 1-Signals & Stops; 0-only Stops; 2-only Signals;
extern string note6 = "Display line mode: 0-no,1-yes";
extern int    Line=1;         // Display line mode: 0-no,1-yes  
extern int    Nbars=2000;
extern string note7 = "use WingDings font";
extern int    ArrowUpSymbol=221;
extern int    ArrowDownSymbol=222;
extern int    DotUpSymbol=159;
extern int    DotDownSymbol=159;
extern string note8 = "Sound Alert = true; turn off = false";
extern bool SoundON=false;
extern string note9 = "Email Alert = true; turn off = false";
extern bool BBEmailAlert=false;
//---- indicator buffers
double UpTrendBuffer[];
double DownTrendBuffer[];
double UpTrendSignal[];
double DownTrendSignal[];
double UpTrendLine[];
double DownTrendLine[];
bool TurnedUp = false;
bool TurnedDown = false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  int init()
  {
   string short_name;
//---- indicator line
   
   SetIndexBuffer(0,UpTrendBuffer);
   SetIndexBuffer(1,DownTrendBuffer);
   SetIndexBuffer(2,UpTrendSignal);
   SetIndexBuffer(3,DownTrendSignal);
   SetIndexBuffer(4,UpTrendLine);
   SetIndexBuffer(5,DownTrendLine);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexArrow(0,DotUpSymbol);
   SetIndexArrow(1,DotDownSymbol);
   SetIndexArrow(2,ArrowUpSymbol); //233
   SetIndexArrow(3,ArrowDownSymbol); //234
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
//---- name for DataWindow and indicator subwindow label
   short_name="BBands Stop("+Length+","+Deviation+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"UpTrend Stop");
   SetIndexLabel(1,"DownTrend Stop");
   SetIndexLabel(2,"UpTrend Signal");
   SetIndexLabel(3,"DownTrend Signal");
   SetIndexLabel(4,"UpTrend Line");
   SetIndexLabel(5,"DownTrend Line");
//----
   SetIndexDrawBegin(0,Length);
   SetIndexDrawBegin(1,Length);
   SetIndexDrawBegin(2,Length);
   SetIndexDrawBegin(3,Length);
   SetIndexDrawBegin(4,Length);
   SetIndexDrawBegin(5,Length);
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| Bollinger Bands_Stop_v1                                             |
//+------------------------------------------------------------------+
int start()
  {
   int    i,shift,trend;
   double smax[25000],smin[25000],bsmax[25000],bsmin[25000];
   
   for (shift=Nbars;shift>=0;shift--)
   {
   UpTrendBuffer[shift]=0;
   DownTrendBuffer[shift]=0;
   UpTrendSignal[shift]=0;
   DownTrendSignal[shift]=0;
   UpTrendLine[shift]=EMPTY_VALUE;
   DownTrendLine[shift]=EMPTY_VALUE;
   }
   
   for (shift=Nbars-Length-1;shift>=0;shift--)
   {	
     smax[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_UPPER,shift);
	  smin[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_LOWER,shift);
	
	  if (Close[shift]>smax[shift+1]) trend=1; 
	  if (Close[shift]<smin[shift+1]) trend=-1;
		 	
	  if(trend>0 && smin[shift]<smin[shift+1]) smin[shift]=smin[shift+1];
	  if(trend<0 && smax[shift]>smax[shift+1]) smax[shift]=smax[shift+1];
	  	  
	  bsmax[shift]=smax[shift]+0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);
	  bsmin[shift]=smin[shift]-0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);
		
	  if(trend>0 && bsmin[shift]<bsmin[shift+1]) bsmin[shift]=bsmin[shift+1];
	  if(trend<0 && bsmax[shift]>bsmax[shift+1]) bsmax[shift]=bsmax[shift+1];
	  
	  if (trend>0) 
	  {
	     if (Signal>0 && UpTrendBuffer[shift+1]==-1.0)
	     {
	     UpTrendSignal[shift]=bsmin[shift];
	     UpTrendBuffer[shift]=bsmin[shift];
	     if(Line>0) UpTrendLine[shift]=bsmin[shift];
     if ((SoundON==true && shift==0 && !TurnedUp) || (BBEmailAlert==true && shift==0 && !TurnedUp))
         {
          Alert("BBands going Up on ",Symbol(),"-",Period());
          if (BBEmailAlert) SendMail("BBands going Up on ",Symbol()+"-"+Period());
          TurnedUp = true;
          TurnedDown = false;
     }
	     }
	     else
	     {
	     UpTrendBuffer[shift]=bsmin[shift];
	     if(Line>0) UpTrendLine[shift]=bsmin[shift];
	     UpTrendSignal[shift]=-1;
	     }
	  if (Signal==2) UpTrendBuffer[shift]=0;   
	  DownTrendSignal[shift]=-1;
	  DownTrendBuffer[shift]=-1.0;
	  DownTrendLine[shift]=EMPTY_VALUE;
	  }
	  if (trend<0) 
	  {
	  if (Signal>0 && DownTrendBuffer[shift+1]==-1.0)
	     {
	     DownTrendSignal[shift]=bsmax[shift];
	     DownTrendBuffer[shift]=bsmax[shift];
	     if(Line>0) DownTrendLine[shift]=bsmax[shift];
     if ((SoundON==true && shift==0 && !TurnedDown) || (BBEmailAlert==true && shift==0 && !TurnedDown))
         {
          Alert("BBands going Down on ",Symbol(),"-",Period());
          if (BBEmailAlert) SendMail("BBands going Down on ",Symbol()+"-"+Period());
          TurnedDown = true;
          TurnedUp = false;
     }
	     }
	     else
	     {
	     DownTrendBuffer[shift]=bsmax[shift];
	     if(Line>0)DownTrendLine[shift]=bsmax[shift];
	     DownTrendSignal[shift]=-1;
	     }
	  if (Signal==2) DownTrendBuffer[shift]=0;    
	  UpTrendSignal[shift]=-1;
	  UpTrendBuffer[shift]=-1.0;
	  UpTrendLine[shift]=EMPTY_VALUE;
	  }
	  
	 }
	return(0);	
 }

Comments