Author: Copyright � 2005, MetaQuotes Software Corp.
Z-Z1_001

This script is designed to identify and visualize key structural turning points in a financial market's price action, specifically focusing on significant "peaks" (highs) and "valleys" (lows). It acts as an automated way to filter out minor price fluctuations to reveal the underlying trend of the asset.

Core Functionality

The logic operates by scanning historical price data to identify extreme points within a specific window of time or price movement. Instead of marking every single price change, it filters for "meaningful" movements based on three primary parameters:

  • Depth: This determines how far back the script looks to find the highest high or lowest low in a given section of the chart.
  • Deviation: This acts as a sensitivity threshold. It ensures that a new peak or valley is only recognized if it is different enough from the previous one, preventing "noise" from cluttering the visual display.
  • Backstep: This provides a buffer to ensure that points being identified are not too close to one another, helping to smooth out the transitions between trend changes.

The Two-Step Processing Logic

The script processes the data in two distinct phases to ensure accuracy:

1. Preliminary Identification The script first sweeps through the price history to find potential highs and lows. During this phase, it checks every candle to see if it represents a new maximum or minimum within the defined "Depth." If a point is found that meets the criteria, it is temporarily flagged. However, at this stage, the script may still show multiple points that are very close together.

2. Refinement and Conflict Resolution Once all potential points are identified, the script performs a second pass to "clean up" the data. It compares each identified high and low against its neighbors. If it finds two highs in a row, it keeps only the higher one and removes the other. Conversely, if it finds two lows, it keeps only the lower one. This logic ensures that the final output consists of a clean, alternating sequence of peaks and valleys (e.g., High -> Low -> High), clearly defining the structural "zig" and "zag" of the market.

Visual Output

The final result is a series of marks on the chart that represent the confirmed structural extremes. By stripping away the minor volatility and only highlighting these significant turning points, the script allows a user to see the broader path of the market trend more clearly.

Miscellaneous
Implements a curve of type %1
8 Views
0 Downloads
0 Favorites
Z-Z1_001
//+------------------------------------------------------------------+
//|                                       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