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

 
Nikolai Semko:
Vielen Dank für den Code, natürlich. Aber EAs sind in jedem Fall in Ordnung, dennwenn ich TF ändern sie nicht reinitialisieren Variablen, während Indikatoren tun. Wenn Sie wirklich mit Ratschlägen helfen wollen, führen Sie den Vorgang bitte noch einmal in aller Ruhe durch.

Nicholas, ich bin auf das Thema gestoßen, schon als ich den ersten Beitrag geschrieben habe. Und ich habe keine Diskussion darüber gefunden, wie sich ein EA verhält, wenn sich der Zeitrahmen ändert. Ja - das Thema dreht sich hauptsächlich um Indikatoren, obwohl der Autor in seinem Beitrag schrieb"Ein Indikator oder Expert Advisorwird geschrieben ".

Ich habe ein Beispiel gegeben, das ich überprüft habe und das im Rahmen des Expert Advisors funktioniert. Aber Sie - dann werfen Sie mir Unaufmerksamkeit vor, dann schicken Sie mich, das Thema noch einmal zu lesen, dann diskutieren Sie - was sinnvoll oder nicht sinnvoll ist. Außerdem können Sie die erste Seite lesen

Es ist nicht klar, ob es sich um einen Expert Advisor oder einen Indikator handelt. Sie sagen in Ihrem Beitrag nicht einmal klar, dass es sich um einen Indikator handelt.

SIEHE EIN BEISPIEL FÜR IHREN BEITRAG:

Nikolai Semko:
Das war's also?
Ich habe experimentiert und diesen Grundcode (REASON_CHARTCHANGE) in vollem Umfang genutzt. Aber was nützt es, wenn alle Variablen auf ihren Anfangszustand gesetzt werden und OnDeinit nach OnInit der neuen TF ausgeführt wird?

Ist aus dem Gesagten ersichtlich, dass die Variablen im Indikator initialisiert werden?

Die Person, die Ihren Beitrag liest, könnte denken, dass das Gleiche in einem Expert Advisor passiert.

----

Die Antwort auf diese Frage lautet: "Wenn Sie die TF ändern, findet keine Neuinitialisierung der Variablen statt, während sie bei Indikatoren erfolgt.

Andrey Dik:
Sie können Variablenwerte irgendwo speichern, zum Beispiel in Globals...

Wenn Sie die OnInit-Methode verwenden möchten, müssen Sie die Werte auf die gleiche Weise lesen und wiederherstellen.

------------

Wenn Sie sich nur für das Problem der Änderung der TF für den Indikator interessieren, bedeutet das nicht, dass andere, mich eingeschlossen, nicht an der Möglichkeit der Änderung der TF für den EA interessiert sind.

Ich kann keineRatschläge zum Indikatorgeben , da ich nicht weiß, wie man ihn in der Praxis einsetzt, aber ich werde die vorgeschlagenen Lösungen mit Interesse verfolgen.

Ich habe verstanden, dass die Entwickler dieses Thema lesen und sogar einige Dinge im Build 1580 korrigiert haben. Vielleicht werden sie Lösungen anbieten.

 
Slawa:

Haben Sie nicht gelesen, was ich mehrmals geschrieben habe?

In den Indikatoren gibt es keine Möglichkeit. Man kann es nicht von Anfang an in fünf Jahren schaffen. Denn Sie müssen eine völlig neue Kopie des Indikators mit allen Konsequenzen herunterladen.


Ich danke Ihnen für Ihre ehrliche Antwort.

So war es schon immer in der 5. Vielleicht ist es an der Zeit, sie zu reparieren?

Ist es wirklich so schwer, die richtige Reihenfolge einzuhalten? Die Zeitersparnis beim Start führt dann zu endlosen Kontrollen bei jedem Tick.

Ich habe mich bereits an das OOP-Paradigma von MT5 gewöhnt und weiß, wo die Harke ist und wie man Krücken anbringt, um diese Harken zu umgehen, natürlich nur, wenn es keine neuen gibt. Es stellt sich heraus, dass es einfacher ist, ein Objekt zu löschen und ein neues zu erstellen, als ein paar Parameter zu ändern.

Ähnlich verhält es sich bei einem Auto: Anstatt das Öl zu wechseln und weiterzufahren, ist es besser, das Auto wegzuwerfen und ein neues zu bauen.

Erinnert mich an einen Zeichentrickfilm:


Video herunterladen
 

Können Sie mir das bitte sagen?

Ich habe beschlossen, ein Programm zu schreiben, das

1. 8 Zeilen bei Inite-Ausgängen

2. bei DeInite werden 8 weitere Zeilen ausgegeben.

Ich habe es im Testgerät laufen lassen (ich habe es 2 Tage lang laufen lassen und es bekommen).

Aus irgendeinem Grund werden einige Zeilen selektiv nicht protokolliert.

Geht es dabei auch darum, die Dinge zu beschleun igen?


------------------------------------------------------------------------------------------

FRAGE GEKLÄRT, WEIL DIE VOLLSTÄNDIGEN PROTOKOLLE ALLE INFORMATIONEN ENTHALTEN

------------------------------------------------------------------------------------------

In der Dokumentation ist es notwendig, Folgendes hinzuzufügen

1. Das Protokoll enthält nicht alle Informationen, die der Programmierer erwartet

-------- IST ES UNERLÄSSLICH, DAS VOLLSTÄNDIGE PROTOKOLL ZU SEHEN!!!

Dateien:
Log2.txt  2 kb
ERROR_2.mq5  2 kb
 

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, erstellt in OnInit ein Objekt für etwas, wobei er logischerweise vor der Erstellung des Indikators überprüft, ob ein Objekt mit diesem Namen existiert. 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 durchgeführt und das Objekt 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 wollen, wenn Sie die TF ändern, können Sie OnDeinit wegen der unvorhersehbaren Abfolge von Initialisierungs- und Deinitialisierungsoperationen nicht verwenden.
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.

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

 

Alle Diagrammobjekte werden mit Bezug auf die aktuelle TF benannt. Bei der Initialisierung erstellen wir, bei der Deinitialisierung löschen wir. Während des Betriebs des Anzeigers nach Bedarf ändern.

Gibt es hier ein Problem? Kein Problem. Vom Start des Indikators bis zum Entladen ist alles normal.

Wir schalten die TF um. Es spielt keine Rolle, in welche Richtung es geht, ob nach oben oder nach unten. Eine Kopie des Indikators wird gestartet. Dies entspricht der Tatsache, dass der Indikator auf dieser TF zum ersten Mal eingeführt wurde.

Gibt es hier ein Problem? Es gibt kein Problem. Die alte Kopie entfernt ihre Objekte, und die neue Kopie erstellt neue Objekte entsprechend dem aktuellen Zeitrahmen.

Was mache ich falsch? Warum sehe ich kein Problem?

 
Andrey Dik:

Alle Diagrammobjekte werden mit Bezug auf die aktuelle TF benannt. Bei der Initialisierung erstellen wir, bei der Deinitialisierung löschen wir. Während des Betriebs des Anzeigers nach Bedarf ändern.

Gibt es hier ein Problem? Kein Problem. Vom Start des Indikators bis zu seiner Entladung ist alles normal.

Wir schalten die TF um. Es spielt keine Rolle, in welche Richtung es geht, ob nach oben oder nach unten. Eine Kopie des Indikators wird gestartet. Dies entspricht der Tatsache, dass der Indikator auf dieser TF zum ersten Mal eingeführt wurde.

Gibt es hier ein Problem? Es gibt kein Problem. Die alte Kopie entfernt ihre Objekte, und die neue Kopie erstellt neue Objekte entsprechend dem aktuellen Zeitrahmen.

Was mache ich falsch? Warum sehe ich kein Problem?

Kein Problem, wenn Sie über diese undokumentierte Funktion Bescheid wissen und sich nur mit dem einfachsten Fall beschäftigen - mit der Grafik. Objekte. Ich meine diejenigen, die nicht wissen, diese Funktion, ich denke, dieses Thema wird von einem sehr kleinen Prozentsatz der Programmierer auf diesem Forum zu lesen und ich nur schade, ihre Zeit, um herauszufinden, alle Nuancen. Ich war schon in dieser Situation, bevor ich das Wesentliche verstanden habe.
 
Nikolai Semko:
Kein Problem, wenn Sie sich dieser undokumentierten Funktion bewusst sind und sich nur mit dem einfachsten Fall befassen - mit der Grafik. Objekte. Ich meine diejenigen, die nicht wissen, diese Funktion, ich denke, dieses Thema wird von einem sehr kleinen Prozentsatz der Programmierer auf diesem Forum zu lesen, und ich nur schade, ihre Zeit, um herauszufinden, alle Nuancen. Ich war in dieser Situation gewesen, bevor ich das Wesentliche verstanden hatte.

Ich habe noch nie von solchen Nuancen gehört, wie sie in diesem Thread beschrieben werden, aber ich habe auch noch nie Probleme mit den hier beschriebenen Problemen gehabt.

Wenn Sie etwas auf eine andere Kopie des Indikators übertragen wollen, brauchen Sie es nicht zu deinitieren - halten Sie die übertragenen Daten während der gesamten Lebensdauer des Indikators auf dem neuesten Stand - zum Beispiel in den Hauptvariablen des Terminals, dann spielt es keine Rolle, aus welchem Grund der Indikator entladen wird (Wechsel von TF, meine Mutter hat den Stecker gezogen, "damit er nicht brummt, wenn alle schlafen", Erdbeben, Änderung der magnetischen Pole der Erde und so weiter.usw.) wird der nächste Lauf des Indikators (einschließlich einer Kopie, wenn sich die TF ändert) alle notwendigen Informationen aus dieser magischen Datenquelle beziehen (für die unglücklichen Fälle von globaler Skala können Sie die Daten auf einem Cloud-Laufwerk speichern).

Leute, es gibt überhaupt kein Problem.

 
Andrey Dik:

Alle Diagrammobjekte werden mit Bezug auf die aktuelle TF benannt. Bei der Initialisierung erstellen wir, bei der Deinitialisierung löschen wir. Während des Betriebs des Anzeigers nach Bedarf ändern.

Gibt es hier ein Problem? Kein Problem. Vom Start des Indikators bis zu seiner Entladung ist alles normal.

Wir schalten die TF um. Es spielt keine Rolle, in welche Richtung es geht, ob nach oben oder nach unten. Eine Kopie des Indikators wird gestartet. Dies entspricht der Tatsache, dass der Indikator auf dieser TF zum ersten Mal eingeführt wurde.

Gibt es hier ein Problem? Es gibt kein Problem.

Es gibt ein Problem: das gleichzeitige Vorhandensein von Objekten aus verschiedenen Indikatoren. "Sorry, wir haben vorübergehende technische Probleme" (aber das wird in wenigen Sekunden behoben sein, wenn der alte Indikator DeInit passiert)

Die alte Kopie entfernt ihre Objekte, und die neue Kopie erstellt ihre neuen Objekte und benennt sie entsprechend der aktuellen TF.

Was mache ich falsch? Warum sehe ich keine Probleme?

Das ist eine verengte Sichtweise. Deshalb können Sie nicht sehen. Erweitern Sie Ihren Horizont ein wenig. Die ersten Probleme treten bei der Arbeit mit den Dateien auf, da nicht klar ist, ob der vorherige Indikator Zeit hatte, Daten in der Datei zu speichern oder nicht. Es müssen einige Flags in den globalen Variablen des Terminals angelegt werden. Die neue Kopie des Indikators muss warten, bis die alte Kopie die akkumulierten Daten zurückgesetzt hat. Das Problem ist übrigens, dass eine solche Synchronisierung nur in OnCalculate() möglich ist. Und was ist zu tun, wenn der Wechsel am Wochenende stattfindet? Ein neues Exemplar wird erst am Montag erscheinen? Oh ja, wir können sie mit einer Zeitschaltuhr versehen! Ich habe gehört, dass man mit einer Kanone auf Spatzen schießen kann, eine Steinschleuder wäre eine gute Möglichkeit.

Dabei handelt es sich noch um einfache Probleme. Versuchen Sie, diese Logik zu berücksichtigen, wenn Sie mit einer Multi-Threaded-DLL arbeiten. Jetzt fängt der Spaß erst richtig an. Nun, wir werden stärker werden ))))

 
Andrey Dik:

Ich habe noch nie von solchen Nuancen gehört, wie sie in diesem Thread beschrieben werden, aber ich habe auch noch nie Probleme mit den hier beschriebenen Problemen gehabt.

Wenn Sie etwas auf eine andere Kopie des Indikators übertragen wollen, brauchen Sie es nicht zu deinitieren - halten Sie die übertragenen Daten während der gesamten Lebensdauer des Indikators auf dem neuesten Stand - zum Beispiel in den Hauptvariablen des Terminals, dann spielt es keine Rolle, aus welchem Grund der Indikator entladen wurde (Wechsel des TF, Mama hat den Stecker gezogen, "damit er nicht brummt, wenn alle schlafen", Erdbeben, Änderung der magnetischen Pole der Erde und so weiter.usw.) wird der nächste Start des Indikators (einschließlich der Kopie beim TF-Wechsel) alle notwendigen Informationen aus dieser magischen Datenquelle beziehen (für unglückliche Fälle von globalem Ausmaß ist es möglich, Daten auf der Cloud-Disk zu behalten).

Leute, es gibt überhaupt kein Problem.

Ich werde sie morgen beantworten. ALLES KLAR? Das Fahren ist einfach.
 
Ihor Herasko:

Es gibt ein Problem: das gleichzeitige Vorhandensein von Objekten aus verschiedenen Indikatoren. "Entschuldigung, wir haben vorübergehende technische Probleme" (die aber in wenigen Sekunden behoben sein werden, wenn der alte Indikator de-initiert wird)

Ein eingeschränktes Sichtfeld. Deshalb können Sie nicht sehen. Erweitern Sie Ihren Horizont ein wenig. Die ersten Probleme treten bereits bei der Arbeit mit Dateien auf, da nicht klar ist, ob der vorherige Indikator es geschafft hat, Daten in der Datei zu speichern oder nicht. Es müssen einige Flags in den globalen Variablen des Terminals angelegt werden. Die neue Kopie des Indikators muss warten, bis die alte Kopie die akkumulierten Daten zurückgesetzt hat. Das Problem ist übrigens, dass eine solche Synchronisierung nur in OnCalculate() möglich ist. Und was ist zu tun, wenn der Wechsel am Wochenende stattfindet? Ein neues Exemplar wird erst am Montag erscheinen? Oh ja, wir können sie mit einer Zeitschaltuhr versehen! Ich habe gehört, dass man mit einer Kanone auf Spatzen schießen kann, eine Steinschleuder wäre eine gute Möglichkeit.

Dabei handelt es sich noch um einfache Probleme. Versuchen Sie, diese Logik zu berücksichtigen, wenn Sie mit einer Multithreading-DLL arbeiten. Jetzt fängt der Spaß erst richtig an. Nun, wir werden stärker werden)))

Ich habe bereits deutlich geschrieben, dass Sie die Daten, die Sie zum Kopieren benötigen, immer auf dem neuesten Stand halten müssen, und zwar nicht nur bei der Eingabe, sondern immer.

Alle anderen Fälle sind aufgrund von Verschrobenheit erfunden.

Wenn es ein Problem damit gibt, denselben Indikator gleichzeitig laufen zu lassen, dann erstellen Sie jedes Mal eindeutige Objekte mit einer Verknüpfung zur TF, und wenn es bereits Objekte gibt, fügen Sie dem Namen eine 1 hinzu.

Niemand hat einen einzigen Fall angeführt, in dem die Probleme aufgrund der derzeitigen Arbeitsweise des Terminals mit Indikatoren unüberwindbar sind. Die Probleme werden durch die falsche Arbeit mit Indikatoren verursacht.

Im Allgemeinen scheinen viele Leute nicht zu verstehen, dass es nicht umsonst 3 Arten von Programmen gibt (das vierte wird bald verfügbar sein).