Init() und DeInit() Ausführungsreihenfolge

 

Hallo zusammen!

Ich stehe vor folgendem Problem

Ich habe einen Indikator oder Expert Advisor.

Es gibt zwei Funktionen darin - Init() und DeInit()

In welcher Reihenfolge werden diese Funktionen ausgeführt, wenn ich den TF (Zeitrahmen) wechsle?

Ich verstehe, dass Init() funktionieren sollte, wenn ich den Indikator starte oder anhänge.

Beim Löschen aus dem Diagramm sollteDeInit() ausgeführt werden.

Beim Wechsel der TF sollte zunächstDeInit() der aktuellen TF und dannInit() der neuen TF funktionieren

Sie wird jedoch nicht immer in dieser Reihenfolge ausgeführt, was die Logik des Programms stört.

Ich habe ein Beispiel für den Indikator und die Protokolle beigefügt.

Bitte teilen Sie mit, wer dieses Problem gelöst hat oder vergessen Sie es einfach!

Dateien:
ERROR.mq5  2 kb
Log.txt  1 kb
 

Welche Art von Logik ist verdorben?

Wenn Sie den Zeitrahmen ändern, wird eine neue Kopie des Indikators erstellt, die nichts über die vorherige Kopie weiß. Für eine bestimmte Zeit (sehr kurz) existieren beide Kopien des Indikators parallel. Dann wird die vorherige Kopie entladen.

Dokumentation lesen https://www.mql5.com/ru/docs/runtime/running

Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Wenn Sie den Zeitrahmen ändern, wird jedes Mal OnInit aufgerufen, was zu einigen Unannehmlichkeiten führt.
 
Slawa:

Welche Art von Logik ist verdorben?

Wenn Sie den Zeitrahmen ändern, wird eine neue Kopie des Indikators erstellt, die nichts über die vorherige Kopie weiß. Für eine bestimmte Zeit (sehr kurz) existieren beide Kopien des Indikators parallel. Dann wird die vorherige Kopie ausgeschlossen.

Dokumentation lesen https://www.mql5.com/ru/docs/runtime/running


Vielen Dank für Ihr Feedback

Über "logisches Verderben"

Ich habe einen Indikator geschrieben, der das Hauptdiagramm (Candlesticks) durch seine eigene Art der Zeichnung DRAW_CANDLES ersetzt

Das Ziel ist es, das Hauptpreisdiagramm zu entfernen und nur mein Diagramm anzuzeigen.

- Stellen Sie die Farbe des Hauptdiagramms auf transparent ein , wenn Sie es einrichten.

Ich zeichne mein eigenes Diagramm (nach meinen Parametern).


Da ich die Farbe des Hauptdiagramms wiederherstellen möchte, nachdem ich meinen Indikator entfernt habe

- In DeInit stelle ich die Farbe des Hauptdiagramms wieder her


Wenn ich die TF ändere, meine ich zuerst DeInit (die Farbe wiederherstellen), und dann Init (wieder transparent werden)


Die Ausführung der Befehle erfolgt nicht sequentiell, sondern in regelmäßigen Abständen, wenn die TF

In regelmäßigen Abständen wird das Hauptdiagramm (mit wiederhergestellter Farbe) mit meinem Indikator überlagert.

Hier ist zum Beispiel ein "Logikfehler".


PS: (((Dokumentation lesenhttps://www.mql5.com/ru/docs/runtime/running )))

Wenn Sie das Symbol oder den Zeitrahmen des Charts, an den der Expert Advisor angehängt ist, ändern, wird der Expert Advisor nicht entladen und geladen. In diesem Fall werden die HandlerOnDeinit() für das alte Symbol/die alte Zeitleiste undOnInit() für das neue Symbol/die neue Zeitleiste (falls vorhanden)konsistent aufgerufen, die Werte der globalen Variablen undstatischen Variablen werden nicht zurückgesetzt. Alle Ereignisse, die für einen EA vor Abschluss der Initialisierung (OnInit()) eingehen, werden übersprungen.


Документация по MQL5: Программы MQL5 / Выполнение программ
Документация по MQL5: Программы MQL5 / Выполнение программ
  • www.mql5.com
Программы MQL5 / Выполнение программ - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
nmaratr:


Bezüglich.

"Es wird eine neue Kopie des Indikators erstellt, die nichts über die vorherige Kopie weiß".

Warum löscht DeInit dann Objekte, die in der neuen Init-Kopie erstellt wurden. Wenn es nur eine Kopie ist.



 
Petros Shatakhtsyan:
Wenn der Zeitrahmen geändert wird, wird jedes Mal OnInit aufgerufen, was einige Unannehmlichkeiten verursacht.


Was bedeutet es, OnInit jedes Mal aufzurufen, wenn

Wozu ist OnInit da - um alle Variablen und Parameter einmal zu initialisieren

Zum Beispiel

Ich möchte einen Indikator schreiben, der einen Textmarker auf einem Diagramm mit aktuellem Zeitrahmen erstellt.

Wenn Sie den Indikator löschen, wird diese Textmarkierung aus dem Diagramm entfernt.

Und wenn die TF geändert wird, wird ihr Inhalt durch einen neuen ersetzt (indem die alte gelöscht und eine neue erstellt wird).

Was wir bekommen

Ein paar Mal haben wir die TF geändert und die Textmarkierung ist verschwunden. (Also hat erst OnInit und dann DeInit gewirkt, was diese Kennzeichnung entfernt hat.)

Dann wurde TF noch ein paar Mal gewechselt und es erschien.

Das ist nicht richtig.

 
nmaratr:

Wenn es sich um grafische Objekte handelt, gehören sie zum Chatraum und können von jeder Software, die in diesem Chatraum läuft, aufgerufen werden.
 
Alexander Bereznyak:

wenn es sich um grafische Objekte handelt, gehören sie zum Chat und sind für jedes Programm, das auf diesem Chat läuft, zugänglich.


Wie kann dieses Problem also gelöst werden? (Hat es jemand???)

Oder so akzeptieren, wie es ist. Um die Berechnungen zu beschleunigen, ist es möglich, Befehle nicht sequentiell auszuführen.

Was im Widerspruch zur Dokumentation steht


Wenn Sie ein Symbol oder einen Zeitrahmen eines Charts ändern, an den der Expert Advisor angehängt ist, wird der Expert Advisor nicht entladen und geladen. In diesem Fall

sequenziell

Die HandlerOnDeinit() für das alte Symbol/die alte Zeitleiste undOnInit() für das neue Symbol/die neue Zeitleiste (falls vorhanden) werden aufgerufen

 
nmaratr:


Kann dieses Problem also gelöst werden? (Hat es bei jemandem funktioniert???)



Ich schließe mich dem Autor dieses Threads an. Die Frage ist wirklich nicht müßig. Und sehr konkret.
Ich habe dieses Problem schon vor langer Zeit entdeckt. Ich habe mich bereits im Juni 2016 mit einem ganz ähnlichen Beispiel wie der Autor dieses Threads an servicedesk gewandt. Sie haben es ignoriert - es ist immer noch ein offenes Thema:

Bewerbung bei Servicedesk

Natürlich habe ich beim Wechsel der TF eine Parameterübergabe im Indikator vorgenommen, nachdem ich viel Zeit damit verbracht habe. Aber ich will nicht einfach eine Aufgabe mit Diamanten machen.
Aber Entwickler, bitte implementieren Sie die Möglichkeit, spezielle globale Variablen in Indikatoren zu erstellen, die bei Zeitrahmenänderungen nicht neu initialisiert werden. In den Expert Advisors erfolgt die Neuinitialisierung nicht zum Zeitpunkt des TF-Wechsels, im Indikator schon. Wenn es eine Möglichkeit gäbe, einige Variablen und Arrays in Indikatoren nicht zu reinitialisieren, wäre die Synchronisierung von OnInit und OnDeinit kein Problem, und es würden sich neue interessante Möglichkeiten für Programmierer ergeben. Ich glaube nicht, dass diese Möglichkeit der Entinitialisierung von Variablen die Sicherheit von Programmen beeinträchtigt.

Wozu ist das gut?
Es gibt eine Vielzahl von Situationen.

Zum Beispiel:
Wenn ich den Indikator starte, führe ich Berechnungen von Variablen, Index-Arrays und Daten-Arrays durch, die unabhängig von TF sind, und diese können ziemlich lang und umfangreich sein. Die Frage ist, warum ich das jedes Mal tun muss, wenn ich die TF wechsle.
- Ich kann die Parameter des Indikators nicht über das Parameter-Fenster ändern, sondern aus Gründen der Bequemlichkeit und Übersichtlichkeit direkt im Chart mit der Maus (Sie können diesen Indikator sehen und verwenden, der dies auf höchst komplizierte Weise erreicht). Und die Einstellungen gehen nicht verloren, wenn Sie die TF wechseln.

 

Dieses Problem ist gelöst wie zwei Finger... weißt du was...

In OnDeinit muss der Grund für die Deinitialisierung angegeben werden, bevor das Objekt gelöscht wird... Wenn es sich NICHT um eine Periodenänderung handelt, wird das Objekt gelöscht. UND DAS WAR'S...

 
Alexey Viktorov:

Dieses Problem ist gelöst wie zwei Finger... Weißt du, was...

In OnDeinit muss der Grund für die Deinitialisierung angegeben werden, bevor das Objekt gelöscht wird... Wenn es sich NICHT um eine Periodenänderung handelt, wird das Objekt gelöscht. UND DAS WAR'S...

Das war's also!?
Ich habe experimentiert und diesen Grundcode (REASON_CHARTCHANGE) in vollem Umfang genutzt. Was nützt es, wenn alle Variablen wieder auf ihren ursprünglichen Zustand gesetzt werden und OnDeinit nach OnInit der neuen TF ausgeführt werden kann
Grund der Beschwerde: