zigzag-pointerV2
Download scriptThis script is designed as a technical analysis tool for the MetaTrader platform, specifically modified to identify and visualize significant price swings on a trading chart. It automates the detection of "peaks" (highs) and "troughs" (lows), helping traders see the underlying structure of market movements by filtering out minor price fluctuations.
Core Functionality
The primary goal of this tool is to trace the progression of price over time, identifying major reversal points rather than every small tick in price movement. It achieves this through a three-stage logical process:
1. Initial Price Scanning The script first looks back through a specific number of past price bars (defined by the "Depth" setting). It searches for the highest highs and lowest lows within that window. If a price point is significant enough—meaning it moves further than a set threshold (the "Deviation")—it is flagged as a potential turning point.
2. Backstep Verification To ensure accuracy, the script employs a "backstep" logic. This means it doesn't just take the first high or low it finds; it checks a small number of preceding bars to see if a more extreme price point occurred nearby. If it finds a more prominent peak or valley within that short range, it prioritates that one, ensuring the visual trend remains smooth and logical.
3. Conflict Resolution (Final Cutting) The final stage of the logic is a refinement process. It ensures that the chart doesn't show overlapping or contradictory signals. For example, if the script identifies a new high that is higher than the previous "confirmed" high, it will automatically remove the old one and replace it with the new, more significant point. This creates a clean, continuous path of connected highs and lows, removing any "noise" that would otherwise clutter the visual display.
User Experience
For a trader, this means the tool provides a clear "map" of the market's history. Instead of seeing every tiny wiggle in price, you see the major structural shifts. The script uses different colors and arrow styles to distinguish between upward movements (bullish trends) and downward movements (bearish trends), making it easier to identify support and resistance levels 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 4
#property indicator_color1 Lime
#property indicator_width1 2
#property indicator_color2 Red
#property indicator_width2 2
#property indicator_color3 Yellow
#property indicator_width3 1
#property indicator_color4 Orange
#property indicator_width4 1
//---- indicator parameters
extern int ExtDepth=100;
extern int ExtDeviation=75;
extern int ExtBackstep=15;
//---- indicator buffers
double ZigZagUp[];
double ZigZagDown[];
double zzL[];
double zzH[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(4);
//---- drawing settings
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0, 233);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1, 234);
SetIndexStyle(2,DRAW_ARROW);
SetIndexArrow(2, 233);
SetIndexStyle(3,DRAW_ARROW);
SetIndexArrow(3, 234);
//---- indicator buffers mapping
SetIndexBuffer(0,ZigZagUp);
SetIndexBuffer(1,ZigZagDown);
SetIndexBuffer(2,zzL);
SetIndexBuffer(3,zzH);
SetIndexEmptyValue(0,0.0);
SetIndexEmptyValue(1,0.0);
SetIndexEmptyValue(2,0.0);
SetIndexEmptyValue(3,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; zzL[shift + back] = res; }
}
}
}
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; zzH[shift + back] = res; }
}
}
}
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)
{
zzH[lasthighpos] = ZigZagDown[lasthighpos];
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)
{
zzL[lastlowpos] = ZigZagUp[lastlowpos];
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