BBands_Stop_v1_with alert
Download scriptThis 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:
- 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).
- 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.
- 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).
//+------------------------------------------------------------------+
//| 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