ZigZag_test

ZigZag_test

This script is a specialized technical analysis tool designed to identify specific price patterns—referred to as "WolfWaves"—by tracking the structural movement of market highs and lows. It essentially acts as an automated trend-mapping assistant that filters out market noise to highlight significant geometric shifts in price action.

Core Operational Logic

The tool operates through a multi-layered filtering process to ensure that only the most significant price turns are used for analysis:

1. Structural Foundation (ZigZag Mapping) The script begins by identifying "anchor points" in the market. It scans historical price data to find distinct peaks (highs) and valleys (lows). To prevent the tool from reacting to minor fluctuations, it uses specific depth and deviation filters. This ensures that only substantial price movements are recorded as valid structural points, creating a simplified "skeleton" of the market trend.

2. Pattern Cleaning and Smoothing Once the primary highs and lows are identified, the logic performs a "cleaning" phase. It compares consecutive peaks to ensure they are logical. For example, if a new high is found that is higher than a previous one, it may adjust the data to maintain a consistent directional flow. This prevents the tool from drawing cluttered or overlapping lines on your chart.

3. WolfWave Recognition The primary objective of the script is to identify a specific five-point geometric pattern. The logic looks at the most recent structural peaks and valleys to see if they meet these criteria:

  • Buy Pattern: Occurs when specific price relationships suggest a bullish structure (where certain lows are lower than previous highs/lows in a specific sequence).
  • Sell Pattern: Occurs when those same relationships suggest a bearish structure.

4. Visual Feedback and Alerts When the script identifies one of these patterns, it automatically draws several visual elements on your chart:

  • Trend Lines: It draws colored lines connecting the identified structural points to show the "path" of the move.
  • Numerical Labels: It places numbers (1 through 5) at the key peaks and valleys of the pattern to help the user track the sequence of the move.
  • Fibonacci Retracement: The tool automatically calculates and draws a Fibonacci tool between the two most recent significant turning points, helping traders identify potential pull-back levels.
  • Audio Alerts: If enabled, the script can provide an audible notification when a new trend direction is detected.

Summary for the User

In simple terms, this script ignores the "jitter" of the daily market and focuses on the big picture. It draws a clear map of where price has turned significantly, identifies specific "WolfWave" shapes that indicate potential trend shifts, and automatically places Fibonacci levels to help you determine where the next price correction might end.

Miscellaneous
Implements a curve of type %1
13 Views
0 Downloads
0 Favorites
ZigZag_test
//+------------------------------------------------------------------+
//| A WolfWave finder based on ZIGZAG.MQ4                            |
//| fukinagashi a t gmx p o i n t net   
//| Patched by Nen @  http://onix-trade.net/forum/index.php?showtopic=373
//| Patched again by Maumax                                         |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 AliceBlue
#property indicator_width1 2
#property indicator_width2 2
#define MaxAnalyze 200
#define UpperDistance 15
#define LowerDistance 5
#define Title "WW"

//---- indicator parameters
extern int ExtDepth=6;// was 12
extern int ExtDeviation=3;// was 3
extern int ExtBackstep=2;//was 2

//---- indicator buffers
double ExtMapBuffer[];
double ExtMapBuffer2[];
int timeFirstBar=0;
int OldLastZigZag, OldPreviousZigZag;
double alertBar;
extern int SoundAlertMode = 0;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
//---- drawing settings

   SetIndexStyle(0,DRAW_SECTION,STYLE_SOLID);
//---- indicator buffers mapping
   SetIndexBuffer(0,ExtMapBuffer);
   SetIndexBuffer(1,ExtMapBuffer2);
     
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);

   ArraySetAsSeries(ExtMapBuffer,true);
   ArraySetAsSeries(ExtMapBuffer2,true);
//---- indicator short name
   IndicatorShortName("WolfWave");
//---- initialization done

   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
      for (int i=1;i<=5;i++)
       {
         ObjectDelete(Title + ""+i);
       }
   
      ObjectDelete(Title + "Line-2-4");   
      ObjectDelete(Title + "Line-1-3");
      ObjectDelete(Title + "Line-1-4");
      ObjectDelete(Title + "Line-2-5");
   return(0);

	ObjectDelete("Fibo");
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int    shift, back,lasthighpos,lastlowpos;
   double val,res;
   double curlow,curhigh,lasthigh,lastlow;
   int num=0;

   int Peak[MaxAnalyze],h,i,j;
   int Wolf[6];
   string WolfWave="None";
   double Winkel1, Winkel2;
   bool found=false;

   //----+ ïðîâåðêà êîëè÷åñòâà áàðîâ íà äîñòàòî÷íîñòü äëÿ êîððåêòíîãî ðàñ÷¸òà èíäèêàòîðà
   if (Bars-1<ExtDepth)return(0);
   //----+ Ââåäåíèå öåëûõ ïåðåìåííûõ ïàìÿòè äëÿ ïåðåñ÷¸òà èíäèêàòîðà òîëüêî íà íåïîäñ÷èòàííûõ áàðàõ
   static int time2,time3,time4;  
   //----+ Ââåäåíèå ïåðåìåííûõ ñ ïëàâàþùåé òî÷êîé äëÿ ïåðåñ÷¸òà èíäèêàòîðà òîëüêî íà íåïîäñ÷èòàííûõ áàðàõ
   static  double ZigZag2,ZigZag3,ZigZag4;
   //----+ Ââåäåíèå öåëûõ ïåðåìåííûõ äëÿ ïåðåñ÷¸òà èíäèêàòîðà òîëüêî íà íåïîäñ÷èòàííûõ áàðàõ è ïîëó÷åíèå óæå ïîäñ÷èòàííûõ áàðîâ
   int MaxBar,limit,supr2_bar,supr3_bar,supr4_bar;
   //---- ïðîâåðêà íà âîçìîæíûå îøèáêè
   if (counted_bars<0)return(-1);
   //---- ïîñëåäíèé ïîäñ÷èòàííûé áàð äîëæåí áûòü ïåðåñ÷èòàí
   if (counted_bars>0) counted_bars--;
   //---- îïðåäåëåíèå íîìåðà ñàìîãî ñòàðîãî áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò ïðîèçåä¸í ïîëûé ïåðåñ÷¸ò âñåõ áàðîâ
   MaxBar=Bars-ExtDepth; 
   //---- îïðåäåëåíèå íîìåðà ñòàðòîâîãî  áàðà â öèêëå, íà÷èíàÿ ñ êîòîðîãî áóäåò ïðîèçåäèòüñÿ  ïåðåñ÷¸ò íîâûõ áàðîâ
   if (counted_bars==0 || Bars-counted_bars>2)
     {
      limit=MaxBar;
     }
   else 
     {
      //----
      supr2_bar=iBarShift(NULL,0,time2,TRUE);
      supr3_bar=iBarShift(NULL,0,time3,TRUE);
      supr4_bar=iBarShift(NULL,0,time4,TRUE);
      //----
      limit=supr3_bar;      
      if ((supr2_bar<0)||(supr3_bar<0)||(supr4_bar<0))
         {
          limit=MaxBar;
         }
     }
     
   //---- èíèöèàëèçàöèÿ íóëÿ
   if (limit>=MaxBar || timeFirstBar!=Time[Bars-1]) 
     {
      timeFirstBar=Time[Bars-1];
      for (shift=Bars-1; shift>0;shift--) {ExtMapBuffer[shift]=0.0; ExtMapBuffer2[shift]=0.0;}
      limit=MaxBar; 
     } 
   //----  

   
   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; 
              }
           }
        } 
      if (Low[shift]==val) 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; 
              } 
           }
        }
      if (High[shift]==val) 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) ExtMapBuffer[shift]=res;
         if(res>0.0) ExtMapBuffer[shift]=res;         
        }
     }

   // Ïðîâåðêà ïåðâîãî ëó÷à
   i=0;j=0;
   res=0;
   for (shift=0;i<3;shift++)
     {
      if (ExtMapBuffer[shift]>0)
        {
         i++;
         if (i==1 && ExtMapBuffer[shift]==High[shift])
           {
            j=shift;
            res=ExtMapBuffer[shift];
           }
         if (i==2 && res>0 && ExtMapBuffer[shift]==High[shift])
           {
            if (ExtMapBuffer[shift]>=ExtMapBuffer[j]) ExtMapBuffer[j]=0; else ExtMapBuffer[shift]=0;
            res=0;
            i=0;
            j=0;
            shift=0;
           }
        }
     }


   //+--- Âîññòàíîâëåíèå çíà÷åíèé èíäèêàòîðíîãî áóôôåðà, êîòîðûå ìîãëè áûòü óòåðÿíû 
   if (limit<MaxBar)
     {
      ExtMapBuffer[supr2_bar]=ZigZag2; 
      ExtMapBuffer[supr3_bar]=ZigZag3; 
      ExtMapBuffer[supr4_bar]=ZigZag4; 
      for(int qqq=supr4_bar-1; qqq>supr3_bar; qqq--)ExtMapBuffer[qqq]=0; 
      for(int ggg=supr3_bar-1; ggg>supr2_bar; ggg--)ExtMapBuffer[ggg]=0;
     }
   //+---+============================================+
  
   //+--- èñïðàâëåíèå âîçíèêàþùèõ ãîðáîâ 
   double vel1, vel2, vel3, vel4;
   int bar1, bar2, bar3, bar4;
   int count;
   if (limit==MaxBar)supr4_bar=MaxBar;
   for(int bar=supr4_bar; bar>=0; bar--)
    {
     if (ExtMapBuffer[bar]!=0)
      {
       count++;
       vel4=vel3;bar4=bar3;
       vel3=vel2;bar3=bar2;
       vel2=vel1;bar2=bar1;
       vel1=ExtMapBuffer[bar];bar1=bar;
       if (count<3)continue; 
       if ((vel3<vel2)&&(vel2<vel1)){ExtMapBuffer[bar2]=0;bar=bar3+1;}
       if ((vel3>vel2)&&(vel2>vel1)){ExtMapBuffer[bar2]=0;bar=bar3+1;}
       if ((vel2==vel1)&&(vel1!=0 )){ExtMapBuffer[bar1]=0;bar=bar3+1;}
     }
    } 
   //+--- çàïîìèíàíèå âðåìåíè òð¸õ ïîñëåäíèõ ïåðåãèáîâ Çèãçàãà è çíà÷åíèé èíäèêàòîðà â ýòèõ òî÷êàõ 
   time2=Time[bar2];
   time3=Time[bar3];
   time4=Time[bar4];
   ZigZag2=vel2;  
   ZigZag3=vel3; 
   ZigZag4=vel4; 
   //+---          

    
// Basic Modification ==>

   i=0;
   for(h=0; h<Bars && i<MaxAnalyze; h++)
   {
      if ((ExtMapBuffer[h]!=0) || (ExtMapBuffer2[h]!=0)) {
         Peak[i]= h;
         i++;    
      }
   }
   
   for(j=0;j<i && j<MaxAnalyze && found==false;j++) {
      Wolf[1]=Peak[j+4]; // 1 High
      Wolf[2]=Peak[j+3]; // 2 Low
      Wolf[3]=Peak[j+2]; // 3 High 
      Wolf[4]=Peak[j+1]; // 4 Low 
      Wolf[5]=Peak[j+0]; // 5 High
      if (     // Buy Wolfwave
         Low[Wolf[1]]<High[Wolf[2]] &&  // 1. + 3.a.//1-3
         Low[Wolf[3]]<Low[Wolf[1]] &&   // 2. + 3.b. //3-1
         Low[Wolf[3]]<High[Wolf[4]]  // 4//3-4
         ) {
            WolfWave="Buy";
      } else if 
         (     // Sell Wolfwave
         High[Wolf[1]]>Low[Wolf[2]] &&  // 1. + 3.a.
         High[Wolf[3]]>High[Wolf[1]] &&   // 2. + 3.b. 
         High[Wolf[3]]>Low[Wolf[4]]  // 4
         ) {
            WolfWave="Sell";
         } else {
            WolfWave="Not";
      }

      if(WolfWave=="Buy") {
         	ObjectCreate(Title + "Line-1-3", OBJ_TREND, 0, Time[Wolf[1]],Low[Wolf[1]], Time[Wolf[3]],Low[Wolf[3]] );
        //	ObjectSet(Title + "Line-1-3",OBJPROP_RAY,0);
        	ObjectSet(Title + "Line-1-3", OBJPROP_COLOR, Lime);
          	ObjectSet(Title + "Line-1-3", OBJPROP_WIDTH, 2);
          //	ObjectSet(Title + "Line-1-3",OBJPROP_BACK,1);
          	
        	if (ObjectGetValueByShift(Title + "Line-1-3", Wolf[3]) >= Low[Wolf[3]]) {
           	ObjectCreate(Title + "1", OBJ_TEXT, 0, Time[Wolf[1]],Low[Wolf[1]]-LowerDistance*Point );
           	ObjectSetText(Title + "1", ""+DoubleToStr(1,0), 14, "Arial", Yellow);//Size @ 10
           	ObjectCreate(Title + "2", OBJ_TEXT, 0, Time[Wolf[2]],High[Wolf[2]]+UpperDistance*Point );
           	ObjectSetText(Title + "2", ""+DoubleToStr(2,0), 14, "Arial", Yellow);
           	ObjectCreate(Title + "3", OBJ_TEXT, 0, Time[Wolf[3]],Low[Wolf[3]]-LowerDistance*Point );
           	ObjectSetText(Title + "3", ""+DoubleToStr(3,0), 14, "Arial", Yellow);
           	ObjectCreate(Title + "4", OBJ_TEXT, 0, Time[Wolf[4]],High[Wolf[4]]+UpperDistance*Point );
           	ObjectSetText(Title + "4", ""+DoubleToStr(4,0), 14, "Arial", Yellow);
           	ObjectCreate(Title + "5", OBJ_TEXT, 0, Time[Wolf[5]],Low[Wolf[5]]-LowerDistance*Point );
           	ObjectSetText(Title + "5", ""+DoubleToStr(5,0), 14, "Arial", Yellow);
           	
           	ObjectCreate(Title + "Line-1-4", OBJ_TREND, 0, Time[Wolf[1]],Low[Wolf[1]], Time[Wolf[4]],High[Wolf[4]] );
           	ObjectSet(Title + "Line-1-4", OBJPROP_COLOR, Red);
           //	ObjectSet(Title + "Line-1-4",OBJPROP_RAY,0);
           	ObjectSet(Title,OBJPROP_STYLE,STYLE_DOT);
          	ObjectSet(Title + "Line-1-4", OBJPROP_WIDTH, 0);
          	ObjectSet(Title + "Line-1-4",OBJPROP_BACK,0);
          	ObjectSet(Title + "Line-2-5",OBJPROP_BACK,0);
          	
          //	ObjectCreate(Title + "Line-2-5", OBJ_TREND, 0, Time[Wolf[2]],High[Wolf[2]], Time[Wolf[5]],Low[Wolf[5]] );
            //ObjectSet(Title,OBJPROP_STYLE,STYLE_DOT);
           // ObjectSet(Title + "Line-2-5",OBJPROP_RAY,0);
            //ObjectSet(Title + "Line-2-5", OBJPROP_COLOR, Lime);
           // ObjectSet(Title + "Line-2-5", OBJPROP_WIDTH, 1);
//        	// found=true;
         //} //else {
           // ObjectDelete(Title + "Line-1-3");
         }
      } else if (WolfWave=="Sell") {
            ObjectCreate(Title + "Line-1-3", OBJ_TREND, 0, Time[Wolf[1]],High[Wolf[1]], Time[Wolf[3]],High[Wolf[3]] );
         //ObjectSet(Title + "Line-1-3",OBJPROP_RAY,0);
         	ObjectSet(Title + "Line-1-3", OBJPROP_COLOR, Lime);
          	ObjectSet(Title + "Line-1-3", OBJPROP_WIDTH, 2);
          //	ObjectSet(Title + "Line-1-3",OBJPROP_BACK,1);
          	
         if ( ObjectGetValueByShift(Title + "Line-1-3", Wolf[3]) <= High[Wolf[3]] ) {
           	ObjectCreate(Title + "1", OBJ_TEXT, 0, Time[Wolf[1]],High[Wolf[1]]+UpperDistance*Point );
            ObjectSetText(Title + "1", ""+DoubleToStr(1,0), 20, "Arial", Yellow);//size @ 10
            ObjectCreate(Title + "2", OBJ_TEXT, 0, Time[Wolf[2]],Low[Wolf[2]]-LowerDistance*Point );
            ObjectSetText(Title + "2", ""+DoubleToStr(2,0), 20, "Arial", Yellow);
            ObjectCreate(Title + "3", OBJ_TEXT, 0, Time[Wolf[3]],High[Wolf[3]]+UpperDistance*Point );
            ObjectSetText(Title + "3", ""+DoubleToStr(3,0), 20, "Arial", Yellow);
            ObjectCreate(Title + "4", OBJ_TEXT, 0, Time[Wolf[4]],Low[Wolf[4]]-LowerDistance*Point );
            ObjectSetText(Title + "4", ""+DoubleToStr(4,0), 20, "Arial", Yellow);
            ObjectCreate(Title + "5", OBJ_TEXT, 0, Time[Wolf[5]],High[Wolf[5]]+UpperDistance*Point );
            ObjectSetText(Title + "5", ""+DoubleToStr(5,0), 20, "Arial", Yellow);
            
            ObjectCreate(Title + "Line-1-4", OBJ_TREND, 0, Time[Wolf[1]],High[Wolf[1]], Time[Wolf[4]],Low[Wolf[4]] );
            ObjectSet(Title + "Line-1-4", OBJPROP_COLOR, Red);
            //ObjectSet(Title + "Line-1-4",OBJPROP_RAY,0);
            ObjectSet(Title,OBJPROP_STYLE,STYLE_DOT);
            ObjectSet(Title + "Line-1-4", OBJPROP_WIDTH, 0);
            ObjectSet(Title + "Line-1-4",OBJPROP_BACK,0);
            
            
           // ObjectCreate(Title + "Line-2-5", OBJ_TREND, 0, Time[Wolf[2]],Low[Wolf[2]], Time[Wolf[5]],High[Wolf[5]] );
           //// ObjectSet(Title,OBJPROP_STYLE,STYLE_DOT);
           // ObjectSet(Title + "Line-2-5",OBJPROP_RAY,0);
           // ObjectSet(Title + "Line-2-5", OBJPROP_COLOR, Yellow);
           // ObjectSet(Title + "Line-2-5", OBJPROP_WIDTH, 1);
          //  ObjectSet(Title + "Line-2-5",OBJPROP_BACK,0);
//         // found=true;
         } //else {
                //ObjectDelete(Title + "Line-1-3");
                 ObjectsRedraw();
         //}
      } 
  	int m=0;
  	int LastZigZag, PreviousZigZag;
   
   int p=0;
   while ( ExtMapBuffer[p]==0 && ExtMapBuffer2[p]==0) {
   	p++;
   }
   
   LastZigZag=p;
   
   p++;
   while(ExtMapBuffer[p]==0 && ExtMapBuffer2[p]==0) {
   	p++;
   }
   
   PreviousZigZag=p;
   
   if (OldLastZigZag>LastZigZag || OldPreviousZigZag>PreviousZigZag) {
   	if(SoundAlertMode > 0 && Bars>alertBar && OldLastZigZag == 1) {Alert("WolfWave Down trend Starting on ",Symbol()," Period ",Period());alertBar = Bars;}
    	OldLastZigZag=LastZigZag;
   	OldPreviousZigZag=PreviousZigZag;
   	ObjectDelete("Fibo");
   	ObjectCreate("Fibo", OBJ_FIBO, 0, Time[PreviousZigZag], ExtMapBuffer[LastZigZag], Time[LastZigZag], ExtMapBuffer[PreviousZigZag]);

   }
   if (OldLastZigZag<LastZigZag || OldPreviousZigZag<PreviousZigZag) {
 	  	if(SoundAlertMode > 0 && Bars>alertBar && OldLastZigZag == 1) {Alert("WolfWave Up trend Starting on ",Symbol()," Period ",Period());alertBar = Bars;}
    	OldLastZigZag=LastZigZag;
     	OldPreviousZigZag=PreviousZigZag;
   	ObjectDelete("Fibo"); 
   	ObjectCreate("Fibo", OBJ_FIBO, 0, Time[PreviousZigZag], ExtMapBuffer[LastZigZag], Time[LastZigZag], ExtMapBuffer[PreviousZigZag]);
 
   }
}

   return(0);
  }
//+------------------------------------------------------------------+
  

Comments