Análisis de los resultados de las pruebas y optimización en el probador de estrategias de MetaTrader 5 - página 2

 
Anatoli Kazharski:

Se comprueba el parámetro largo (lparam). Contiene el identificador del evento de tick.

El identificador del evento de usuario (int id) es igual a cero.

Se puede escribir así para que quede más claro:

Entiendo que hay que reescribir todo para que funcione correctamente. Te lo mostraré ahora.

 
fxsaber:

Me he dado cuenta de que hay que reescribir todo para que funcione correctamente. Estoy a punto de hacerlo.

Y no puedo, porque esta mierda está sucediendo.

2018.01.28 12:37:23.692 Tester  EURUSD: preliminary downloading of history ticks started, it may take quite a long time
2018.01.28 12:37:24.692 Tester  EURUSD: preliminary downloading of history ticks completed, 89 bytes in 0:00.998 (0.09 Kb/sec)
2018.01.28 12:37:24.692 Tester  EURUSD: ticks data begins from 2017.09.01 00:00
2018.01.28 12:37:24.692 Core 1  agent process started
2018.01.28 12:37:33.425 Core 1  connecting to 127.0.0.1:3000
2018.01.28 12:37:50.450 Core 1  tester agent authorization error
2018.01.28 12:37:50.456 Core 1  connection closed
y no puedo hacer que el probador se ejecute.
 

Indicador

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Asesor experto

#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    Sum2 += GetBid(Symbols[(int)lparam]);
}

EURUSD M1 MetaQuotes-Demo, Hedge, USD, sin lag, sólo Core1-agent, ticks reales 01.09.2017 - 28.01.2018.


Un símbolo

i = 0 Pass = 0 OnTester = 7.053 s.: Count = 9986677, 1415947.4 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 6.930 s.: Count = 9986677, 1441078.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Dos símbolos

i = 0 Pass = 0 OnTester = 25.747 s.: Count = 9986677, 387877.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 26.118 s.: Count = 9986677, 382367.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Tres símbolos

i = 0 Pass = 0 OnTester = 47.448 s.: Count = 9986677, 210476.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 46.994 s.: Count = 9986677, 212509.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


  1. En el modo de símbolo único, el "espía" es 2,5 veces más lento que el OnTick puro. ¡Es decir, el indicador vacío (construido sobre PERIOD_W1 para que el historial de barras sea mínimo) tiene una enorme sobrecarga en el Probador!
  2. Dos símbolos son 3,5 veces más lentos que uno.
  3. Pero tres símbolos son sólo 1,8 veces más lentos que dos. Es decir, el paso de dos a tres se debe a la escalabilidad. frente al punto 2.
 

Anatoly, te sugiero que muevas el tema a Expertos en Forex, Robots de Comercio y Asesores Expertos y lo fijes en la parte superior allí.

Así estará siempre a la vista. Ya hay muchos temas publicados aquí

 
Rashid Umarov:

Anatoly, te sugiero que muevas el tema a Expertos en Forex, Robots de Comercio y Asesores Expertos y lo fijes en la parte superior allí.

Así estará siempre a la vista. Ya hay muchos temas publicados aquí

No me importa si el tema puede ser útil.
 
fxsaber:

...

  1. En el modo de símbolo único, Spy es 2,5 veces más lento que el OnTick puro. ¡Es decir, el indicador vacío (construido sobre PERIOD_W1, por lo que el historial de barras es mínimo) tiene una enorme sobrecarga en el Probador!
  2. Dos símbolos son 3,5 veces más lentos que uno.
  3. Pero tres símbolos son sólo 1,8 veces más lentos que dos. Es decir, el paso de dos a tres se debe a la escalabilidad. a diferencia del punto 2.

Su resultado es 6, 25, 46. ¿Por qué no 6, 12 y 18?

Tienes que mirar la desaceleración relativa a un solo carácter. Entonces tres personajes son casi 8 veces más lentos que uno, no 3 como se esperaba.

La cuestión es exactamente ésta. ¿Por qué hay tanto resultado con la escalabilidad? Y si el resultado no puede mejorarse, se sugirió la opción de un nuevo modo de prueba. Esto solucionaría el problema de las pruebas largas cuando se utilizan varios caracteres.

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

Análisis de Pruebas y Optimización en MetaTrader 5 Strategy Tester

Anatoli Kazharski, 2018.01.27 20:15

Pregunta:

¿Es posible crear un esquema de Asesor Experto multisímbolo de este tipo en MQL, para que la duración de las pruebas no aumente repetidamente al añadir símbolos a la prueba?

//---

Si esto no es posible, una de las opciones para los desarrolladores del terminal es añadir un modo más, en el que se pueda ejecutar la prueba símbolo a símbolo, en lugar de todos los símbolos a la vez. Esto produciría el tiempo de prueba esperado al final. La cuestión es que los EA multisímbolos se utilizan muy a menudo simplemente para aquellos casos en los que:

  1. Se necesitan más datos para las pruebas.
  2. Probar el algoritmo de negociación en una mayor variedad de comportamientos de precios, condiciones (spread, niveles de stop/límite), etc., con los mismos parámetros.

Para estos casos necesitamos un nuevo modo que nos permita reducir considerablemente la duración de las pruebas y optimizar los parámetros. Y ya para la prueba final para probar todos los símbolos simultáneamente.


 
Anatoli Kazharski:

Tienes un resultado de 6, 25, 46. ¿Por qué no 6, 12 y 18?

La desaceleración tiene que verse en relación con un símbolo.

Dos personajes con picos es un modo de prueba muy diferente al de un solo personaje. Por lo tanto, es lógico observar la escalabilidad en relación con dos.

Además, el indicador de la cabeza es tan salvaje que trabajar a través de los espías es una muleta. A la espera de los Servicios, donde la escalabilidad debería ser casi perfecta, en relación con un solo símbolo. Como en el caso del temporizador. Sólo que allí no habrá saltos de garrapata.

 
Aceleración significativa
#include <TesterBenchmark.mqh> // https://www.mql5.com/ru/code/18804

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

double Sum2 = 0;

double GetBid( const string &Symb )
{
  static MqlTick Tick;

  return(SymbolInfoTick(Symb, Tick)? Tick.bid : 0);
}

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnDeinit( const int )
{
  Print(Sum2);
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnTick( const string &Symb )
{
  Sum2 += GetBid(Symb);
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}


Un símbolo

i = 0 Pass = 0 OnTester = 2.697 s.: Count = 9986677, 3702883.6 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 2.657 s.: Count = 9986677, 3758628.9 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Dos dígitos

i = 0 Pass = 0 OnTester = 17.632 s.: Count = 9986677, 566395.0 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 17.539 s.: Count = 9986677, 569398.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Tres símbolos

i = 0 Pass = 0 OnTester = 35.639 s.: Count = 9986677, 280217.7 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 35.462 s.: Count = 9986677, 281616.3 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755


Cuatro símbolos

i = 0 Pass = 0 OnTester = 68.459 s.: Count = 9986677, 145878.2 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
i = 1 Pass = 1 OnTester = 69.429 s.: Count = 9986677, 143840.1 unit/sec, Agent = C:\Program Files\Alpari Limited MT5\Tester\Agent-127.0.0.1-3000 build = 1755
 
fxsaber:

Dos personajes con espías es un modo de operación muy diferente para un probador que un solo personaje. Por lo tanto, es lógico mirar la escalabilidad en relación con dos.

Además, la sobrecarga de indicadores es tan salvaje que trabajar a través de espías es una muleta. A la espera de los Servicios, donde la escalabilidad debería ser casi perfecta, en relación con un solo símbolo. Como en el caso del temporizador. Sólo que allí no habrá saltos de garrapata.

fxsaber:
Aceleración significativa

Un símbolo

Dos símbolos

Tres personajes

Cuatro personajes

Si miramos los resultados relativos a dos símbolos, entonces dividimos el resultado de dos símbolos por dos: 17 / 2 = 8,5

Luego, al añadir símbolos, multiplicamos este valor por el número de símbolos para obtener el tiempo de prueba previsto.

  • tres caracteres: 8,5 * 3 = 25, y el tiempo real es de35,462 s.
  • cuatro caracteres: 8,5 * 4 = 34, mientras que el tiempo real es de68,459 s.

Pero este es, en cualquier caso, el mejor resultado hasta ahora. Una variante interesante es utilizar el símbolo actual en OnTick, mientras que el resto en eventos personalizados.

Puede utilizarlo mientras no haya servicios.

Este es un foro para el comercio, los sistemas de comercio automatizados y las pruebas de estrategia.

Secuencia de ejecución de Init() y DeInit()

Slava, 2017.04.14 10:18

Los servicios, entre otras cosas, tendrán funciones comerciales y la capacidad de gestionar objetos. Y gráficos.

El proveedor de datos de mercado es sólo una posibilidad.

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

Secuencia de ejecución de Init() y DeInit()

Slava, 2017.04.14 10:21

Los servicios tendrán OnTick(símbolo de cadena). Pero los ticks de un símbolo en particular tendrán que ser suscritos a

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

Secuencia de ejecución de Init() y DeInit()

fxsaber, 2017.04.14 10:46

Resulta que los Servicios tendrán casi todas las funciones de On: OnInit, OnDeinit, OnTick(string),OnTimer,OnTrade,OnTradeTransaction, OnTester, OnTesterInit, OnTesterPass, OnTesterDeinit, OnBookEvent, OnChartEvent(long ChartID, ...), OnCalculate, ...

Si no necesita los buffers de los indicadores y no quiere lidiar con las muletas de los indicadores/asesores, escriba en un nuevo tipo de programa -Servicios- que no tenga ninguna limitación (estiramiento de las versiones anteriores de MT).

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

Secuencia de ejecución de Init() y DeInit()

Slava, 2017.04.14 10:56

Exactamente.

No habrá OnCalculate.

Todavía no hay solución con OnChartEvent.

 
Razón de la queja: