Zeitschaltuhr - Seite 2

 
TheXpert:

Eine Sache noch... Ihr seid doch keine Brüder, oder?

Das heißt aber nicht, dass es keine gibt. Jeder hat einen anderen Auftrag.

Jetzt geht's los... Können wir lesen? Zeigen Sie mir, wie das bei den Induks gemacht wird.


  1. Das glaube ich nicht, ich weiß nicht einmal, wer das ist :D
  2. Nun, ich bin ehrlich gesagt noch nicht auf eine solche Aufgabe gestoßen, denn für meine Aufgaben gilt: Je schneller es zählt, desto besser.
  3. Es tut mir leid, ich habe es durchgesehen)). Ich habe mich nicht wirklich mit den Themen beschäftigt - was ist da los? Ich weiß nicht, ich habe so etwas noch nie gesehen. Es hängt wirklich von der Aufgabe ab, es sei denn, ich führe ein seltsames Skript aus, das die Anzeige abgreift.
Oder, als weitere Alternative, alle Berechnungen und alles in einem separaten Thread in eine dll zu packen - aber das klingt wie eine Perversion.
 

Interesting:

... Die Timer-Verarbeitung kann erst aufgerufen werden, wenn die vorherige Timer-Verarbeitung abgeschlossen ist. Oder einfach ausgedrückt: OnTimer() erhält erst dann das Recht, ausgeführt zu werden, wenn der Thread, der den Timer verarbeiten sollte, beschäftigt ist.

Zur Veranschaulichung der Unmöglichkeit, die Timer-Verarbeitung durch den zweiten Thread zu starten, können Sie dieses Beispiel verwenden (dumm, aber klar):

int OnInit()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
EventSetTimer(1);
//----------------------------------------------------------------------------//
return(0);
//----------------------------------------------------------------------------//
}

void OnTimer()
{
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
Print(TimeLocal());
Sleep(2000);
//----------------------------------------------------------------------------//
}
Es stellt sich also heraus, dassTimer-Ereignisse ebenso ignoriert werden können wieNewTick-Ereignisse? Und unter bestimmten Bedingungen können sie nicht in die Ereigniswarteschlange des Expert Advisors gestellt werden?
 
Yedelkin:
Es stellt sich also heraus, dassTimer-Ereignisse auf die gleiche Weise ignoriert werden können wieNewTick-Ereignisse? Und unter bestimmten Bedingungen kann es aus der Ereigniswarteschlange des Expert Advisors ausgeschlossen werden?
Das Ereignis NewTick ist in diesem Fall eine Ausnahme. Für andere Arten von Ereignissen gibt es keine Kontrollen. Wenn die Ereignisbehandler langsamer laufen, als die Ereigniswarteschlange gefüllt wird, läuft die Warteschlange über und einige Ereignisse werden übersprungen. Das obige Beispiel bestätigt nur, dass der EA einen einzigen Ausführungsthread hat und dass die Ereignisbehandlung sequentiell in der Reihenfolge der Warteschlange erfolgt.
Документация по MQL5: Программы MQL5 / События клиентского терминала
Документация по MQL5: Программы MQL5 / События клиентского терминала
  • www.mql5.com
Программы MQL5 / События клиентского терминала - Документация по MQL5
 
antt:
Das Ereignis NewTick ist in diesem Fall eine Ausnahme. Für andere Ereignistypen gibt es keine Prüfungen. Wenn die Ereignisbehandler langsamer sind als die Ereigniswarteschlange gefüllt wird, läuft die Warteschlange über und einige Ereignisse werden übersprungen. Das obige Beispiel bestätigt nur, dass der EA einen einzigen Ausführungsthread hat und dass die Ereignisbehandlung sequentiell in der Reihenfolge der Warteschlange erfolgt.

Großartig, danke für die Erklärungen! Logisch und verständlich, kein Grund zu spekulieren

Interessant, Ihre Frage zum Multithreading von Ereignissen ist damit sozusagen beantwortet. Und ich habe sogar den OnTimer erraten :)

 
Yedelkin:
Es stellt sich also heraus, dassTimer-Ereignisse auf die gleiche Weise wieNewTick-Ereignisse ignoriert werden können? Und unter bestimmten Umständen können sie nicht in die Warteschlange der Expert Advisor-Ereignisse aufgenommen werden?

Soweit ich es verstanden habe, geht es in etwa so:

1. Alle Ereignisse werden in dieselbe Warteschlange gestellt. Wenn sich ein NewTick-Ereignis in der Warteschlange befindet oder ein solches Ereignis behandelt wird, wird NewTick ignoriert und nicht in die Warteschlange aufgenommen.

2. Der Programmierer wählt aus, welche Ereignisse behandelt werden sollen. Handler für OnTrade, OnTimer und OnTick sind grundlegend und werden häufig in Expert Advisors verwendet.

3. Während der Bearbeitung eines Ereignisses können andere nicht bearbeitet werden.

(4) Wenn der Ereignisstapel überläuft, werden alte Ereignisse ohne Bearbeitung aus der Warteschlange entfernt.

5. Von den drei oben genannten Ereignistypen wird Trade seltener und NewTick häufiger generiert (aber Ticks wie oben beschrieben dürfen nicht in die Warteschlange aufgenommen werden).

6. Der aus dieser Sicht interessanteste Handler ist OnChartEvent, der alle Ereignisse des Diagramms und benutzerdefinierte Ereignisse verarbeitet.

Und gerade eine große Anzahl dieser Ereignisse kann die Ereigniswarteschlange leicht überlaufen lassen (falls es viele solcher Ereignisse gibt).

Meiner Meinung nach ist die einzige Rettung in dieser Situation, dass OnChartEvent-Ereignisse willkürlich und asynchron erzeugt werden.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы графиков / Типы событий графика - Документация по MQL5
 

Yedelkin:

Interessant, Ihre Frage nach der Multithreading-Ereignisbehandlung scheint beantwortet zu sein. Und ich habe sogar den OnTimer erraten :)

Im Prinzip hatte ich keine Zweifel an einem einzigen Thread, zumal der Code im Expert Advisor selbst in einem einzigen Thread ausgeführt wird.

Und was ich beschrieben habe, ist eine Art Traum über die Zukunft (sagen wir, über MT6), wenn es Multi-Threading in MT geben wird (zumindest bis der Ereignisstrom aus irgendeinem Grund nicht getrennt wird).

Ursprünglich hätte ich zumindest alle ChartEvent-Ereignisse in einen eigenen Thread getrennt, aber die Entwickler wissen es besser...

 

Gibt es eine Möglichkeit, den EA dazu zu bringen, Timer-Ereignisse zu einer bestimmten Zeit zu erzeugen? Zum Beispiel zu Beginn der letzten Minute der Stunde oder des Tages.

 
Yedelkin:

Gibt es eine Möglichkeit, den EA dazu zu bringen, Timer-Ereignisse zu einer bestimmten Zeit zu erzeugen? Zum Beispiel zu Beginn der letzten Minute der Stunde oder des Tages.

Ja, sicher.
 
TheXpert:
Ja, sicher.
Wie sieht sie (die Methode) aus, wenn sie nicht ein Geheimnis ist?
 
Yedelkin:
Wie sieht sie (die Methode) aus, wenn nicht als Geheimnis?

Verwendung des Timer-Managers. Ich wollte eigentlich einen Artikel schreiben, aber dann bin ich irgendwie vom Thema abgekommen. Auch wenn es nicht wie ein Artikel aussieht.

Eine bestimmte Zeit wird wegen der Single-Thread-Natur des Codes und der Ereigniswarteschlange nicht funktionieren, aber mit einem durchschnittlichen Fehler von weniger als einer Sekunde (das Maximum wird durch die maximale Ausführungszeit des Ereignisses durch den Code begrenzt).

Außerdem gibt es nur eine Zeitschaltuhr.

Soll ich?