MetaTrader 5 Strategy Tester: bug, errori, suggerimenti per il miglioramento - pagina 42

 
fxsaber:

Sono disponibili istruzioni per la riproduzione su qualsiasi personaggio. Qualsiasi domanda - basta eseguirla.

No, preferisco te, dimenticherò il motivo per cui ho iniziato))

Si può testare su un futures stock ad esempio Si? Vuoi un conto corrente per il test?

 
Sergey Chalyshev:

No, preferisco te, quando avrò capito i tuoi codici mi dimenticherò perché ho iniziato))

Puoi testare su un exchange futures, per esempio Si? Vuoi un conto di scambio per il test?

Lo scambio ha un problema di bassa liquidità e code di ordini. Quindi il tester della Borsa di Mosca non è corretto. Non esiste praticamente un fenomeno simile con i piccoli lotti sul Forex. Anche se a volte succede.

 
Sergey Chalyshev:

Devo darti un conto di azioni da testare?

Sì. Ma devo precisare subito che qualsiasi esecuzione all'ultimo prezzo nel Tester è un errore.

 
Controllare il codice per la correttezza del Tester.
#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();
}


Se funziona correttamente, ci dovrebbe essere

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:

Vai a prenderlo. Ma devo dire subito che qualsiasi esecuzione all'ultimo prezzo nel Tester è un errore.

Vi ho scritto di persona.

Naturalmente, l'esecuzione per pinna è senza senso (nonsense).

 
Sergey Chalyshev:

Puoi testare su un futures stock, ad esempio Si?


Meglio. Su zecche reali, ma il TP viene eseguito su pinne.

 
fxsaber:

Non va bene.

No, c'è qualcosa che non va nel tuo tester. Come si fa il test su tutte le zecche o su quelle vere?

Provalo su Si.

Alle 9:45 il mercato è ancora chiuso, tutto può essere lì a quell'ora, bisogna aprire dopo le 10:01.
 
Sergey Chalyshev:

Se un simbolo di scambio e un conto di compensazione, solo allora il limite al prezzo corrente sarà accettato.

Purtroppo, tutti i marchi (compreso TP) sono eseguiti su pinne. Pertanto, è meglio non usare i mercati nel Tester.

 
E l'accesso a tutte le barre caricate dal tester? Rispondimi per favore. O spiegare perché questa restrizione artificiale è necessaria.
 
Alexey Kravchenko:
E l'accesso a tutte le barre caricate dal tester? Rispondimi per favore. O spiegare perché questa limitazione artificiale è necessaria.

Per accelerare il test del 99% degli EA.

Per il restante 1%, si può inserire una stampella.