Bibliotheken: MT4Orders - Seite 61

 
Andrey Khatimlianskii:

Was geschieht nach Ablauf dieser Sekunde? Wird der Vorgang fortgesetzt, wenn keine Synchronisierung stattfindet?

Ja, er wird fortgesetzt, indem eine Warnung ausgegeben wird. Aber ich kann mir kaum vorstellen, dass eine Sekunde nicht ausreicht. Die Synchronisierung dauert Millisekunden.

Wenn das passiert, ist es ratsam, das hier zu melden.

Muss das in die Kampfroboter hineingeschrieben werden?

Nein. Wenn Sie das obige Skript ohne diese Zeile ausführen, wird die Statistik höchstwahrscheinlich zeigen, dass es keine einzige Disynchronisation gab. Ich brauchte diese Zeile als zusätzlichen Faktor, der die Erkennung des Problems provoziert. Fast von Anfang an versucht die Bibliothek, jede Handelsanfrage in den Zustand der Synchronisation zu bringen. Ich habe diese Zeile absichtlich deaktiviert, um die Aufgabe zu erschweren und einen unabhängigen Mechanismus zur Erkennung der Disynchronisierung zu testen.

 
Andrey Khatimlianskii:

Oder reicht es aus, MT4ORDERS::ByPass.Is() vor den Handelsoperationen zu überprüfen (um sicherzustellen, dass keine Disynchronisierung vorliegt)?

Jedes Mal, wenn OrdersTotal, OrdersHistoryTotal und OrderSelect aufgerufen werden, steht ByPass.Is()==true an. Deshalb ist das Ergebnis dieser Funktionen unmittelbar nach ihrem Aufruf relevant. Sie können sich im Laufe der Zeit ändern, so dass es richtig ist, sie erneut aufzurufen, wenn eine Pause eingelegt wurde. Dies ist die Antwort auf die obige Frage. Diese Vorgehensweise ist nicht nur im MT5, sondern auch im MT4 korrekt.


Wenn Sie also gerade die Handelsumgebung gelesen haben, können Sie sofort eine Handelsoperation durchführen, da die Umgebung immer noch relevant ist. Deshalb war es möglich, diesen Mechanismus vor dem durchschnittlichen Benutzer der Bibliothek zu verbergen.

 
// Liste ändern:
// 13.05.2021
// Fix: Fehler in OrderOpenReason() behoben.
 
amrali:

Fehler gefunden:

Die Funktion OrderOpenReason() gibt (ENUM_DEAL_REASON)DEAL_REASON_TP für Aufträge zurück, die mit Gewinnmitnahme geschlossen wurden.

Vielen Dank an Sie! Behoben.

 

fxsaber:

Ja, das wird er, indem er einen Alarm auslöst. Aber ich kann mir kaum vorstellen, dass eine Sekunde nicht ausreicht. Die Rassynchronisation dauert Millisekunden.
Wenn das passiert, wäre es ratsam, es hier zu melden.

Wenn Sie sich immer noch nicht darauf verlassen, dass sich die Umgebung in einer Sekunde synchronisiert hat, wie kann man dann den EA korrekt unterbrechen (neue Aufträge verbieten), wenn es keine Synchronisierung gibt?

if ( MT4ORDERS::ByPass.Is() == false ) // Umgebung ist nicht synchronisiert, nicht handeln
        return;

OrderSend(...);

?

 
Andrey Khatimlianskii:

Wenn wir uns nicht darauf verlassen, dass sich die Umgebung in einer Sekunde synchronisiert, wie können wir dann den EA korrekt unterbrechen (neue Aufträge verbieten), wenn es keine Synchronisierung gibt?

Hier liegt es in Ihrem Ermessen. Sie können tun, was Sie geschrieben haben. Oder eine andere Wartezeit einrichten. Oder die Pause verlängern. Ich würde versuchen, mindestens eine solche lange Disynchronisation abzuwarten.

 
fxsaber:

Es liegt in Ihrem Ermessen. Sie können tun, was Sie geschrieben haben. Oder es zu einer anderen Wartezeit machen. Oder die Pause verlängern. Ich würde versuchen, mindestens eine solche lange Disynchronisation abzuwarten.

Ich danke Ihnen!

Ich werde versuchen, auf einen Alarm oder eine Rückstellung zu warten, und die anderen Prüfungen entfernen.

 
// Liste ändern:
// 14.05.2021
// Korrektur: Der BYPASS-Mechanismus wirkt sich nicht mehr auf OrderSelect(INT_MAX, SELECT_BY_POS) und OrderSelect(INT_MIN, SELECT_BY_POS) aus.

Wichtig für diejenigen, die Snapshots und andere sehr spezifische Handelstechniken verwenden.

 

Müde von Überraschungen mit Margen. Ich empfehle, solche Testskripte vor dem Einsatz von Expert Advisors auszuführen.

// Prüfen Sie, ob die Margin-Berechnung im MT5 korrekt ist.

#include <MT4Orders.mqh> // https://www.mql5.com/de/code/16006

bool EqualDouble( const double Value1, const double Value2, const double Epsilon = 0.01 )
{
  return(Value1 && Value2 && (MathMax(Value1, Value2) / MathMin(Value1, Value2) < 1 + Epsilon));
}

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

bool CheckMargin( const string Symb )
{
  const double RealMargin = AccountInfoDouble(ACCOUNT_MARGIN);
// const double CalcMargin = GetMarginRequired(Symb); // https://www.mql5.com/ru/forum/170952/page9#comment_4134898
  
  double CalcMargin = 0;
  OrderCalcMargin(ORDER_TYPE_BUY, Symb, 1, SymbolInfoDouble(Symb, SYMBOL_ASK), CalcMargin);
  
  const bool Res = EqualDouble(RealMargin, CalcMargin);
  
  const string Str = TOSTRING(Symb) + TOSTRING(RealMargin) + TOSTRING(CalcMargin) + "- " + (string)Res;
  
  if (Res)
    Print(Str);
  else
    Alert(Str);
      
  return(Res);
}

bool CheckCalcMargin( const string Symb )
{
  bool Res = !OrdersTotal();
  
  if (Res)
  {
    const TICKET_TYPE Ticket = OrderSend(Symb, OP_BUY, 1, SymbolInfoDouble(Symb, SYMBOL_ASK), 0, 0, 0);
    
    if (Res = (Ticket != -1))
    {
      Res = CheckMargin(Symb);
      
      if (OrderSelect(Ticket, SELECT_BY_TICKET))
        OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    }
  }
  else
  {
    Alert("ERROR: OrdersTotal() != 0");
    
    ExpertRemove();
  }
  
  return(Res);
}

void OnStart()
{
  if (AccountInfoInteger(ACCOUNT_TRADE_MODE) != ACCOUNT_TRADE_MODE_DEMO)
    Alert("Demo account is required!");
  else  
    for (int i = SymbolsTotal(true) - 1; !IsStopped() && (i >= 0); i--)
    {
      const string Symb = SymbolName(i, true);
      
      if (!SymbolInfoInteger(Symb, SYMBOL_CUSTOM))
        CheckCalcMargin(Symb);
    }
}

Wir sehen eine völlige Diskrepanz zwischen den berechneten MT5-Margin-Zahlen und den realen Zahlen. Unter solchen Umständen ist es vielleicht die einzige Möglichkeit, die entsprechenden Symbole zu vermeiden.


ZЫ Und es ist auch lästig, dass man elementare Dinge aufgreift und dort sofort Fehler findet, und im Forum kein Wort darüber verliert!

 
fxsaber:
Respekt an die einzige Person in diesem Forum, die nicht müde wird, Fehler zu melden. Die meisten Leute hören nach ein paar ignorierten Beiträgen auf.
Und kaum jemand hier benutzt diese Symbole, deshalb haben sie es nicht bemerkt.