[i] ZigXard-Pointer-V3
Download scriptThis 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.
//+------------------------------------------------------------------+
//| 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