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

 
Andrey Dik:

Ich habe deutlich geschrieben - halten Sie die Daten, die für die Übertragung auf die Kopie benötigt werden, immer auf dem neuesten Stand, Sie müssen das nicht nur bei der Eingabe tun, halten Sie sie immer auf dem neuesten Stand.


Andrey, machst du Witze oder verstehst du wirklich nicht, dass alle deine tatsächlichen Daten, die in Variablen und Arrays in den Indikatoren gespeichert sind, nach dem Wechsel der TF irrelevant werden, weil die Indikatorkopie mit all ihren Details gelöscht wird. Bei Expert Advisors ist natürlich alles ganz einfach, weil es keine Neuinitialisierung gibt.
 
Nikolai Semko:

Sie machen wohl Witze, oder Sie verstehen nicht, dass alle Ihre tatsächlichen Daten, die in Variablen und Arrays in den Indikatoren gespeichert sind, nach dem Wechsel der TF irrelevant werden, weil die Indikatorkopie mit all ihren Details gelöscht wird. Bei Experten ist natürlich alles ganz einfach, denn es gibt keine Neuinitialisierung.

Nein, das bin ich nicht.

Du verstehst nicht, was ich sage.

Zum Beispiel gibt es einen bestimmten Datensatz, der in eine andere Kopie des Indikators übertragen werden muss (ob es sich dabei um einen anderen Indikator auf einem Diagramm oder eine neue Kopie des Indikators handelt, wenn sich die TF ändert, spielt keine Rolle). Der Indikator berechnet etwas und jedes Mal, wenn er etwas berechnet und dieses Etwas auf andere Indikatoren angewendet wird, sollte dieser Indikator aktualisiert werden. Jedes Mal. Diese Datenbank kann an verschiedenen Orten gespeichert werden, je nach Datenmenge und gewünschter Übertragungsrate. Diese Daten müssen immer dann aktualisiert werden, wenn eine Änderung an den Daten vorgenommen wurde, und nicht nur, wenn sie deinitialisiert werden. Das ist der Trick. Es gibt nichts Kompliziertes daran. Es geht nicht darum, die Daten in den lokalen Variablen des Indikators zu speichern, sondern darum, die Daten jedes Mal zurückzusetzen/zu aktualisieren, wenn die Daten neu berechnet wurden.

Aber mit den grafischen Objekten ist es sehr einfach.

 
Nikolai Semko:

Bei Expert Advisors ist natürlich alles ganz einfach, weil es keine Neuinitialisierung gibt.
In Expert Advisors gibt es eine "Neuinitialisierung", aber alle lokalen Variablen werden gespeichert, aber ich habe oben über etwas anderes geschrieben - über das Speichern, wenn es notwendig ist, lokale Daten bei jeder Änderung auf einen externen Speicher zu übertragen, nicht nur bei der Deinitialisierung.
 
Andrey Dik:

Nein, das bin ich nicht.

Du verstehst nicht, was ich sage.

Zum Beispiel gibt es einen bestimmten Datensatz, der in eine andere Kopie des Indikators übertragen werden muss (ob es sich dabei um einen anderen Indikator auf einem Diagramm oder eine neue Kopie des Indikators handelt, wenn sich die TF ändert, spielt keine Rolle). Der Indikator berechnet etwas und jedes Mal, wenn er etwas berechnet und dieses Etwas auf andere Indikatoren angewendet wird, sollte dieser Indikator aktualisiert werden. Jedes Mal. Diese Datenbank kann an verschiedenen Orten gespeichert werden, je nach Datenmenge und erforderlicher Kommunikationsgeschwindigkeit. Diese Daten müssen immer dann aktualisiert werden, wenn eine Änderung an den Daten vorgenommen wurde, und nicht nur, wenn sie deinitialisiert werden. Das ist der Trick. Es gibt nichts Kompliziertes daran. Es geht nicht darum, Daten in lokalen Indikatorvariablen zu speichern, sondern darum, die Daten jedes Mal zurückzusetzen/zu aktualisieren, wenn die Daten neu berechnet wurden.

Und bei grafischen Objekten ist es ganz einfach, das muss man nicht einmal erklären.


Es ist sehr fragwürdig, dass nichts kompliziert ist. Versuchen Sie, das, was ich in diesem Produkt implementiert habe, am Beispiel einer einfachen Wellenmaschine wirklich nachzuvollziehen. Im Handrad ändern Sie den Zeitraum mit der Maus, und wenn Sie TF ändern, sollten die Änderungen gespeichert werden, und Sie können mehrere Indikatoren im Fenster verwenden. Und Sie werden sehen, dass es nichts Kompliziertes ist. Und wenn Sie ein Array übergeben müssen. Und Sie werden sehen, wie "einfach" es ist. Vielleicht würde ich selbst so denken, wenn ich es nicht schon umgesetzt hätte.
 
Nikolai Semko:

Es ist sehr fraglich, ob nichts schwierig ist. Versuchen Sie, am Beispiel eines einfachen Abschleppwagens wirklich nachzuvollziehen, was ich in diesem Produkt umgesetzt habe. Im Handrad ändern Sie den Zeitraum mit der Maus, und wenn Sie TF ändern, sollten die Änderungen gespeichert werden, und es ist möglich, mehrere Indikatoren im Fenster zu verwenden. Und Sie werden sehen, dass es nichts Kompliziertes ist. Und wenn Sie ein Array übergeben müssen. Und Sie werden sehen, wie "einfach" es ist.

Ich habe erst vor kurzem gelernt, dass alle Variablen in EAs bei der Reinitialisierung erhalten bleiben, d.h. ich habe EAs auf die gleiche Weise wie Indikatoren geschrieben, in der Annahme, dass das Programm nichts über andere Programme weiß, denn es gibt nur deren init und deinit, das Programm darf nichts über init und deinit anderer Programme wissen.

Deshalb verlasse ich mich nie auf die zeitliche Konsistenz von ininit und deinit des zu entladenden und wieder auszuführenden Programms, ich habe mich nie darauf verlassen, dass es sich irgendwann ändern kann (in 1580 hat es sich geändert). Sich auf undokumentierte Fehler und zukünftige Plattformen zu verlassen, kann in der Zukunft nach hinten losgehen.

In meiner Praxis gibt es auch Produkte, die die Visualisierung in Abhängigkeit von den Aktionen des Benutzers dynamisch ändern und alles anwenden - von Ereignissen bis zum Austausch von Dateien. Es gibt viel mehr Indikatoren auf dem Chart als 1 in der Regel, die Indikatorpuffer in 5 sind unbegrenzt und Sie können sie als Parameter während des Starts erstellen. D.h. wir sind kreative Menschen, wir müssen einen flexiblen Ansatz haben, um unsere Aufgaben zu lösen und gleichzeitig die Besonderheiten von 3 Arten von Programmen im Auge behalten, aber die Plattformentwickler sind mit anderen Themen beschäftigt, die wichtiger sind als kleinere Schwierigkeiten im Vergleich zu den globalen Aufgaben der Plattform.

Es gibt wirklich wichtige Mängel in der Plattform, über die sie nicht viel oder gar nicht reden, das ist viel wichtiger als das weit hergeholte Problem der "inits und deinits Ordnung".

 
Slawa:

Wenn der Zeitrahmen nach unten umgestellt wird, dann zuerst OnInit auf dem niedrigsten (neuen) Zeitrahmen und dann OnDeinit auf dem höchsten (alten) Zeitrahmen.

Wenn der Schalter nach oben geht, dann ist es umgekehrt. Zuerst OnDeinit auf dem unteren (alten) Zeitrahmen und dann OnInit auf dem oberen (neuen) Zeitrahmen.

Dabei ist zu beachten, dass die Caches vom niedrigsten zum höchsten Zeitrahmen abgearbeitet werden

Das ist einfach furchtbar. Anwendungsprogrammierer sollten nicht über solche systemischen Dinge nachdenken. Die Plattform kann die Caches intern nach Belieben verarbeiten, aber auf der MQL-Ebene sollte sie alles transparent in einen einzigen Ereignisvertrag ohne potenzielle Nebeneffekte einbringen. Alle Verweise auf angebliche Effizienzüberlegungen und die Möglichkeit, dass jeder das Problem selbst umgehen kann, sind einfach unhaltbar. Es ist möglich, beides effektiv und bequem zu tun (wobei die Möglichkeit, auf diese Harke zu treten, im Allgemeinen ausgeschlossen ist), ein für alle Mal.
 
Stanislav Korotky:
Das ist einfach furchtbar. Anwendungsprogrammierer dürfen nicht über solche systemischen Dinge nachdenken. Die Plattform kann die Caches intern handhaben, wie sie will, aber auf der MQL-Ebene muss sie alles transparent in einen einzigen Ereignisvertrag bringen, ohne potenzielle Nebeneffekte. Alle Verweise auf angebliche Effizienzüberlegungen und die Möglichkeit für jeden, das Problem selbst zu lösen, sind einfach unhaltbar. Es ist möglich, beides effektiv und bequem zu tun (und die Möglichkeit, auf diese Harke zu treten, ganz zu vermeiden), ein für alle Mal.

Das ist richtig, das sollten sie nicht. Sie führen also zum Beispiel Total Commander aus. Warum verlangen Sie von Microsoft, dass Windows sich um die "richtige" Reihenfolge des Hoch- und Herunterladens von TC-Kopien in den RAM kümmert? Ist das ein Anliegen des Betriebssystems?

Das Anliegen von OS ist, dass TC sich nicht in andere TCs einmischt und was diese dort im RAM machen, Dateien austauschen oder was auch immer, ist ihre Sache.

"Ich glaube schon!" (c) Mimino, 1977.

 
Nikolai Semko:

Ich möchte die obigen Ausführungen zusammenfassen und erläutern. Was haben wir also vor der Veröffentlichung des 1580er Builds von MT5 (aktueller Build 1571)?

In den Indikatoren, im Gegensatz zu den Expert Advisors, wenn die TF sich ändert, weil"eine neue Kopie des Indikators erstellt wird, die nichts über die vorherige Kopie weiß", werden alle Variablen neu initialisiert, außerdem ist die Ausführungsreihenfolge von OnDeinit der alten TF und OnInit der neuen TF unvorhersehbar, unabhängig davon, ob die TF "oben" oder "unten" ist (Praxis, im Gegensatz zu dem , was von Herrn Slava erwähnt wurde). In diesem Zusammenhang haben Programmierer eine Reihe von Problemen und Unsicherheiten. Zum Beispiel:
- der Programmierer, der dieses Thema nicht gelesen hat, wenn er einen Indikator für etwas in OnInit erstellt, erstellt ein Objekt und prüft logischerweise vor der Erstellung des Objekts mit diesem Namen. Außerdem ist es logisch, das Entfernen dieses Objekts in OnDeinit vorzuschreiben. Wenn die TF geändert wird und das erste OnInit der neuen TF ausgeführt wird, wird geprüft, ob das Objekt bereits existiert, und es wird nicht erstellt, da es bereits erstellt wurde. Danach wird OnDeinit der alten TF durchgeführt und das Objekt wird entfernt. Der Programmierer befindet sich in einem Schockzustand. Wo ist mein Objekt und warum ist es weg? Noch verwirrender wird es, wenn bei der nächsten Änderung der TF, wenn die Reihenfolge von OnInit und OnDeinit anders ist, das Objekt nicht entfernt wird. Es ist gelöscht, es ist nicht gelöscht.... Nach einer langen Recherche werden neue Themen im Forum über das alte an den Service Desk gerichtet.
Dies ist nur der einfachste Fall. Es wird weitere geben, da diese Funktion nicht in der Dokumentation beschrieben ist und man nur im Forum darüber lesen kann.
Wenn Sie etwas Besonderes erstellen und einige Parameter von der alten Kopie des Indikators an eine neue Kopie übergeben möchten, wenn Sie die TF ändern, können Sie OnDeinit nicht verwenden, da die Reihenfolge der Initialisierungs- und Deinitialisierungsvorgänge nicht vorhersehbar ist.
MeinerMeinung nach ist die beste Lösung in diesem Fall die Verwendung der folgenden Tools:ResourceCreate basierend auf dem Pixel-Array undResourceReadImage, aber es ist ziemlich umständlich und Sie müssen sich um Ressourcenkonflikte kümmern, wenn Sie mehrere identische Indikatoren in einem Fenster verwenden, und jedes Mal, wenn die Daten, die Sie für eine andere Kopie senden wollen, in einer nicht reinitialisierten Ressource gespeichert werden müssen, weil der Zeitpunkt einer möglichen Änderung der TF für die Anwendung nicht bekannt ist. Ich habe dies schon vor langer Zeit implementiert (z. B. in diesem Produkt), ich weiß also, wovon ich spreche. Die Implementierung des Datentransfers über Dateien und globale Variablen des Terminals ist eine weniger erfolgreiche Lösung (IMHO).

Wenn das neue Build 1580so sein wird, wie Slava sagt, wird es die Aufgabe nicht einfacher machen, weil die Deinitialisierung der alten Kopie des Indikators nach der Initialisierung eines neuen durchgeführt wird. Aber es wird keine Unsicherheit geben.

Wir können nur hoffen, dass die Entwickler auf dieses Problem aufmerksam geworden sind und versuchen, es zu beheben.
Wir warten auf ein neues Gebäude.


Ich stimme voll und ganz zu, dass diese Verarbeitungsfunktion in der Dokumentation erwähnt werden MUSS, sonst werden Neuankömmlinge mit diesem Problem konfrontiert und suchen in den Foren nach einer Lösung. (Warum, wenn man es ihnen gleich im Terminal und in den MQL-Dokumenten mitteilen kann).

Fügen Sie der Dokumentation auch hinzu, dass das Protokoll kein vollständiges Bild der Ereignisse zeigt, sondern nur einen Teil davon. Siehe vollständige Protokolle für ein vollständiges Bild.

Über den Rest später ...

 
Nikolai Semko:

Ich möchte die obigen Ausführungen zusammenfassen und erläutern. Was haben wir also vor der Veröffentlichung des 1580er Builds von MT5 (aktueller Build 1571)?

In den Indikatoren, im Gegensatz zu den Expert Advisors, wenn die TF sich ändert, weil"eine neue Kopie des Indikators erstellt wird, die nichts über die vorherige Kopie weiß", werden alle Variablen neu initialisiert, außerdem ist die Ausführungsreihenfolge von OnDeinit der alten TF und OnInit der neuen TF unvorhersehbar, unabhängig davon, ob die TF "oben" oder "unten" ist (Praxis, im Gegensatz zu dem , was von Herrn Slava erwähnt wurde). In diesem Zusammenhang haben Programmierer eine Reihe von Problemen und Unsicherheiten. Zum Beispiel:
- der Programmierer, der dieses Thema nicht gelesen hat, wenn er einen Indikator für etwas in OnInit erstellt, erstellt ein Objekt und prüft logischerweise vor der Erstellung des Objekts mit diesem Namen. Außerdem ist es logisch, das Entfernen dieses Objekts in OnDeinit vorzuschreiben. Wenn die TF geändert wird und das erste OnInit der neuen TF ausgeführt wird, wird geprüft, ob das Objekt bereits existiert, und es wird nicht erstellt, da es bereits erstellt wurde. Dann wird OnDeinit der alten TF ausgeführt und das Objekt wird entfernt. Der Programmierer befindet sich in einem Schockzustand. Wo ist mein Objekt und warum ist es weg? Noch verwirrender wird es, wenn bei der nächsten Änderung der TF, wenn die Reihenfolge von OnInit und OnDeinit anders ist, das Objekt nicht entfernt wird. Es ist gelöscht, es ist nicht gelöscht.... Nach einer langen Recherche werden neue Themen im Forum über das alte an den Service Desk gerichtet.
Dies ist nur der einfachste Fall. Es wird weitere geben, da diese Funktion nicht in der Dokumentation beschrieben ist und man nur im Forum darüber lesen kann.
Wenn Sie etwas Besonderes erstellen und einige Parameter von der alten Kopie des Indikators an die neue übergeben möchten, wenn Sie die TF ändern, können Sie OnDeinit nicht verwenden, da die Reihenfolge der Initialisierungs- und Deinitialisierungsvorgänge nicht vorhersehbar ist.
MeinerMeinung nach ist die beste Lösung in diesem Fall die Verwendung der folgenden Tools:ResourceCreate basierend auf dem Pixel-Array undResourceReadImage, aber es ist ziemlich umständlich und Sie müssen sich um Ressourcenkonflikte kümmern, wenn Sie mehrere identische Indikatoren in einem Fenster verwenden, und jedes Mal, wenn die Daten, die Sie für eine andere Kopie senden wollen, in einer nicht reinitialisierten Ressource gespeichert werden müssen, weil der Zeitpunkt einer möglichen Änderung der TF für die Anwendung nicht bekannt ist. Ich habe dies schon vor langer Zeit implementiert (z. B. in diesem Produkt), ich weiß also, wovon ich spreche. Die Implementierung des Datentransfers über Dateien und globale Variablen des Terminals ist eine weniger erfolgreiche Lösung (IMHO).

Wenn das neue Build 1580so sein wird, wie Slava sagt, wird es die Aufgabe nicht einfacher machen, weil die Deinitialisierung der alten Kopie des Indikators nach der Initialisierung eines neuen durchgeführt wird. Aber zumindest wird es keine Ungewissheit geben.

Ich hoffe, dass die Entwickler auf dieses Problem aufmerksam geworden sind, da sie versuchen, es zu beheben.
Wir warten auf ein neues Gebäude.

Der Expert Advisor funktioniert gut, wenn die TF gewechselt wird, und der Indikator arbeitet in dieser Situation ganz anders.

 
Nikolai Semko:
Kein Problem, wenn Sie sich dieser undokumentierten Funktion bewusst sind und sich nur mit dem einfachsten Fall befassen - der Grafik. Objekte. Ich meine diejenigen, die nicht wissen, diese Funktion, ich denke, dieses Thema auf diesem Forum wird von einem sehr kleinen Prozentsatz der Programmierer gelesen werden und ich schade, ihre Zeit, um herauszufinden, alle Nuancen. Ich war schon in dieser Situation, bevor ich das Wesentliche verstanden hatte.
Und es tut Ihnen nicht leid, Ihre Zeit mit einem nutzlosen Streit über eine so triviale Angelegenheit zu verschwenden?