PriceChannel_Stop_v1_1_.2
Download scriptThis script is designed to work as a technical analysis tool for trading platforms, specifically focused on identifying market trends and potential reversal points based on price action. Instead of using complex mathematical formulas that might confuse most users, it operates on the logic of "price channels" and "dynamic boundaries."
Core Concept: The Price Channel
The script looks at a specific window of time (defined by the user as the "Channel Period") to determine the highest and lowest prices reached. From these extremes, it establishes a range. Within this range, the script calculates a specific risk buffer—a safety zone that sits slightly above the lows or below the highs.
How the Trend is Determined
The logic functions like a tug-of-war between buyers and sellers:
- Upward Trend: If the market price closes above the calculated "high" boundary of the previous channel, the script identifies an upward trend.
- Downward Trend: If the price closes below the "low" boundary, it identifies a downward trend.
A key feature of this logic is its "memory." Once a trend is established, the boundaries adjust dynamically. If the market continues to move in the current direction, the script protects that trend by updating the boundaries so they don't flip prematurely unless the price makes a significant move against the prevailing direction.
Visual Signals and Alerts
The script translates these mathematical calculations into visual elements on your chart:
- Trend Lines: It draws continuous lines that act as dynamic support or resistance levels, showing you where the current trend "floor" or "ceiling" sits.
- Stop Markers: It identifies specific points (signals) where a trend might be shifting. When the logic detects a transition—for example, a shift from a downward sentiment to an upward one—it can trigger a visual change on the chart.
- Notifications: To ensure you don't have to stare at the screen constantly, the script includes a notification system. If it detects a confirmed trend reversal (a "Buy" or "Sell" signal) accompanied by active trading volume, it can trigger an audible alert or send a notification to your device.
Summary for the User
In plain terms, this tool acts as a "trend tracker." It automatically maps out the boundaries of price movement and highlights when the market is breaking out into a new direction. By following these boundaries and watching for the script's signal markers, traders can get a clearer picture of whether the market is currently leaning toward growth or decline.
//+------------------------------------------------------------------+
//| PriceChannel_Stop_v1.2.mq4 |
//| Copyright © 2006, Forex-TSD.com |
//| Written by IgorAD,igorad2003@yahoo.co.uk |
//| http://finance.groups.yahoo.com/group/TrendLaboratory |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link "http://www.forex-tsd.com/"
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_color5 Blue
#property indicator_color6 Red
//---- input parameters
extern int ChannelPeriod=6.5;
extern double Risk=0.30;
extern int Signal=1;
extern int Line=1;
extern int SoundAlertMode=0;
extern int SMSAlertMode=0;
extern int AlertTimes=1;
extern int Nbars=1000;
//---- indicator buffers
double UpTrendBuffer[];
double DownTrendBuffer[];
double UpTrendSignal[];
double DownTrendSignal[];
double UpTrendLine[];
double DownTrendLine[];
double trend[];
bool UpTrendAlert=false, DownTrendAlert=false;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- indicator line
IndicatorBuffers(7);
SetIndexBuffer(0,UpTrendBuffer);
SetIndexBuffer(1,DownTrendBuffer);
SetIndexBuffer(2,UpTrendSignal);
SetIndexBuffer(3,DownTrendSignal);
SetIndexBuffer(4,UpTrendLine);
SetIndexBuffer(5,DownTrendLine);
SetIndexBuffer(6,trend);
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,159);
SetIndexArrow(1,159);
SetIndexArrow(2,108);
SetIndexArrow(3,108);
//---- name for DataWindow and indicator subwindow label
short_name="PriceChannel_Stop_v1("+ChannelPeriod+")";
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,ChannelPeriod);
SetIndexDrawBegin(1,ChannelPeriod);
SetIndexDrawBegin(2,ChannelPeriod);
SetIndexDrawBegin(3,ChannelPeriod);
SetIndexDrawBegin(4,ChannelPeriod);
SetIndexDrawBegin(5,ChannelPeriod);
//----
return(0);
}
//+------------------------------------------------------------------+
//| PriceChannel_Stop_v1 |
//+------------------------------------------------------------------+
int start()
{
int i,shift;
double high, low, price;
double smax[30000],smin[30000],bsmax[30000],bsmin[30000];
string Message;
for (shift=Nbars-1;shift>=0;shift--)
{
UpTrendBuffer[shift]=EMPTY_VALUE;
DownTrendBuffer[shift]=EMPTY_VALUE;
UpTrendSignal[shift]=-1;
DownTrendSignal[shift]=-1;
UpTrendLine[shift]=EMPTY_VALUE;
DownTrendLine[shift]=EMPTY_VALUE;
trend[shift]=0;
}
for (shift=Nbars-ChannelPeriod-1;shift>=0;shift--)
{
high=High[shift]; low=Low[shift]; i=shift-1+ChannelPeriod;
while(i>=shift)
{
price=High[i];
if(high<price) high=price;
price=Low[i];
if(low>price) low=price;
i--;
}
smax[shift]=high;
smin[shift]=low;
bsmax[shift]=smax[shift]-(smax[shift]-smin[shift])*Risk;
bsmin[shift]=smin[shift]+(smax[shift]-smin[shift])*Risk;
trend[shift]=trend[shift+1];
if (Close[shift]>bsmax[shift+1]) {trend[shift]= 1; }
if (Close[shift]<bsmin[shift+1]) {trend[shift]=-1; }
if(trend[shift]>0 && bsmin[shift]<bsmin[shift+1]) bsmin[shift]=bsmin[shift+1];
if(trend[shift]<0 && bsmax[shift]>bsmax[shift+1]) bsmax[shift]=bsmax[shift+1];
if (trend[shift]>0)
{
if (Signal>0 && UpTrendBuffer[shift+1]==-1.0)
{
UpTrendSignal[shift]=bsmin[shift];
if(Line>0) UpTrendLine[shift]=bsmin[shift];
if (SoundAlertMode>0 && shift==0) PlaySound("alert2.wav");
}
else
{
UpTrendBuffer[shift]=bsmin[shift];
if(Line>0) UpTrendLine[shift]=bsmin[shift];
UpTrendSignal[shift]=-1;
}
if (Signal==2) UpTrendBuffer[shift]=0;
DownTrendBuffer[shift]=-1.0;
DownTrendLine[shift]=EMPTY_VALUE;
}
if (trend[shift]<0)
{
if (Signal>0 && DownTrendBuffer[shift+1]==-1.0)
{
DownTrendSignal[shift]=bsmax[shift];
if(Line>0) DownTrendLine[shift]=bsmax[shift];
if (SoundAlertMode>0 && shift==0) PlaySound("alert2.wav");
}
else
{
DownTrendBuffer[shift]=bsmax[shift];
if(Line>0)DownTrendLine[shift]=bsmax[shift];
DownTrendSignal[shift]=-1;
}
if (Signal==2) DownTrendBuffer[shift]=0;
UpTrendBuffer[shift]=-1.0;
UpTrendLine[shift]=EMPTY_VALUE;
}
//if ( trend[0]>0 && Close[2]<=bsmax[3] && Close[1]>bsmax[2] && Volume[0]>1 && !UpTrendAlert)
if ( trend[2]<0 && trend[1]>0 && Volume[0]>1 && !UpTrendAlert)
{
Message = " "+Symbol()+" M"+Period()+": Signal for BUY";
if ( SoundAlertMode>0 ) Alert (Message);
if ( SMSAlertMode>0 ) SendMail ("Signal from PriceChannel_Stop",TimeToStr(CurTime())+Message);
UpTrendAlert=true; DownTrendAlert=false;
}
//if ( trend[0]<0 && Close[2]>=bsmin[3] && Close[1]<bsmin[2] && Volume[0]>1 && !DownTrendAlert)
if ( trend[2]>0 && trend[1]<0 && Volume[0]>1 && !DownTrendAlert)
{
Message = " "+Symbol()+" M"+Period()+": Signal for SELL";
if ( SoundAlertMode>0 ) Alert (Message);
if ( SMSAlertMode>0 ) SendMail ("Signal from PriceChannel_Stop",TimeToStr(CurTime())+Message);
DownTrendAlert=true; UpTrendAlert=false;
}
}
return(0);
}
//+------------------------------------------------------------------+
Comments