PriceChannel_Stop_v1_v3

Download script
PriceChannel_Stop_v1_v3

This tool is designed to identify market trends and provide clear visual boundaries for price action on a trading chart. Rather than just following every small fluctuation in price, the logic focuses on establishing "channels" that define the momentum of the market.

Core Mechanism

The script operates by analyzing a specific window of recent historical data (defined by the "Channel Period"). Within this window, it identifies the highest and lowest prices reached. It then uses these extremes to calculate a dynamic risk zone.

Think of this as creating a "box" around recent price movement. Based on the user-defined risk percentage, the script calculates specific safety boundaries—upper and lower limits—that represent the current swing of the market.

Trend Identification

The logic determines the market trend by comparing the current closing price against the boundaries established in the previous period:

  • Upward Trend: If the price closes above the calculated upper boundary, the system recognizes bullish momentum.
  • Downward Trend: If the price closes below the calculated lower boundary, the system recognizes bearish momentum.

To keep the trend stable and avoid "choppy" signals, the script includes a memory feature. Once a trend is established, the boundaries are locked in a way that they can only move in the direction of the trend. This prevents the boundaries from retreating significantly against the current momentum, ensuring that the support or resistance levels remain robust.

Visual Output

The script translates this logic into four distinct types of visual information on your chart:

  • Trend Lines: These provide a continuous visual guide showing the active "floor" for an uptrend or the "ceiling" for a downtrend. They act as moving markers to show where the price is currently supported or resisted.
  • Stop Levels: The script identifies specific points where the trend might be considered broken. These serve as logical areas where a trader might consider taking profit or tightening their risk.
  • Signal Markers: Depending on the settings, the script can highlight specific transition points. It distinguishes between the continuous path of the trend and the specific moments where the signal originates.

Summary for the User

Essentially, this tool filters out market "noise." It looks at a block of time to see where the price has traveled, calculates a risk-based boundary based on that travel, and draws clear lines to show you which way the market is leaning. It helps you stay on the right side of the trend by showing you exactly where the "breaking point" of that trend lies.

Miscellaneous
Implements a curve of type %1
11 Views
0 Downloads
0 Favorites
PriceChannel_Stop_v1_v3
//+------------------------------------------------------------------+
//|                                         PriceChannel_Stop_v1.mq4 |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Aqua
#property indicator_width1 1
#property indicator_color2 Magenta
#property indicator_width2 1
#property indicator_color3 Aqua
#property indicator_width3 3
#property indicator_color4 Magenta
#property indicator_width4 3
#property indicator_color5 Aqua
#property indicator_color6 Magenta
//---- input parameters
extern int ChannelPeriod=9;
extern double Risk=0.30;
extern int Signal=1;
extern int Line=1;
extern int Nbars=20000;
//---- indicator buffers
double UpTrendBuffer[];
double DownTrendBuffer[];
double UpTrendSignal[];
double DownTrendSignal[];
double UpTrendLine[];
double DownTrendLine[];
//+------------------------------------------------------------------+
//| 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,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,trend;
   double high, low, price;
   double smax[20000],smin[20000],bsmax[20000],bsmin[20000];
   
   for (shift=Nbars-1;shift>=0;shift--)
   {
   UpTrendBuffer[shift]=EMPTY_VALUE;
   DownTrendBuffer[shift]=EMPTY_VALUE;
   UpTrendSignal[shift]=EMPTY_VALUE;
   DownTrendSignal[shift]=EMPTY_VALUE;
   UpTrendLine[shift]=EMPTY_VALUE;
   DownTrendLine[shift]=EMPTY_VALUE;
   }
   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;
     
     if (Close[shift]>bsmax[shift+1])  trend=1; 
	  if (Close[shift]<bsmin[shift+1])  trend=-1;
		  		
	  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];
	     if(Line>0) UpTrendLine[shift]=bsmin[shift];
	     }
	     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<0) 
	  {
	  if (Signal>0 && DownTrendBuffer[shift+1]==-1.0)
	     {
	     DownTrendSignal[shift]=bsmax[shift];
	     if(Line>0) DownTrendLine[shift]=bsmax[shift];
	     }
	     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;
	  }
	  
	 
   }
   return(0);
  }
//+------------------------------------------------------------------+

Comments