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

 
Andrey Dik:

Das war's, das Wehklagen hat begonnen...

Was Sie verlangen, ist genau das, was normale Desktop-Anwendungen nicht haben.

Was ist nicht in der App enthalten? Synchronisierung? )))

Würden die Entwickler all diese Funktionen, die bereits "out of the box" sind, nicht anbieten, wären die Autoren von MQL-Programmen ständig mit allen Reizen der Desktop-Entwicklung konfrontiert, sei es die Sicherheit oder die Geschwindigkeit der Ausführung.

Das ist nur eine wissenschaftliche Argumentation ohne Fakten. In MT4 arbeiten die Indikatoren mit aufeinanderfolgenden OnInit() und DeInit(). Es gibt einen Nachteil - alle Indikatoren arbeiten in einem einzigen Thread. Das Problem kann gelöst werden, indem der Indikator richtig geschrieben wird, was auch im MT5 erforderlich ist. Obwohl MT5 davon nicht weggekommen ist - jedenfalls funktionieren die Indikatoren eines Charts weiterhin in einem Thread.
 
Ihor Herasko:

1. Was ist nicht in den Apps enthalten? Synchronisierung? )))

2) Sie ziehen unwissenschaftliche Schlüsse ohne Fakten. In MT4 arbeiten die Indikatoren mit aufeinanderfolgenden OnInit() und DeInit(). Es gibt einen Nachteil - alle Indikatoren arbeiten in einem einzigen Thread. Das Problem kann gelöst werden, indem der Indikator richtig geschrieben wird, was auch im MT5 erforderlich ist. Obwohl MT5 davon nicht weggekommen ist - jedenfalls funktionieren die Indikatoren eines Charts weiterhin in einem Thread.

1. Von welcher Synchronisierung sprechen Sie?

2. In MT4 wird im Rahmen der Ausführung des Indikatorcodes zuerst init und dann deinit ausgeführt, was braucht man mehr!!! Im MT5 ist es dasselbe.


Mehrere Personen haben mich bereits gebeten, ein konkretes Beispiel für eine Aufgabe zu nennen, die im Rahmen des Paradigmas der Indikatorausführung in MT5 problematisch ist. Wird es ein Beispiel geben oder nicht, ein klares Beispiel, das nicht aus der Luft gegriffen ist?

 
Andrey Dik:

1. von welcher Synchronisierung sprechen Sie?!

Über Interthreading. Solange ein Thread nicht abgeschlossen ist (derjenige, der den Befehl zur Beendigung erhalten hat), wird der andere Thread nicht gestartet. Oder, wenn alles in einem Thread passiert, ist es noch einfacher: Beenden Sie alle Programme, die mit der "alten" TF verbunden sind, und starten Sie erst dann Programme auf der "neuen" TF.

2. In MT4 wird im Rahmen der Ausführung des Indikatorcodes zuerst init und dann deinit ausgeführt, was brauchen Sie noch?! Dasselbe gilt für den MT5.

Richtig. Genau das ist bei MT4 der Fall. Im MT5 ist das nicht der Fall. Und genau darum geht es bei diesem Thema.

Mehrere Leute haben mich bereits gebeten, ein konkretes Beispiel für eine Aufgabe zu nennen, die im Rahmen des Indikatorausführungsparadigmas im MT5 problematisch ist. Wird es ein Beispiel geben oder nicht, ein klares Beispiel, das nicht aus der Luft gegriffen ist?

Ich habe erst vorgestern drei Beispiele genannt. Siehst du sie nicht?
 
Andrey Dik:

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 Betriebssystem kümmert sich darum, dass der TC andere TCs nicht stört, und was sie dort im RAM tun, Dateien austauschen oder was auch immer, ist ihre Sache.

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

Was hat der Total Commander damit zu tun? Es ist nur ein Low-Level-Dienstprogramm in dem Sinne, dass es direkt mit den Systemressourcen arbeitet. Im Falle von MQL besteht die Aufgabe der MT-Plattform darin, den Anwendungsprogrammierer von Systemaufgaben wie der Synchronisation zu befreien - die Plattform kann dies effektiver und auf einen Schlag für alle leisten. MQL-Programmierer müssen sich Gedanken über die Analyse von Kursen und Handelsstrategien machen. Dies ist der Zweck von MT.

Was hat das mit dem Austausch von Dateien und Daten zu tun? Betrachten Sie die Logik der Arbeit im Zusammenhang mit einem MQL-Programm. Es wird einfach versucht, die Ereignisse OnInit/OnDeinit ihrem Zweck entsprechend zu verwenden - um korrekt von einem bestimmten Zustand zu starten und sich selbst korrekt zu beenden, indem der Zustand gespeichert wird. Wenn sie für diesen Zweck nicht geeignet sind, wozu sind sie dann, wie bereits erwähnt, gut? Nach den Argumenten der Verteidiger zu urteilen - so dass wir darin herumtanzen und herausfinden könnten, welche anderen Kopien vorher und nachher ausgeführt wurden und von welchem Zeitrahmen und zu welchem sie gewechselt haben? Dies hat genau den gegenteiligen Effekt von dem, was MQ erreichen wollte - dass eine Kopie nichts über die andere weiß.

Damit eine Kopie nichts weiß und es nicht herausfinden muss und trotzdem ohne Nebenwirkungen funktioniert, muss der Kernel über alle Kopien Bescheid wissen - sowohl über die, die heruntergefahren werden, als auch über die, die hochgefahren werden - und eine elegante Handhabung von init/deinit-Ereignissen für sie in einer Standard-Warteschlangenmetapher bereitstellen. Das Terminal verfolgt ohnehin alle Kopien und verwendet die Ereigniswarteschlange, aber aus irgendeinem Grund unterbrechen init/deinit die Ereignislogik.

 
Stanislav Korotky:

Damiteine Kopie nichts weiß und es nicht herausfinden muss und trotzdem ohne Nebeneffekte funktioniert, muss der Kernel über alle Kopien Bescheid wissen - sowohl über die, die beendet werden, als auch über die, die gestartet werden - und eine elegante Init/Deinit-Ereignisbehandlung für sie in der Standard-Warteschlangenmetapher anbieten. Das Terminal behält alle Kopien im Auge und verwendet die Ereigniswarteschlange, aber aus irgendeinem Grund unterbrechen init/deinit die Ereignislogik.

Ich stimme zu.
 
Andrey Khatimlianskii:

Was ist das Problem bei der Speicherung der Periode in einer Hauptvariablen?

Warum sollte es notwendig sein, eine Reihe von Daten zwischen aufeinanderfolgenden Läufen des Indikators auf verschiedenen TFs zu übertragen?


Andrey, ich mag keine globalen Terminalvariablen. Ich habe mit ihnen experimentiert (vor langer Zeit) und war von ihrer Geschwindigkeit und den Synchronisationsproblemen sehr enttäuscht. Um zu vermeiden, dass sie nicht unterstützt werden, werde ich versuchen, ein Beispiel zu schreiben (etwas später), das ihre Geschwindigkeit demonstriert. Vielleicht hat sich etwas geändert und ich liege falsch. Eine andere Sache, die ich an globalen Variablen nicht mag, ist, dass sie ein Eigenleben führen und absolut öffentlich sind. Jeder kann sie durch Drücken von F3 überprüfen und löschen. Wenn es mehrere davon gibt, ist das nur halb so schlimm, aber wenn alle sie benutzen, habe ich persönlich das Gefühl, dass auf meinem Schreibtisch ein Chaos herrscht.

Über die Übergabe der Arrays. Ja, ich stimme zu, das ist nicht sehr oft nötig. Aber hier ist ein konkretes Beispiel - mein Indikator. Sein interner Betrieb hängt nicht von der gewählten TF ab, da er während der Initialisierung alle (fast alle) TF herunterlädt und sein eigenes allgemeines Array (so etwas wie ein logarithmisches Array von Anführungszeichen) erstellt und darauf basierend einige umfangreichere Berechnungen von Index-Arrays durchführt. Bei einem TF-Wechsel ist es nicht rationell, jedes Mal ein und dieselbe Menge an Arbeit zu erledigen - beim TF-Wechsel kommt es zu Verzögerungen. Ich habe auch Algorithmen zur Mustererkennung im Kopf, die ich implementieren werde, so dass die Initialisierungsberechnungen bis zu mehreren Sekunden dauern können, und ich möchte, dass dies nur einmal geschieht und dann vergessen wird.

Демонстрация индикатора ChannelsProf
Демонстрация индикатора ChannelsProf
  • 2016.02.27
  • www.youtube.com
Скоро на экранах ваших мониторов новый индикатор для MT5 ChannelsProf.
 
Stanislav Korotky:

Damit eine Kopie nichts weiß und es nicht herausfinden muss und trotzdem ohne Nebeneffekte funktioniert, muss der Kernel über alle Kopien Bescheid wissen - sowohl über die, die beendet werden, als auch über die, die gestartet werden - und eine elegante Init/Deinit-Ereignisbehandlung für sie in der Standard-Warteschlangenmetapher anbieten. Das Terminal verfolgt ohnehin alle Kopien und verwendet die Ereigniswarteschlange, aber aus irgendeinem Grund unterbrechen init/deinit die Ereignislogik.

Und nun stellen Sie sich vor, dass es nicht eine einzige Ereignis-Warteschlange gibt, sondern für jede Zeichenperiode eine eigene Warteschlange. So viele Zeichenperioden, so viele Warteschlangen.

Schlagen Sie nun die Reihenfolge vor, in der die Warteschlangen abgearbeitet werden.

 
Slawa:

Und nun stellen Sie sich vor, dass es nicht nur eine einzige Ereignis-Warteschlange gibt, sondern eine Warteschlange für jede Symbol-Periode. So viele Symbolperioden, wie es Warteschlangen gibt.

Schlagen Sie nun die Reihenfolge vor, in der die Warteschlangen abgearbeitet werden.

Eine Warteschlange ist ein Fensterattribut. Eine Warteschlange pro Symbolperiode ist für Schnittstellenereignisse nicht korrekt. Wie gehen Sie dann mit Mausklicks um?
 
Ihor Herasko:

1. über Interthreading. Solange ein Thread nicht abgeschlossen ist (derjenige, der den Befehl zur Beendigung erhalten hat), wird der andere Thread nicht gestartet. Oder, wenn dies alles in einem Thread geschieht, ist es sogar noch einfacher: wir beenden die Ausführung aller Programme, die mit der "alten" TF verbunden sind, und erst danach starten wir die Programme auf der "neuen" TF.

2. Richtig. In MT4 ist es genau dasselbe. Im MT5 ist das nicht der Fall. Genau darum geht es bei diesem Thema.

3. vorgestern habe ich Arbeit mit grafischen Objekten entsteht eine Schönheit: ein Indikator existiert noch und ist nicht bereinigt, während der zweite über diese Objekte zeichnet. So werden wir dem Nutzer erklären: "Beim Umschalten der TF werden Sie kurzfristige Störungen beobachten". )))
  • Arbeiten mit DLL. Wenn Sie die DLL deinitieren, sollten alle Threads, die von ihr erstellt wurden, unterbrochen werden. Die nächste Indikatorkopie danach erstellt sie für sich selbst neu. Nun wird die neue Kopie des Indikators versuchen, alle diese Threads zu erstellen, was jedoch abgelehnt wird, da sie noch laufen. Der neue Indikator wird eine Fehlermeldung erzeugen und nicht funktionieren. Nur wegen des TF-Wechsels. Ja, das Problem ist lösbar.
  • 1) Es sollte so gemacht werden, wie ich bereits geschrieben habe: die akkumulierte Datenbank sollte regelmäßig in einer Datei oder einem anderen Speicher gespeichert werden, kein Problem - Datei öffnen, schreiben, schließen. Sie müssen dies jedes Mal tun, wenn Sie diese Daten aktualisieren oder in regelmäßigen Abständen, nicht bei Init und Deinit. (Sie speichern Ihre Arbeit regelmäßig, wenn Sie ein Programm schreiben oder einen Artikel verfassen). Und es ist unmöglich, sich gegen das Scheitern des Schreibens in eine Datei zu versichern. Um sich in kritischen Situationen abzusichern, wird manchmal Folgendes getan: Die aktualisierten Informationen werden in eine neue Datei geschrieben, nach dem erfolgreichen Schreiben wird die alte Datei gelöscht und der Name der neuen Datei so geändert, wie er in der alten Datei stand.

    2) Ich habe es bereits erklärt. Jeder Indikator muss mit seinen eigenen grafischen Objekten arbeiten. Natürlich müssen wir prüfen, ob die Objekte existieren, und wenn sie bereits existieren, müssen wir eine 1 an den Objektnamen anhängen.

    3) Nun, Sie haben bereits geschrieben, dass die Aufgabe lösbar ist.

    Und das sind überhaupt keine Probleme. Dies ist der normale Betrieb von Programmen - Erstellung einzigartiger Objekte, periodische Speicherung der gesammelten Informationen, Bereinigung nach Abschluss.

     
    Andrey Dik:

    1. Das sind Ihre Wünsche. Aber Sie sagten, Sie wollten die Funktionsweise von Desktop-Anwendungen, also funktionieren Desktop-Anwendungen nicht so, wie Sie es wollen.

    Wie nennen Sie Desktop-Anwendungen? Ich habe das Gefühl, dass MT5 keine Desktop-Anwendung ist.

    2. Denken Sie sich keine Geschichten aus. Die Reihenfolge von oninit und ondeinit ist bei MT4 und MT5 gleich. Ein Programm, das mit deinit beginnt, gibt es nicht.

    Ich habe mir das nicht ausgedacht. Dies ist das Thema des aktuellen Threads. Der Punkt ist, dass MT5 Init für den Indikator ausführen kann, der noch nicht DeInit ist. Ja, das ist sie. Haben Sie das Thema nicht gelesen?

    3) Gut, analysieren wir die Beispiele:

    1) Zu tun, wie ich früher schrieb: akkumulierte Datenbank sollte regelmäßig in eine Datei oder einen anderen Speicher gespeichert werden, kein Problem - geöffnete Datei, geschrieben, geschlossen. Sie müssen dies jedes Mal tun, wenn Sie diese Daten aktualisieren oder in regelmäßigen Abständen, nicht bei Init und Deinit. (Sie speichern Ihre Arbeit regelmäßig, wenn Sie ein Programm schreiben oder einen Artikel verfassen). Und es ist unmöglich, sich gegen das Scheitern des Schreibens in eine Datei zu versichern. Um sich in kritischen Situationen abzusichern, wird manchmal Folgendes getan: Die aktualisierten Informationen werden in eine neue Datei geschrieben, nach dem erfolgreichen Schreiben wird die alte Datei gelöscht und der Name der neuen Datei wird so geändert, wie er in der alten Datei stand.

    Versuchen Sie, dieselbe Datei mehrmals pro Sekunde zu aktualisieren, und teilen Sie Ihre Gefühle mit.

    2) Ich habe es bereits erklärt. Jeder Indikator muss mit seinen eigenen grafischen Objekten arbeiten. Natürlich müssen wir prüfen, ob die Objekte existieren, und wenn sie bereits existieren, müssen wir eine 1 an den Objektnamen anhängen.

    Was hat das mit dem Hinzufügen einer 1 zum Namen zu tun? Es geht darum, dass grafische Objekte desselben Indikators, aber verschiedene Kopien davon, gleichzeitig auf dem Bildschirm zu sehen sind. Technisch gesehen gibt es keinen Konflikt. Für den Benutzer, der das Ärgernis auf dem Bildschirm sieht, wird es einen Konflikt geben, bis die alte Kopie gelöscht ist.

    3) Nun, Sie haben bereits geschrieben, dass die Aufgabe lösbar ist.

    Das ist überhaupt kein Problem. Dies ist ein normaler Programmbetrieb - Erstellung einzigartiger Objekte, periodische Speicherung der gesammelten Informationen, Aufräumen nach Beendigung.

    Ich verrate Ihnen ein großes Geheimnis: Es gibt eine Kopie der DLL pro Terminal-Kopie. Sie können nicht mehrere Kopien davon verwenden.