Resultados de la prueba de expertos multidivisa

 

Después de leer los artículos sobre la construcción de EAs multidivisa, de hacer preguntas y de obtener respuestas de los "guardianes" de la comunidad, me queda la pregunta: "¿Cómo construir el código del EA de manera que los resultados de las pruebas sean correctos?" El objetivo del tema es precisamente averiguar esta cuestión.

Lo he probado utilizando tres métodos diferentes sugeridos por los miembros de la comunidad.

-OnTick().

-OnChartEvent(). Este método es sugerido por Konstantin Gruzdev en su artículo"Implementación del modo multidivisa en MetaTrader 5".

-OnTimer().

Tomé prestado el esquema delAsesor Experto multidivisa de Nikolay Kositsin, que describió en detalle en su artículo"Creación de un Asesor Experto que opera con diferentes símbolos".

Para la prueba escribí un simple EA porque la esencia está en comparar los resultados de la prueba. La "referencia" será el resultado del gráfico diario del EURUSD desde el año 2000. A continuación, este resultado con los mismos parámetros se comparará con el resultado obtenido en el gráfico del GBPUSD. En principio, sólo hay un instrumento implicado en las pruebas, pero los resultados deberían ser idénticos independientemente del instrumento que se pruebe.

OnTick()

int OnInit()
{
 return(0);
}

void OnDeinit()
{
}

void OnTick()
{  
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

Una prueba en el EURUSD desde el gráfico del EURUSD:

Etiqueta: 01_tick

Una prueba en el EURUSD desde el gráfico del GBPUSD:

Etiqueta:02_tick

Los resultados de la prueba no son consistentes.

OnChartEvent()

enum ENUM_CHART_EVENT_SYMBOL
  {
   CHARTEVENT_NO        =0,          // События отключены
   CHARTEVENT_INIT      =0,          // Событие "инициализация" 
   
   CHARTEVENT_NEWBAR_M1 =0x00000001, // Событие "новый бар" на 1 -минутном графике
   CHARTEVENT_NEWBAR_M2 =0x00000002, // Событие "новый бар" на 2 -минутном графике
   CHARTEVENT_NEWBAR_M3 =0x00000004, // Событие "новый бар" на 3 -минутном графике
   CHARTEVENT_NEWBAR_M4 =0x00000008, // Событие "новый бар" на 4 -минутном графике
   
   CHARTEVENT_NEWBAR_M5 =0x00000010, // Событие "новый бар" на 5 -минутном графике
   CHARTEVENT_NEWBAR_M6 =0x00000020, // Событие "новый бар" на 6 -минутном графике
   CHARTEVENT_NEWBAR_M10=0x00000040, // Событие "новый бар" на 10-минутном графике
   CHARTEVENT_NEWBAR_M12=0x00000080, // Событие "новый бар" на 12-минутном графике
   
   CHARTEVENT_NEWBAR_M15=0x00000100, // Событие "новый бар" на 15-минутном графике
   CHARTEVENT_NEWBAR_M20=0x00000200, // Событие "новый бар" на 20-минутном графике
   CHARTEVENT_NEWBAR_M30=0x00000400, // Событие "новый бар" на 30-минутном графике
   CHARTEVENT_NEWBAR_H1 =0x00000800, // Событие "новый бар" на 1 -часовом графике
   
   CHARTEVENT_NEWBAR_H2 =0x00001000, // Событие "новый бар" на 2 -часовом графике
   CHARTEVENT_NEWBAR_H3 =0x00002000, // Событие "новый бар" на 3 -часовом графике
   CHARTEVENT_NEWBAR_H4 =0x00004000, // Событие "новый бар" на 4 -часовом графике
   CHARTEVENT_NEWBAR_H6 =0x00008000, // Событие "новый бар" на 6 -часовом графике
   
   CHARTEVENT_NEWBAR_H8 =0x00010000, // Событие "новый бар" на 8 -часовом графике
   CHARTEVENT_NEWBAR_H12=0x00020000, // Событие "новый бар" на 12-часовом графике
   CHARTEVENT_NEWBAR_D1 =0x00040000, // Событие "новый бар" на дневном графике
   CHARTEVENT_NEWBAR_W1 =0x00080000, // Событие "новый бар" на недельном графике
     
   CHARTEVENT_NEWBAR_MN1=0x00100000, // Событие "новый бар" на месячном графике   
   CHARTEVENT_TICK      =0x00200000, // Событие "новый тик"
   
   CHARTEVENT_ALL       =0xFFFFFFFF, // Все события включены
  };

...

int OnInit()
{
 if(iCustom("EURUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),0,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на EURUSD"); return(true);}
   
 if(iCustom("GBPUSD",PERIOD_D1,"Spy Control panel MCM",ChartID(),1,CHARTEVENT_TICK) == INVALID_HANDLE)
   { Print("Ошибка установки шпиона на GBPUSD"); return(true);}
}

void OnDeinit()
{
}

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 if(id >= CHARTEVENT_CUSTOM)      
   {
    // Объявление массивов переменных для торговых сигналов
    static datetime New_Bar[1];  
    static bool UpSignal[1], DnSignal[1];
      
    // Получение торговых сигналов
    TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);
   
    // Совершение торговых операций
    TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
   }
}

Prueba en el EURUSD desde el gráfico del EURUSD:

Etiqueta:01_event == 01_tick

El resultado es idéntico al resultado marcado como 01_tick.

Prueba en el EURUSD desde el gráfico del GBPUSD:

Etiqueta:02_event ~= 02_tick

Los resultados de las pruebas no son consistentes.

OnTimer()

int OnInit()
{
 EventSetTimer(10);

 return(0);
}

void OnDeinit()
{
 EventKillTimer();
}

void OnTimer()
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
   
 // Получение торговых сигналов
 TradeSignalCounter(0,Symbol_01,Trade_01,Timeframe_01,UpSignal,DnSignal,New_Bar);

 // Совершение торговых операций
 TradePerformer(0,Symbol_01,Trade_01,Timeframe_01,Stop_Loss_01,Take_Profit_01,Slippage_01,UpSignal,DnSignal,New_Bar);
}

El temporizador está ajustado a 10 segundos.

Prueba en el instrumento EURUSD del gráfico EURUSD:

Etiqueta: 01_time == 01_tick && 01_time == 01_ event

Una prueba en el EURUSD desde el gráfico del GBPUSD:

Etiqueta: 02_time == 01_tick && 02_time == 01_ event

Los resultados de las pruebas son idénticos. Sólo en un lugar vi una pequeña inexactitud. También me he dado cuenta de que cuanto más pequeño es el intervalo en el temporizador, más preciso es el resultado. Es decir, aunque la prueba se realice en barras diarias y el intervalo en el probador se establezca, por ejemplo, en 1 hora, la prueba se ejecutará mucho más rápido que 10 segundos, pero los resultados de la prueba no coincidirán.

------

Eso es todo. Interesado en la opinión de todos y aún más en los métodos de solución)))


 

En mi opinión, no es correcto comparar estas opciones por separado.

Personalmente, me adhiero a la opinión de que el temporizador en el dibujo animado debe ser, y lo que se añadirá a él (ticks o eventos) es un tema aparte.

En mi opinión, todos los manejadores disponibles deben ser utilizados, la cuestión es sólo en su llenado y la aplicación del algoritmo general.

 
tol64:

"¿Cómo se arma el código del examinador para que los resultados de las pruebas sean correctos?".

En un principio no entendí el enunciado de la pregunta. ¿Qué quiere decir con resultados "correctos" de las pruebas, y por qué deben conseguirse?
 
Interesting:

En mi opinión, no es correcto comparar estas opciones por separado.

Personalmente, soy de la opinión de que el contador de tiempo en el dibujo animado debe estar presente, y lo que se le agregue (ticks o eventos) es una cuestión aparte.

La idea es que se utilicen todos los manejadores disponibles en la mula, sólo es cuestión de su relleno e implementación del algoritmo general.


¿Por qué es incorrecto comparar estas opciones? Dentro de los límites de un simple Asesor Experto, cuando la decisión se toma después de que la barra se forma en el símbolo necesario y el TF necesario, creo que es correcto.

Incorrecto como se menciona a continuación, sería si añadimos un algoritmo más complejo para analizar la situación actual utilizando los mismos ticks. Pero sólo me interesan las barras formadas.

 
Yedelkin:
Al principio no entendí la pregunta. ¿Qué quiere decir con resultados "correctos" de las pruebas, y por qué deben conseguirse?

Es decir, las que se corresponden con la realidad. Sea cual sea el carácter desde el que hagamos la prueba, los resultados deberían ser idénticos. En este caso, el resultado idéntico se ha conseguido sólo con la función OnTimer().

Me interesa mucho el método de Konstantin Gruzdev. Tal vez estoy haciendo algo mal, por eso no obtuve los resultados correctos (fiables). También espero sus comentarios sobre este tema.

 
tol64:

¿Por qué es incorrecto comparar estas opciones? En el marco de este sencillo Asesor Experto, cuando la decisión se toma después de que la barra se forme en el símbolo correcto y el TF correcto, creo que es correcta.

Incorrecto como se menciona a continuación, sería si añadimos un algoritmo más complejo para analizar la situación actual utilizando los mismos ticks. Pero sólo me interesan las barras formadas.

No lo discuto, es correcto en teoría, pero en la práctica hay muchas dudas.

Por ejemplo, aquí está el siguiente - se implementa en el manejador de ticks y se pierde la conexión con el servidor. ¿Cómo funcionará el sistema y cómo detectará si algo va mal?

Realización sólo en temporizador - Opción más o menos aceptable, pero necesita un compromiso razonable en la elección del periodo (pero incluso así habrá algunas dificultades).

Eventos - Los eventos en sí tampoco son muy eficientes. En general, el procesamiento de los ticks y los eventos debe implementarse de manera que se utilicen los recursos de la forma más eficaz y que el Asesor Experto pueda pasar a procesar una nueva porción de datos con bastante rapidez.

Yedelkin:
No entendí la pregunta desde el principio. ¿Qué significa que los resultados de las pruebas sean "correctos" y por qué deben obtenerse?

También creo que no hay que conseguir resultados 100% idénticos. Además, es extraño limitar las posibilidades de multiplicación a la negociación de UN símbolo.

Digamos que se negociarán al menos dos símbolos (uno de los cuales podría ser un símbolo gráfico).

 
tol64:

Es decir, las que se corresponden con la realidad. Sea cual sea el símbolo desde el que hagamos la prueba, los resultados deberían ser idénticos.

Créeme, encontrar el 100% de la no-identidad es un auto-engaño y una ilusión. Igual de ilusionante que un GRAAL que funcione eternamente. Siempre hay que tener en cuenta un cierto margen de error/no identidad.

Y tal como están las cosas, probar un dibujo animado no es muy revelador. La discusión sobre las multitudes debe ser sólo en términos de comercio en múltiples símbolos o el comercio con múltiples estrategias en un símbolo.

Me refiero a que los resultados PROSTÁTICAMENTE idénticos no son importantes en un multisímbolo, sino los mecanismos que permiten a los expertos tomar decisiones comerciales teniendo en cuenta las posiciones y el historial.

Por ejemplo, intente negociar con dos símbolos EURUSD y GBPUSD, mientras que las operaciones deben realizarse con cobertura y señales en el segundo símbolo.

 
Interesting:

Créanme, la búsqueda del 100% de no identidad es un autoengaño y una ilusión. Igual de ilusionante que el siempre activo GRAAL. Siempre hay que tener en cuenta un cierto margen de error/no identidad.

Y tal como están las cosas, probar un dibujo animado no es muy revelador. La discusión sobre las multitudes debe ser sólo en términos de comercio en múltiples símbolos o el comercio con múltiples estrategias en un símbolo.

Me refiero a que los resultados PROSTÁTICAMENTE idénticos no son importantes en un multisímbolo, lo importante son los mecanismos que permiten al experto tomar decisiones comerciales teniendo en cuenta las posiciones y el historial.

Por ejemplo, intente negociar con dos símbolos EURUSD y GBPUSD, mientras que las operaciones deben realizarse con cobertura y señales en el segundo símbolo.

Ahora estás viendo el panorama general, cómo debería funcionar el EA. Vamos a omitir todas las dificultades y detalles técnicos de la aplicación del programa para el comercio real. El asunto es muy crítico en este artículo.

1. Un sistema de comercio sencillo. Se basa en las barras formadas.

2. Una prueba sobre un símbolo, pero de otro símbolo.

He simplificado intencionadamente la estructura al mínimo. Se hace para facilitar el análisis de los resultados de las pruebas. Puedes probar todos los símbolos pero los resultados no mejorarán. Obtendrá un lío que será más difícil y largo de analizar. El Asesor Experto mostrará la acción exacta en el símbolo en el que se encuentra, pero se hará un lío en todos los demás, que es exactamente lo que muestran estos resultados. Los resultados de las pruebas deben ser idénticos, de lo contrario resulta que el Asesor Experto hace entradas correctas en un símbolo, mientras que en los otros no lo hace, o no sigue exactamente el sistema. Esta discrepancia es bastante notable.

Hasta ahora, la identidad sólo puede lograrse a través de la función OnTimer().

P.D. No creo en los GRAILES. O mejor dicho, lo entiendo de manera diferente a muchos otros).

 

Aquí está el resultado a la vez en cinco caracteres a través de la función OnTimer():

Sea cual sea el símbolo desde el que se realice la prueba, el resultado es siempre el mismo.

Pero al utilizar otros métodos(OnTick() y OnChartEvent()), los resultados serían diferentes al cambiar el símbolo donde se encuentra el Asesor Experto. Y sólo confirma que el Asesor Experto realiza acciones incorrectas en otros símbolos.

Está claro por qué ocurre con OnTick(). Ya se ha discutido muchas veces. Pero el método OnChartEvent() sigue siendo cuestionable.

 

tol64:

Con OnTick(), está claro por qué ocurre esto. Esto ya se ha discutido muchas veces. Pero el método OnChartEvent() sigue siendo cuestionable.

Tenemos que considerar un posible retraso en la gestión del evento, o incluso la posible PÉRDIDA del mismo.
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
tol64:

Es decir, las que se corresponden con la realidad. Sea cual sea el carácter desde el que hagamos la prueba, los resultados deberían ser idénticos. En este caso, el resultado idéntico se consiguió sólo cuando se utilizó OnTimer().

Lo veo a grandes rasgos. De hecho, está eligiendo un "motor" sobre el que va a construir su Asesor Experto multidivisa. Para ello, se toma una estrategia de negociación primitiva y se ejecuta primero según el esquema "la fuente de señales y el manejador de señales en un símbolo", y luego según el esquema "la fuente de señales y el manejador de señales en diferentes símbolos". ¿Es esto correcto?

Si es así, no entiendo muy bien frases como "Prueba en la herramienta EURUSD desde el gráfico GBPUSD". ¿Qué símbolo, en este caso, es la fuente de la señal y a cuál está unido el manejador de la señal?

Razón de la queja: