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

 

Heute gab es starke Bewegungen bei Brent

Und in diesem Moment sorgte MT5 für diese Verzögerungen.

 
Renat Fatkhullin:

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

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

Hier ist die Ausgabe auf einem echten Konto gerade eben:

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.

Vielen Dank für den klaren Code! Nach Ihren Ergebnissen gibt es wirklich nichts zu korrigieren. Ich habe einen Fehler gemacht.
 
prostotrader:

Heute gab es eine starke Bewegung auf Brent.

Und in diesem Moment kümmerte sich MT5 um diese Verzögerungen.

Halten Sie Hotkeys für die sofortige Bildschirmaufzeichnung bereit. Oder nehmen Sie rund um die Uhr alles auf. Sie können immer ein problematisches Stück herausschneiden und es als Beweis vorlegen. Für den Moment nur Worte.
 
prostotrader:

Was redest du da, Renate?

Das ist ein Auszug aus dem Logbuch des Temninals, nicht mein eigenes Logbuch!

Ja, das ist richtig. Tut mir leid, ich habe es mit einem Kumpel verwechselt, der die Zeiten falsch gezählt hat.

Hier ist, was damals passiert ist: Es ist eine Frage an die Börse - warum verhält sie sich bei minimalen Bewegungen immer so und hält es für normal, Aufträge in einer solchen Zeit auszuführen.

Sie wollten eine marktnahe Limit-Order zu 47,56 platzieren und es ist wahrscheinlich, dass die Börse die Annahme von Orders für ein marktnahes Preisintervall absichtlich verlangsamt hat, damit es keine Überraschungen gibt:


Von der Performance her kann es keine Fragen geben, denn das Volumen war lächerlich, 320 Lots pro Minute.

Ich habe oben meine Performance in einem ruhigen Markt gezeigt.

 
fxsaber:
Halten Sie Hotkeys für die sofortige Bildschirmaufzeichnung bereit. Oder nehmen Sie rund um die Uhr alles auf. Sie können jederzeit den problematischen Teil herausschneiden und als Beweis vorlegen. Vorerst aber nur Worte.
prostotrader:

Heute gab es eine starke Bewegung beim Brent.

Und in diesem Moment hat MT5 für diese Verzögerungen gesorgt.

Nur hat MT5 nichts mit diesen Verzögerungen zu tun.

Es war die Börse, die so lange reagierte.

 
Renat Fatkhullin:

Nur MT5 hat mit diesen Verzögerungen nichts zu tun.

Es war die Börse, die so lange brauchte, um zu reagieren.

Können Sie bitte die Zeilen in Ihrem Beispielprotokoll hervorheben, in denen die Bremsen der Börse sichtbar sind, wenn sie sich so verhält?

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
 

Das wird sich wahrscheinlich erst ab hier bemerkbar machen, aber auf jeden Fall bei den letzten beiden Transaktionen:

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
 
Renat Fatkhullin:

Es wird sich wahrscheinlich von hier aus bemerkbar machen, aber es wird auf jeden Fall bei den letzten beiden Transaktionen sichtbar sein:

Danke. Die Hilfe und der Artikel sind ziemlich spärlich, was die internen Prozesse hinter den einzelnen Arten von Handelsgeschäften angeht.

Aus Ihrer Erläuterung geht hervor, dass es sich bei den ersten vier Zeilen (8ms) noch nicht um einen Austausch handelt. Wo kann man nachlesen, was eigentlich passiert? Denn es gibt kein Verständnis und es ist nicht klar, wo man es bekommen kann.

 
fxsaber:

Danke. Die Hilfe und der Artikel sind ziemlich spärlich, was die internen Prozesse hinter den einzelnen Arten von Handelsgeschäften angeht.

Bei Ihrer Erläuterung stellt sich heraus, dass die ersten vier Zeilen (8ms) noch kein Austausch sind. Wo kann man nachlesen, was eigentlich passiert? Denn es gibt kein Verständnis und es ist nicht klar, wo man es hervorheben soll.

Nein, das habe ich nicht gesagt.

Ich habe den Code hastig skizziert und nicht alle Felder beschrieben. Überprüfen Sie selbst im Debugger jede Eingabe in die Funktion meines Skripts und drucken Sie bitte weitere Felder aus.

 
fxsaber:

Danke. Die Hilfe und der Artikel sind eher dürftig über die internen Prozesse hinter jeder Art von Handelstransaktion geschrieben.

Ein Beispiel für einen möglichen Zuhörer von Handelsereignissen wird im Artikel Wo soll man anfangen, wenn man einen Handelsroboter für die Moskauer Börse MOEX erstellt?

//+------------------------------------------------------------------+
//|TradeTransactionListener.mq5 |
//| Copyright 2016, MetaQuotes Software Corp. | |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Experteninitialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PrintFormat("LAST PING=%.f ms",
               TerminalInfoInteger(TERMINAL_PING_LAST)/1000.);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Experten-Tick-Funktion|
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
//| TradeTransaction-Funktion|
//+------------------------------------------------------------------+
void OnTradeTransaction(const MqlTradeTransaction &trans,
                        const MqlTradeRequest &request,
                        const MqlTradeResult &result)
  {
//---
   static int counter=0;   // Zähler der OnTradeTransaction()-Aufrufe
   static uint lasttime=0; // Zeitpunkt des letzten Aufrufs OnTradeTransaction()
//---
   uint time=GetTickCount();
//--- wenn die letzte Transaktion länger als 1 Sekunde zurückliegt
   if(time-lasttime>1000)
     {
      counter=0; // dies bedeutet, dass es sich um einen neuen Handelsvorgang handelt und Sie den Zähler zurücksetzen können
      if(IS_DEBUG_MODE)
         Print("Neuer Handelsbetrieb");
     }
   lasttime=time;
   counter++;
   Print(counter,". ",__FUNCTION__);
//--- Ergebnis der Ausführung der Handelsanfrage
   ulong            lastOrderID   =trans.order;
   ENUM_ORDER_TYPE  lastOrderType =trans.order_type;
   ENUM_ORDER_STATE lastOrderState=trans.order_state;
//--- der Name des Zeichens, bei dem die Transaktion stattgefunden hat
   string trans_symbol=trans.symbol;
//--- Transaktionsart
   ENUM_TRADE_TRANSACTION_TYPE  trans_type=trans.type;
   switch(trans.type)
     {
      case  TRADE_TRANSACTION_POSITION:   // Position ändern
        {
         ulong pos_ID=trans.position;
         PrintFormat("MqlTradeTransaction: Position  #%d %s modified: SL=%.5f TP=%.5f",
                     pos_ID,trans_symbol,trans.price_sl,trans.price_tp);
        }
      break;
      case TRADE_TRANSACTION_REQUEST:     // Senden einer Handelsanfrage
         PrintFormat("MqlTradeTransaction: TRADE_TRANSACTION_REQUEST");
         break;
      case TRADE_TRANSACTION_DEAL_ADD:    // Hinzufügen einer Transaktion
        {
         ulong          lastDealID   =trans.deal;
         ENUM_DEAL_TYPE lastDealType =trans.deal_type;
         double        lastDealVolume=trans.volume;
         //--- Transaktionsidentifikator im externen System - von der Moskauer Börse zugewiesenes Ticket
         string Exchange_ticket="";
         if(HistoryDealSelect(lastDealID))
            Exchange_ticket=HistoryDealGetString(lastDealID,DEAL_EXTERNAL_ID);
         if(Exchange_ticket!="")
            Exchange_ticket=StringFormat("(MOEX deal=%s)",Exchange_ticket);

         PrintFormat("MqlTradeTransaction: %s deal #%d %s %s %.2f lot   %s",EnumToString(trans_type),
                     lastDealID,EnumToString(lastDealType),trans_symbol,lastDealVolume,Exchange_ticket);
        }
      break;
      case TRADE_TRANSACTION_HISTORY_ADD: // Hinzufügen eines Auftrags zur Historie
        {
         //--- Auftragskennung im externen System - von der Moskauer Börse zugewiesenes Ticket
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_FILLED)
           {
            if(HistoryOrderSelect(lastOrderID))
               Exchange_ticket=HistoryOrderGetString(lastOrderID,ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("(MOEX ticket=%s)",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),trans_symbol,EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
      default: // andere Transaktionen 
        {
         //--- Auftragskennung im externen System - von der Moskauer Börse zugewiesenes Ticket
         string Exchange_ticket="";
         if(lastOrderState==ORDER_STATE_PLACED)
           {
            if(OrderSelect(lastOrderID))
               Exchange_ticket=OrderGetString(ORDER_EXTERNAL_ID);
            if(Exchange_ticket!="")
               Exchange_ticket=StringFormat("MOEX ticket=%s",Exchange_ticket);
           }
         PrintFormat("MqlTradeTransaction: %s order #%d %s %s   %s",EnumToString(trans_type),
                     lastOrderID,EnumToString(lastOrderType),EnumToString(lastOrderState),Exchange_ticket);
        }
      break;
     }
//--- Ticket bestellen 
   ulong orderID_result=result.order;
   string retcode_result=GetRetcodeID(result.retcode);
   if(orderID_result!=0)
      PrintFormat("MqlTradeResult: order #%d retcode=%s ",orderID_result,retcode_result);
//--- 
  }
//+------------------------------------------------------------------+
//| übersetzt numerische Antwortcodes in String mnemocodes |
//+------------------------------------------------------------------+
string GetRetcodeID(int retcode)
  {
   switch(retcode)
     {
      case 10004: return("TRADE_RETCODE_REQUOTE");             break;
      case 10006: return("TRADE_RETCODE_REJECT");              break;
      case 10007: return("TRADE_RETCODE_CANCEL");              break;
      case 10008: return("TRADE_RETCODE_PLACED");              break;
      case 10009: return("TRADE_RETCODE_DONE");                break;
      case 10010: return("TRADE_RETCODE_DONE_PARTIAL");        break;
      case 10011: return("TRADE_RETCODE_ERROR");               break;
      case 10012: return("TRADE_RETCODE_TIMEOUT");             break;
      case 10013: return("TRADE_RETCODE_INVALID");             break;
      case 10014: return("TRADE_RETCODE_INVALID_VOLUME");      break;
      case 10015: return("TRADE_RETCODE_INVALID_PRICE");       break;
      case 10016: return("TRADE_RETCODE_INVALID_STOPS");       break;
      case 10017: return("TRADE_RETCODE_TRADE_DISABLED");      break;
      case 10018: return("TRADE_RETCODE_MARKET_CLOSED");       break;
      case 10019: return("TRADE_RETCODE_NO_MONEY");            break;
      case 10020: return("TRADE_RETCODE_PRICE_CHANGED");       break;
      case 10021: return("TRADE_RETCODE_PRICE_OFF");           break;
      case 10022: return("TRADE_RETCODE_INVALID_EXPIRATION");  break;
      case 10023: return("TRADE_RETCODE_ORDER_CHANGED");       break;
      case 10024: return("TRADE_RETCODE_TOO_MANY_REQUESTS");   break;
      case 10025: return("TRADE_RETCODE_NO_CHANGES");          break;
      case 10026: return("TRADE_RETCODE_SERVER_DISABLES_AT");  break;
      case 10027: return("TRADE_RETCODE_CLIENT_DISABLES_AT");  break;
      case 10028: return("TRADE_RETCODE_LOCKED");              break;
      case 10029: return("TRADE_RETCODE_FROZEN");              break;
      case 10030: return("TRADE_RETCODE_INVALID_FILL");        break;
      case 10031: return("TRADE_RETCODE_CONNECTION");          break;
      case 10032: return("TRADE_RETCODE_ONLY_REAL");           break;
      case 10033: return("TRADE_RETCODE_LIMIT_ORDERS");        break;
      case 10034: return("TRADE_RETCODE_LIMIT_VOLUME");        break;
      case 10035: return("TRADE_RETCODE_INVALID_ORDER");       break;
      case 10036: return("TRADE_RETCODE_POSITION_CLOSED");     break;
      default:
         return("TRADE_RETCODE_UNKNOWN="+IntegerToString(retcode));
         break;
     }
//---
  }
//+------------------------------------------------------------------+