vorher_berechnet - Seite 3

 
Alexey Viktorov:

Die erstaunliche Fähigkeit, die falsche Frage zu beantworten...

Nun erklären Sie mir, was passiert, wenn:

1. 100 Balken gezählt, in Puffer von 0 bis einschließlich 99 eingetragen (Zählrichtung als Zeitreihe) Wert 1,03

2. Plötzlich wurde die Historie geladen und prev_calculated wurde zu 0.

Ab welchem Balken im Indikator wird der Wert 1,03 sein?

  1. Um die Indexierung wie in der Zeitreihe zu berechnen, sollten wir das AS_SERIES-Flag in OnInit() des Indikatorpuffers setzen - deshalb bevorzuge ich das Konzept "der ganz rechte Balken" - so wird niemand fälschlicherweise informiert.
  2. Hier ist die Antwort:
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    bei "prev_calculated==0" werden absolut alle Elemente des Indikatorpuffers mit den Werten "1.01" neu initialisiert und sofort durch "return(rates_total);" beendet. Das heißt, dass keine Spuren der früheren "1,03"-Werte im Indikatorpuffer verbleiben.
 
Alexey Viktorov:

Erklären Sie besser, wie man den Müll loswird, wenn der Indikator zumERSTEN Mal gestartet wird.

Es ist ganz einfach: Vergessen Sie prev_calculated und erstellen Sie Ihr eigenes Duplikat ohne das "Loch in der Seite". Wenn Sie die zuvor berechneten Balken im Auge behalten wollen - wiefxsaber im Beispiel.
fxsaber:
Überhaupt keine Krücke. So mache ich das.
Wenn ein einfaches Flag erster Lauf / nicht mehr erster Lauf ausreicht, ersetzen Sie prev_calculated durch static bool b_First_Run. Oder Sie können die Pufferinitialisierung auf OnInint
 
Karputov Vladimir:
  1. Um die Indizierung wie bei Zeitreihen zu berücksichtigen, sollten wir das Flag AS_SERIES in OnInit() des Indikatorpuffers setzen - deshalb bevorzuge ich die Verwendung von "rechter Balken" - damit niemand fälschlicherweise informiert wird.
  2. Hier ist die Antwort:
       if(prev_calculated==0)
         {
          //--- инициализация элементов индикаторного буфера при первом запуске или при подкачке истории
          for(int i=0;i<rates_total;i++)
             ExtBuffer[i]=1.01;
          return(rates_total);
         }
    bei "prev_calculated==0" werden absolut alle Elemente des Indikatorpuffers mit den Werten "1.01" neu initialisiert und sofort durch "return(rates_total);" beendet. Das heißt, dass keine Spuren der früheren "1,03"-Werte im Indikatorpuffer verbleiben.

Dies ist also das Problem, das gelöst werden sollte. Ich brauche keinen Müll (nicht wirklich, aber er stört die Anzeige), aber ich muss die vorherigen Berechnungen des Indikators speichern. Wenn Sie den Indikator zum ersten Mal starten, wird der Puffer zugemüllt, und beim Laden der Historie sollte alles, was in den Puffer eingefügt wurde, gespeichert werden ... und vorzugsweise ohne sie in einer Datei oder in GV zu speichern.


hinzugefügt:

Damit soll die Inanspruchnahme jede Minute in Echtzeit geschätzt werden. Der Expert Advisor arbeitet eine Woche lang ohne Unterbrechung, und anstelle der wöchentlichen Anzeige sehen wir nur den letzten Wert, der auch ohne den Indikator sichtbar ist.

 
Alexander Puzanov:
Wenn ein einfaches Kennzeichen für den ersten Lauf / nicht mehr ersten Lauf ausreicht, ersetzen Sie prev_calculated durch static bool b_First_Run. Und Sie können die Pufferinitialisierung in OnInint
Nein, so primitiv sind die Ziele dort nicht.
 
fxsaber:
Nein, die Ziele dort sind nicht so primitiv.
Dies ist nicht Ihr Vorschlag,Alexey Viktorov, wie ich es verstehe, muss nur die Puffer beim ersten Start auf Null setzen und berührt nichts in ihnen während eines Paging
 
Alexey Viktorov:

Das ist also das Problem, das es zu lösen gilt. Ich brauche den Müll nicht (ich brauche ihn nicht, aber er stört die Anzeige), aber ich muss die vorherigen Berechnungen des Indikators speichern. Wenn Sie den Indikator das erste Mal starten, wird der Puffer zugemüllt, und beim Laden der Historie sollte alles, was in den Puffer eingefügt wurde, gespeichert werden ... und vorzugsweise ohne sie in einer Datei oder in GV zu speichern.


hinzugefügt:

Dies ist als Echtzeitschätzung der Inanspruchnahme pro Minute gedacht. Der Expert Advisor arbeitet eine Woche lang ohne Unterbrechung, und anstelle einer wöchentlichen Anzeige sehen wir nur den letzten Wert, der auch ohne Indikator sichtbar ist...

О! Jetzt macht es mehr Sinn. Ich werde am Abend antworten.
 
Alexander Puzanov:
Alexey Viktorov, so wie ich es verstehe, braucht nur dies - die Puffer beim ersten Start auf Null zu setzen und während des gesamten Auslagerungsvorgangs nichts in ihnen zu berühren
Natürlich begann ich mit der Initialisierung von Puffern in OnInit(), aber irgendetwas war falsch, ich weiß nicht mehr was, und ich initialisierte sie in OnCalculate mit prev_calculated == 0
 

Es wurde erneut überprüft, was passiert, wenn Puffer-Arrays in OnInit() initialisiert werden.

Selbst wenn der Indikator aus dem Diagramm entfernt und neu gesetztwird, haben NICHT ALLE, sondern nur einige Puffer noch die alten Werte. Sie sind nicht einmal genau so hoch wie vorher, aber einer dieser Werte erstreckt sich über mehrere Balken.

 
Karputov Vladimir:
Oh! Das macht jetzt mehr Sinn. Ich melde mich heute Abend bei Ihnen.
Entschuldigen Sie die Verzögerung bei der Beantwortung. Die einzige Möglichkeit, die berechneten Werte für diesen Zeitraum zu speichern, besteht darin, sie in einer Datei zu speichern. Das erfordert eine Synchronisation - die Daten sollten beim Lesen aus der Datei auf ihre Balken verteilt werden. Der logischste Weg ist die Synchronisierung mit der Öffnungszeit des Balkens, aber es kann einige Nuancen geben: zum Beispiel war die Öffnungszeit des Balkens (gespeichert in einer Datei) 2016.09.05. 25:02, aber jetzt gibt es einen Balken auf dem Diagramm mit der Zeit gleich 2016.09.05. 25:01.
 
Karputov Vladimir:
Entschuldigen Sie die Verzögerung bei der Beantwortung. Die einzige Möglichkeit, die berechneten Werte für einen bestimmten Zeitraum zu speichern, besteht darin, sie in einer Datei zu speichern. Sie müssen sich um die Synchronisierung kümmern, damit die Daten beim Lesen aus der Datei auf ihren Balken platziert werden. Die logischste Lösung ist die Synchronisierung gemäß der Öffnungszeit des Balkens, aber es kann einige Feinheiten geben: zum Beispiel war die Öffnungszeit des Balkens (gespeichert in einer Datei) 2016.09.05. 25:02, aber jetzt haben wir einen Balken auf dem Diagramm mit der Zeit gleich 2016.09.05. 25:01.

Oder wäre es vielleicht besser, die Aufmerksamkeit der Entwickler auf das Problem der Initialisierung von Indikatorpuffern zu lenken? Warum gibt es dieses Problem bei MT4 nicht? Vielleicht wieder kein vollständiges Verständnis? Das Problem ist, dass selbst nach der obligatorischen Initialisierung von Puffern nach der Entnahme eines Indikators aus einem Diagramm in JEDEM von ihnen, nicht alle Puffer Müll enthalten, und wir können nicht entladen es von dort...

Ich persönlich habe nichts gegen Krücken, aber nur, wenn diese Krücken nicht zu kompliziert sind und eine positive Wirkung haben. Aber in eine Datei zu schreiben und sie dann zu lesen, ist eine faule Krücke.

Grund der Beschwerde: