Author: Copyright � 2005, MetaQuotes Software Corp.
Z1

This script is a visual trading tool designed to identify and plot significant structural "zig-zag" patterns on a price chart. Its primary purpose is to filter out minor market noise—those small, insignificant fluctuations in price—to reveal the underlying trend by highlighting only the major highs and lows.

Core Logic and Behavior

The logic operates in three distinct stages to ensure that the lines drawn on your chart are clean and accurately represent significant turning points:

1. Filtering Significant Price Movements The script first scans through historical price data (based on a user-defined depth). It looks for extreme highs and lows within a specific window of time. However, it doesn't mark every peak or valley. It uses a "deviation" threshold; if a price move is too small, the script ignores it. This ensures that only meaningful price swings are captured, preventing the chart from being cluttered with every minor tick of movement.

2. Peak and Valley Identification Once the significant moves are identified, the script performs a secondary check to ensure chronological consistency. It looks at a "backstep" area to verify if a new high or low is truly the most prominent one in that specific sequence. If it finds a more significant price point nearby, it corrects previous markings to ensure the data remains coherent and logically ordered from left to right.

3. Final Refinement and Conflict Resolution The final stage of the logic is a "cleaning" process. Because market prices can be volatile, the script performs a final pass over the gathered data to resolve conflicts between highs and lows. It ensures that:

  • A "high" point is only kept if it is higher than the previous recorded high in its sequence.
  • A "low" point is only kept if it is lower than the previous recorded low.

If a new price point violates these rules (for example, if a new high appears that is actually lower than one previously marked), the script dynamically removes the incorrect point. This creates a smooth, connected path of peaks and valleys on your screen.

User Experience

For the person viewing the chart, this logic translates to a clear visual guide of market structure. Instead of seeing every tiny candle fluctuation, you see a series of clean points that define the "swing" high and "swing" low of the market. It allows you to easily see where the price has pivoted, making it easier to identify trends, support levels, and resistance zones at a glance.

Miscellaneous
Implements a curve of type %1
14 Views
0 Downloads
0 Favorites
Z1
//+------------------------------------------------------------------+ 
//| Z1.mq4 | 
//| Copyright © 2005, MetaQuotes Software Corp. | 
//| http://www.metaquotes.net/ | 
//+------------------------------------------------------------------+ 
#property copyright "Copyright © 2005, MetaQuotes Software Corp." 
#property link "http://www.metaquotes.net/" 

#property indicator_chart_window 
#property indicator_buffers 1 
#property indicator_color1 Blue 
//---- indicator parameters 
extern int ExtDepth=12; 
extern int ExtDeviation=5; 
extern int ExtBackstep=3; 
extern int barn=1500; 
//---- indicator buffers 
double ExtMapBuffer[]; 
double ExtMapBuffer2[]; 

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

for(shift=barn-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=barn-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=barn-1; shift>=0; shift--) 
{ 
if(shift>=barn-ExtDepth) ExtMapBuffer[shift]=0.0; 
else 
{ 
res=ExtMapBuffer2[shift]; 
if(res!=0.0) ExtMapBuffer[shift]=res; 
} 
} 
}

Comments