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

 
Andrey Dik:

...

Mehrere Personen haben bereits nach einem konkreten Beispiel für eine Aufgabe gefragt, die im Rahmen des Paradigmas der Indikatorausführung in MT5 problematisch ist. Wird es ein klares, nicht aus der Luft gegriffenes Beispiel geben oder nicht?

Ein Indikator hat zuerst initial und dann deinit. Aber wenn der Zeitrahmen gewechselt wird, wird die zweite Indikatorinstanz erstellt, und ihr init kann früher ausgeführt werden als das deinit der vorherigen (nicht gezeichneten) Instanz.

Das offensichtlichste Beispiel ist die Speicherung von Benutzerparametern beim Wechsel des Zeitrahmens - wir speichern Parameter im Deinit und lesen sie im Init. Wenn der init der neuen Instanz vor dem deinit der vorherigen Instanz ausgelöst wird, werden die Parameter nicht gespeichert.

In der Praxis wird das Deinit der entfernten Instanz meist vor dem Init der neuen Instanz ausgelöst, aber wenn der Zeitrahmen sehr schnell umgeschaltet wird oder die Daten geladen werden, kommt es zu einem Fehler.

 
Slawa:

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

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

Meiner Meinung nach sollte die Warteschlange mit einem Diagramm verbunden sein. Unabhängig davon, ob der Benutzer ein Symbol oder eine TF ändert oder einfach nur schließt, sollten alle Indikatoren vollständig fertiggestellt werden, dann die EAs, mit der Verarbeitung aller Befehle in den Deinitionen (was auch immer sie tun, Schreiben in globale Variablen, Dateien, Löschen von Objekten, Interaktion mit DLL, etwas an das Internet zu senden) und nach der Fertigstellung und Entladen aus dem Speicher - führen Sie neue Instanzen auf einem neuen TF oder Symbol, nichts über die vorherige zu wissen, aber in der Lage, die Informationen korrekt zu lesen gespeichert die vorherige.

Es wird wahrscheinlich etwas langsamer gehen, aber es wird das Richtige sein.

Ich bin für Programme, die richtig funktionieren und nicht schnell und falsch.

Wenn die neue Instanz früher gestartet wird, dann stellt sich heraus, dass deinit überhaupt nicht notwendig ist und sogar schädlich ist, weil es Programmierer in die Irre führt, weil sie hoffen, dass sie etwas speichern und es dann zählen. Wenn wir es so lassen, wie es ist, dann fügen wir der Hilfe hinzu, dass die Ergebnisse dieser Funktion dem nächsten Benutzer nicht bekannt sein werden. Die Ergebnisse dieser Funktion werden der nächsten Instanz nicht bekannt sein, d.h. niemand wird in dieser Funktion etwas tun. Und noch besser - löschen Sie sie, wenn die natürliche Reihenfolge der Ereignisse sehr schwierig ist und Sie Hunderte von Arbeitsstunden in Anspruch nehmen wird.

 
Slawa:

Wenn der Zeitrahmenwechsel nach unten geht, dann zuerst OnInit auf dem niedrigeren (neuen) Zeitrahmen und dann OnDeinit auf dem höheren (alten) Zeitrahmen.

Wenn der Schalter nach oben geht, ist es genau umgekehrt. Zuerst starten wir 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

Was für eine seltsame Logik! Was soll ich tun? Wenn in DeInit einige Parameter auf die Festplatte geschrieben werden, sollten diese beim nächsten Start des Indikators in OnInit gelesen und abgeholt werden, auch wenn der Indikator in einem niedrigeren Zeitrahmen gestartet wird.

Ich denke, ich muss einen kurzen Test schreiben, um das zu überprüfen. Wenn die Funktion zu einem niedrigeren Zeitrahmen wechselt, ist die Logik sogar mehr als in Ordnung.

Generell ist es schade, dass statische Variablen nicht in Indikatoren gespeichert werden, gleichzeitig sind die Expert Advisors großartig mit statischen Variablen.
 
Ihor Herasko:

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

2) 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?

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

4. Was hat das mit dem Hinzufügen einer 1 zum Namen zu tun? Es geht um die Tatsache, dass auf dem Bildschirm gleichzeitig grafische Objekte desselben Indikators, aber verschiedene Kopien davon, 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.

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

1. Wir sprechen hier nicht von MT5, sondern von Indikatoren (wie Skripte und Experten), die nicht im Betriebssystem, sondern in einer speziellen sicheren Umgebung ausgeführt werden.

2. Du widersprichst dir selbst. Wenn die Neuberechnung so schnell erfolgt (mehrere Male pro Sekunde), ist es kein Problem, eine neue Neuberechnung in einer neuen Kopie des Indikators durchzuführen. In diesem Fall ist es sinnvoll, die laufenden Daten in regelmäßigen Abständen nach einer bestimmten Zeit zurückzusetzen (Sie können dafür ontimer oder einen benutzerdefinierten Zähler verwenden). Und wenn die Berechnungen lang sind, ist es umso notwendiger, die Daten nach den Berechnungen zu speichern, um ihren Verlust im Falle höherer Gewalt zu vermeiden (Mutter hat den Stecker aus der Steckdose gezogen, "um Phonation zu vermeiden").

3. Die alte Kopie wird in weniger als einer Sekunde gelöscht, und mit ihr die Graphobjekte. Welcher Idiot würde TF mit einer solchen Häufigkeit umschalten, dass ein Flimmern zu beobachten ist? - Na und? dll kann nicht in weniger als einer Sekunde aus der Kopie entfernt werden.

4. und? die DLL kann beschäftigt sein, das ist normal. Sie brauchen sich nicht darum zu kümmern, sondern müssen die Anfrage z. B. nur in einer Sekunde wiederholen.

Wie Sie sehen - kein Problem, Sie müssen nur die Programme im MT-Terminal richtig handhaben und daran denken, dass es sich nicht um Desktop-Anwendungen handelt und dass sie in einer besonders geschützten Umgebung laufen.

 
Dmitry Fedoseev:

Ein Indikator hat zuerst initial und dann deinit. Aber wenn der Zeitrahmen gewechselt wird, wird die zweite Indikatorinstanz erstellt, und ihr init kann früher ausgeführt werden als das deinit der vorherigen (nicht gezeichneten) Instanz.

Das offensichtlichste Beispiel ist die Speicherung von Benutzerparametern beim Wechsel des Zeitrahmens - wir speichern Parameter im Deinit und lesen sie im Init. Wenn der init der neuen Instanz vor dem deinit der vorherigen Instanz ausgelöst wird, werden die Parameter nicht gespeichert.

Praktisch wird das Deinit der entfernten Instanz vor dem Init der neuen Instanz ausgelöst, aber wenn der Zeitrahmen sehr schnell gewechselt wird oder die Daten geladen werden, kommt es zu einem Fehler.

Da haben wir es wieder... Warum "sehr schnell den Zeitrahmen wechseln"? Schaltet jemand von Ihnen den Computer wirklich "schnell durch Drücken der Taste" ein (oder aus)?
 
Andrey Dik:
Da haben wir es wieder... Warum "sehr schnell den Zeitrahmen wechseln"? Schaltet jemand von euch seinen Computer "schnell durch Drücken der Taste" ein (oder aus)?

Und warum? Verbietet es das Strafgesetzbuch oder die Verfassung?
 
Dmitry Fedoseev:

Und warum? Verbietet es das Strafgesetzbuch oder die Verfassung?

Es gibt viele Dinge, die die AC nicht verbietet, z. B. die Finger in eine Steckdose zu stecken.

Nennen Sie ein Beispiel für die Notwendigkeit, die TF so schnell umzuschalten, dass die Objekte zu flimmern beginnen. - Geben Sie kein Beispiel für die hypnotische Wirkung, da diese durch effizientere Methoden erreicht werden kann.

 
Andrey Dik:

Es gibt viele Dinge, die der Gesetzgeber nicht verbietet, wie z. B. das Stecken der Finger in eine Steckdose.

Nennen Sie ein Beispiel für die Notwendigkeit, die TF so oft umzuschalten, dass die Gegenstände zu flimmern beginnen. - Geben Sie kein Beispiel für die hypnotische Wirkung, da diese durch effizientere Methoden erreicht werden kann.

Denn die Steckdose und der Stecker wurden von vernünftigen Designern entworfen, nicht von Idioten. Auf der Spannungsseite befindet sich die Steckdose, nicht der Stecker. Außerdem sind die Löcher in der Buchse so groß, dass man den Finger nicht hineinstecken kann. Aber Sie können es in Ihrer eigenen Wohnung auch anders machen - lassen Sie die Stecker aus der Wand ragen und die Steckdosen an den Drähten hängen. Schließlich verstehen Sie, dass man Stecker, die aus der Wand ragen, nicht mit den Händen anfassen kann und will.
 
Dmitry Fedoseev:
Denn die Steckdose und der Stecker wurden von vernünftigen Designern entworfen, nicht von Idioten. Auf der Spannungsseite befindet sich die Steckdose, nicht der Stecker. Außerdem sind die Löcher in der Fassung so groß, dass man den Finger nicht hineinstecken kann. Aber Sie können es in Ihrer eigenen Wohnung auch anders machen - lassen Sie die Stecker aus der Wand ragen und die Steckdosen an den Drähten hängen. Du verstehst und berührst die aus der Wand herausragenden Stecker nicht mit den Händen.

GUT. Die Steckdosen sind ein unglückliches Beispiel.

Dann nehmen wir eine andere - den Sprung vom Balkon! Verbietet das AC, vom Balkon zu springen? - Nein? - Warum üben Sie es dann nicht wegen des Adrenalinstoßes?

Alle Ziele müssen mit sinnvollen Mitteln erreicht werden, sonst sind die Ziele nicht sinnvoll.

 
Dmitry Fedoseev:

Andrej Dik:

Nennen Sie ein Beispiel für die Notwendigkeit, die TF häufig so schnell umzuschalten, dass die Objekte zu flimmern beginnen. - Geben Sie kein Beispiel für die hypnotische Wirkung, da diese durch effizientere Methoden erreicht werden kann.

Grund der Beschwerde: