BBands_Stop_v1_with alert

Download script
Author: Copyright � 2006, TrendLaboratory Ltd.
BBands_Stop_v1_with alert

This technical indicator is designed to identify and visualize trend directions and potential entry/exit points on a financial chart. It operates by leveraging the logic of Bollinger Bands—a common market analysis tool—but adds a specialized "Stop" mechanism to help traders define specific price levels for their positions.

Core Logic Overview

The script functions by constantly monitoring the relationship between the current market price and the outer boundaries of the Bollinger Bands. It looks for moments where the price breaks out beyond these boundaries to determine if a new trend is forming.

  • Trend Detection: The tool identifies an "Up Trend" when the closing price moves above the upper band, and a "Down Trend" when it drops below the lower band.
  • Dynamic Stop Levels: Unlike standard Bollinger Bands which fluctuate constantly, this script implements a "trailing" logic. When a trend is active, the indicator tracks the highest or lowest boundary reached during that move. It creates a safety line (a "Stop" level) that only moves in favor of the trader, ensuring that if the market remains in a trend, the stop level stays at a protective level without moving backward.
  • Risk Adjustment: The logic includes an "Offset Factor." This allows users to mathematically expand or contract the distance between the identified trend boundary and the calculated stop line, providing a customizable buffer based on the user's specific risk tolerance.

Visual and Notification Features

The script is designed to communicate information to the trader through three main channels:

  1. Visual Signals: It places specific arrows or markers on the chart to signal the exact moment a trend shifts (e.g., switching from an upward move to a downward move).
  2. Trend Lines: Depending on user settings, it can draw continuous lines that represent the current "Stop" level, allowing traders to see exactly where their exit point sits in real-time as the price moves.
  3. Active Alerts: The system features a multi-channel notification suite. When a new trend signal is detected, the script can simultaneously trigger:
    • Pop-up Alerts: On-screen messages with the current price and time.
    • Audio Notifications: A sound file to grab the trader's attention.
    • Email Alerts: Automated messages sent to a designated email address for traders who are monitoring the markets remotely.

Summary of Behavior

Essentially, this script automates the "watching" process. It identifies when price momentum breaks out of its normal range, calculates a trailing protective boundary based on that momentum, and notifies the user immediately when the market structure changes from bullish to bearish (or vice versa).

Price Data Components
Series array that contains open time of each bar
Indicators Used
Bollinger bands indicator
Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screenIt sends emailsIt plays sound alerts
10 Views
0 Downloads
0 Favorites
BBands_Stop_v1_with alert
//+------------------------------------------------------------------+
//|                                               BBands_Stop_v1.mq4 |
//|                           Copyright © 2006, TrendLaboratory Ltd. |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                       E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, TrendLaboratory Ltd."
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 RoyalBlue
#property indicator_color2 Red
#property indicator_color3 RoyalBlue
#property indicator_color4 Red
#property indicator_color5 RoyalBlue
#property indicator_color6 Red





extern int    Length        = 20;        // Bollinger Bands Period
extern int    Deviation     = 1;         // Deviation was 2
extern double MoneyRisk     = 1.00;      // Offset Factor
extern int    Signal        = 1;         // Display signals mode: 1-Signals & Stops; 0-only Stops; 2-only Signals;
extern int    Line          = 1;         // Display line mode: 0-no,1-yes  
extern int    Nbars         = 2000;

extern string note13        = "turn on soundAlert = true; turn off = false";
extern bool   SoundON       = true;

extern string note15        = "send Email Alert = true; turn off = false";
extern bool   EmailON       = false;

extern string note17        = "turn on Alert = true; turn off = false";
extern bool   AlertON       = true;
extern string SoundFileName = "alert.wav";




//---- 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,0,1);
   SetIndexStyle(1,DRAW_ARROW,0,1);
   SetIndexStyle(2,DRAW_ARROW,0,1);
   SetIndexStyle(3,DRAW_ARROW,0,1);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexStyle(5,DRAW_LINE);
   SetIndexArrow(0,159);
   SetIndexArrow(1,159);
   SetIndexArrow(2,233);
   SetIndexArrow(3,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 (shift==0 && !TurnedUp)
        {
        if (AlertON) Alert(" BBands going Up at Ask=",Ask,"\n Bid=",Bid,"\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
        if (EmailON) SendMail("BBands going Up","Buy signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
        if (SoundON) PlaySound(SoundFileName);
        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 (shift==0 && !TurnedDown)
         {
        if (AlertON) Alert(" BBands going Down on at Ask=",Ask,"\n Bid=",Bid,"\n Time=",TimeToStr(CurTime(),TIME_DATE)," ",TimeHour(CurTime()),":",TimeMinute(CurTime()),"\n Symbol=",Symbol()," Period=",Period());
        if (EmailON) SendMail("BBands going Down on","Sell signal at Ask="+DoubleToStr(Ask,4)+", Bid="+DoubleToStr(Bid,4)+", Date="+TimeToStr(CurTime(),TIME_DATE)+" "+TimeHour(CurTime())+":"+TimeMinute(CurTime())+" Symbol="+Symbol()+" Period="+Period());
        if (SoundON) PlaySound(SoundFileName);
        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