Probador de Estrategias de MetaTrader 5: errores, fallos, sugerencias de mejora - página 42

 
fxsaber:

Hay instrucciones para la reproducción de cualquier personaje. Si tiene alguna pregunta, hágala.

No, prefiero que lo hagas tú, me olvidaré de por qué lo empecé))

¿Se puede probar en una acción de futuros, por ejemplo, Si? ¿Quieres una cuenta de valores para la prueba?

 
Sergey Chalyshev:

No, te prefiero a ti, para cuando descubra tus códigos me olvidaré de por qué lo empecé))

¿Se puede probar en un futuro de la bolsa, por ejemplo, Si? ¿Quieres una cuenta de intercambio para la prueba?

La bolsa tiene un problema de baja liquidez y colas de pedidos. Por lo tanto, el probador de la Bolsa de Moscú no es correcto. Prácticamente no existe este fenómeno con los lotes pequeños en Forex. Aunque a veces ocurre.

 
Sergey Chalyshev:

¿Te doy una cuenta de valores para que hagas una prueba?

Sí. Pero debo señalar de inmediato que cualquier ejecución a último precio en el Probador es un error.

 
Comprobar que el código del Comprobador es correcto.
#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();
}


Si funciona correctamente, debería haber

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:

Ve a por ello. Pero debo señalar de entrada que cualquier ejecución a último precio en el Probador es un error.

Te he escrito en persona.

Naturalmente, la ejecución por flipper carece de sentido (tonterías).

 
Sergey Chalyshev:

¿Se puede probar en un futuro stock, por ejemplo, Si?


Mejor. En las garrapatas reales, pero el TP se ejecuta en las aletas.

 
fxsaber:

No es bueno.

No, hay algo que no funciona en tu probador. ¿Cómo se hace la prueba en todas las garrapatas o en las garrapatas reales?

Pruébalo en Si.

A las 9:45 el mercado todavía está cerrado, nada puede estar allí a esa hora, hay que abrir después de las 10:01.
 
Sergey Chalyshev:

Si un símbolo de intercambio y una cuenta de compensación, sólo entonces se aceptará el límite al precio actual.

Desgraciadamente, todas las marcas (incluida TP) se ejecutan en aletas. Por lo tanto, es mejor no utilizar los mercados en el Probador.

 
¿Y el acceso a todas las barras cargadas desde el probador? Contéstame, por favor. O explicar por qué es necesaria esta restricción artificial.
 
Alexey Kravchenko:
¿Y el acceso a todas las barras cargadas desde el probador? Contéstame, por favor. O explique por qué es necesaria esta limitación artificial.

Para acelerar las pruebas del 99% de los EAs.

Para el 1% restante, se puede insertar una muleta.

Razón de la queja: