Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 185

 
Es ist noch ein weiterer Fehler im Spiel. Wir erteilen einen Limit-Auftrag zum aktuellen Kurs und beobachten seine allmähliche Erfüllung. Wir überprüfen bei jedem Schritt die Gesamtmenge aller Positionen und Aufträge. Sie sollte sich nicht ändern und derjenigen entsprechen, die an OrderSend gesendet wurde.
// Демонстрация потери данных во время торговли.

template <typename T>
T MyPrint( const T Value, const string Str )
{
  Print(Str + " = " + (string)Value);

  return(Value);
}

#define _P(A) MyPrint(A, ": " + #A)

sinput double inLots = 100;

int OnInit()
{
  MqlTradeResult Result = {0};
  MqlTradeRequest Request = {0};
  
  Request.action = TRADE_ACTION_PENDING;
  Request.symbol = _Symbol;
  Request.volume = inLots;
  Request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
  Request.type = ORDER_TYPE_BUY_LIMIT;
  
  return(OrdersTotal() || PositionsTotal() || !OrderSend(Request, Result)); // Работаем, когда ничего не открыто.
}

// Возвращает сумму лотов всех позиций и ордеров.
double GetSumLots()
{
  double Lots = 0;
  
  for (int i = _P(OrdersTotal()) - 1; i >= 0; i--)
    if (_P(OrderGetTicket(_P(i))))
      Lots += _P(OrderGetDouble(ORDER_VOLUME_CURRENT));
    
  for (int i = _P(PositionsTotal()) - 1; i >= 0; i--)
    if (_P(PositionGetTicket(_P(i))))
      Lots += _P(PositionGetDouble(POSITION_VOLUME));

  return(Lots);
}

void OnTradeTransaction(const MqlTradeTransaction& trans,
                        const MqlTradeRequest& request,
                        const MqlTradeResult& result)
{
  Print("---------");
    
  // Проверяем, что сумма лотов всех позиций и ордеров совпадает с заданной.
  if (NormalizeDouble(_P(GetSumLots()) - inLots, _Digits))
    Alert("BUG!");
}


Ergebnis.

2020.08.21 01:18:13.375 : OrdersTotal() = 1
2020.08.21 01:18:13.375 : i = 0
2020.08.21 01:18:13.375 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.375 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 68.59999999999999
2020.08.21 01:18:13.375 : PositionsTotal() = 1
2020.08.21 01:18:13.375 : i = 0
2020.08.21 01:18:13.375 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.375 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.375 : GetSumLots() = 100.0
2020.08.21 01:18:13.377 ---------
2020.08.21 01:18:13.377 : OrdersTotal() = 1
2020.08.21 01:18:13.377 : i = 0
2020.08.21 01:18:13.377 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.377 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 68.59999999999999
2020.08.21 01:18:13.377 : PositionsTotal() = 1
2020.08.21 01:18:13.377 : i = 0
2020.08.21 01:18:13.377 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.377 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.377 : GetSumLots() = 100.0
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.389 : GetSumLots() = 72.8
2020.08.21 01:18:13.389 Alert: BUG!
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.389 : GetSumLots() = 72.8
2020.08.21 01:18:13.389 Alert: BUG!
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : PositionGetDouble(POSITION_VOLUME) = 31.4
2020.08.21 01:18:13.389 : GetSumLots() = 72.8
2020.08.21 01:18:13.389 Alert: BUG!
2020.08.21 01:18:13.389 ---------
2020.08.21 01:18:13.389 : OrdersTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : OrderGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.389 : OrderGetDouble(ORDER_VOLUME_CURRENT) = 41.4
2020.08.21 01:18:13.389 : PositionsTotal() = 1
2020.08.21 01:18:13.389 : i = 0
2020.08.21 01:18:13.389 : PositionGetTicket(MyPrint(i,: +i)) = 1197440
2020.08.21 01:18:13.390 : PositionGetDouble(POSITION_VOLUME) = 58.6
2020.08.21 01:18:13.390 : GetSumLots() = 100.0

Es wurden 100 Lots platziert, aber irgendwann wurden aus den Lots 72,8. Offensichtlich kann der Handelsalgorithmus in einer solchen Situation durcheinander geraten.

Suchbegriff: Oshibka 011.
 

fxsaber:
Он должен быть неизменным - равным тому, что был отправлен в OrderSend.

Nein, es besteht zwar die Möglichkeit einer Störung der Zeitmessung, was auch geschieht, aber es gibt keine einfache Lösung.

 
Andrei Trukhanovich:

Nein, es besteht die Gefahr, dass das Timing nicht übereinstimmt, und genau das passiert, es gibt keine einfache Lösung.

Ich habe nicht einmal eine einfache Lösung. Wie man sicherstellt, dass es in einem laufenden Skript eine Desynchronisation gibt, ist überhaupt nicht klar.

 
fxsaber:

Ich habe nicht einmal eine komplizierte Lösung. Wie man in einem laufenden Skript sicherstellt, dass es eine Asynchronität gibt, ist überhaupt nicht klar.

Wenn sich das Gesamtlos geändert hat, zählen Sie weiter, bis die Lose für Aufträge und Positionen zweimal gleich sind.

Die Wahrscheinlichkeit, dass die Synchronisierung nicht stimmt, ist gering oder liegt sogar nur bei wenigen Prozent, so dass die Leistung nicht beeinträchtigt wird.

__________

Ich habe mir Ihre Ausdrucke angeschaut, vielleicht ist es ein Fehler, wenn es ein Fall von async ist, sollte der falsche Betrag nicht auf die gleiche Weise in mehreren Berechnungen wiederholt werden

 
Andrei Trukhanovich:

Wenn sich das Gesamtlos geändert hat, zählen Sie weiter, bis die Lose für Aufträge und Positionen zweimal gleich sind.

Die Wahrscheinlichkeit eines Ausrichtungsfehlers liegt bei einem Bruchteil oder wenigen Prozent, so dass die Leistung kaum beeinträchtigt wird.

Im obigen Protokoll zeigen drei aufeinanderfolgende Berechnungen das falsche Ergebnis. Wir brauchen Schlaf, aber das kann zu Verzögerungen führen, wenn wir keine Zeit haben, auf den erteilten Handelsauftrag zu reagieren.

Dies ist keine angenehme Situation.

 
fxsaber:

Im obigen Protokoll zeigen drei aufeinanderfolgende Berechnungen das falsche Ergebnis.

Ja, das habe ich gesehen, ich habe es oben hinzugefügt.

 
Kommentare, die sich nicht auf dieses Thema beziehen, wurden nach "Fragen von Neulingen zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes" verschoben.
 
Alexey Viktorov:

Sie sollten nicht beleidigt sein. Die höchste Wahrscheinlichkeit ist ein Fehler im Code. An zweiter Stelle steht der exorbitante Spread. Aber wer außer Ihnen kann die erste Option verwerfen und die zweite in Betracht ziehen, ohne den Code zu sehen. Ich hoffe, die Moderatoren werden das Thema in das falsche Thema verschieben.

Vielen Dank für die angemessene Antwort. Ich bin nicht beleidigt, ich bin verärgert). Ich schrieb, um zu versuchen, eine schnelle Lösung zu finden, die vielleicht jemand, der bereits begegnet ist, sein. Der Code ist absoluter Standard, Totalprofit-Schleife, die summiert und mit einem bestimmten Wert vergleicht, außerdem funktioniert der Code seit ein paar Monaten auf zwei verschiedenen Konten, ohne zu versagen. Ich wünsche Ihnen einen schönen Tag.

 
Evgeny Vlasov:

Ich danke Ihnen für die angemessene Antwort. Ich bin nicht beleidigt, ich bin traurig)). Ich habe geschrieben, um zu versuchen, eine schnelle Lösung zu finden, die vielleicht jemand hat, der bereits auf dieses Problem gestoßen ist. Der Code ist absoluter Standard, Totalprofit-Schleife, die summiert und mit einem bestimmten Wert vergleicht, außerdem funktioniert der Code seit ein paar Monaten auf zwei verschiedenen Konten, ohne zu versagen. Ich wünsche Ihnen einen schönen Tag.

Hier geht es nicht um die Merkmale.
 
Artyom Trishkin:
Hier geht es nicht um die Merkmale.

Ich stimme zu.

Grund der Beschwerde: