OnDeinit in Indikatoren - Seite 5

 
mql5:
Ich werde versuchen, es noch einmal zu erklären (auf meinen Fingern):
  1. Das Terminal wurde X Mal nach dem letzten Start hochgefahren
  2. Download der Historie eingeleitet, die nicht vorhanden ist (Terminal war X Minuten lang inaktiv)
  3. Aufruf von OnCalculate für den Indikator auf der verfügbaren Historie prevtime = letzte bekannte Historienzeit, Indikatorpuffergröße N Bars
  4. Während die Historie vom Server heruntergeladen wird, erscheint ein Häkchen
  5. Aufruf von OnCalculate des Indikators, wobei Time[0] eine Tickzeit ist, die der Indikator als prevtime speichert, Puffergröße des Indikators ist N+1 Bars (zwischen N und N+1 Bars gibt es eine Lücke in der Historie)
  6. Nachdem die Historie heruntergeladen wurde, wird OnCalculate erneut aufgerufen, aber dieses Mal gibt es kein Loch in der Historie, aber prevtime hat das gleiche Datum wie Time[0] - kein neuer Balken (bzw. kein Löschen von Puffern im Indikator), Puffergröße der N+X/Timeframe-Balken des Indikators und IndBuffer[0] sind nicht die gleichen wie in Schritt 5



Was hat die Vorzeit damit zu tun?

Ich frage, warum es nicht funktioniert.

/////////////////////////////////////
void OnDeinit(const int reason)
{
 ArrayInitialize(body_up,EMPTY_VALUE);
ArrayInitialize(body_down,EMPTY_VALUE);
ArrayInitialize(shadow_up,EMPTY_VALUE);
ArrayInitialize(shadow_down,EMPTY_VALUE);
  ArrayInitialize(yell_body_up,EMPTY_VALUE);
ArrayInitialize(yell_body_down,EMPTY_VALUE);
ArrayInitialize(yell_shadow_up,EMPTY_VALUE);
ArrayInitialize(yell_shadow_down,EMPTY_VALUE);


}
 
eevviill:

Was hat das mit der Vorzeit zu tun?

Ich frage, warum es nicht funktioniert.

Und woher wissen Sie, dass es nicht funktioniert? Wie überprüfen Sie das?

Und warum werden die Indikatorpuffer initialisiert, bevor sie entladen werden? Es ist bereits entladen, nicht wahr?

DiePuffer für die Indikatoren sollten initialisiert werden, wenn alle Indikatorwerte vollständig neu berechnet sind:

int OnCalculate(..)
{
   ...
   if (<необходимо пересчитать все значения индикатора, например, если limit == Bars - 1>)
   {
      ArrayInitialize(...);
   }
   ...
}
 
eevviill:

Hier. Ich führe dazu einen Puffer-Nullabgleich durch. Inite hat bereits gesagt, dass Sie das nicht tun können.

Ich möchte deinitieren. Aber auch dort funktioniert es nicht. Und warum?

Was haben init() und deinit() damit zu tun? Die Operation ist an einer ganz anderen Stelle erforderlich. Ich werde es noch einmal wiederholen. Nach der Berechnung wurde die Historie geladen.

Ich habe eine funktionierende Version erstellt.

Dateien:
 
Scriptong:

Woher wissen Sie, ob es nicht funktioniert? Wie überprüfen Sie das?


https://forum.mql4.com/ru/65066/page2#1015138
 
Vinin:

Was hat init(), deinit() damit zu tun? Die Operation wird an anderer Stelle benötigt. Ich wiederhole. Nach der Berechnung wurde die Historie geladen.

Ich habe eine funktionierende Version erstellt.

Auf Ihre Empfehlung hin habe ich es trotzdem beim ersten Mal richtig gemacht.

Ich frage mich, warum das Deinit nicht funktioniert, um die Arrays auf Null zu setzen?

 
eevviill:
https://forum.mql4.com/ru/65066/page2#1015138

Sie haben einen Link zu einem Code angegeben, der in OnCalculate funktioniert. Ich habe gefragt, woher Sie wissen, dass die Initialisierung in DeInit nicht funktioniert. Nur für den Fall, dass nach OnDeinit() nichts aus dem Indikatorcode funktioniert (weder OnInit() noch OnCalculate()), möchte ich darauf hinweisen. Daher können Sie die Nullstellung der Arrays nur in OnDeinit() selbst überprüfen.

 
Scriptong:

Sie haben einen Link zu einem Code angegeben, der in OnCalculate funktioniert. Ich habe gefragt, woher Sie wissen, dass die Initialisierung in DeInit nicht funktioniert. Nur für den Fall, dass nach OnDeinit() nichts aus dem Indikatorcode funktioniert (weder OnInit() noch OnCalculate()), möchte ich darauf hinweisen. Daher können Sie die Tatsache des Nullsetzens von Arrays nur in OnDeinit() selbst überprüfen.

Ich habe einen Link angegeben zu

BetriebGeöffnete Karte - angeschlossener M1-Indikator - geschlossenes Terminal - geöffnetes Terminal in ein paar Minuten. Das Ergebnis ist auf Screenshots zu sehen.

So teste ich es.

 
eevviill:

Auf Ihre Empfehlung hin habe ich es trotzdem beim ersten Mal richtig gemacht.

Ich frage mich, warum deinit nicht mit dem Nullsetzen von Arrays funktioniert?

Oder funktioniert deinit nicht, wenn das Terminal geschlossen ist?
 
eevviill:
Oder funktioniert deinit nicht, wenn das Terminal geschlossen ist?
Ja, aber es hat keinen Sinn, die Indikatorpuffer zu löschen - sie werden nicht gespeichert.
 
mql5:
Es funktioniert, aber es hat keinen Sinn, die Indikatorpuffer zu löschen - sie werden nicht gespeichert.

Und warum?

Warum wird der Wert von Puffer 0 gefüllt gespeichert, aber nicht auf Null gesetzt?