highs und lows im Indikator tracken

 
Hallo zusammen. Ich versuche nun schon seit ner ewigkeit die highs und lows meines Indikators zu tracken


der indikator is nichts besonderes. schwingt um 0 und ich würde gerne die letzten drei highs und lows in einem array speichern



Hier ist mein Ansatz:

    if(bp[i-1] > bp[i] && bp[i-1] > bp[i-2]) // if new high?
    {
      static double secondHigh = hi[0];
      static double thirdHigh = hi[1];
      static double firstHigh = 1;

      hi[2] =  thirdHigh;
      hi[1] =  secondHigh;
      hi[0] = firstHigh ;
    }
    if(isNewBar())
    {
      hi[0]++; //first high
      hi[1]++; //second high
      hi[2]++; //third high

    }

Leider spuckt der Indikator im Tester folgendes aus:


das first High stimmt aufjedenfall. Das secondHigh und das thridHigh sind entweder ständig genauso groß wie das firstHigh, oder eine Zahl kleiner. Mir scheint, als verstünde ich eine Grundsätzliche arbeitsweise des Indikators oder von mql5 nicht...

 
Mir kommt vor Du mischt Index und Preise.
  1. Willst Du die Indices oder die Preise der high2 speichern? Was brauchst Du im Weiteren?
  2. Wenn es ein neues High gibt, das Du speichern willst, würde ich 'verschieben':
static double hi[3] = {0., 0., 0.};
..
if (/* new high*/ ) {
        hi[2] = hi[1];
        hi[1] = hi[0];
        hi[0] = bp[i-1];
}


 

ich möchte die Indizes speichern, die Preise sind nicht wichtig.

Gemäß deinem Ansatz:

    if(bp[i-1] > bp[i] && bp[i-1] > bp[i-2]) // if new high?
    {

      hi[2] =  hi[1];
      hi[1] =  hi[0];
      hi[0] = 1 ;
    }
    if(isNewBar())
    {
      hi[0]++; //first high
      hi[1]++; //second high
      hi[2]++; //third high

    }

habe ich

static double hi[3] = {0., 0., 0.};

global definiert. Leider wird das hi[] die ganze zeit mit dem Indice des neuesten Highs befüllt...


zwar entspricht das hi[0] tatsächlich dem 14. Index, aber die andern werden einfach mit demselben Wert gefüllt und ich kann mir das nicht erklären...

 
Claudius Marius Walter #:

ich möchte die Indizes speichern, die Preise sind nicht wichtig.

Gemäß deinem Ansatz:

habe ich

global definiert. Leider wird das hi[] die ganze zeit mit dem Indice des neuesten Highs befüllt...


zwar entspricht das hi[0] tatsächlich dem 14. Index, aber die andern werden einfach mit demselben Wert gefüllt und ich kann mir das nicht erklären...

Die Indices ändern sich laufen, was ist wenn Du die Eröffnungszeit der Bar speicherst?

static datetime hi[3] = {0, 0, 0};
..
if (/* new high*/ ) {
        hi[2] = hi[1];
        hi[1] = hi[0];
        hi[0] = time[i-1];
}
 
Carl Schreiber #:

Die Indices ändern sich laufen, was ist wenn Du die Eröffnungszeit der Bar speicherst?

Das wäre meine letzte Option.

ich dachte eben, dass ich die Änderungen der Indices mit der Funktion einbeziehen kann:

    if(isNewBar())
    {
      hi[0]++; //first high
      hi[1]++; //second high
      hi[2]++; //third high

    }
 Kannst du irgendwo meinen Denkfehler erkennen?
 

Wenn Du das machst:

    if(bp[i-1] > bp[i] && bp[i-1] > bp[i-2]) // if new high?
    {

      hi[2] =  hi[1];
      hi[1] =  hi[0];
      hi[0] = 1 ;
    }
    if(isNewBar())
    {
      hi[0]++; //first high
      hi[1]++; //second high
      hi[2]++; //third high

    }

müsste dann nicht der Index des hi, also i-1 zugewiesen werden?

    if(bp[i-1] > bp[i] && bp[i-1] > bp[i-2]) // if new high?
    {

      hi[2] =  hi[1];
      hi[1] =  hi[0];
      hi[0] =  i-1 ;
    }
    if(isNewBar())
    {
      hi[0]++; //first high
      hi[1]++; //second high
      hi[2]++; //third high

    }

Aber das hätte man auch mit dem Debugger herausgefunden.

 
Carl Schreiber #:

Wenn Du das machst:

müsste dann nicht der Index des hi, also i-1 zugewiesen werden?

Aber das hätte man auch mit dem Debugger herausgefunden.

hab ich auch schon probiert. würde baer keinen unterschied machen, da ich das neueste high sowieso imm beim Index 1 feststelle. (0 wäre dann die neueste kerze)

Im Debgugger ist es etwas unhandlich. Habe in den einstellung zwar "Nür Öffnungspreise " eingestellt. trotzdem scheint es so, als würde er jeden Tick abfahren... Das wiederum führt dazu, dass die IsNewBar() nicht true ausgibt und ich somit überhaupt nichts nachvollzoiehen kann..

 
Claudius Marius Walter #:
hab ich auch schon probiert. würde baer keinen unterschied machen, da ich das neueste high sowieso imm beim Index 1 feststelle. (0 wäre dann die neueste kerze)

Im Debgugger ist es etwas unhandlich. Habe in den einstellung zwar "Nür Öffnungspreise " eingestellt. trotzdem scheint es so, als würde er jeden Tick abfahren... Das wiederum führt dazu, dass die IsNewBar() nicht true ausgibt und ich somit überhaupt nichts nachvollzoiehen kann..

Zu den Eröffnungspreisen steht in der Referenz unter  Optionen... Einstellungen des MetaEditors im Abschnitt Debug:  "Nur Eröffnungspreise — diese Methode emuliert auch die Preise für OHLC, jedoch wird nur der Eröffnungspreis einer Bar zum Testen/Optimieren herangezogen."
 
hab den fehler gefunden, danke dir Carl für deinen Dialog:)!

so müsste es richtig heißen:

    if(isNewBar())
    {
      if(bp[i-1] > bp[i] && bp[i-1] > bp[i-2]) // if new high?
      {

        hi[2] =  hi[1];
        hi[1] =  hi[0];
        hi[0] = 1 ;
      }


      {
        hi[0]++; //first high
        hi[1]++; //second high
        hi[2]++; //third high

      }
    }