Init() und DeInit() Ausführungsreihenfolge - Seite 5

 
Nikolai Semko:


Ich verstehe das. Ich habe nach der Logik der Abfolge der Vorgänge gefragt. Und hier fehlt sie uns. Manchmal wird OnDeinit zuerst ausgeführt (wie es nach der Logik eines Laien sein sollte) und manchmal wird OnInit zuerst ausgeführt.

Mir ist klar, dass die Antwort in der Zeile"Für eine gewisse Zeit (eine sehr kurze Zeit) existieren beide Kopien des Indikators parallel" liegt.Aber das macht die Frage nicht klarer.

Die Funktion OnInit muss als erstes im Programm ausgeführt werden.

Können Sie ein Beispiel nennen, bei dem die Sequenz OnInit -> OnDeinit nicht immer ausgeführt wird?

 
Andrey Dik:

Die OnInit-Funktion sollte als erstes im Programm ausgeführt werden.

Können Sie ein Beispiel nennen, bei dem OnInit -> OnDeinit nicht immer ausgeführt wird?


Sie können ein Beispiel des Autors des ThemasERROR.mq5 verwenden, das er am Anfang angibt. Schalten Sie die TF um und sehen Sie, was auf der Registerkarte Experten passiert.

 
Nikolai Semko:


Sie können das BeispielERROR.mq5 verwenden, das er am Anfang angibt

Ich werde es tagsüber benutzen. Und Sie persönlich haben es bereits genutzt?
 
Andrey Dik:
Ich werde es im Laufe des Tages ausprobieren. Haben Sie es schon persönlich benutzt?

Natürlich habe ich es vor 9 Monaten benutzt. Sie können meinen Kommentar unter #8 in diesem Thema lesen.
 
Stanislav Korotky:

Äh, nein, so einfach ist das nicht. Indikatoren befinden sich innerhalb einer anderen Entität, dem Diagramm, und sind diesem untergeordnet (ich bin mir ihrer komplexen Eins-zu-Viel-Beziehung bewusst, aber das ändert nichts an der Sache). Ein Diagramm hat seinen eigenen Lebenszyklus, der eine Art von internen Init- und Deinit-Ereignissen umfasst, die die Grenzen für den Lebenszyklus der Indikatoren bilden. Mit anderen Worten: Ein Indikator kann sein Diagramm nicht überdauern. Das Deinit des Diagramms muss auf das Deinit oder Timeout des Deinits aller Indikatoren warten. Erst dann kann das Chart-Init für den neuen Zeitrahmen gestartet werden, und von dort aus können die Inits der angehängten Indikatoren aufgerufen werden.

Diagramme sind dasselbe wie Indikatoren. Indikatoren können ihre Charts "überleben".

Vor OnInit eines Indikators/Advisors werden die Konstruktoren der globalen Objekte ausgeführt. Nach OnDeinit - die Destruktoren. Daher können Sie OnInit und OnDeinit aus jedem Indikator entfernen.

Das einzige Problem ist, dass Ihre Vorstellungen von den Indikatoren nicht mit der Realität übereinstimmen. Vielleicht ist dieses Verhalten für einige Freiberufler, die die Lösung nicht schreiben können, kritisch.

Ich würde es begrüßen, wenn die Entwickler bei diesem Thema einen Schritt nach vorn machen würden. Aber hier prallen zwei völlig verständliche Standpunkte aufeinander, die ihre eigene Logik haben, so wie es sein sollte. Keiner von ihnen ist fehlerhafter als der andere. Es ist nur so, dass einige meinen, es sei richtig so und andere meinen, es sei richtig so.

 

Stellen Sie sich vor, wie langsam die Charts wären, wenn das Terminal vor dem Wechsel der TF auf das Entladen aller Indikatoren der alten TF warten würde und erst dann die neue TF aufbauen und initialisieren würde.

In welchen Situationen, abgesehen von der einfachen Arbeit mit grafischen Objekten (ohne den Namen der TF im Namen), ist die DeInit-Init-Sequenz wichtig?

 
Andrey Khatimlianskii:

Stellen Sie sich vor, wie langsam die Charts wären, wenn das Terminal vor dem Wechsel der TF auf das Entladen aller Indikatoren der alten TF warten würde und erst dann die neue TF aufbauen und initialisieren würde.

In welchen Situationen, abgesehen von der einfachen Arbeit mit grafischen Objekten (ohne den Namen der TF im Namen), ist die DeInit-Init-Sequenz wichtig?


+
 

Noch einmal. Wenn Sie den Zeitrahmen oder das Symbol im Diagramm ändern, wird eine neue Kopie des Indikators erstellt. Eine neue.

Aus dem gleichen Grund, aus dem die berechneten Teile der Indikatoren in den History-Caches gespeichert sind. Für jeden Zeitrahmen gibt es einen eigenen Cache von Balken. Wenn Sie den Zeitrahmen wechseln, z.B. EURUSD,M1 auf EURUSD,H1, wird an den Indikator im Cache M1 das Ereignis Deinit mit der Ursache 3 (Chartwechsel) gesendet und nach einer Weile wird dieser Indikator entladen. Wenn dieser Indikator plötzlich keine Zeit mehr hatte, Deinit mit Grund 3 zu behandeln, wird er mit Grund 1 (Chart schließen) deinitialisiert. Wenn der H1-Cache zu diesem Zeitpunkt noch nicht vorhanden war, wird er erstellt. Danach wird die Kopie des NEUEN Indikators in den H1-Cache geladen, an den das Init-Ereignis gesendet wird. Das neue Exemplar des Indikators weiß nichts über das vorherige Exemplar, das im Begriff ist, zu sterben. Alle Variablen der neuen Kopie des Indikators sind sauber, sie sind neu geboren.

Bei einem Zeitrahmenwechsel innerhalb eines einzelnen Symbols ist die Reihenfolge der Initialisierung/Deinitialisierung im Prinzip vorhersehbar. Laden Sie den neuesten Build 1580 herunter - wir haben einige Dinge korrigiert, jetzt wird das Löschen von Indikatoren in der allerletzten Runde durchgeführt, so dass es keine vorzeitige Deiniteration geben sollte. Ändert man jedoch das Symbol, kommt es zu einem Inter-Thread-Race in Reinform, und man kann die Reihenfolge der Initialisierung-Deinitialisierung nicht eindeutig vorhersagen. Da verschiedene Zeichen in verschiedenen Threads verarbeitet werden

Deshalb ein Tipp für den Themenstarter. Konzentrieren Sie sich auf die Ursache der Deinitialisierung. Wenn es 3 ist, müssen Sie das Farbschema nicht an das Diagramm zurückgeben.

 
Ist es nicht möglich, auf alle Deinit warten, wenn die TF ändern, und dann starten Sie die Indikatoren und führen Init in ihnen?
 
Andrey Khatimlianskii:

Stellen Sie sich vor, wie langsam die Charts wären, wenn das Terminal vor dem Wechsel der TF auf das Entladen aller Indikatoren der alten TF warten würde und erst dann die neue TF aufbauen und initialisieren würde.

In welchen Situationen, abgesehen von der einfachen Arbeit mit grafischen Objekten (ohne den Namen der TF im Namen), ist die DeInit-Init-Sequenz wichtig?


Warum sollten sie langsam sein? Es sei denn, der Indikator ist falsch geschrieben. Für einen gut geschriebenen Indikator benötigt DeInit nur recht wenig Zeit. Außerdem ist der TF-Wechsel kein so häufiger Vorgang. In einigen besonders schwerwiegenden Fällen (bei "falschen" Indikatoren) können Sie beim Wechsel der TFs ein oder zwei Sekunden warten.

Daher ist das Argument des Abbremsens beim TF-Wechsel mehr als zweifelhaft. Außerdem ist die Zeitverzögerung deutlich spürbar, wenn man zu der noch nicht gebauten TF wechselt. Und niemand weint über die Bremsen des Terminals.