Nach einem Jahr fassen wir die Zwischenergebnisse zusammen:
- die Funktion CopyTicks funktioniert korrekt (wie beschrieben);
- Die mit dieser Funktion ermittelten aktuellen Tickdaten des Terminmarktes stimmen mit den Börsendaten überein;
- Die Historie der Tickdaten des Terminmarktes für die liquidesten Instrumente ist ab dem 28.07.2016 korrekt (offensichtlich der Start der neuesten Serverversion);
All dies gilt für das MT5-Terminal Version 1395 und die realen Konten des Terminmarktes in Open-Broker. Im Prinzip ist das Thema abgeschlossen.
Haben Sie auch die Richtung der Geschäfte überprüft?
Ich habe folgende Frage. Ist es sinnvoll (aus Sicht der Leistung), wenn Sie CopyBuffer verwenden, um Puffer für die Anzahl der geänderten Werte hinzuzufügen(Eingabeparameter Anzahl ist nicht Null) oder immer eine vollständige Kopie des Puffers zu machen?
aber fast die gleiche Frage über CopyTicks.
Ist es sinnvoll (aus Sicht der Leistung), bei der Verwendung von CopyTicks neue Werte zu bereits gesammelten Ticks hinzuzufügen oder immer eine vollständige Anfrage von der Stelle aus zu stellen, an der die Ticks benötigt werden, und keine zuvor gesammelten Werte zu speichern?
Примечание
Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов,
назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит
исполняющая подсистема терминала.
Общее число элементов в массиве не может превышать 2147483647.
Das Skript gibt Ticks aus, wenn die besten Gangs in derselben Millisekunde gewechselt haben
#property script_show_inputssinputint Count = 10000; // Количество тиков на проверку#define TOSTRING(A) " " + #A + " = " + (string)Tick.A
string TickToString( constMqlTick &Tick )
{
staticint i = 0;
i++;
return("Tick" + (string)i + ":" + TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume));
}
voidOnStart()
{
MqlTick Ticks[];
constint Amount = CopyTicks(_Symbol, Ticks, COPY_TICKS_INFO, 0, Count);
for (int i = 1; i < Amount; i++)
if (Ticks[i].time_msc == Ticks[i - 1].time_msc) // ищем соседние тики с одним временем (с точностью до мс)// if ((Ticks[i].bid > Ticks[i - 1].bid) ||(Ticks[i].ask < Ticks[i - 1].ask)) // ищем выставление лимитной заявки внутрь спредаPrint(TickToString(Ticks[i - 1]) + "\n" + TickToString(Ticks[i]) + "\n");
}
Ein Teil des Ergebnisses:
2016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick14: time = 2016.09.1310:12:55.819 bid = 98220.0 ask = 98240.0 last = 98240.0 volume = 22016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick13: time = 2016.09.1310:12:55.819 bid = 98230.0 ask = 98240.0 last = 98240.0 volume = 2
Hier hat es jemand innerhalb einer Millisekunde geschafft, sein BuyLimit= 98230 zurückzuziehen. Genau, es wurde nicht mit dem Marker geklatscht, sondern herausgezogen.
Die Überprüfung hat ergeben, dass alle derartigen Aktionen innerhalb einer Millisekunde eine Entnahme (nicht eine Ausführung) des besten Limits aus dem Becher sind.
Ein weiterer Teil des Ergebnisses:
2016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick4: time = 2016.09.1310:00:00.235 bid = 98490.0 ask = 99040.0 last = 98500.0 volume = 82016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick3: time = 2016.09.1310:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 82016.09.1311:58:46.861 Test (RTS-9.16,M1)
2016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick2: time = 2016.09.1310:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 82016.09.1311:58:46.861 Test (RTS-9.16,M1) Tick1: time = 2016.09.1310:00:00.235 bid = 98500.0 ask = 98600.0 last = 98500.0 volume = 8
Hier ist es jemandem gelungen, bei der Eröffnung der Sitzung sowohl SellLimit als auch BuyLimit in einer Millisekunde zu entfernen. Das heißt, zwei Aktionen in einer Millisekunde!
Wie kann das sein? Schließlich kann selbst HFT einen Limitauftrag nicht innerhalb von weniger als 1 ms löschen.
Oder wenn durch OrderSendAsync zwei Limit-Orders (BuyLimit1_price < BuyLimit2_price) innerhalb der Spanne gesendet werden, dann generiert die Börse zwei aufeinanderfolgende Ticks mit Bid-Price-Verbesserung zur gleichen Zeit (mit einer Genauigkeit von 1ms)?
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Erlauben Sie die Verwendung von Cookies, um sich auf der Website MQL5.com anzumelden.
Bitte aktivieren Sie die notwendige Einstellung in Ihrem Browser, da Sie sich sonst nicht einloggen können.
Sie sind angemeldet. Die Zwei-Faktor-Authentifizierung wurde deaktiviert. Richten Sie sie erneut ein und scannen Sie einen neuen QR-Code oder fahren Sie mit deaktivierter Zwei-Faktor-Authentifizierung fort.
Nach einem Jahr fassen wir die Zwischenergebnisse zusammen:
- die Funktion CopyTicks funktioniert korrekt (wie beschrieben);
- Die mit dieser Funktion ermittelten aktuellen Tickdaten des Terminmarktes stimmen mit den Börsendaten überein;
- Die Historie der Tickdaten des Terminmarktes für die liquidesten Instrumente ist ab dem 28.07.2016 korrekt (offensichtlich der Start der neuesten Serverversion);
All dies gilt für das MT5-Terminal Version 1395 und die realen Konten des Terminmarktes in Open-Broker. Im Prinzip ist das Thema abgeschlossen.
Ich hatte eine Frage zu CopyBuffer
Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien
Erlaubt es mql5, einen Indikator zu schreiben, der Charts in verschiedenen Fenstern zeichnet oder auf Indikatorpuffer in anderen Fenstern zugreift?
fxsaber, 2016.09.09 10:20
aber fast die gleiche Frage über CopyTicks.
Ist es sinnvoll (aus Sicht der Leistung), bei der Verwendung von CopyTicks neue Werte zu bereits gesammelten Ticks hinzuzufügen oder immer eine vollständige Anfrage von der Stelle aus zu stellen, an der die Ticks benötigt werden, und keine zuvor gesammelten Werte zu speichern?
Beim Hinzufügen von Zecken zu einem dynamischen Array, wie viel reserve_size in ArrayResize ist am besten?
Ein dynamisches Array ist auf INT_MAX begrenzt, daher ist es am besten, das Array gleich auf diese Größe zu setzen.
Ein dynamisches Array ist auf INT_MAX begrenzt, daher ist es am besten, das Array gleich auf diese Größe zu setzen.
Mikalas, bist du das? :-)
Das Skript gibt Ticks aus, wenn die besten Gangs in derselben Millisekunde gewechselt haben
Ein Teil des Ergebnisses:
Hier hat es jemand innerhalb einer Millisekunde geschafft, sein BuyLimit= 98230 zurückzuziehen. Genau, es wurde nicht mit dem Marker geklatscht, sondern herausgezogen.
Die Überprüfung hat ergeben, dass alle derartigen Aktionen innerhalb einer Millisekunde eine Entnahme (nicht eine Ausführung) des besten Limits aus dem Becher sind.
Ein weiterer Teil des Ergebnisses:
Hier ist es jemandem gelungen, bei der Eröffnung der Sitzung sowohl SellLimit als auch BuyLimit in einer Millisekunde zu entfernen. Das heißt, zwei Aktionen in einer Millisekunde!
Wie kann das sein? Schließlich kann selbst HFT einen Limitauftrag nicht innerhalb von weniger als 1 ms löschen.
Oder wenn durch OrderSendAsync zwei Limit-Orders (BuyLimit1_price < BuyLimit2_price) innerhalb der Spanne gesendet werden, dann generiert die Börse zwei aufeinanderfolgende Ticks mit Bid-Price-Verbesserung zur gleichen Zeit (mit einer Genauigkeit von 1ms)?
Wie kann das sein? Schließlich können selbst HFTs einen Limitauftrag nicht in weniger als 1 ms löschen.
Woher haben Sie dieses Wissen?
Neben Plaza II gibt es ein FAST/FIX-Protokoll
Es gibt Hunderte von Operationen in 1 ms.