Diskussion zum Artikel "Vergleich von MQL5 und QLUA - warum sind Transaktionen in MQL5 bis zu 28 Mal schneller?" - Seite 4

 

Wenn wir das Problem umformulieren als "wie oft wird MQL5-Code vom Terminal-Kernel aufgerufen", dann sollte alles falsch gemessen werden:

  1. Wir sollten allen unnötigen MQL5-Code entfernen und ein paar Zähler in einer bloßen Funktion belassen, um die Kosten für die Messung selbst zu minimieren
  2. Finden Sie einen geeigneten OnXXXX-Einstiegspunkt und eine Methode zur Zwangsgenerierung von Aufrufen aus dem Kernel. Hier müssen wir einen separaten Testaufbau für die Messung erstellen.

In diesem Fall kann man, nachdem man ein Polygon gebaut hat, wirklich alle Overheads bei MQL5-Aufrufen messen und erhält eine interessante Kennzahl. Wie es bei uns üblich ist, optimieren wir dann alles mehrere Male.

Dies ist eine interessante Aufgabe, mit der wir uns beschäftigen werden.

 
fxsaber:


Ich hab's!

Ja, das haben wir.

Tut mir leid, ich habe es übersehen.

 
Renat Fatkhullin:

Wenn wir das Problem umformulieren als "wie oft wird MQL5-Code vom Terminal-Kernel aufgerufen", dann sollte alles falsch gemessen werden:

  1. Wir sollten allen unnötigen MQL5-Code entfernen und ein paar Zähler in einer bloßen Funktion belassen, um die Kosten für die Messung selbst zu minimieren
  2. Finden Sie einen geeigneten OnXXXX-Einstiegspunkt und eine Methode zur Zwangsgenerierung von Aufrufen aus dem Kernel. Hier müssen wir einen separaten Testaufbau für die Messung erstellen.

In diesem Fall kann man, nachdem man ein Polygon gebaut hat, wirklich alle Overheads bei MQL5-Aufrufen messen und erhält eine interessante Kennzahl. Wie es bei uns üblich ist, optimieren wir dann alles mehrere Male.

Das ist eine interessante Aufgabe und wir werden es tun.

Vielen Dank, dass Sie solche ausgefallenen Dinge nicht unbeachtet lassen!

Wahrscheinlich brauchen wir einen separaten Build für die Messung der Ankunftsgeschwindigkeit von Zitatpaketen. Genau das wollte ich messen.

[Gelöscht]  
Renat Fatkhullin, fxsaber - danke für die Klarstellung.
 
fxsaber:

Bitte machen Sie einen weiteren MT5 Geschwindigkeitstest auf einem realen Konto

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Testen von 'CopyTicks'

fxsaber, 2016.09.13 11:11 AM

Wenn durch OrderSendAsync zwei Limiter (BuyLimit1_price < BuyLimit2_price) innerhalb des Spreads gesendet werden, wird die Börse zwei aufeinanderfolgende Ticks mit Geldkursverbesserung zur gleichen Zeit generieren (mit 1ms Genauigkeit)?

Ich erkläre Ihnen, was das bedeutet.

Wenn BuyLimit1 innerhalb des Spreads gesendet wird, erhalten wir von der Börse einen Tick mit dem Zeitpunkt seiner Geburt (es wird ein neues Bid generiert). Nach BuyLimit2 - ein weiterer Tick mit seiner Geburtszeit. Der Unterschied zwischen diesen beiden Zeiten ist die Geschwindigkeit, mit der die MT5-Handelsaufträge an die Börse geliefert werden.

Um bei einem solchen Experiment möglichst wenig Geld zu verlieren, können Sie nicht zwei BuyLimits asynchron senden, sondern BuyLimit und SellLimit innerhalb des Spreads und ein wenig liquides Handelsinstrument wählen.

 

Bevor wir vergleichen, müssen wir den gesamten Komplex der Handelsoperationen "abschließen

(Empfang von Daten, Begründung von Transaktionen, Empfang der Bestätigung von Transaktionen).

Hinzugefügt Build 1395, real

2016.09.14 17:30:03.100 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': accepted sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:06.849 Trades  'xxxxx': sell limit 5.00 BR-12.16 at 47.56 placed for execution in 3750.466 ms
2016.09.14 17:30:06.851 Trades  'xxxxx': cancel order #44309414 sell limit 5.00 BR-12.16 at 47.56
2016.09.14 17:30:10.014 Trades  'xxxxx': deal #29388895 sell 1.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:10.014 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:10.385 Trades  'xxxxx': deal #29388914 sell 4.00 BR-12.16 at 47.56 done (based on order #44309414)
2016.09.14 17:30:12.374 Trades  'xxxxx': accepted exchange buy 1.00 BR-11.16 at market
2016.09.14 17:30:12.375 Trades  'xxxxx': exchange buy 1.00 BR-11.16 at market placed for execution in 2360.902 ms
2016.09.14 17:30:12.398 Trades  'xxxxx': deal #29389024 buy 1.00 BR-11.16 at 47.25 done (based on order #44309578)
2016.09.14 17:30:12.401 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.006 Trades  'xxxxx': accepted exchange buy 4.00 BR-11.16 at market
2016.09.14 17:30:13.007 Trades  'xxxxx': exchange buy 4.00 BR-11.16 at market placed for execution in 606.852 ms
2016.09.14 17:30:13.009 Trades  'xxxxx': deal #29389140 buy 4.00 BR-11.16 at 47.25 done (based on order #44309644)
2016.09.14 17:30:13.015 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.74
2016.09.14 17:30:13.357 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.74 placed for execution in 342.736 ms
2016.09.14 17:30:13.668 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.712 Trades  'xxxxx': accepted buy limit 5.00 BR-12.16 at 47.79
2016.09.14 17:30:13.716 Trades  'xxxxx': buy limit 5.00 BR-12.16 at 47.79 placed for execution in 48.228 ms
2016.09.14 17:30:13.718 Trades  'xxxxx': deal #29389165 buy 5.00 BR-12.16 at 47.79 done (based on order #44309680)
2016.09.14 17:30:13.721 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.740 Trades  'xxxxx': accepted exchange sell 5.00 BR-11.16 at market
2016.09.14 17:30:13.741 Trades  'xxxxx': exchange sell 5.00 BR-11.16 at market placed for execution in 20.867 ms
2016.09.14 17:30:13.778 Trades  'xxxxx': deal #29389166 sell 5.00 BR-11.16 at 47.29 done (based on order #44309682)
 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

FORTS. Fragen zur Ausführung

Renat Fatkhullin, 2016.08.23 16:35

Sie brauchen nur 5-10 ms zu warten und es erneut zu versuchen.

Die Sache ist, dass Sie die Transaktionsbestätigung sofort erhalten, aber die vollständigen Transaktionsdetails kommen danach asynchron an. Es kann von 0 bis N ms dauern, normalerweise innerhalb von 1-2 ms (hängt natürlich vom Ping ab).

Aufgrund dieses Umstandes fällt der Vergleich mit QLUA nicht zugunsten von MT5 aus.
 
prostotrader:

Bevor wir vergleichen, müssen wir den gesamten Komplex der Handelsoperationen "abschließen

(Empfang von Daten, Begründung von Transaktionen, Empfang der Bestätigung von Transaktionen).

Hinzugefügt Build 1395, real


Habe gerade einen ähnlichen Vorgang manuell durchgeführt: 11,7 ms

2016.09.14 18:17:26.298	Trades	'10321': order #44324961 buy limit 1.00 / 1.00 BR-12.16 at 47.00 done in 11.759 ms
2016.09.14 18:17:26.295	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00 placed for execution
2016.09.14 18:17:26.293	Trades	'10321': accepted buy limit 1.00 BR-12.16 at 47.00
2016.09.14 18:17:26.286	Trades	'10321': buy limit 1.00 BR-12.16 at 47.00
 
Renat Fatkhullin:

Sie wollen den echten Bericht nicht sehen, sondern verwenden Ihre eigene fehlerhafte Methode zur Messung der Transaktionszeit.

Und Sie wollen Ihre Fehler nicht eingestehen, sondern ziehen es vor, die ungeheuerlichen Zahlen Ihres fehlerhaften Skripts zu glauben.

Ich habe gerade einen ähnlichen Vorgang manuell durchgeführt: 11,7 ms.

Wovon reden Sie, Renate?

Dies ist ein Auszug aus dem Log von Temninal, nicht mein eigenes Log!

 
fxsaber:
Aufgrund dieses Umstandes ist es notwendig, den Vergleich mit QLUA nicht zu Gunsten von MT5 leicht anzupassen.

Es gibt keine Notwendigkeit, etwas zu ändern. Mein Satz war für den allgemeinen Fall "in Ihrem Internet und Ihr Ping kann alles sein und in der Realität abhängig von Ihrem Netzwerk werden Sie eine Transaktion in 0-N ms erhalten". Und es ist wahrscheinlicher, dass es 0 ms sind als mehr.

Hier ist der Verifizierungscode mit Kontrolle aller Transaktionen im asynchronen Modus:

ulong ExtTicks=0;
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Ausgabe des Pings an den Handelsserver in Millisekunden
   PrintFormat("AsyncTradesTest: last ping %.2f ms, build %d",TerminalInfoInteger(TERMINAL_PING_LAST)/1000.0,TerminalInfoInteger(TERMINAL_BUILD));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
   Print(EnumToString(trans.type)," ",trans.symbol,": ",trans.price," ",result.order," time: ",(GetMicrosecondCount()-ExtTicks)/1000.0," ms");
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
   static bool started=false;
//--- die Serie einmal beim ersten Tick ausführen
   if(!started)
     {
      started=true;
      //--- die Anfrage ausfüllen
      MqlTradeRequest req={};
      MqlTradeResult  res={};

      req.volume      =1;
      req.symbol      =_Symbol;
      req.price       =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
      req.sl          =0;
      req.tp          =0;
      req.deviation   =100;
      req.type_filling=ORDER_FILLING_RETURN;
      req.action      =TRADE_ACTION_DEAL;
      req.type        =ORDER_TYPE_BUY;
      req.magic       =2016;
      //--- Ausführen der Operationsschleife
      ExtTicks=GetMicrosecondCount();
      Print("Start...");
      OrderSendAsync(req,res);
     }
  }

Hier ist die Ausgabe auf einem echten Konto gerade eben:

2016.09.14 18:32:53.234 Test (BR-12.16,H1)      TRADE_TRANSACTION_HISTORY_ADD BR-12.16: 0.0 0 time: 11.455 ms
2016.09.14 18:32:53.232 Test (BR-12.16,H1)      TRADE_TRANSACTION_DEAL_ADD BR-12.16: 47.13 0 time: 8.778 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_DELETE BR-12.16: 0.0 0 time: 8.457000000000001 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 8.202999999999999 ms
2016.09.14 18:32:53.231 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 8.151 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_UPDATE BR-12.16: 0.0 0 time: 5.196 ms
2016.09.14 18:32:53.228 Test (BR-12.16,H1)      TRADE_TRANSACTION_REQUEST : 0.0 44326441 time: 5.171 ms
2016.09.14 18:32:53.227 Test (BR-12.16,H1)      TRADE_TRANSACTION_ORDER_ADD BR-12.16: 0.0 0 time: 4.184 ms
2016.09.14 18:32:53.223 Test (BR-12.16,H1)      Start...
2016.09.14 18:32:49.753 Test (BR-12.16,H1)      AsyncTradesTest: last ping 2.15 ms, build 1417

Sie sollten ihn von unten nach oben lesen.

Es zeigt alle Phasen der Transaktionen mit der kumulativen Gesamtzeit, die von Anfang an verbraucht wurde. Anhand der Transaktionsarten können Sie sehen, was dem Terminal hinzugefügt wurde und wann.

Die Gesamtzeit beträgt 11,45 ms.