Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Das stimmt. Das wusste ich nicht. Daran hatte ich nicht gedacht. Eigentlich löst es das Problem nicht vollständig, da ich Aufträge fast sofort ausgeführt werden müssen (und ich denke, mit dieser Methode kann ich es nur jede Sekunde überprüfen, aber zumindest nicht jeden Tick), aber in der Tat kann ich leicht eine temporäre Lösung mit ihm bauen.
Obwohl der OnTimer die schnellste Rate hat, die sich an der Systemuhr orientiert, d.h. alle 15 ms, würde ich eine Schleife in 1ms-Intervallen bevorzugen (mit Sleep(1) in der Schleife).
Obwohl der OnTimer die schnellste Rate hat, die sich an der Systemuhr orientiert, d.h. alle 15 ms, würde ich eine Schleife in 1ms-Intervallen bevorzugen (unter Verwendung des Sleep(1) in der Schleife).
Wäre das nicht ein Problem? Ich meine, gibt es nicht interne Prozesse in MT4, die OnTick() ausführen müssen, um zu verhindern, dass interne Puffer überlaufen oder überdimensioniert sind, nachdem sie (der EA) wochenlang gelaufen sind, ohne anzuhalten und nur eine Schleife zu machen?
Ich frage das aus Unwissenheit, ich habe keine Ahnung, ob das ein Problem sein könnte, ich nehme nur an, dass MT4 nicht dafür entwickelt wurde.
Sie denken also (/ haben versucht) es wird nicht ein Problem sein? (Wenn ja, sind das großartige Neuigkeiten).
BTW: Wie bekommen Sie OnTimer() unter 1 sec Intervall ausgeführt werden?
Vor einigen Jahren habe ich EAs in einer Schleife laufen lassen, die in init() gestartet wurde, und zwar aus einem ähnlichen Grund - Lesen externer Daten mit minimaler Verzögerung. Es lief wochenlang ohne jegliche Nebenwirkung. Sleep(1) ist zufriedenstellend, um die Auswirkungen auf die Rechenleistung sehr gering zu halten.
Die Timer-Einstellungen akzeptieren Millis.
Vor einigen Jahren habe ich EAs in einer Schleife laufen lassen, die in init() gestartet wurde, und zwar aus einem ähnlichen Grund - Lesen externer Daten mit minimaler Verzögerung. Es lief wochenlang ohne jegliche Nebenwirkung. Sleep(1) ist zufriedenstellend, um die Auswirkungen auf die Rechenleistung sehr gering zu halten.
Die Timer-Einstellungen akzeptieren Millis.
BTW: Wie erreichen Sie, dass OnTimer() in einem Intervall von weniger als 1 Sekunde ausgeführt wird? :?
EventSetMillisecondTimer
Die Funktion zeigt dem Client-Terminal an, dass für diesen Expert Advisor oder Indikator Timer-Ereignisse in Intervallen von weniger als einer Sekunde erzeugt werden sollen.
boolEventSetMillisekundenTimer(
intmilliseconds// Anzahl der Millisekunden
);
Parameter
milliseconds
[in] Anzahl der Millisekunden, die die Häufigkeit der Timer-Ereignisse festlegen.
Rückgabewert
Im Falle einer erfolgreichen Ausführung wird true zurückgegeben, andernfalls - false. Um einen Fehlercode zu erhalten, sollte die Funktion GetLastError() aufgerufen werden.
Hinweis
Diese Funktion ist für die Fälle gedacht, in denen einhochauflösender Timer benötigt wird. Mitanderen Worten, Timer-Ereignisse sollten häufiger als einmal pro Sekunde empfangen werden. Wenn Ihnen ein herkömmlicher Timer mit einer Periode von mehreren Sekunden ausreicht, verwenden Sie EventSetTimer().
Normalerweise sollte diese Funktion von der Funktion OnInit() oder im Klassenkonstruktor aufgerufen werden. Um Ereignisse, die vom Timer kommen, zu verarbeiten, sollte ein Expert Advisor oder ein Indikator über die Funktion OnTimer() verfügen.
Jeder Expert Advisor und jeder Indikator arbeitet mit seinem eigenen Timer und empfängt Ereignisse ausschließlich von diesem Timer. Beim Herunterfahren der mql4-Anwendung wird der Timer zwangsweise zerstört, falls er zwar erstellt, aber nicht mit der Funktion EventKillTimer() deaktiviert wurde.
Für jedes Programm kann nur ein Timer gestartet werden. Jede mql4-Anwendung und jedes Diagramm haben ihre eigene Ereignis-Warteschlange, in die alle neu eingetroffenen Ereignisse gestellt werden. Wenn die Warteschlange bereits ein Timer-Ereignis enthält oder dieses Ereignis in der Verarbeitungsphase ist, wird das neue Timer-Ereignis nicht in die Warteschlange der mql4-Anwendung aufgenommen.
EventSetMillisecondTimer
Die Funktion gibt dem Clientterminal an, dass für diesen Expert Advisor oder Indikator Timer-Ereignisse in Intervallen von weniger als einer Sekunde erzeugt werden sollen.
boolEventSetMillisekundenTimer(
intmilliseconds// Anzahl der Millisekunden
);
Parameter
milliseconds
[in] Anzahl der Millisekunden, die die Häufigkeit der Timer-Ereignisse festlegen.
Rückgabewert
Im Falle einer erfolgreichen Ausführung wird true zurückgegeben, andernfalls - false. Um einen Fehlercode zu erhalten, sollte die Funktion GetLastError() aufgerufen werden.
Hinweis
Diese Funktion ist für die Fälle gedacht, in denen einhochauflösender Timer benötigt wird. Mitanderen Worten: Timer-Ereignisse sollten häufiger als einmal pro Sekunde empfangen werden. Wenn Ihnen ein herkömmlicher Timer mit einer Periode von mehreren Sekunden ausreicht, verwenden Sie EventSetTimer().
Normalerweise sollte diese Funktion von der OnInit()-Funktion oder im Klassenkonstruktor aufgerufen werden. Um Ereignisse zu verarbeiten, die vom Timer kommen, sollte ein Expert Advisor oder ein Indikator über die Funktion OnTimer() verfügen.
Jeder Expert Advisor und jeder Indikator arbeitet mit einem eigenen Timer, der ausschließlich Ereignisse von diesem Timer empfängt. Beim Herunterfahren der mql4-Anwendung wird der Timer zwangsweise zerstört, falls er zwar erstellt, aber nicht durch die Funktion EventKillTimer() deaktiviert wurde.
Für jedes Programm kann nur ein Timer gestartet werden. Jede mql4-Anwendung und jedes Diagramm haben ihre eigene Ereignis-Warteschlange, in der alle neu eingetroffenen Ereignisse abgelegt werden. Wenn die Warteschlange bereits ein Timer-Ereignis enthält oder sich dieses Ereignis in der Verarbeitungsphase befindet, wird das neue Timer-Ereignis nicht in die Warteschlange der mql4-Anwendung aufgenommen.
Danke für die ausführliche Erklärung; mein Fehler; ich habe es zu schnell online gelesen. (Links haben docs.mql4.com Domäne mit forum.mql4.com vertauscht. Nur für den Fall, dass noch jemand diesen Thread liest...)
EDIT: Ich werde die Anwesenheit eines Moderators ausnutzen: Wissen Sie, ob es einen Unterschied gibt zwischen dem Ausführen von OnTimer() alle N Millisekunden und dem Ausführen der gleichen Schleife alle N Millisekunden, wie in früheren Beiträgen beschrieben?
Ich verstehe nicht, warum die ganze Aufregung mit "ms" Timing. Es sei denn, es handelt sich um eine Art "High Frequency News Scalper" auf einer Broker-Verbindung mit sehr geringer Latenz, sollte ein Sekundenintervall bei OnTimer() als Antwortzeit mehr als ausreichend sein.
Wenn Sie alle Verzögerungen und Latenzen der JAVA-App-Ausführung, der IPC-Kommunikation (LAN & WAN), der Order-Management-Ausführung und der Broker-Server-Latenz addieren, gibt es keinen wirklichen Vorteil bei der Verwendung von "ms"-Timing für normale Strategien.
Wenn es sich jedoch um eine Art "High Frequency News Scalper" handelt, der auf einem VPS mit einer Verbindung mit geringer Latenz zum Broker eingesetzt werden soll, dann sollten Sie NICHT mit JAVA und IPC herumspielen und die Strategie direkt in sehr kompakter MQL kodieren, um die geringstmögliche Latenz zu erreichen.
EDIT:
EDIT: Ich werde die Anwesenheit eines Moderators ausnutzen: Wissen Sie, ob es einen Unterschied gibt zwischen dem Ausführen von OnTimer() alle N Millisekunden und dem Ausführen der gleichen Schleife alle N Millisekunden, wie in früheren Beiträgen beschrieben?
Nur weil ich ein Moderator bin, bedeutet das nicht, dass ich mehr weiß als andere. In der Tat haben die anderen Poster in diesem Thread offensichtlich mehr Wissen über dieses Thema als ich. Ich weiß nichts über Java.
Ich verstehe den Sinn der Verwendung von Sleep() in einem Timer-Ereignis nicht, da es den EA in eine Warteschleife versetzt und dies bedeuten könnte, dass eine Menge OnTick()-Ereignisse verpasst werden. Natürlich können OnTick-Ereignisse, je nach EA, unwichtig sein.
Vor einigen Jahren habe ich EAs in einer Schleife laufen lassen, die in init() gestartet wurde, und zwar aus einem ähnlichen Grund - Lesen externer Daten mit minimaler Verzögerung. Es lief wochenlang ohne jegliche Nebenwirkung. Der Sleep(1) ist ausreichend, um die Auswirkungen auf die Rechenleistung sehr gering zu halten.
Zum Spaß... das folgende Skript akzeptiert mehrere gleichzeitige TCP/IP-Verbindungen und schreibt eingehende CR-begrenzte Nachrichten in das Expertenprotokoll. Sobald das Skript läuft, können Sie beispielsweise eine Verbindung über Telnet herstellen (standardmäßig zu Port 51234), und jede Textzeile, die Sie eintippen, wird ausgedruckt.
Das folgende Skript akzeptiert mehrere gleichzeitige TCP/IP-Verbindungen und schreibt eingehende CR-getrennte Nachrichten in das Expertenprotokoll.
... um das Offensichtliche klarzustellen: Wenn Sie das oben Genannte in einem EA und nicht in einem Skript ausführen wollten, würden Sie es einfach wie folgt ändern: