Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Indikatoren

Ideal ZigZag - Indikator für den MetaTrader 5

Ansichten:
1779
Rating:
(61)
Veröffentlicht:
2016.06.13 12:23
Aktualisiert:
2016.11.22 07:34
idealzz.mq5 (7.33 KB) ansehen
idealzzp.mq5 (7.33 KB) ansehen
Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Das ist ein einfacher, aber sehr schneller Zigzag.

Keine fehlenden oder falschen Gipfel. Die Feststellung von Gipfeln wurde zeitoptimiert.

Ideal ZigZag

Vorteile:

  1. Die aufwendigste Funktion in Berechnungen ist iBarShift. Es ersetzt völlig alle Zyklen die zum Feststellen von Gipfel benötigt werden. Daher wurde es durch ArrayBSearch ersetzt. Das bedeutet, dass der Indikator effizienter als sein MQL4-Äquivalent ist;
  2. Alle notwendige Daten für jeden Balken sind nicht nur in jedem Augenblick zugänglich, sondern auch für den EA jederzeit in der Historie;
  3. Keine fehlenden Gipfel;
  4. Effiziente Methode um Gipfel ohne Suche von Indikatorwerten zu finden;
  5. Sehr schnell;
  6. Arbeitet richtig bei Einfügungen in die Historie und wenn TimeFrames umgeschaltet werden;
  7. Perfekt für die Verwendung in EAs.

Nachteile:

  1. Speicherbedarf. ZigZag braucht 2 Buffer (einer ist wegen Lücken nicht genug) für korrektes Zeichnen, hier werden 5 Buffer verwendet. Meiner Meinung nach wird dieser Nachteil vollständig durch den Vorteil #6 wieder gut gemacht. Keiner der schnellen ZigZags kann Einfügungen in die Historie auf zwei Buffern korrekt verarbeiten.
  2. Zusätzliche Linien sind verfügbar. Das wird benötigt, um die Daten für einen Expert Advisor sichtbar zu machen. Diese Linien sollten niemals sichtbar sein.

Prinzip:

Der ZigZag wird durch das Kanalprinzip gezeichnet. Die Kanalbreite kann in Punkten (IdealZZ) oder in Prozenten (IdealZZP) definiert werden.

Gipfelerkennung:

input int ChannelWidth=100;

#property indicator_chart_window

datetime LastTime;
int ZZHandle;
//+------------------------------------------------------------------+
//| Benutzerdefinierter Indikator Initialisierungs-Funktion          |
//+------------------------------------------------------------------+
void OnInit()
  {
   LastTime = 0;
   ZZHandle = iCustom(_Symbol, Period(), "IdealZZ", ChannelWidth);
  }
//+------------------------------------------------------------------+
//| GetValue                                                         |
//+------------------------------------------------------------------+
bool GetValue(double dir,int bar,int prevBar,double &peak,
             int &peakBar,datetime &peakTime,const datetime &T[])
  {
   if(dir<0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,1,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else if(dir>0)
     {
      double t[1];
      if(0>=CopyBuffer(ZZHandle,2,bar,1,t)) return false;
      int i= ArrayBsearch(T, (datetime)t[0]);

      if(i==prevBar)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
        }

      double v[1];
      if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;

      if(v[0]==EMPTY_VALUE)
        {
         if(0>=CopyBuffer(ZZHandle,2,bar+1,1,t)) return false;
         i=ArrayBsearch(T,(datetime)t[0]);
         if(0>=CopyBuffer(ZZHandle,0,i,1,v)) return false;
        }

      peak=v[0];
      peakBar=i;
      peakTime=(datetime)t[0];
     }
   else
     {
      return(false);
     }

   return(true);
  }
//+------------------------------------------------------------------+
//| GetValue                                                         |
//+------------------------------------------------------------------+
void SetPt(string name,double price,datetime time)
  {
   ObjectCreate(0,name,OBJ_ARROW,0,time,price);
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,108);
   ObjectSetDouble(0,name,OBJPROP_PRICE,price);
   ObjectSetInteger(0,name,OBJPROP_TIME,time);
  }
//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikatoriterationsfunktion                   |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &T[],
                const double &open[],
                const double &high[],
                const double& low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   if(LastTime==T[0]) return(rates_total);
   LastTime=T[0];

   ArraySetAsSeries(T,true);

   double dir_[1];
   if(0>=CopyBuffer(ZZHandle,4,1,1,dir_)) return rates_total;
   double dir=dir_[0];
   double rdir=-dir;

   if(dir==EMPTY_VALUE) return(rates_total);

   double v1,v2,v3,v4,v5;
   int    i1,i2,i3,i4,i5;
   datetime t1,t2,t3,t4,t5;

   if(
      GetValue(dir,1,0,v1,i1,t1,T) && 
      GetValue(rdir,i1,0,v2,i2,t2,T) && 
      GetValue(dir,i2,i1,v3,i3,t3,T) && 
      GetValue(rdir,i3,i2,v4,i4,t4,T) && 
      GetValue(dir,i4,i3,v5,i5,t5,T)
      )
     {
      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);
     }
   else
     {
      Print("Scheint ein Fehler vorzuliegen...");
     }

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

Dieses Beispiel ist ein Indikator der die ersten fünf Gipfel (einschließlich des sich aktuell bildenden) markiert (einmal pro Balken).

Achtung! Der Code könnte falsch arbeiten, wenn Zero Bar Mode aktiviert ist

Zero Bar Mode:

Der Modus kann in der Variablen DrawZeroBar Variable eingeschaltet werden. Standardmäßig ist er deaktiviert. Es wird nicht empfohlen ihn zu aktivieren, besonders, wenn der Indikator in einem Expert Advisor verwendet wird.

Viel Spaß damit. Bitte informieren Sie mich über entdeckte Probleme.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/ru/code/925

Corrected Average (CA) Corrected Average (CA)

Corrected Average Indikator von A.Uhl (auch bekannt als der "Optimale gleitende Durchschnitt").

Jolly Roger EA Version Jolly Roger EA Version

Inspiriert von Pirat's Expert Advisor welcher an der Automated Trading Championship 2011 teilnahm.

Simple Trend Detector Simple Trend Detector

Gleich wie RSI und Dem aber empfindlicher.

Bibliothek zur Steuerung von Skype Bibliothek zur Steuerung von Skype

Bibliothek für die Arbeit mit Skype.