ZigZag Pointer_v1
Download scriptThis script functions as a visual navigation tool for your trading charts, specifically designed to identify significant "peaks" and "valleys" in price action. It filters out the minor market noise to reveal the underlying trend structure, making it easier for a trader to see where the major turning points occur.
Core Logic Overview
The indicator works by scanning historical price data to identify extreme highs and lows based on three user-adjustable parameters: Depth (how far back to look), Deviation (the minimum price change required to recognize a new point), and Backstep (how many bars to skip to avoid cluttered signals).
The logic processes the market in two primary stages:
1. Identification of Extremes The script first searches through the price history to find the highest highs and lowest lows within a specific window. It doesn't just mark every single peak; it uses a "filtering" mechanism. If a new high or low is found, the script checks if it is significant enough (based on your Deviation setting) compared to the previous point. This ensures that small, insignificant price wiggles are ignored, and only meaningful market movements are highlighted.
2. Structure Refinement and "Cutting" To ensure the final visual output is clean and logical, the script performs a secondary refinement process. It analyzes the identified points to ensure they follow a coherent zigzag pattern.
- Highs and Lows: If the script detects a new peak that is higher than the previous one, it intelligently "cuts" or removes the older, lower point to maintain a continuous zigzag flow.
- Alternating Pattern: It ensures that the indicator identifies alternating highs and lows. By resetting its tracking whenever a high or low is confirmed, it prevents multiple consecutive highs or lows from appearing next to each other, which keeps the chart organized and easy to read.
How it Appears on Your Chart
The result of this logic is a series of visual markers (arrows) that connect the major structural shifts in price.
- Highs are highlighted to show where the upward momentum stalled and began to reverse.
- Lows are highlighted to show where the downward momentum exhausted and started to bounce.
By stripping away the "noise" of minor price fluctuations, this tool allows you to see the "skeleton" of the market's movement, helping you identify support and resistance levels more clearly.
/*-----------------------------+
| |
| Shared by www.Aptrafx.com |
| |
+------------------------------*/
//+------------------------------------------------------------------+
//| 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 Lime
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_width2 1
//---- indicator parameters
extern int ExtDepth=12;
extern int ExtDeviation=5;
extern int ExtBackstep=3;
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
//---- drawing settings
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0, 233);
SetIndexStyle(1,DRAW_ARROW);
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;
}
}
}
//end//
Comments