Testen von 'CopyTicks' - Seite 12

 
Dmitriy Skub:

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 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

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?

 
Beim Hinzufügen von Zecken zu einem dynamischen Array, wie viel reserve_size in ArrayResize ist am besten?
 
fxsaber:
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, diese Größe gleich festzulegen.
 
prostotrader:
Ein dynamisches Array ist auf INT_MAX begrenzt, daher ist es am besten, das Array gleich auf diese Größe zu setzen.
Es ist schade um das Gedächtnis des Vogels.
 
prostotrader:
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? :-)
 
Dennis Kirichenko:
Mikalas, bist du das? :-)
Примечание

Функция может быть применена только к динамическим массивам. При этом необходимо иметь ввиду, что нельзя изменять размер для динамических массивов, 
назначенных в качестве индикаторных буферов функцией SetIndexBuffer(). Для индикаторных буферов все операции по изменению размера производит 
исполняющая подсистема терминала.

Общее число элементов в массиве не может превышать 2147483647.
 
prostotrader:
Ich sehe an deiner Handschrift, dass du es bist ;-)
 

Das Skript gibt Ticks aus, wenn die besten Gangs in derselben Millisekunde gewechselt haben

#property script_show_inputs

sinput int Count = 10000; // Количество тиков на проверку

#define  TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  static int i = 0;
  
  i++;
  
  return("Tick" + (string)i + ":" + TOSTRING(time) + "." + (string)(Tick.time_msc %1000) +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume));
}

void OnStart()
{
  MqlTick Ticks[];
  
  const int 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.13 11:58:46.861 Test (RTS-9.16,M1)      Tick14: time = 2016.09.13 10:12:55.819 bid = 98220.0 ask = 98240.0 last = 98240.0 volume = 2
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick13: time = 2016.09.13 10: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.13 11:58:46.861 Test (RTS-9.16,M1)      Tick4: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 99040.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick3: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick2: time = 2016.09.13 10:00:00.235 bid = 98490.0 ask = 98600.0 last = 98500.0 volume = 8
2016.09.13 11:58:46.861 Test (RTS-9.16,M1)      Tick1: time = 2016.09.13 10: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)?

 
fxsaber:


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.