Fehler, Irrtümer, Fragen - Seite 2220

 
1861 - Es ist unmöglich, eine Demo auf Alpari zu öffnen. Die Auswahl eines Maklers funktioniert nicht.
 
fxsaber:

Meiner Meinung nach handelt es sich um einen Fehler, wenn ein Auftrag auf dem Handelsserver liegt, aber nach dem synchronen OrderSend auf dem Terminal nicht mehr zu sehen ist.

Ich habe beschlossen zu prüfen, wie lange solche Phantomaufträge dauern, wenn der Auftrag im System, aber nicht im Terminal vorhanden ist.

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


Das Ergebnis ist

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


Ein Auftrag ist im System vorhanden, aber 32 Millisekunden lang nicht im Terminal! Stellen Sie sich die Folgen vor, wenn die Handelslogik in diesem Intervall ausgeführt würde ...


Interessant ist, dass Phantomaufträge meist nur bei den TransaktionsartenTRADE_TRANSACTION_ORDER_DELETE und TRADE_TRANSACTION_DEAL_ADD (viel seltener) vorkommen.


Sehr schlechte Nuancierung der Plattform.


ZZY Die Geschwindigkeit der Handelsgeschäfte auf 5 ist leider fragwürdig.

Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?
Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?
  • 2016.09.13
  • MetaQuotes Software Corp.
  • www.mql5.com
Многие трейдеры зачастую не задумываются над тем, как быстро доходит их заявка до биржи, как долго она там исполняется и когда торговый терминал трейдера узнает о результате. В результате они не знают, что легко могут улучшить качество исполнения своих сделок за счет более быстрой реакции и скорости проведения транзакций. 12 сентября 2016 года...
 
fxsaber:

Ich beschloss zu prüfen, wie lange solche Phantomaufträge dauern, wenn ein Auftrag im System, aber nicht im Terminal ist.


Das Ergebnis ist


Seit 32 Millisekunden gibt es einen Auftrag, aber er ist nicht im Terminal! Stellen Sie sich die Folgen vor, wenn die Handelslogik während dieses Zeitraums ausgeführt würde.

Ja, das ist nicht gut. Wie Sie sehen können, werden diese Transaktionsergebnisse in verschiedenen Paketen gesendet. Sie sollten in einem Paket sein.

 
Alexey Navoykov:

Wie Sie sehen können, werden diese Transaktionsergebnisse in verschiedenen Paketen gesendet, obwohl sie in einem Paket sein sollten.

Es stellt sich heraus, dass die Order direkt nach OrderSend ein Phantom sein kann und der parallele Expert Advisor mit OnTradeTransaction diesen Zustand nicht immer abfangen kann. D.h. OnTradeTransaction selbst verlangsamt sich manchmal.


Generell gibt es im MT5 architektonisch an verschiedenen Stellen Verzögerungen, die kaum zu beseitigen sind. Es handelt sich um Verzögerungen bei der Ankunft von Zecken und jetzt bei den Handelsgeschäften. Sie müssen sich darüber im Klaren sein, was die Plattform leisten kann, wenn Sie sich auf die Ausführungsgeschwindigkeit verlassen. Zum Beispiel Ticks, die mit einer ordentlichen Verzögerung eingehen, dann Transaktionen... und schließlich kann jemand anderes auf MT5 oder einer anderen Plattform überholen, selbst wenn man selbst direkt neben der Börse sitzt.

 
Handelstransaktionen werden vorrangig behandelt und haben Vorrang vor allen anderen. Dadurch wird die Latenzzeit erheblich reduziert.
 
Renat Fatkhullin:
Die Handelsgeschäfte werden in Prioritätspaketen abgewickelt und überholen die anderen. Dadurch wird die Latenzzeit erheblich reduziert.

Wie kommt es, dass das Skript eine Phantom-Order-Situation nach OrderSend erkennt, aber OnTradeTransaction auf einem parallelen EA nicht (nicht immer, aber es passiert)?

 
Renat Fatkhullin:
Die Handelstransaktionen kommen in vorrangigen Paketen und überholen die anderen. Dadurch wird die Latenzzeit erheblich reduziert.

Das Problem ist, dass die TransaktionenTRADE_TRANSACTION_ORDER_DELETE undTRADE_TRANSACTION_HISTORY_ADD in unterschiedlichen Paketen kommen und es deshalb egal ist, welche Priorität sie haben, die Netzwerklatenz ist es sowieso.Und diese Transaktionen müssen synchron ausgeführt werden, eine nach der anderen, ohne irgendeinen Zwischenzustand, d.h. es handelt sich im Wesentlichen um eine atomare Operation, denn das Eintragen eines gelöschten Auftrags in die Historienliste hat nichts mit einem Austausch zu tun.

D.h. es gibt hier zwei Möglichkeiten: entweder kommen diese beiden Transaktionen in einem Paket zusammen, oder die erste Transaktion wird im Terminal nicht ausgeführt, bis die zweite eintrifft.

 
Alexey Navoykov:

D.h. es gibt zwei Möglichkeiten: Entweder kommen diese beiden Transaktionen in einem Paket, oder die erste Transaktion wird im Terminal nicht ausgeführt, bis die zweite eintrifft.

Es gibt Situationen, in denen TRADE_TRANSACTION_DEAL_ADD der Transaktion TRADE_TRANSACTION_ORDER_DELETE vorausgeht. In diesem Fall ist der Auftrag auch vor TRADE_TRANSACTION_ORDER_DELETE noch ein Phantom.

 

Entfernte Agenten haben aufgehört zu optimieren

2018.06.22 14:05:24.901 SVA_03  pass 19 tested with error "task rejected by tester agent" in 0:00:00.000
2018.06.22 14:05:27.387 SVA_03  pass 19 tested with error "task rejected by tester agent" in 0:00:00.000

Ich nehme an, dass es an dem neuen Compiler liegt. Wie können sie aktualisiert werden, damit es funktioniert?

Außerdem besteht nur ein Teil des Optimierers aufgrund dieses Fehlers 13 von 28 Punkten.
 

Ein Blick in den Code des Alglib-Pakets. Er ist voll von solchen Konstruktionen, die das Lesen des Codes erschweren:

         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=xy[i][i_];
         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=tmp[i_]-ct[xyc[i]][i_];
         //--- calculation
         v=0.0;
         for(i_=0;i_<=nvars-1;i_++)
            v+=tmp[i_]*tmp[i_];

Ist es so nicht einfacher?

v=0.0;
for(i_=0;i_<=nvars-1;i_++){
   tmp=xy[i][i_]-ct[xyc[i]][i_];
   v+=tmp*tmp;
}

Ich habe den Eindruck, dass die Ausführungsgeschwindigkeit sogar noch höher sein würde.

Warum haben sie den Code so kompliziert gemacht? Oder einfach aus einer anderen Sprache portiert, ohne irgendwelche Anpassungen? Aber ich frage mich trotzdem, warum eine solche Komplikation im Original?