This script is a specialized technical analysis tool designed to identify significant structural turning points in financial markets. By filtering out minor market "noise," it highlights the primary price swings, allowing traders to see the broader trend more clearly.
Core Functionality
The logic operates by scanning historical price data to locate major peaks (highs) and troughs (lows). Rather than marking every small fluctuation, it uses three specific parameters—Depth, Deviation, and Backstep—to ensure that only movements of a substantial enough magnitude are recorded.
How the Logic Works
The tool processes the market data through a multi-stage filtering system:
- Primary Identification: The script scans a set window of recent candles to find the highest highs and lowest lows. It calculates whether the price movement is significant enough to be considered a "structural" change based on your chosen settings.
- Dynamic Refinement: As new price data arrives, the script continuously evaluates the most recent peaks and troughs. If a new high or low is formed that is more extreme than a previous one within a certain timeframe, the script automatically updates the "pointer" to reflect this newer, more significant point.
- Trend Mapping: By connecting these significant points, the tool effectively maps out the "bones" of the market movement. This helps in identifying where a trend might be exhausting or where it is beginning to reverse.
Alert System
One of the key features of this specific version is its proactive notification system. The logic keeps track of the positions of the most recent significant peaks and troughs. If the script detects a shift in these structural points—indicating that the market may be changing direction—it triggers a real-time alert. This serves as a warning for traders to pay close attention to potential trend reversals or momentum shifts.
Summary for the User
Instead of overwhelming you with every price tick, this tool simplifies the chart by highlighting only the most meaningful market pivots. It identifies the "big picture" movement and provides automated alerts when those major structural landmarks shift, helping you stay ahead of significant price transitions.
//+------------------------------------------------------------------+
//| 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("ZZ Pointer 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("ZZ Pointer 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