Author: Copyright � 2005, MetaQuotes Software Corp.
_00_ZZ_v2

This script functions as a sophisticated technical analysis tool designed to identify market trends and momentum by tracking significant price peaks and valleys. Instead of simply looking at every price movement, the logic filters out "noise" to highlight major structural shifts in the market.

Core Logic Overview

The script operates through three distinct phases: identification, refinement, and signaling.

1. Identification of Key Extremes The tool begins by scanning a specific window of historical data (defined by the "Depth" setting) to locate the highest highs and lowest lows. It doesn't just take any high or low price; it applies strict criteria to ensure only significant turning points are recorded:

  • Deviation Check: It ignores minor price fluctuations. If a price movement is too small, it is disregarded.
  • Backstep Filtering: It ensures that the identified peaks and valleys are distinct from one another by checking a set distance in time. This prevents the script from "clustering" multiple signals in a very tight area.

2. Trend Refinement and Smoothing Once the primary highs and lows are found, the logic performs a "cleaning" process. It compares consecutive peaks and valleys to determine which ones are truly dominant. If a new, higher peak (or lower valley) appears that invalidates a previous point, the script removes the older, less significant data point. This ensures that the trend lines drawn on your chart represent the strongest structural movements of the market rather than minor retracements.

3. Signal Generation and Visualization The final stage converts these price structures into visual signals for the trader:

  • Trend Direction: The script determines the current state of the market (bullish or bearish) based on the relationship between these refined high and low points.
  • Dynamic Signaling: It creates a logic-based "trigger" system. By looking at the transition between different trend states, it identifies specific moments where momentum is shifting.
  • Visual Output: These signals are rendered on the chart as colored lines and arrows. The intensity or position of these markers helps the user quickly distinguish between strong, confirmed trends and weaker, emerging movements.

Summary for the User

In practical terms, this script acts as an automated "trend hunter." It ignores the minor wobbles of the market to find the backbone of the price action. It provides a visual roadmap that tells you where the major structural peaks and valleys are, helping you identify whether the current momentum is pushing upward or downward while providing specific markers to highlight potential trend reversals.

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

#property indicator_separate_window
#property indicator_minimum -100
#property indicator_maximum 100
#property indicator_buffers 4
#property indicator_color1 DeepSkyBlue
#property indicator_color2 Gold
#property indicator_color3 DeepSkyBlue
#property indicator_color4 Gold
//---- indicator parameters
extern bool Comments=false;
extern int ExtDepth=32;
extern int ExtDeviation=3;
extern int ExtBackstep=12;

//---- indicator buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];
double ExtMapBuffer5[];
double ExtMapBuffer6[];
double zz[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(7);
//---- drawing settings
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,119);
   SetIndexBuffer(0,ExtMapBuffer3);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,119);
   SetIndexBuffer(1,ExtMapBuffer4);
   SetIndexEmptyValue(1,0.0);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(2,ExtMapBuffer5);
   SetIndexEmptyValue(2,0.0);
   SetIndexStyle(3,DRAW_LINE);
   SetIndexBuffer(3,ExtMapBuffer6);
   SetIndexEmptyValue(3,0.0);
//---- indicator buffers mapping
   SetIndexBuffer(4,ExtMapBuffer1);
   SetIndexBuffer(5,ExtMapBuffer2);
   SetIndexBuffer(6,zz);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexEmptyValue(2,0.0);
   ArraySetAsSeries(ExtMapBuffer1,true);
   ArraySetAsSeries(ExtMapBuffer2,true);
//---- indicator short name

IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)-4);
IndicatorShortName("ZZ");
//---- initialization done
   return(0);
  }
  int deinit() {return(0);}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;
   bool signal;
   int i;

   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=ExtMapBuffer1[shift+back];
               if((res!=0)&&(res>val)) ExtMapBuffer1[shift+back]=0.0; 
              }
           }
        } 
      ExtMapBuffer1[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=ExtMapBuffer1[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) ExtMapBuffer1[lastlowpos]=0;
            else ExtMapBuffer1[shift]=0;
           }
         //---
         if((curlow<lastlow)||(lastlow<0))
           {
            lastlow=curlow;
            lastlowpos=shift;
           } 
         lasthigh=-1;
        }
     }
  
   for(shift=Bars-1; shift>=0; shift--)
     {
      if(shift>=Bars-ExtDepth) {ExtMapBuffer1[shift]=0.0;ExtMapBuffer2[shift]=0.0;}
      else
        {
         if (ExtMapBuffer1[shift]>0) {signal=true;}
         res=ExtMapBuffer2[shift];
         if(res!=0.0) {ExtMapBuffer1[shift]=res;signal=false;}
        }
        if (signal)
          {  
           zz[shift]=-1;
          }
        else 
          {
           zz[shift]=1;
          }
     }
     
// âûâîä  

   for(shift=Bars-4; shift>=0; shift--)
     {
      if (zz[shift]<0) 
        {

         if (zz[shift+2]>0)
           {
            if (zz[shift+1]>0)
              {
               ExtMapBuffer4[shift+1]=-60;
               ExtMapBuffer6[shift+1]=-60;
               ExtMapBuffer4[shift]=-90;
               ExtMapBuffer6[shift]=-90;
               ExtMapBuffer3[shift]=-90;
               ExtMapBuffer5[shift]=-90;
              }
            else
              {
               ExtMapBuffer3[shift]=-30;
               ExtMapBuffer5[shift]=-30;
              }
           }
         else
           {
            if (zz[shift+1]>0)
              {
               ExtMapBuffer3[shift]=-90;
               ExtMapBuffer5[shift]=-90;
               ExtMapBuffer4[shift]=-90;
               ExtMapBuffer6[shift]=-90;
              }
            else
              {
               ExtMapBuffer3[shift]=0.001;
               ExtMapBuffer5[shift]=0.001;
              }
           }

        }
      else 
        {
         if (zz[shift+2]>0)
           {
            if (zz[shift+1]>0)
              {
               ExtMapBuffer4[shift]=0.001;
               ExtMapBuffer6[shift]=0.001;
              }
            else
              {
               ExtMapBuffer3[shift]=90;
               ExtMapBuffer5[shift]=90;
               ExtMapBuffer4[shift]=90;
               ExtMapBuffer6[shift]=90;
              }
           }
         else
           {
            if (zz[shift+1]>0)
              {
               ExtMapBuffer4[shift]=30;
               ExtMapBuffer6[shift]=30;
              }
            else
              {
               ExtMapBuffer3[shift+1]=60;
               ExtMapBuffer5[shift+1]=60;
               ExtMapBuffer3[shift]=90;
               ExtMapBuffer5[shift]=90;
               ExtMapBuffer4[shift]=90;
               ExtMapBuffer6[shift]=90;
              }
           }
        }

     }
  
  /*ObjectCreate("zz-txt", OBJ_LABEL, WindowFind("ZZ"), 0, 0);//TREND LABEL
        ObjectSetText("zz-txt","ZZ =", 10, "Verdana", Silver);
        ObjectSet("zz-txt", OBJPROP_CORNER, 0);
        ObjectSet("zz-txt", OBJPROP_XDISTANCE, 545);
        ObjectSet("zz-txt", OBJPROP_YDISTANCE, 0);
  
  ObjectCreate("zz-lab", OBJ_LABEL, WindowFind("ZZ"), 0, 0);
        ObjectSetText("zz-lab",DoubleToStr(zz,Digits), 8, "Verdana Bold", DodgerBlue);
        ObjectSet("zz-lab", OBJPROP_CORNER, 0);
        ObjectSet("zz-lab", OBJPROP_XDISTANCE, 860);
        ObjectSet("zz-lab", OBJPROP_YDISTANCE, 24);*/
  
  }

Comments