Home Technische indicator Bericht

De Ideale ZigZag Indicator voor MetaTrader 4: Voordelen en Nadelen

Bijlage
10671.zip (2.71 KB, Downloaden 0 keer)



Voordelen van de ZigZag Indicator

  • De kostbaarste functie, iBarShift, vervangt volledig alle cycli in de code die nodig zijn voor het ophalen van pieken.
  • Alle informatie die nodig is om de ZigZag voor elke bar te bouwen, is niet alleen toegankelijk op elk moment, maar ook voor elke externe code.
  • Geen opgeschorte pieken.
  • Een efficiënte methode om pieken te vinden is beschikbaar.
  • Zeer snel.
  • Werkt correct bij het invoegen van geschiedenis en bij het wisselen van tijdframes.
  • Perfect voor gebruik in een Expert Advisor (EA).

Nadelen van de ZigZag Indicator

1. Geheugenvereisten. Deze indicator gebruikt 5 buffers in plaats van 2 (of zelfs 1) in andere vergelijkbare implementaties. Maar (volgens mij) is dit een goede prijs voor de voordelen #6 en #7. Geen enkele snelle ZigZag die ik heb gezien kan geschiedenis-invoegingen verwerken zonder een volledige herbouw. De mijne doet dat. Bovendien doet hij het op een efficiënte manier.

2. Extra lijnen zijn beschikbaar. Dit is nodig om de gegevens zichtbaar te maken voor elke externe code. Deze lijnen zouden nooit zichtbaar moeten zijn.

Principe:

De ZigZag wordt getekend volgens het kanaalprincipe.

De kanaalbreedte kan worden gedefinieerd in punten (XLab_ZZ) of in procenten (XLab_ZZP).

Pieken ophalen:

extern int ChannelWidth = 100;

#property indicator_chart_window
#property indicator_buffers 1

#property indicator_color1 Red
#property indicator_width1 3

datetime LastTime;

int init()
{
   LastTime = 0;
   
   return(0);
}

bool GetValue(double dir, int bar, int prevBar, double& peak, int& peakBar, datetime& peakTime)
{
   if (dir < 0)
   {
      datetime t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar);
      int i = iBarShift(Symbol(), 0, t);

      if (i == prevBar)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
         i = iBarShift(Symbol(), 0, t);
      }

      double v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);
      
      if (v == EMPTY_VALUE)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
         i = iBarShift(Symbol(), 0, t);
         v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);
      }
      
      peak = v;
      peakBar = i;
      peakTime = t;
   }
   else if (dir > 0)
   {
      t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar);
      i = iBarShift(Symbol(), 0, t);

      if (i == prevBar)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
         i = iBarShift(Symbol(), 0, t);
      }

      v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);
      
      if (v == EMPTY_VALUE)
      {
         t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
         i = iBarShift(Symbol(), 0, t);
         v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);
      }
      
      peak = v;
      peakBar = i;
      peakTime = t;
   }
   else 
   {
      return (false);
   }
   
   return (true);
}

int start()
{
   if (LastTime == Time[0]) return (0);
   LastTime = Time[0];
   
   double dir = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 4, 1);
   double rdir = -dir;

   if (dir == EMPTY_VALUE) return (0);
   
   double v1, v2, v3, v4, v5;
   int    i1, i2, i3, i4, i5;
   datetime t1, t2, t3, t4, t5;
   
   GetValue(dir, 1, 0, v1, i1, t1);
   GetValue(rdir, i1, 0, v2, i2, t2);
   GetValue(dir, i2, i1, v3, i3, t3);
   GetValue(rdir, i3, i2, v4, i4, t4);
   GetValue(dir, i4, i3, v5, i5, t5);

   SetPt("1", v1, t1);
   SetPt("2", v2, t2);
   SetPt("3", v3, t3);
   SetPt("4", v4, t4);
   SetPt("5", v5, t5);
   
   Print(v1, "   ", v2, "  ", v3, "  ", v4, " ", v5, " ", i1, "  ", i2, "  ", i3, " ", i4, " ", i5);

   return(0);
}

void SetPt(string name, double price, datetime time)
{
   ObjectCreate(name, OBJ_ARROW, 0, time, price);
   ObjectSet(name, OBJPROP_ARROWCODE, 108);
   ObjectSet(name, OBJPROP_PRICE1, price);
   ObjectSet(name, OBJPROP_TIME1, time);
}

Dit voorbeeld is een indicator die (één keer per bar) de eerste vijf pieken markeert (inclusief de huidige die zich vormt).

Let op! Deze code kan incorrect werken als de 0th Bar Mode is ingeschakeld.


0th Bar Mode:

Wordt ingesteld met de DrawZeroBar variabele. Standaard uitgeschakeld.

Het wordt niet aanbevolen om deze optie te gebruiken, vooral niet als de indicator wordt gebruikt in een EA.


Veel plezier met het gebruik ervan! Voel je vrij om vragen te stellen.

Als er bugs worden gevonden, laat het me alsjeblieft weten. Bedankt.

Gerelateerde berichten

Reactie (0)