[i] ZigXard-Pointer-V3

Download script
Author: dr_richard_gaines
[i] ZigXard-Pointer-V3

This script is designed to simplify market analysis by identifying and highlighting the significant "peaks" and "valleys" in price movement. It automatically filters out minor market noise to reveal the broader structural trend of a financial instrument's price history.

Core Functionality

The tool scans historical price data to locate the most important turning points—highs and lows. Instead of showing every single fluctuation, it uses three specific logic layers to determine what qualifies as a "significant" move:

  • Trend Depth & Deviation: The script looks at a specific window of time (Depth) to find the highest and lowest prices. It only recognizes a move as significant if the price change exceeds a pre-defined threshold (Deviation). This ensures that small, insignificant wiggles in the price are ignored.
  • Backstep Verification: To prevent the indicator from creating too many points in a tight area, it uses a "Backstep" logic. This ensures that there is a minimum required distance between two identified points, effectively cleaning up cluttered data.
  • Dynamic Correction (The "Final Cut"): The script performs a secondary verification pass. As new price data comes in, it compares the most recent peak or valley to previous ones. If a newer, more extreme high or low is formed, the script "rewrites" the history by removing the previous less significant point. This keeps the zigzag path clean and logically consistent with the current market structure.

Visual Output

The result is a series of clear markers on your chart:

  • High Points: These identify major resistance levels or "peaks."
  • Low Points: These identify major support levels or "valleys."

By visually connecting these points, the tool allows traders to see the underlying "skeleton" of the market, making it easier to identify overall trend directions and structural shifts at a glance.

Miscellaneous
Implements a curve of type %1
9 Views
0 Downloads
0 Favorites
[i] ZigXard-Pointer-V3
//+------------------------------------------------------------------+
//|                                               zigzag-pointer.mq4 |
//|                                    zigzag modified by Dr. Gaines |
//|                                      dr_richard_gaines@yahoo.com |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#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 2
#property indicator_color2 White
#property indicator_width2 2
//---- indicator parameters
extern int ExtDepth=115;//105;//21;
extern int ExtDeviation=130;//120;//24;
extern int ExtBackstep=80;//70;//14;
//---- indicator buffers
double ZigZagUp[];
double ZigZagDown[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0, 174);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1, 174);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigZagUp);
   SetIndexBuffer(1,ZigZagDown);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,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=ZigZagUp[shift+back];
               if((res!=0)&&(res>val)) { ZigZagUp[shift+back]=0.0; } 
              }
           }
        } 
      ZigZagUp[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=ZigZagDown[shift+back];
               if((res!=0)&&(res<val)){ ZigZagDown[shift+back]=0.0; } 
              } 
           }
        }
      ZigZagDown[shift]=val;
     }

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

   for(shift=Bars-ExtDepth; shift>=0; shift--)
     {
      curlow=ZigZagUp[shift];
      curhigh=ZigZagDown[shift];
      if((curlow==0)&&(curhigh==0)) continue;
      //---
      if(curhigh!=0)
        {
         if(lasthigh>0) 
           {
            if(lasthigh<curhigh)
             {
              ZigZagDown[lasthighpos]=0;
             }
            else ZigZagDown[shift]=0;
           }
         //---
         if(lasthigh<curhigh || lasthigh<0)
           {
            lasthigh=curhigh;
            lasthighpos=shift;
           }
         lastlow=-1;
        }
      //----
      if(curlow!=0)
        {
         if(lastlow>0)
           {
            if(lastlow>curlow)
             {
              ZigZagUp[lastlowpos]=0;
            }
            else ZigZagUp[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
  
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) ZigZagUp[shift]=0.0;
      else
        {
         res=ZigZagDown[shift];
         if(res!=0.0) ZigZagDown[shift]=res;
        }
     }
  }
  
  //end//

Comments