Exchange Ticks Corrections
- Utilitys
-
Aleksei Kuznetsov
Erweiterter Optimierungsbericht
Optimieren Sie Ihre Trading-Strategien in Meta Trader 5 (MT5)? Nutzen Sie eine erweiterte und anschaulichere Darstellung der Optimierungsresultate mit den Vorteilen interaktiver HTML-Seiten.
Kurz über die Vorteile: - Version: 1.0
- Aktivierungen: 5
Anpassung der Ticks für den MQ-Tester, die es ermöglicht, Strategien für Börseninstrumente zu testen und Ergebnisse zu erhalten, die näher am realen Handel liegen als dies im Tester mit gespeicherten Ticks der Fall ist.
Getestet an der MOEX über den Broker F..am. Die Funktionsweise an anderen Börsen wurde nicht überprüft, aber möglicherweise besteht dort ein ähnliches Problem.
Die ersten 10 Verkäufe zu je 30 $, danach zu je 50 $.
Funktionsweise:
- Das Skript liest die gespeicherten Ticks des aktuellen Instruments ein
- Ticks aus der Nicht-Handelssitzung werden anhand bestimmter Merkmale automatisch identifiziert und herausgefiltert. Die morgendliche und abendliche Handelspause werden ermittelt. Die Beginnzeiten der Handelssitzungen haben sich geändert: Die morgendliche Sitzung begann zunächst um 10:00 Uhr, ab 2025 um 07:00 Uhr, und die abendliche Handelspause dauerte von 18:40 bis 19:05 Uhr, heute auf 5 Minuten von 18:55 bis 19:00 verkürzt. Da sich der Zeitplan geändert hat, wäre die Verwendung einer der Tabellen für Handelssitzungen ungenau, weshalb ich einen automatischen Erkennungsmechanismus geschrieben habe. Möglicherweise werde ich in Zukunft eine Variante erstellen, bei der die Handelssitzungen manuell eingegeben werden können; das ist zuverlässiger, erfordert jedoch mehr Vorarbeit bei der Erstellung eines Zeitplans für die Änderungen (möglicherweise wird es schwierig sein, alle Änderungsdaten zu finden).
- Da die Ask- und Bid-Ticks oft nicht mit den Last-Ticks davor und danach übereinstimmen, werden alle Ask- und Bid-Ticks gelöscht
- Es werden neue Ask- und Bid-Kurse auf der Grundlage der „Last“-Ticks erstellt, unter der Annahme, dass alle „Last“-Ticks zu den Ask- und Bid-Kursen ausgeführt werden. Die Kurse werden nicht als separater Tick gespeichert, sondern den „Last“-Ticks hinzugefügt, die sie verändert haben
- Wenn innerhalb einer Millisekunde eine große Serie von „Last“-Ticks mit unterschiedlichen Kursen auftritt, werden die Ask- oder Bid-Kurse nur dem letzten Tick dieser Millisekunde hinzugefügt, da kein Roboter es schafft, seinen Handel in dieser Millisekunde zu platzieren. Solche Transaktionsserien entstehen durch eine Markttransaktion mit großem Volumen, die sofort mehrere Ebenen im Orderbuch abdeckt.
- Alle „Last“-Ticks mit gleicher Richtung und gleichem Kurs werden zu einem einzigen Tick zusammengefasst, dessen Volumen der Summe der Volumina aller zusammengefassten Ticks entspricht. Ein solcher Tick kann sich sowohl innerhalb einer Millisekunde als auch über mehrere Sekunden hinweg bilden. Der Kurs kann sich auch mehrere Minuten lang nicht ändern, doch damit der Kerzendiagramm-Verlauf übereinstimmt, werden Ticks mindestens einmal pro Minute erzeugt, sofern in dieser Minute mindestens ein Tick stattgefunden hat.
- Für die erzeugten Ask- und Bid-Kurse erfolgt eine Korrektur: Falls Ask <= Bid ist, wird Ask um 1 Punkt über Bid oder auf den letzten Kurs gesetzt.
- Die erhaltenen Ticks werden in einem benutzerdefinierten Symbol gespeichert, an dem die Tests durchgeführt werden sollen
- Bevor Sie das Skript starten, müssen Sie die Echtzeit-Ticks des gewünschten Instruments herunterladen. Starten Sie dazu im Tester einen beliebigen Expert Advisor für den gewünschten Zeitraum; der Tester lädt alle ausgewählten Ticks herunter. Wiederholen Sie den Test nach 2–5 Minuten, da der Tester möglicherweise noch einige Zeit benötigt, um die Ticks vollständig herunterzuladen.
- Führen Sie das Skript auf dem Chart des gewünschten Instruments aus
- Geben Sie die Eingabeparameter ein (Startdatum, „Action“ – vollständiger Neustart oder Nachladen aktueller Ticks, „PostFix“ – für den Namen des zu erstellenden benutzerdefinierten Symbols, „LoadByYears“ – wenn Sie wenig Arbeitsspeicher haben, arbeitet diese Option in Blöcken von jeweils einem Jahr und nicht sofort für 5–10 Jahre; beispielsweise hat GAZP für 5 Jahre 11 GB Tick-Daten in den Arbeitsspeicher geladen, bei einer Verarbeitung von jeweils einem Jahr sind es nur 3 GB)
- Starten Sie das Skript und warten Sie, bis es fertig ist (GAZP benötigte für 5 Jahre fast 2 Minuten)
- Sie können nun mit dem Testen im Tester anhand des erstellten benutzerdefinierten Symbols beginnen
Beschreibung der Probleme mit der NICHT-Handelssitzung, die in den gespeicherten Kursdaten auftreten:
1) Da in den Kursdaten die Ticks aus der Nicht-Handelssitzung nicht entfernt wurden, arbeitet der Tester auch mit diesen, während die Börse zu dieser Zeit jegliche Befehle ablehnt.
Beispiele:
Von 18:40 bis 19:05 Uhr findet kein Handel statt, doch im Tester werden während dieser Zeit Transaktionen ausgeführt https://www.mql5.com/ru/forum/516827/page11#comment_60568825
if(Tick.time== D'2024.06.07 18:49:55'){ OrderSend(_Symbol, OP_SELL, 1.0, n(Tick.bid), 0, n(130.0),0,NULL,3);}
2) Wenn eine Position während der Handelszeiten eröffnet und bis zum Ende der Handelssitzung nicht geschlossen wurde und über nicht handelbare Ticks verläuft, können TP/SL und andere Pending-Orders im Simulator (jedoch nicht an der Börse) außerhalb der Handelszeiten ausgelöst werden. Und da die Börse (oder der Broker) außerhalb der Handelszeiten ein Bid > Ask im Abstand von mehreren Tageskerzen gesetzt hat, erhält der Tester enorme positive Slippage-Werte und macht selbst eine primitive Strategie zum „Heiligen Gral“ des Testers. Ein Beispiel finden Sie in den Screenshots.
Das Herausfiltern von Nicht-Handels-Ticks hilft, diese Probleme zu beseitigen. Im Skript erfolgt die automatische Erkennung von Nicht-Handels-Ticks und deren Entfernung.
Wichtiger Hinweis: Da einige Minuten aus dem Verlauf entfernt werden, werden die MA-Indikatoren und andere Indikatoren ohne diese Balken berechnet, sodass die Werte abweichen werden.
Beschreibung der Probleme mit den vorhandenen Ask- und Bid-Ticks in den gespeicherten Kursen:
1) Ask- und Bid-Ticks werden nicht häufig genug aktualisiert, was dazu führt, dass Transaktionen, die zu einem „Last“-Preis abgeschlossen wurden, auf veralteten Ask- oder Bid-Werten basieren.
2) Manchmal stimmen die Ask- und Bid-Ticks nicht mit den „Last“-Kursen davor und danach überein, dabei werden „Last“-Ticks genau anhand von Ask und Bid ausgelöst, weshalb diese übereinstimmen müssen. Es kommt zu Abweichungen von 10 oder mehr Punkten; in den Screenshots ist eine Abweichung von 30 Punkten zu sehen.
Aus diesen Gründen löscht das Skript die gespeicherten Ask- und Bid-Ticks vollständig und erstellt neue auf der Grundlage der Last-Ticks.
Alle Fehler wurden den Entwicklern gemeldet; möglicherweise werden sie diese beheben. Vorerst kann man jedoch mit Hilfe der von diesem Skript erstellten benutzerdefinierten Symbole testen. Ein zusätzlicher Vorteil ist eine 4- bis 5-fache Beschleunigung der Tests, da Last-Ticks mit identischem Kurs zusammengefasst werden und die Ask- und Bid-Kurse nicht als separate Ticks hinzugefügt, sondern den Last-Ticks unter Hinzufügung der entsprechenden Flags angehängt werden.
Probleme, die selbst mit Hilfe dieses Skripts nicht gelöst werden können.
Eine exakte Übereinstimmung der Handelsergebnisse lässt sich aus folgenden Gründen nicht erreichen:
1) Die Börse oder der Händler sendet im realen Handel die Ask- und Bid-Ticks 10–30 ms nach den „Last“-Ticks, die sie verändern. Beispiel:
FP 0 16:55:35.242 test_trail (GAZP,H1) 2026.10.30 16:55:35.51 bid:117.22 ask:117.23 last:117.25 vol:64 flags:1080 BUY LAST VOL
MR 0 16:55:35.252 test_trail (GAZP,H1) 2026.10.30 16:55:35.61 bid:117.23 ask:117.25 last:117.25 vol:64 flags:1030 BID ASK
In den gespeicherten Ticks werden Ask- und Bid-Werte seltener aktualisiert, und die Preise stimmen oft nicht überein.
Bei den korrigierten Ticks werden Ask- und Bid-Werte an den Tick angehängt, der sie verändert hat, d. h., sie werden in derselben Millisekunde angewendet.
In beiden Varianten gibt es eine Abweichung. Bei der Variante mit korrigierten Ticks ist die Abweichung geringer und die Ergebnisse liegen näher am realen Handel.
2) Eine Börse oder ein Händler sendet im realen Handel alle paar Millisekunden ausgedünnte Ticks; fast alle Ticks innerhalb einer Tickserie von einer oder mehreren Millisekunden werden übersprungen. OnTick wird seltener aufgerufen, im Tester hingegen bei jedem gespeicherten Tick.
Bei den angepassten Ticks im Tester wird OnTick ebenfalls bei jedem Tick aufgerufen, und es kommt ebenfalls zu Abweichungen vom realen Handel; so führt der Tester beispielsweise einen Befehl zu einem Kurs aus, der im realen Handel übersprungen wurde.
3) Im realen Handel führt die Börse oder der Händler alle Aufträge mit einer Netzwerkverzögerung von einigen Millisekunden aus, im Simulator hingegen sofort.
4) Der Tester führt Limit-Orders nur aus, wenn das Niveau im Orderbuch vollständig ausgefüllt ist und der erste Tick des nächsten Niveaus erfolgt – unter der Annahme, dass Ihre Order die letzte in der Warteschlange ist. Im realen Handel ist Ihre Order möglicherweise nicht die letzte und wird ausgeführt, sobald der Kurs das Level berührt und wieder zurückfällt; der Tester reagiert nicht auf das Berühren, sondern erst beim Übergang zum nächsten Kurs. Diese Besonderheit ist mir beim Vergleich der Ausführung meines Testbeispiels aufgefallen: https://www.mql5.com/ru/forum/518455/page12#comment_60642029
Das heißt, eine vollständige Übereinstimmung ist nicht möglich, aber das Testen mit korrigierten Ticks liefert Ergebnisse, die näher an der Realität liegen als das Testen mit gespeicherten Ticks.
Bei der Erstellung und Überprüfung des Skripts wurde der Code https://www.mql5.com/ru/market/product/206598/comments#comment_60673660 verwendet, der dank Limit-Orders und der Preisrundung bei der Orderausführung die Einstiegspunkte im realen Börsenhandel und im Tester mit korrigierten Ticks exakt nachbildet (siehe Screenshots). Anschließend werden die Trades entweder per Stop-Loss oder per Stop-Loss nach einem Trailing abgeschlossen. Es gibt Unterschiede in den Ergebnissen: größere beim Test mit gespeicherten Ticks und geringere bei den angepassten Ticks.
Screenshots:
1) Im oberen Bereich 8 Transaktionen aus dem realen Handel mit einem Tagesergebnis von -3,4 Rubel, im unteren Bereich ein Test mit korrigierten Ticks mit einem Ergebnis von -4,2 Rubel, Differenz -0,8 Rubel
2) Oben dieselben realen Trades in der Positionsansicht, Ergebnis -3,4 Rubel; unten ein Test mit gespeicherten Ticks mit einem Ergebnis von +1 Rubel, Differenz +4,4 Rubel. Gründe: Es gibt mehr Transaktionen, da die Ask- und Bid-Ticks nicht den Last-Preisen entsprechen und aufgrund ihrer seltenen Aktualisierung die Transaktionen zu veralteten Ask- und Bid-Preisen mit positivem Slippage abgeschlossen werden.
3) Beispiel für die Auslösung eines Stop-Loss im Tester außerhalb der Handelszeiten zu Kursen, die um mehrere Tagesbalken unter den aktuellen Kursen liegen ; alle Sell- Transaktionen „erzielen Gewinne“ sowohl bei fallendem als auch bei steigendem Markt. „Gewinn“: mehrere tausend Rubel.
4) Beispiel für die Auslösung eines Stop-Loss im Simulator außerhalb der Handelszeiten zu Kursen, die um mehrere Tagesbalken über den aktuellen Kursen liegen ; alle Transaktionen sind Kaufgeschäfte und „erzielen Gewinne“ sowohl bei fallenden als auch bei steigenden Märkten. „Gewinn“: mehrere tausend Rubel.
5) Beispiel für die Auslösung eines Stop-Loss im Tester bei bereinigten Ticks, bei denen nicht handelbare Ticks entfernt wurden; alle Transaktionen sind „Sell“-Transaktionen. Die „Tester-Magie“ ist verschwunden, und es entstand ein kleiner Verlust.
6) Beispiel für die Auslösung des Stop-Loss im Tester bei bereinigten Ticks, wobei nicht handelbare Ticks entfernt wurden; alle Transaktionen sind Kaufgeschäfte. Der Gewinn entspricht in etwa dem realen Wert von ca. 120 Rubel.
7) Vergleich der Tick-Ausdrucke von GAZP (255 Ticks) und GAZP_Fixed (41 Ticks) über einen Zeitraum von 2 Sekunden.
Links weist GAZP Ask- und Bid-Ticks auf, die unangemessen höher liegen als die Last-Ticks, etwa um 30 Punkte; dies ist eines der Beispiele dafür, warum ich mich entschlossen habe, sie zu entfernen. Wir sehen viele Last-Ticks zum gleichen Preis – das sind alle Transaktionen an der Börse.
Rechts die korrigierten GAZP_Fixed. Da die Ask- und Bid-Ticks entfernt wurden, steht an erster Stelle der Last-Tick, der den Kurs verändert hat, und zu ihm wird der Ask-Kurs hinzugefügt; das Volumen entspricht der Summe der beiden GAZP-Ticks 1+3=4. Alle „Last“-Ticks mit identischem Kurs werden zu einem einzigen mit dem Gesamtvolumen zusammengefasst.
Ebenfalls zu erkennen ist eine große Serie von Ticks innerhalb einer Millisekunde aufgrund eines Kaufs von etwa 36.000 Lots, der mehrere Ebenen im Orderbuch abgedeckt hat. Die „Ask“-Preise dafür sind nur im ersten und letzten Tick erfasst.
In den Diskussionen habe ich weitere Details und Dateien zur Nachverfolgung beigefügt.
Falls jemand alles selbst überprüfen und die Ticks vergleichen möchte, füge ich Folgendes bei:
– Export der im GAZP-Terminal gespeicherten Ticks vom 30. Oktober 2026,
- Export der korrigierten GAZP_Fixed-Daten vom 30. Oktober 2026; Sie können die Ticks in Ihr Terminal importieren und den Expert Advisor starten, um die Funktion zu überprüfen.
- Ausdruck der Ticks, die in OnTick() beim Live-Handel am 30. Oktober 2026 empfangen wurden.
– Protokoll der Trades und Handelsbefehle für diesen Tag. Diese Transaktionen sehen Sie auf den Screenshots und in der Beschreibung.
- Der Code des Expert Advisors, der auf einem Live-Konto und im Backtester lief, sowie die Testkonfigurationsdatei für den 30. Oktober 2026
– Export der korrigierten Ticks für Januar bis Mai 2026 sowie die Einstellungsdatei des Expert Advisors zur Überprüfung der Test-Gralität anhand der Ticks des Dealers und deren Beseitigung für die korrigierten Ticks.
