Okay, here's an explanation of what this MetaTrader script does, without getting too technical:
This script is designed to identify potential turning points in a price chart and mark them with arrows. It's essentially trying to draw a "zigzag" line that connects the major highs and lows, helping traders visualize trends.
Here's the breakdown:
-
Defining the Zigzag: The script uses three key settings to define what it considers a significant "zig" or "zag":
- Depth: This determines how many past price bars the script looks at when trying to identify a high or low point. A higher depth means the script will look further back, potentially finding bigger, more significant swings, but it might also miss smaller, more recent ones.
- Deviation: This sets a minimum price change required for the script to consider a new high or low point. It filters out minor price fluctuations to focus on more substantial moves.
- Backstep: Once a high or low is identified, this setting ensures that the identified point remains a valid turning point, even if the price briefly goes slightly further in the same direction.
-
Finding Potential Highs and Lows: The script scans the price chart, looking back a certain number of bars (determined by the "Depth" setting). For each bar it checks, it finds the highest and lowest prices within that range. It then checks if these highs and lows meet the "Deviation" requirement.
-
Filtering and Refining: After finding initial potential highs and lows, the script filters them to ensure they are truly significant. It does this by:
- Comparing to Past Points: The script compares each new potential high or low with any previously identified points. If a new point is higher than a previous high (or lower than a previous low), it replaces the old one. This ensures that the script only keeps the most extreme highs and lows within a given range.
- Ensuring Persistence: The "Backstep" setting ensures that a high or low point remains valid even if the price briefly moves slightly beyond it.
-
Drawing the Arrows: Once the script has identified the significant highs and lows, it places arrows on the chart at those points. Lime-colored arrows represent lows, and red-colored arrows represent highs.
-
Alerts: The script is designed to trigger alerts and send emails when a new zigzag pattern is detected. It remembers the positions of the last two zigzags, and if those positions change, it sends alerts to signal potential uptrends or downtrends.
//+------------------------------------------------------------------+
//| 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 5
#property indicator_color2 Red
#property indicator_width2 5
//---- indicator parameters
extern int ExtDepth=28;//was 12
extern int ExtDeviation=1;//was 5
extern int ExtBackstep=1;//was 3
//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];
double test1;
double test2;
double alertTag;
int OldLastZigZag, OldPreviousZigZag;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
IndicatorBuffers(2);
//---- drawing settings
SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,5);
SetIndexArrow(0, 233);
SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,5);
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("#ZiGzag Pointer Downtrend starting on ",Symbol(),Period()); SendMail(Symbol()+" "+OrderComment(),"Stopreversal crossed up");}
if(OldLastZigZag>LastZigZag) SendMail("#ZiGzag Pointer Downtrend starting on ",Symbol(),Period()); SendMail(Symbol()+" "+OrderComment(),"Stopreversal crossed up");}
OldLastZigZag=LastZigZag;
OldPreviousZigZag=PreviousZigZag;
}
if (OldLastZigZag!=LastZigZag || OldPreviousZigZag!=PreviousZigZag) {
if(OldLastZigZag<LastZigZag) Alert("#ZiGzag Pointer Uptrend starting on ",Symbol(),Period());
if(OldLastZigZag<LastZigZag) SendMail("#ZiGzag Pointer Uptrend starting on ",Symbol(),Period());
OldLastZigZag=LastZigZag;
OldPreviousZigZag=PreviousZigZag;
}
}
}
//end//
Comments
Markdown Formatting Guide
# H1
## H2
### H3
**bold text**
*italicized text*
[title](https://www.example.com)

`code`
```
code block
```
> blockquote
- Item 1
- Item 2
1. First item
2. Second item
---