Werte aus ZigZag Indikator auslesen

 
Hallo, 

ich zähle alle Kerzen Rückwerts bis ich einen Wert erhalte.

   int bars = Bars(_Symbol,PERIOD_CURRENT);

   for(int i=0; i<bars; i++)
     {
      double zz=iCustom(Symbol(), 0, "ZigZag",10,0,0, 0 i);
      if(zz!=0 && zz!= EMPTY_VALUE)
        {
         Comment(zz);
        }

     }
Die letzten Zwei Indikator Parameter stellen die Hochs und Tiefs dar. 
Ausgegeben wird der mit Werten gefüllte double. 

In der Praxis wird kein Wert erkannt und die Schleife zählt bis in das Unendliche. 

Kann mir bitte jemand bei der Fehlersuche helfen? 

MQL5
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Indikatorkonstanten / Typen der Indikatoren
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Indikatorkonstanten / Typen der Indikatoren
  • www.mql5.com
Typen der Indikatoren - Indikatorkonstanten - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Ist das jetzt MQL4 (gehört in einen anderen Thread weiter unten) oder MQL5?
 
Carl Schreiber #:
Ist das jetzt MQL4 (gehört in einen anderen Thread weiter unten) oder MQL5?

MQL5, korrigiert =)

 
Janis Hellmuth #:

MQL5, korrigiert =)

Ja, das kann auch gar nicht funktionieren.

Du erstellst das Handle mit double, da gehört int hin und das handle musst Du nur einmal erstellen, darum kommt es nicht in die Schleife, sondern davor. Zum Beispiel in die OnInit... oder ist das ein Skript?

Hier ist mal ein Artikel, da steht ein Bisschen wie es gemacht wird. Du brauchst nämlich noch mindestens einen Array, den mit ArraySetAsSeries als Zeitreihe einstellst und mit Werten füllen kannst.
Und dann füllst Du diesen mit Hilfe von Copybuffer und dem Indikatorhandle. Das steht in dem Artikel unten beschrieben. Dann hast Du aber immer noch nicht die Werte, außerdem ist das ganz logisch, dass die Schleife immer weiter zählt, schließlich hast Du ihr keinen Grund gegeben, anzuhalten. Statt bis i<bars könntest Du auch sagen bis (zzarray[i]!=0&&zzarray[i]!=EMPTY_VALUE ). Dann hält er jedoch beim ersten ZigZagpunkt schon an. Das wäre mal ne gute Übung. Dann musst Du Dir jedoch das Arrayelement zzarray[soundso] anzeigen lassen und nicht das Handle. Wenn Du das hinkriegst hast Du schon ganz schön was gelernt für heute.

https://www.mql5.com/de/articles/31

Hier noch was über Arrays. Die brauchst Du so gut wie immer. Das i in der Schleife zählt die Elemente 0,1,2,3 im Array/Buffer des ZZ ab.
https://www.mql5.com/de/articles/567

Ich sags mal so wie es ist, vielleicht unterschätze ich Deine Intelligenz und Du kommst aus einem ganz anderen Bereich oder so und in zwei Jahren gehst Du voll ab. Kann ich nicht sagen. Es sieht aber so aus, als würde Dir das nicht besonders liegen und es ist dann immer schwierig, gute Ratschläge zu geben, wenn so viele Grundprinzipien nicht verstanden wurden.

MQL5 für Neueinsteiger: Leitfaden zur Verwendung technischer Indikatoren in Expert Advisors
MQL5 für Neueinsteiger: Leitfaden zur Verwendung technischer Indikatoren in Expert Advisors
  • www.mql5.com
Um Werte eines integrierten oder benutzerdefinierten Indikators in einem Expert Advisor zu erhalten, sollte zuerst sein Handle mithilfe der entsprechenden Funktion erstellt werden. Die Beispiele in diesem Beitrag zeigen, wie diese und jene technischen Indikatoren während der Erstellung Ihrer eigenen Programme genutzt werden können. Dieser Beitrag beschreibt Indikatoren, die in MQL5 geschrieben werden. Er richtet sich an jene, die nicht viel Erfahrung in der Entwicklung von Handelsstrategien haben, und liefert einfache und klare Arten der Arbeit mit Indikatoren mithilfe der bereitgestellten Bibliothek von Funktionen.
 
Vielen dank für die Hilfe und das Interesse!
Mir ist anscheinend der Unterschied zwischen MQL4 und 5 nicht ganz klar.

Wie kann ich nach einem konkreten Wert innerhalb der icustum-Funktion suchen? 

z.b. 

   CopyBuffer(ZIGZAG_Indikator1,0,0,1000,ZZ_Array1);
   ArraySetAsSeries(ZZ_Array1,true);

   for(int i=0; i<1000; i++)
     {
      if(ZZ_Array1[i] != 0.0 && ZZ_Array1[i] != EMPTY_VALUE)
        {
         if(ZigZag1_Nr[0] == 0.0)
           {
            ZigZag1_Nr[0] = ZZ_Array1[i];
           }
Diese Funktion gibt mir allgemein die Indicatorwerte. '

Mein Ziel ist es direkt nach dem "x" zu suchen: 

   "ZIGZAG_Indikator1_Time_Hoch=iCustom(_Symbol,PERIOD_CURRENT,"ZigZag",3,0,0,0,x);"
 

Warum schaust Du nicht nach, wie iCustom verwendet wird?

Entweder Kursor auf iCostom stellen und F1 drücken oder (Du kennst's ja schon) in https://www.mql5.com/de/docs/function_indices iCustom suchen und unten das Beispiel verwenden: 1. in Oninit()  ein Handle sich geben lassen und 2. in OnCalculate(..) mit CopyBuffer die Werte holen.

Dokumentation zu MQL5: MQL5 Funktionenliste
Dokumentation zu MQL5: MQL5 Funktionenliste
  • www.mql5.com
MQL5 Funktionenliste - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
int OnInit() //0,1,2,3,4,5,6,07,08
  {

   
   atrHandle = iATR(_Symbol,PERIOD_CURRENT,12);                                                                      
                                                                                 
                                                                           
                                                                           
                      
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {

  }

void OnTick()
  {
   CopyBuffer(atrHandle,0,0,1,atr);
   ArraySetAsSeries(atr,true);
   

ungetestetes beispiel. damit hast du aus dem Buffer 0 und der Startposition 0 (jüngste bar) einen Wert aus dem buffer kopiert

 
Janis Hellmuth #:
Vielen dank für die Hilfe und das Interesse!
Mir ist anscheinend der Unterschied zwischen MQL4 und 5 nicht ganz klar.

Wie kann ich nach einem konkreten Wert innerhalb der icustum-Funktion suchen? 

z.b. 

Diese Funktion gibt mir allgemein die Indicatorwerte. '

Mein Ziel ist es direkt nach dem "x" zu suchen: 

   "ZIGZAG_Indikator1_Time_Hoch=iCustom(_Symbol,PERIOD_CURRENT,"ZigZag",3,0,0,0,x);"

Erstmal was Carl sagte. Dann weiß ich grad nicht was das x ist. Schau mal in Indicators\Examples\ZigZag welcher Buffer was speichert und dann kannst Du mit Copybuffer wie bei jedem anderen Indikator den Buffer im EA in ein Array übertragen und wenn Du eine Schleife benutzt, um einen Wert zu suchen ist i der Balken, den Du suchst. Aber dann musst Du auch ArraySetAsSeries verwenden, damit 0 der neueste Balken ist. Und dann schau in der Dokumentation unter "Zugang zu Zeitreihen und Indikatoren", da ist iTime. Du merkst schon, da sind alleine fünf/sechs Ebenen drin.

Dann kannst Du auch mal im Forum suchen unter "Werte vom Indikator richtig auslesen". Da wurde das so ähnlich schon mal gemacht. Hab ich mich da verkünstelt...

 
pennyhunter #:

Erstmal was Carl sagte. Dann weiß ich grad nicht was das x ist. Schau mal in Indicators\Examples\ZigZag welcher Buffer was speichert und dann kannst Du mit Copybuffer wie bei jedem anderen Indikator den Buffer im EA in ein Array übertragen und wenn Du eine Schleife benutzt, um einen Wert zu suchen ist i der Balken, den Du suchst. Aber dann musst Du auch ArraySetAsSeries verwenden, damit 0 der neueste Balken ist. Und dann schau in der Dokumentation unter "Zugang zu Zeitreihen und Indikatoren", da ist iTime. Du merkst schon, da sind alleine fünf/sechs Ebenen drin.

Dann kannst Du auch mal im Forum suchen unter "Werte vom Indikator richtig auslesen". Da wurde das so ähnlich schon mal gemacht. Hab ich mich da verkünstelt...

Korrekt und mit iTime gibt man die Verschiebung für die Bar-For Schleife an. Wenn ich fertig bin biete ich eine detaillierte Lösung zur Klärung! 

Über copybuffer Wert Nr. 2 kann man sich die Hochs und Tiefs generieren. Genau danach hatte ich Gesucht!

Auch die einzelnen Werte speichere ich in Arrays ab. Ich muss nur die Zeit für jedes einzelne Zigzag zuordnen

Danke nochmal!☺️


 
Claudius Marius Walter #:

ungetestetes beispiel. damit hast du aus dem Buffer 0 und der Startposition 0 (jüngste bar) einen Wert aus dem buffer kopiert

Danke für die Hilfe! 

Diesem Stand habe ich bereits erfolgreich umgesetzt.
 
Folgende Situation: 


   for(int v=0; v<bars; v++)
     {
      if(
         (
            High[v] == ZigZag1_Array_Hoch_Nr[0]
         )
      )
        {
         ZigZag1_Hoch_Time0 = iTime(_Symbol,PERIOD_CURRENT,v);
         break;
        }


Mit der Schleife vergleiche ich ob es sich um den exakten ZIGZAG Wert handelt. 


Wenn ich die Werte Visualisiere sind es nicht die exakten ZigZag-Punkte
Grund der Beschwerde: