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

 

Para conseguir el grial en modo pips, cierre las posiciones perdedoras con un marcador para todo el volumen de la posición, y las rentables con 0,01 lotes.

Ejemplo.

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

const bool Init = EventSetTimer(100);

void OnTimer()
{
  while (OrdersTotal())
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), (OrderProfit() > 0) ? 0.01 : OrderLots(), OrderClosePrice(), 0);
      
  OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
}


Resultado

 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: SingleTesterCache

fxsaber, 2020.01.12 23:20

La versión actual de tst-format no contiene los siguientes datos

  • Tiempo en milisegundos.
  • PositionID.
  • Número mágico.
Esto impone restricciones en los escenarios de uso.
 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: SingleTesterCache

fxsaber, 2020.01.13 00:01

Reproducir múltiples errores. Lanzamos el Asesor Experto en el Probador de Estrategias en una cuenta de cobertura.

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

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PAUSE 100000

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
    Sleep(PAUSE);
    
    OrderSend(_Symbol, OP_BUY, 2, Ask, 0, 0, 0);
    Sleep(PAUSE);

    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);
    
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);

    TesterWithdrawal(100);    
    
    FirstRun = false;
  }
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      Print(OrderTicketID()); // MT5-PositionID
    }
}


Obtenemos lo siguiente

2020.01.08 23:59:58   #1 2020.01.01 00:00:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.01 00:00:00 0.00000 0.00 0.00 100000.00 0
2020.01.08 23:59:58   0
2020.01.08 23:59:58   #4 2020.01.02 06:00:00 buy 1.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:03:20 1.12132 -3.56 0.00 -4.46 0
2020.01.08 23:59:58   2
2020.01.08 23:59:58   #5 2020.01.02 06:01:40 buy 2.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:06:40 1.12129 -7.14 0.00 -14.27 0
2020.01.08 23:59:58   3
2020.01.08 23:59:58   #6 2020.01.02 06:10:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.02 06:10:00 0.00000 0.00 0.00 -100.00 withdrawal 0
2020.01.08 23:59:58   0


A continuación, leemos el archivo tst correspondiente mediante el script.

#include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/ru/code/27611
#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

void OnStart()
{  
  uchar Bytes2[];
  
  if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Если получилось прочитать последнюю кеш-запись одиночного прогона
  {
    const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Загоняем ее в соответствующий объект.

    for (int i = 0; i < ArraySize(SingleTesterCache.Positions); i++)
      Print(SingleTesterCache.Positions[i].ToString());
  }
}


Imprimirá los datos en las posiciones

id = 0
mfe = 0.0
mae = -8.029999999999999
profit = -4.46
lifetime = 00:03:20

id = 0
mfe = 0.0
mae = -21.4
profit = -14.27
lifetime = 00:05:00

id = 0
mfe = 0.0
mae = 0.0
profit = 0.0
lifetime = 00:00:00


Si comparamos todo lo expuesto en este post, veremos los siguientes fallos.

  • Id. cero, en lugar de id. correcto.
  • Las comisiones y los swaps no se tienen en cuenta a la hora de calcular el beneficio.
  • La retirada del comercio se incluye erróneamente en el número de posiciones comerciales cerradas.

 

El depurador no es del todo funcional. Lo que falta en comparación con los depuradores estándar, en orden descendente de deficiencias.

1. Modificación de la memoria. Se pueden ver las variables, pero parece que no es posible editarlas.

2. Puntos de ruptura condicionales. Como parar si la variable test=10.

3. Posibilidad de trasladar la ejecución. En otras palabras, puede hacer clic en una línea y decirle que la ejecute a partir de ahí. En otras palabras, haz clic en una línea y di: "Ahora corre desde aquí".

4. un archivo adjunto a un script/consejero/indicador ya en funcionamiento. O, al menos, la posibilidad de adjuntarlo al estrellarse, para que sea fácil de analizar.

 
traveller00:

El depurador no es del todo funcional. Lo que falta en comparación con los depuradores estándar, en orden descendente de deficiencias.

2. Puntos de ruptura condicionales. Como parar si la variable test=10.

if (smth) {

    int a;

}
 
Sí, estoy de acuerdo, se puede conseguir casi cualquier cosa mediante el remontaje. Excepto el punto 4. 4. Pero todavía me gustaría verlo en el depurador, porque es un conjunto de funciones estándar para el depurador.
 

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategias

Bibliotecas: SingleTesterCache

fxsaber, 2020.01.14 10:49

Ahora uso tst-files en lugar de set-files. Puede cambiar entre ellos muy rápidamente, disponiendo no sólo de parámetros de entrada sino también de backtests completos.

Es una pena que ahora no podamos combinar diferentes TSs en una cartera completa debido a la falta de datos de milisegundos en tst.


Espero que los desarrolladores empiecen a utilizar al máximo los campos existentes

INT64             TradeDeal::time_create;             // время создания записи

INT64             TradeOrder::time_setup;             // время приёма ордера от клиента в систему
INT64             TradeOrder::time_done;              // время снятия завки

escribiendo allí el valor del tiempo en milisegundos en lugar de segundos.


En general, en la práctica no podemos demostrar toda la frescura del uso de tst debido a algunos ligeros inconvenientes en tst. Esto podría corregirse.

 


TesterWithdrawal está en el informe, pero falta TesterDeposit.

 
Cómo entender esta imagen. El gráfico de optimización muestra valores máximos en torno a 5000. Pero en la tabla de optimización el valor máximo es 4670. ¿Dónde están los parámetros para los mejores pases?
Archivos adjuntos:
8c97so2_7-1.jpg  184 kb
 
Grozir:
Cómo entender esta imagen. El gráfico de optimización muestra valores máximos en torno a 5000. Y en la tabla de optimización el valor máximo es 4670. ¿Dónde están los parámetros para los mejores pases?

Ordenar la columna "Resultado".