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

 
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...


Ja, ich kann nicht löschen einige Objekt oder Ressource bei TF ändern, ich kann sogar einige kleine Arrays durch Objekt-Ressource zu speichern, und schreiben in Ressource Informationen über TF ändern, aber der Punkt istWie informiere ich das Gerät darüber, dass sich der Zeitrahmen geändert hat und die alten Daten gelesen werden sollen, nachdem das Gerät in einem neuen Zeitrahmen ausgeführt worden ist? Ist das nicht falsch?
 
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 entladen.

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


Ich habe die Beschreibung des Links gelesen, aber solche Informationen, wie Sie sie gegeben haben, nicht gefunden. Und wenn das wirklich so ist, ist das ein großes Problem für die Entwickler von Indikatoren. Es ist sehr seltsam und sehr schlecht, dass eine solche Logik für das Nachladen von Indikatoren angenommen wird, wenn Sie den Zeitrahmen ändern. Warum müssen zwei Kopien desselben Indikators im Speicher vorhanden sein? Wer profitiert davon? Was bringt sie? Es wäre logischer, die Ausführung einer Kopie des Indikators zu beenden, sie zu entladen und erst dann die nächste Kopie zu laden.
 
Nikolai Semko:
Und das ist ALLES!?
Ich habe experimentiert und diesen Grundcode (REASON_CHARTCHANGE) so oft wie möglich verwendet. Und was nützt es, wenn alle Variablen wieder auf ihren ursprünglichen Zustand gesetzt werden, und OnDeinit nach OnInit einer neuen TF ausgeführt werden kann
Ich habe nur gelesen, dass ein Objekt bei der Deinitialisierung gelöscht wird, und habe nur auf dieses Problem reagiert. Komplizierter wird es bei der Speicherung von früheren Berechnungen. Und offenbar wird dieses Problem nie gelöst werden. Slawa beantwortete diese Frage, neuer Indikator, neue Berechnungen. Und das ist fair.
 
Alexey Viktorov:
Slava hat diese Frage beantwortet, neuer Indikator, neue Berechnungen. Und das ist fair.
Der Punkt ist, dass der Indikator derselbe ist, aber der Zeitrahmen ist neu. Die Frage bezieht sich auf die Desynchronisierung von Unit und Deunit, d. h. die umgekehrte (unlogische) Reihenfolge der Ausführung tritt auf, und manchmal ist sie logisch. Es gibt nichts Schlimmeres für einen Programmierer als einen Fließfehler und Logik.
 
Alexey Viktorov:
Und offenbar wird dieses Problem nie gelöst werden.

Und ich habe Vertrauen in das Entwicklungsteam, es sind tolle Leute, die unglaublich viel geleistet haben und noch mehr leisten werden. Ich bin nur noch nicht dazu gekommen, es zu tun. Stimmt, man muss immer wieder Rückmeldungen von ihnen bekommen, wenn sie sich mit Schnickschnack beschäftigen. :))
Meine Aufgabe ist es, sie davon zu überzeugen, dass es getan werden muss. Obwohl ich nicht ausschließe, dass sie mich davon überzeugen werden, dass es besser ist, es nicht zu tun, verstehe ich vielleicht etwas nicht.
 
Nikolai Semko:

Und ich habe Vertrauen in das Entwicklungsteam, es sind großartige Leute, die unglaublich viel getan haben und noch mehr tun werden. Ich habe mich nur noch nicht dazu durchgerungen, es zu tun. Aber ich muss mir von ihnen immer ein Feedback mit Tamburinen holen. :))
Meine Aufgabe ist es, sie davon zu überzeugen, dass es getan werden muss. Obwohl ich nicht ausschließe, dass sie mich davon überzeugen werden, dass es besser ist, es nicht zu tun, verstehe ich vielleicht etwas nicht.


Slawa, was bedeutet die Formulierung in der Dokumentation"Librariesdon't handle any events"?

Sehr vage

 
nmaratr:

- Bei Inite wird die Farbe des Hauptdiagramms auf transparent gesetzt.

Ich zeichne mein eigenes Diagramm (nach meinen Parametern)


Ich möchte, dass die Farbe des Hauptdiagramms wiederhergestellt wird, nachdem ich den 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 eine "logische Aufschlüsselung".


Vielleicht sollte man versuchen, grafischen Objekten den TF-Zeitraum als Bestandteil ihres Namenspräfixes zuzuweisen,

und dann etwas wie dieses anwenden:

 // --- Переменная для хранения текущего ТФ
ENUM_TIMEFRAMES currentTF;

//+---------------------------------------------------------------------------+
void OnInit()
{
  currentTF = (ENUM_TIMEFRAMES)Period();
}

//+---------------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // --- на момент выгрузки индикатора уже сменился ТФ
  if(currentTF != Period()) 
  {
    // если нужно, удалим объекты имеющие префикс старого ТФ и выходим, не трогаем цвет основного графика
    return;
  }

  // раз дошли сюда, ТФ не сменился, восстанавливаем цвет основного графика
  // удалим объекты имеющие префикс старого ТФ
}
 
nmaratr:

- Bei Inite wird die Farbe des Hauptdiagramms auf transparent gesetzt.

Ich zeichne mein eigenes Diagramm (nach meinen Parametern)


Ich möchte, dass die Farbe des Hauptdiagramms wiederhergestellt wird, nachdem ich den 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 eine "logische Aufschlüsselung".

Natürlich ist es besser, wenn alles in einer logischen Reihenfolge abläuft, aber da wir mit dem arbeiten müssen, was wir haben, können wir die Farbe des Hauptdiagramms auf OnCalculate mit Prüfung des aktuellen Wertes verschieben.
 
Nikolai Semko:
Und das ist ALLES!?
Ich habe experimentiert und diesen Grundcode (REASON_CHARTCHANGE) so oft wie möglich verwendet. Und was nützt es, wenn alle Variablen wieder auf den ursprünglichen Zustand gesetzt werden, und OnDeinit nach OnInit der neuen TF ausgeführt werden kann


Versuchen Sie, das Terminal auf Version 1065 zu aktualisieren. In früheren Versionen gab es einen Fehler bei der Neuinitialisierung während des Zeitrahmenwechsels. Kann helfen :)

https://www.mql5.com/ru/forum/187690

Новая версия платформы MetaTrader 4 build 1065
Новая версия платформы MetaTrader 4 build 1065
  • www.mql5.com
Новая версия платформы MetaTrader 4 build 106523 марта 2017 года будет опубликовано обновление платформы MetaTrader 4...
 
Aleksei Radchenko:


Versuchen Sie, das Terminal auf Version 1065 zu aktualisieren. Bei früheren Versionen trat ein Fehler bei der Neuinitialisierung auf, wenn der Zeitrahmen geändert wurde. Könnte helfen :)

https://www.mql5.com/ru/forum/187690

Wir sprechen über MT5
Grund der Beschwerde: