MetaTrader 5 Strategy Tester: Bugs, Bugs, Verbesserungsvorschläge - Seite 42

 
fxsaber:

Es sind Anweisungen für die Wiedergabe auf jedem Zeichen verfügbar. Wenn Sie Fragen haben, lassen Sie es einfach laufen.

Nein, lieber du, bis ich deine Codes herausgefunden habe, werde ich vergessen haben, warum ich damit angefangen habe ))

Können Sie auf einem Lager Futures zB Si testen? Möchten Sie ein Aktienkonto für den Test?

 
Sergey Chalyshev:

Nein, ich bevorzuge dich, bis ich deine Codes herausgefunden habe, werde ich vergessen haben, warum ich damit angefangen habe))

Können Sie es an einer Terminbörse testen, zum Beispiel Si? Möchten Sie ein Austauschkonto für den Test?

Die Börse hat ein Problem mit geringer Liquidität und Auftragswarteschlangen. Daher ist der Tester an der Moskauer Börse nicht korrekt. Ein solches Phänomen gibt es bei kleinen Lots auf dem Forex praktisch nicht. Das kommt allerdings manchmal vor.

 
Sergey Chalyshev:

Soll ich Ihnen probeweise ein Aktienkonto geben?

Ja. Aber ich sollte gleich darauf hinweisen, dass jede Ausführung zum letzten Preis im Tester ein Fehler ist.

 
Prüfen Sie den Code des Testers auf seine Korrektheit.
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void CloseAll()
{
  for (int i = OrdersTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (OrderType() <= OP_SELL)
        OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
      else
        OrderDelete(OrderTicket());
    }    
}

bool Check1()
{
  bool Res = true;
  
  Res &= OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Bid, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, Bid) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_SELL, 1, Bid, 0, Ask, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, Ask) && !OrdersTotal();
  CloseAll();
  
  return(Res);
}

bool Check2()
{
  bool Res = true;
  
  Res &= OrderModify(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), Ask, Bid, 0, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0), Ask, 0, Bid, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0), Bid, Ask, 0, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_SELL, 1, Bid, 0, 0, 0), Bid, 0, Ask  , 0) && !OrdersTotal();
  CloseAll();
  
  return(Res);
}

bool Check3()
{
  bool Res = true;
  
  Res &= OrderSelect(OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask, 0, 0, 0), SELECT_BY_TICKET) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderSelect(OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid, 0, 0, 0), SELECT_BY_TICKET) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderSelect(OrderSend(_Symbol, OP_BUYSTOP, 1, Ask, 0, 0, 0), SELECT_BY_TICKET) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderSelect(OrderSend(_Symbol, OP_SELLSTOP, 1, Bid, 0, 0, 0), SELECT_BY_TICKET) && (OrderType() <= OP_SELL);
  CloseAll();
  
  return(Res);
}

bool Check4()
{
  bool Res = true;
  
  const double TickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
  
  Res &= OrderModify(OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - TickSize, 0, 0, 0), Ask, 0, 0, 0) && (OrdersTotal() == 1) && (OrderSelect(0, SELECT_BY_POS)) && (OrderType() <= OP_SELL);
  CloseAll();  

  Res &= OrderModify(OrderSend(_Symbol, OP_BUYSTOP, 1, Ask + TickSize, 0, 0, 0), Ask, 0, 0, 0) && (OrdersTotal() == 1) && (OrderSelect(0, SELECT_BY_POS)) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid + TickSize, 0, 0, 0), Bid, 0, 0, 0) && (OrdersTotal() == 1) && (OrderSelect(0, SELECT_BY_POS)) && (OrderType() <= OP_SELL);
  CloseAll();

  Res &= OrderModify(OrderSend(_Symbol, OP_SELLSTOP, 1, Bid - TickSize, 0, 0, 0), Bid, 0, 0, 0) && (OrdersTotal() == 1) && (OrderSelect(0, SELECT_BY_POS)) && (OrderType() <= OP_SELL);
  CloseAll();

  return(Res);
}

bool Check5()
{
  bool Res = true;

  const double TickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
  
  Res &= OrderModify(OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask - TickSize, 0, 0, 0), Ask, Bid, 0, 0) && !OrdersTotal();
  CloseAll();  

  Res &= OrderModify(OrderSend(_Symbol, OP_BUYSTOP, 1, Ask + TickSize, 0, 0, 0), Ask, Bid, 0, 0) && !OrdersTotal();
  CloseAll();  

  Res &= OrderModify(OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid + TickSize, 0, 0, 0), Bid, Ask, 0, 0) && !OrdersTotal();
  CloseAll();  

  Res &= OrderModify(OrderSend(_Symbol, OP_SELLSTOP, 1, Bid - TickSize, 0, 0, 0), Bid, Ask, 0, 0) && !OrdersTotal();
  CloseAll();  

  return(Res);
}

bool Check6()
{
  bool Res = true;
  
  Res &= OrderSend(_Symbol, OP_BUYLIMIT, 1, Ask, 0, Bid, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_BUYSTOP, 1, Ask, 0, Bid, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_SELLLIMIT, 1, Bid, 0, Ask, 0) && !OrdersTotal();
  CloseAll();

  Res &= OrderSend(_Symbol, OP_SELLSTOP, 1, Bid, 0, Ask, 0) && !OrdersTotal();
  CloseAll();
  
  return(Res);
}


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

void OnTick()
{
  Print(TOSTRING(Check1()) + TOSTRING(Check2()) + TOSTRING(Check3()) +
        TOSTRING(Check4()) + TOSTRING(Check5()) + TOSTRING(Check6()));

  ExpertRemove();
}


Wenn es richtig funktioniert, sollte es

2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check1() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check2() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check3() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check4() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check5() = true
2019.12.19 00:27:59.263 2019.12.13 00:00:00   Check6() = true
 
fxsaber:

Los geht's. Ich möchte aber gleich darauf hinweisen, dass jede Ausführung zum letzten Preis im Tester ein Fehler ist.

Ich habe Ihnen persönlich geschrieben.

Natürlich ist die Ausführung durch Flipper sinnlos (Unsinn).

 
Sergey Chalyshev:

Können Sie einen Test auf einem Lager Futures z. B. Si ?


Besser. Auf echten Zecken, aber TP wird auf Flossen ausgeführt.

 
fxsaber:

Nicht gut.

Nein, da stimmt etwas mit Ihrem Tester nicht. Wie testen Sie auf alle Zecken oder auf echte Zecken?

Probieren Sie es bei Si.

Um 9:45 Uhr ist der Markt noch geschlossen, um diese Zeit kann alles da sein, man muss nach 10:01 Uhr öffnen.
 
Sergey Chalyshev:

Wenn ein Börsensymbol und ein Netting-Konto, nur dann wird das Limit zum aktuellen Preis akzeptiert.

Leider werden alle Marken (einschließlich TP) auf Flippern ausgeführt. Daher ist es besser, die Märkte im Tester nicht zu verwenden.

 
Wie sieht es mit dem Zugriff auf alle geladenen Balken vom Prüfgerät aus? Bitte antworten Sie mir. Oder erklären Sie, warum diese künstliche Einschränkung notwendig ist.
 
Alexey Kravchenko:
Wie sieht es mit dem Zugriff auf alle geladenen Balken vom Prüfgerät aus? Bitte antworten Sie mir. Oder erklären Sie, warum diese künstliche Einschränkung notwendig ist.

Um das Testen von 99% der EAs zu beschleunigen.

Für die restlichen 1 % kann eine Krücke eingesetzt werden.