VoltyChannel_Stop_v2.1
Download scriptThis script is a technical analysis tool designed to help traders identify market trends and potential entry or exit points by measuring price volatility. Instead of simply looking at where the price is, it calculates a "buffer zone" around the price action to determine if the market is moving with strength or if a trend has officially shifted.
How the Logic Works
1. Volatility Measurement The tool starts by calculating the current volatility of the market using an Average True Range (ATR) indicator. This tells the script how much the price typically moves in a given timeframe. It then creates a dynamic channel around the price based on this volatility, multiplied by a user-defined factor.
2. Trend Detection The script monitors the relationship between the current price and these volatility boundaries. It looks for specific "breakouts":
- If the price moves significantly above the upper boundary, the tool registers an Upward Trend.
- If the price drops significantly below the lower boundary, it registers a Downward Trend.
The logic allows for different ways to calculate these boundaries, such as using simple moving averages or looking at specific high/low price points, making it adaptable to different trading styles.
3. Dynamic Stop Levels (The "VoltyChannel") Once a trend is established, the script creates a visual "stop" line:
- In an Uptrend: It calculates a trailing support level. This line moves upward with the price but is designed to stay flat or move higher—it will never move downward. This helps traders stay in a winning trade as long as the trend remains intact.
- In a Downtrend: It calculates a trailing resistance level. This line moves downward with the price but will never move upward, serving as a visual guide for when to exit a short position.
4. Visual Signals and Alerts The tool provides three layers of feedback:
- Continuous Lines: Shows the current path of the trend and the "stop" level.
- Signal Markers: It places specific icons (arrows or dots) on the exact moment the trend switches from up to down (or vice versa).
- Notifications: If configured, the script can send an active alert notification to the trader the moment a trend reversal is detected, provided there is also trading volume present.
Summary for the User
In plain terms, this tool acts as a "smart" trailing stop. It automatically widens or narrows its boundaries based on how volatile the market is. It identifies when a trend has gained enough momentum to be considered "real" and provides a clear visual line that you can use to manage your risk by staying in the trade until the price crosses that dynamic boundary.
//+------------------------------------------------------------------+
//| VoltyChannel_Stop_v2.1.mq4 |
//| Copyright © 2007, TrendLaboratory |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//| E-mail: igorad2003@yahoo.co.uk |
//+------------------------------------------------------------------+
//2008fxtsd mod
#property copyright "Copyright © 2007, TrendLaboratory"
#property link "http://finance.groups.yahoo.com/group/TrendLaboratory"
//----
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Green
#property indicator_color4 Red
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1
#property indicator_width4 1
//---- input parameters
extern int MA_Price =6; //Applied Price: 0-C,1-O,2-H,3-L,4-Median,5-Typical,6-Weighted
extern int MA_Length =1; //MA's Period
extern int MA_Mode =0; //MA's Method:0-SMA,1-EMA,2-SMMA,3-LWMA
extern int ATR_Length =10;//ATR's Period
extern double Kv =1; //Volatility's Factor or Multiplier
extern double MoneyRisk =1; //Offset Factor
extern bool usePrice_HiLoBreak =false;
extern bool useMA_HiLoEnvelope =false;
extern int AlertMode =0; //0-alert off,1-on
extern int VisualMode =0; //0-lines,1-dots
extern string Applied_Price_ ="0-C,1-O,2-H,3-L,4-Median(H+L)/2,5-Typical(H+L+C)/3,6-Weighted(H+L+C+C)/4";
extern string MAmethod_mode_ ="0-SMA,1-EMA,2-SMMA,3-LWMA";
extern string Visual_Mode___ ="0-lines,1-dots ";
//---- indicator buffers
double UpBuffer[];
double DnBuffer[];
double UpSignal[];
double DnSignal[];
double smin[];
double smax[];
double trend[];
bool UpTrendAlert=false, DownTrendAlert=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
IndicatorBuffers(7);
SetIndexBuffer(0,UpBuffer);
SetIndexBuffer(1,DnBuffer);
SetIndexBuffer(2,UpSignal);
SetIndexBuffer(3,DnSignal);
SetIndexBuffer(4,smin);
SetIndexBuffer(5,smax);
SetIndexBuffer(6,trend);
//----
if(VisualMode==0)
{
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
}
else
{
SetIndexStyle(0,DRAW_ARROW);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(0,159);
SetIndexArrow(1,159);
}
//----
SetIndexStyle(2,DRAW_ARROW);
SetIndexStyle(3,DRAW_ARROW);
SetIndexArrow(2,108);
SetIndexArrow(3,108);
//---- name for DataWindow and indicator subwindow label
short_name="VoltyChannel_Stop("+MA_Length+","+ATR_Length+","+DoubleToStr(Kv,3)+")";
IndicatorShortName(short_name);
SetIndexLabel(0,"UpTrend");
SetIndexLabel(1,"DnTrend");
SetIndexLabel(2,"UpSignal");
SetIndexLabel(3,"DnSignal");
//----
SetIndexDrawBegin(0,MA_Length+ATR_Length);
SetIndexDrawBegin(1,MA_Length+ATR_Length);
SetIndexDrawBegin(2,MA_Length+ATR_Length);
SetIndexDrawBegin(3,MA_Length+ATR_Length);
//----
return(0);
}
//+------------------------------------------------------------------+
//| VoltyChannel_Stop_2 |
//+------------------------------------------------------------------+
int start()
{
int shift,limit, counted_bars=IndicatorCounted();
//----
if(counted_bars > 0) limit=Bars-counted_bars;
if(counted_bars < 0) return(0);
if(counted_bars ==0) limit=Bars-MA_Length-1;
for(shift=limit;shift>=0;shift--)
{
if(useMA_HiLoEnvelope)
{
double bprice=iMA(NULL,0,MA_Length,0,MA_Mode,2,shift);
double sprice=iMA(NULL,0,MA_Length,0,MA_Mode,3,shift);
}
else
{
bprice=iMA(NULL,0,MA_Length,0,MA_Mode,MA_Price,shift);
sprice=iMA(NULL,0,MA_Length,0,MA_Mode,MA_Price,shift);
}
smax[shift]=bprice + Kv*iATR(NULL,0,ATR_Length,shift);
smin[shift]=sprice - Kv*iATR(NULL,0,ATR_Length,shift);
trend[shift]=trend[shift+1];
if(usePrice_HiLoBreak)
{
if(High[shift] > smax[shift+1])trend[shift]= 1;
if(Low[shift] < smin[shift+1])trend[shift]=-1;
}
else
{
if(bprice > smax[shift+1])trend[shift]= 1;
if(sprice < smin[shift+1])trend[shift]=-1;
}
if(trend[shift] >0)
{
if(smin[shift] < smin[shift+1]) smin[shift]=smin[shift+1];
UpBuffer[shift]=smin[shift] - (MoneyRisk - 1)*iATR(NULL,0,ATR_Length,shift);
if(UpBuffer[shift] < UpBuffer[shift+1] && UpBuffer[shift+1]!=EMPTY_VALUE) UpBuffer[shift]=UpBuffer[shift+1];
if(trend[shift+1]!=trend[shift]) UpSignal[shift]=UpBuffer[shift];
else UpSignal[shift]=EMPTY_VALUE;
DnBuffer[shift]=EMPTY_VALUE;
DnSignal[shift]=EMPTY_VALUE;
}
else
if(trend[shift] <0)
{
if(smax[shift]>smax[shift+1]) smax[shift]=smax[shift+1];
DnBuffer[shift]=smax[shift] + (MoneyRisk - 1)*iATR(NULL,0,ATR_Length,shift);
if(DnBuffer[shift] > DnBuffer[shift+1]) DnBuffer[shift]=DnBuffer[shift+1];
if(trend[shift+1]!=trend[shift]) DnSignal[shift]=DnBuffer[shift];
else DnSignal[shift]=EMPTY_VALUE;
UpBuffer[shift]=EMPTY_VALUE;
UpSignal[shift]=EMPTY_VALUE;
}
}
//----
string Message;
if(trend[2]<0 && trend[1]>0 && Volume[0]>1 && !UpTrendAlert)
{
Message=" "+Symbol()+" M"+Period()+": VCS Signal for BUY";
if(AlertMode>0)Alert (Message);
UpTrendAlert=true; DownTrendAlert=false;
}
if(trend[2]>0 && trend[1]<0 && Volume[0]>1 && !DownTrendAlert)
{
Message=" "+Symbol()+" M"+Period()+": VCS Signal for SELL";
if(AlertMode>0)Alert (Message);
DownTrendAlert=true; UpTrendAlert=false;
}
//----
return(0);
}
//+------------------------------------------------------------------+
Comments