ZigZag_Pointer_alert

Author: dr_richard_gaines
ZigZag_Pointer_alert

The ZigZag Pointer is a technical analysis tool designed to simplify price action by identifying and highlighting the core structural "peaks" and "valleys" in a financial market. Rather than showing every minor price fluctuation, this script filters out the noise to reveal the underlying trend of the asset.

Core Logic and Functionality

The logic operates through a multi-stage filtering process to ensure that only significant market movements are captured:

1. Identifying Key Extremes The script continuously scans historical data to find the highest highs and lowest lows over a specific period (defined by the "Depth" setting). It doesn't just look for any high or low; it looks for points that represent a meaningful shift in price compared to the immediate surrounding candles.

2. Noise Reduction and Filtering To prevent the chart from being cluttered with insignificant movements, the script employs two primary filters:

  • Deviation: This ensures that a new peak or valley is only recorded if the price moves by a significant enough amount. If the movement is too small, the script ignores it.
  • Backstep: This acts as a refinement tool. It checks preceding bars to ensure that the identified point is indeed the "extreme" of that specific move, clearing out any secondary points that don't represent the true high or low of the trend.

3. Dynamic Trend Correction (The "ZigZag" Effect) One of the most important features of this logic is its ability to "re-draw" or correct itself in real-time. If the price continues to move higher than a previously identified "peak," the script will automatically remove the old peak and place the new one at the highest point. This ensures that the visual representation always reflects the most current extreme of the market movement.

4. Alternating Structure The logic is programmed to recognize the natural flow of markets—where a high must be followed by a low, and vice versa. It manages these points sequentially, ensuring the "ZigZag" path follows a logical progression from one major turning point to the next.

5. Real-Time Alerts Beyond just providing a visual aid, the script monitors the distance and position of these peaks and valleys. When it detects a significant shift in the structural direction—meaning the price has completed a move from a high to a low (or vice versa) and is starting a new leg—it triggers an automated alert. This informs the user of a "Possible change in direction," allowing for quicker reactions to market shifts.

Summary for the User

In essence, this script acts as a "map" of the market's skeleton. It ignores the constant "jitter" of daily price movements and only places markers on the major structural pivots. By using these markers, you can more easily identify long-term trends, support and resistance levels, and significant reversals in the market.

Miscellaneous
Implements a curve of type %1It issuies visual alerts to the screen
9 Views
0 Downloads
0 Favorites
ZigZag_Pointer_alert
//+------------------------------------------------------------------+
//|                                               ZigZag Pointer.mq4 |
//|                                    zigzag modified by Dr. Gaines |
//|                                      dr_richard_gaines@yahoo.com |
//|                                              reworked by Xard777 |
//+------------------------------------------------------------------+
#property copyright "dr_richard_gaines"
#property link      "http://www.metaquotes.net/"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_width1 3
#property indicator_color2 Blue
#property indicator_width2 3
//---- indicator parameters
extern int ExtDepth=23;//21;//105
extern int ExtDeviation=26;//24;//120
extern int ExtBackstep=16;//14;//70
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];
int OldLastZigZag, OldPreviousZigZag;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_ARROW,0,3);
   SetIndexArrow(0, 233);
   SetIndexStyle(1,DRAW_ARROW,0,3);
   SetIndexArrow(1, 234);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(0,0.0);
   
//---- indicator short name
   IndicatorShortName("ZigZag("+ExtDepth+","+ExtDeviation+","+ExtBackstep+")");
//---- initialization done
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      val=Low[Lowest(NULL,0,MODE_LOW,ExtDepth,shift)];
      if(val==lastlow) val=0.0;
      else 
        { 
         lastlow=val; 
         if((Low[shift]-val)>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer[shift+back]=0.0; 
              }
           }
        } 
      ExtMapBuffer[shift]=val;
      //--- high
      val=High[Highest(NULL,0,MODE_HIGH,ExtDepth,shift)];
      if(val==lasthigh) val=0.0;
      else 
        {
         lasthigh=val;
         if((val-High[shift])>(ExtDeviation*Point)) val=0.0;
         else
           {
            for(back=1; back<=ExtBackstep; back++)
              {
               res=ExtMapBuffer2[shift+back];
               if((res!=0)&&(res<val)) ExtMapBuffer2[shift+back]=0.0; 
              } 
           }
        }
      ExtMapBuffer2[shift]=val;
     }

   // final cutting 
   lasthigh=-1; lasthighpos=-1;
   lastlow=-1;  lastlowpos=-1;

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ExtMapBuffer[shift];
      curhigh=ExtMapBuffer2[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh) ExtMapBuffer2[lasthighpos]=0;
            else ExtMapBuffer2[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow) ExtMapBuffer[lastlowpos]=0;
            else ExtMapBuffer[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
  
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ExtMapBuffer[shift]=0.0;
      else
        {
         res=ExtMapBuffer2[shift];
         if(res!=0.0) ExtMapBuffer2[shift]=res;
        }
  	int i=0;
  	int LastZigZag, PreviousZigZag;
   
   int h=0;
   while ( ExtMapBuffer[h]==0 && ExtMapBuffer2[h]==0) {
   	h++;
   }
   
   LastZigZag=h;
   
   h++;
   while(ExtMapBuffer[h]==0 && ExtMapBuffer2[h]==0) {
   	h++;
   }
   
   PreviousZigZag=h;
   
   if (OldLastZigZag!=LastZigZag || OldPreviousZigZag!=PreviousZigZag) {
   	if(OldLastZigZag>LastZigZag) Alert("Possible change in direction... (M",Period()," ",Symbol(),")");
    	OldLastZigZag=LastZigZag;
   	OldPreviousZigZag=PreviousZigZag;
   	//ObjectDelete("Fibo");
   	//ObjectCreate("Fibo", OBJ_FIBO, 0, Time[PreviousZigZag], ExtMapBuffer[LastZigZag], Time[LastZigZag], ExtMapBuffer[PreviousZigZag]);
  }
   if (OldLastZigZag!=LastZigZag || OldPreviousZigZag!=PreviousZigZag) {
   	if(OldLastZigZag<LastZigZag) Alert("Possible change in direction... (M",Period()," ",Symbol(),")");
   	OldLastZigZag=LastZigZag;
   	OldPreviousZigZag=PreviousZigZag;
   	//ObjectDelete("Fibo");
   	//ObjectCreate("Fibo", OBJ_FIBO, 0, Time[PreviousZigZag], ExtMapBuffer[LastZigZag], Time[LastZigZag], ExtMapBuffer[PreviousZigZag]);
   }
     }
  }
  
  //end//

Comments