Resultados de la prueba de expertos multidivisa - página 5

 
tol64:
¿De qué realidad estás hablando? ¿Pruebas en tiempo real? Si es así, entonces estoy de acuerdo, por supuesto. Si cuelgas dos EAs en tus símbolos, todo será correcto. Pero estoy probando el modo multidivisa. Y un resultado idéntico se muestra sólo usando OnTimer() (10 segundos).

Estoy hablando de una ejecución real en modo multidivisa (operando en N símbolos en EAs (en cada EA) configurados para cada uno de los símbolos) - eso da una estimación real, y en el caso del probador estás comparando principalmente los modos de prueba, no la corrección de cada uno de los métodos de procesamiento de ticks multidivisa. ¿Qué sentido tiene comparar diferentes modos si todos se basan en el entorno artificial del probador? La identidad de los resultados de las ejecuciones no es una razón para afirmar que da los resultados más correctos en términos de comercio, es el óptimo en términos de funcionamiento interno del probador.

 
Yedelkin:

Empecemos por la redacción correcta. En el ejemplo original habría querido "operar en eurodólares". De hecho, los eventos personalizados provenían de dos símbolos y en el manejador de eventos se llamaba a TradeSignalCounter()+TradePerformer() cuando se recibían eventos de cualquiera de estos dos símbolos. Podemos suponer que la cola de eventos estaba siempre llena.

Ahora has eliminado una de las fuentes de señal pero has introducido la comprobación"if(sparam == Symbol_01)" en el manejador de eventos por alguna razón. Pero la siguiente pregunta es diferente. A juzgar por el código, el esquema de Lizar se utiliza en el modo "Todos los ticks" y las funciones TradeSignalCounter()+TradePerformer() se llaman en cada tick desde la fuente de la señal (EURUSD). Interesante ya ha insinuado el posible desbordamiento de la cola de eventos. Me pregunto qué instrumento se utiliza como parámetro Symbol_01 de estas dos funciones y si has intentado cambiar la periodicidad de los eventos en el esquema de Lizar.

Sí, eso es lo que quería hacer. Al fin y al cabo, cada acción que realizamos está provocada por nuestro deseo. En este caso, conseguí exactamente lo que quería. Es decir, sólo operamos con el EURUSD, porque la función TradePerformer() comprueba si está permitido operar con cada símbolo de la matriz de símbolos. Esta opción se encuentra en variables externas y en ese momento el comercio con el símboloGBPUSD estaba prohibido. Los eventos de usuario provenían de dos símbolos, pero en el manejador de eventos, de nuevo, la función TradePerformer() sólo permitía operar con el símbolo EURUSD. La funciónTradePerformer() también contiene una función que determina si se ha producido una nueva barra en un símbolo concreto, en este caso EURUSD. Tu suposición de que la cola de eventos siempre ha estado llena es correcta, pero en este caso todo se ha procesado por separado y un retraso de un tick no es significativo cuando se prueba en barras diarias.

La eliminación de una fuente de señal, la que no debía intervenir en las pruebas, sólo confirmó que todo se había hecho correctamente antes. La comprobación"if(sparam == Symbol_01)" se mantuvo desde que comprobé los resultados sin borrar la fuente de señal que no debía ser comprobada, pero de la que sí debía serlo. Esta comprobación resultó ser en realidad incluso superflua. Los resultados no cambiaron. El símbolo EURUSD se utiliza como parámetro Symbol_01. Intenté cambiar la frecuencia de los eventos pero no cambió nada. Más exactamente, puedo decir que el modo de todos los ticks es el más preciso.

 
marketeer:

Estoy hablando de una ejecución real en modo multidivisa (operando en N símbolos en EAs (en cada EA) configurados para cada uno de los símbolos) - eso da una estimación real, y en el caso del probador estás comparando principalmente los modos de prueba, no la corrección de cada uno de los métodos de procesamiento de ticks multidivisa. ¿Qué sentido tiene comparar diferentes modos si todos se basan en el entorno artificial del probador? Los resultados idénticos de las ejecuciones no permiten afirmar que da los resultados más correctos desde el punto de vista comercial, es el óptimo desde el punto de vista de los mecanismos internos del probador.

Ahora lo entiendo. Pero la discusión se centró originalmente en las pruebas en el probador. Antes de empezar a operar, hay que probar el sistema. Cuanto más precisa sea la prueba, más seguro se sentirá en el comercio real. Los resultados de las pruebas presentados aquí demuestran que las pruebas pueden hacerse bien y mal. Ahora todo el mundo puede elegir y decidir por sí mismo lo que está bien o mal. Un comerciante ha dicho con razón (si no me equivoco, se trata de Van Tharp): "Operamos con nuestras percepciones". Puedo añadir algo más. No sólo intercambiamos nuestras ideas. Incluso vivimos según nuestras percepciones. ))

Si adjuntamos un Asesor Experto por separado a cada símbolo en el comercio real o en las pruebas, será el más preciso. Por supuesto, estoy de acuerdo con eso. Pero no es necesario en la sincronización de barras para eso. La precisión irá acompañada de la duración. Puede estimar períodos históricos largos en el probador. Y personalmente prefiero ver los resultados correctos de las pruebas.

También quiero hacer hincapié en un punto más: nunca excluyo la posibilidad de que pueda estar equivocado en alguna parte y siempre lo compruebo todo. Pero incluso después de las pruebas más duras, cuando a primera vista todo parece correcto, sigo sin descartar la posibilidad de que haya un error en alguna parte. En este punto, si alguien no está de acuerdo con la evaluación de los resultados de esos métodos de prueba que se presentan, tiene que proporcionar sus propios resultados de prueba en comparación. Al fin y al cabo, el objetivo de este hilo es averiguar cómo hacer lo correcto o, para ser más precisos, cómo probar correctamente los Asesores Expertos multidivisa, no quién tiene razón o no sólo de palabra. Los hechos, sólo los hechos y nada más que los hechos. )))

¿Qué sentido tiene comparar diferentes modos si todos se basan en un entorno de pruebas artificial?

La cuestión es tomar una decisión correcta basada en los resultados. Y, desde luego, no veo ningún sentido en analizar datos distorsionados. Al fin y al cabo, se recoge lo que se siembra).

 
tol64:

La eliminación de una fuente de señal, la que no debía intervenir en la prueba, sólo confirmó que todo se había hecho bien antes.

"...se hizo bien antes" es de la categoría de la complacencia. Fue un error en primer lugar. No parece dar importancia a un fenómeno como la "saturación de las colas de los eventos". Sobre todo cuando se trata de la transmisión de eventos a posteriori. Echa un vistazo a los materiales de referencia y al foro sobre el tema. La palabra clave es "cola".

tol64:

... Operé sólo en EURUSD porque la función TradePerformer() comprueba si está permitido operar con cada símbolo de la matriz de símbolos. Esta opción se encuentra en las variables externas, y en ese momento el comercio en el símboloGBPUSD estaba prohibido. Los eventos de usuario provenían de dos símbolos, pero en el manejador de eventos, de nuevo, la función TradePerformer() sólo permitía operar con el símbolo EURUSD. La función TradePerformer() también contiene una función que determina si se ha producido una nueva barra en un símbolo concreto, en este caso EURUSD. Tu suposición de que la cola de eventos siempre ha estado llena es correcta, pero en este caso todo se ha procesado por separado y un retraso de un tick no es significativo cuando se prueba en barras diarias.

Dado que TradeSignalCounter()+TradePerformer() han procesado eventos de una sola fuente de señales, el estado de la cola y su posible desbordamiento no han cambiado en absoluto. En otras palabras, la "prohibición de procesar eventos por el símbolo GBRUSD" no eliminó los eventos apropiados de la cola en absoluto. Por tercera vez, señalo el problema: "Ya se insinuó un posible desbordamiento en la cola de eventos" :) Si cree que sólo se trata de "una garrapata de retraso", ¿en qué se basan esas conclusiones?

"...En este caso todo se gestionó por separado". El problema es que en la versión original, el manejador de eventos llamaba a funciones cuando se recibían eventos de ambas fuentes de señal, y entonces esas funciones ya filtraban la señal de la fuente "innecesaria". Pero las funciones fueron llamadas cada (!) vez.

tol64:

Un retraso de un tick no es significativo cuando se comprueba en barras diarias.

No importa en qué periodo se pruebe el manejador de eventos. Si el esquema de Lizar genera señales tic-tac, entonces también están puntuando la cola de eventos tic-tac, no una vez al día.

"Intenté cambiar la frecuencia de los eventos, pero no hubo ninguna diferencia. Más exactamente, puedo decir que el modo de todos los ticks es el más preciso" ¿Podría proporcionar capturas de pantalla comparativas de los modos sin ticks de Lizar?

 
tol64:

Si pones un EA en cada símbolo por separado en trading real o en pruebas, esa sería la opción más precisa. Por supuesto, estoy de acuerdo con eso. Pero no es necesario sincronizar las barras. La precisión irá acompañada de la duración. Puede estimar períodos históricos largos en el probador. Y personalmente prefiero ver los resultados correctos de las pruebas.

¿Cómo es que no hay que hacer la sincronización de los bares en línea? Todos estos experimentos en el probador son necesarios para evaluar el comercio en línea, y la cuestión de este tema no es sobre el probador (que emula el comercio en línea), sino sobre el comercio en línea, y en primer lugar se necesita la sincronización de barras en línea (para los Asesores Expertos correspondientes).
Tol64:

La cuestión es tomar una decisión correcta basada en los resultados. Pero definitivamente no veo el sentido de analizar datos corruptos. Al fin y al cabo, se recoge lo que se siembra).

Lo que intento señalar es que la categoría de "corrección" ha sido sustituida ahora por la identidad de las carreras de los probadores, pero eso no significa que esos datos estén menos distorsionados. En particular, ahora ha elegido un intervalo de 10 segundos, que sin duda es más distorsionante que, por ejemplo, un intervalo de 5 segundos o de 1 segundo. Es decir, estás aprovechando alguna característica de las condiciones de funcionamiento del probador que te da el método preferido con el temporizador de 10 segundos. Lo que realmente se intenta hacer con los eventos del temporizador es "atrapar" la llegada de los ticks de las nuevas barras en todos los instrumentos, y es bastante obvio que la mejor manera de hacerlo es el evento OnTick.

Обработчик события "новый бар"
Обработчик события "новый бар"
  • 2010.10.04
  • Konstantin Gruzdev
  • www.mql5.com
Язык программирования MQL5 позволяет решать задачи на совершенно новом уровне. Даже те задачи, которые уже вроде имеют решения, благодаря объектно-ориентированному программированию могут подняться на качественно новый уровень. В данной статье специально взят простой пример проверки появления нового бара на графике, который был преобразован в достаточно мощный и универсальный инструмент. Какой? Читайте в статье.
 

No pierdas el tiempo. Nunca conseguirás una coincidencia perfecta en las garrapatas. El tiempo de cierre de un compás es diferente para los distintos instrumentos.

Para un instrumento la hora actual es la hora de cierre de la barra, para otro la barra aún no se ha formado, y para el tercero se ha formado hace varios ticks.

Mira el historial de ticks, el volumen de ticks difiere muchas veces de un instrumento a otro.

Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5
Алгоритм генерации тиков в тестере стратегий терминала MetaTrader 5
  • 2010.05.21
  • MetaQuotes Software Corp.
  • www.mql5.com
MetaTrader 5 позволяет во встроенном тестере стратегий моделировать автоматическую торговлю с помощью экспертов на языке MQL5. Такое моделирование называется тестированием экспертов, и может проводиться с использованием многопоточной оптимизации и одновременно по множеству инструментов. Для проведения тщательного тестирования требуется генерировать тики на основе имеющейся минутной истории. В статье дается подробное описание алгоритма, по которому генерируются тики для исторического тестирования в клиентском терминале MetaTrader 5.
 

Yedelkin 2011.08.25 08:16 #

"...todo se ha hecho bien antes" es de la categoría de la complacencia.

---

¡Buenos días! ))

Además de esta frase arrancada por separado, también escribí: ".Nunca descarto que me equivoque en alguna parte y siempre lo compruebo todo. Pero incluso después de las comprobaciones más duras, cuando a primera vista todo parece correcto, sigo sin poder descartar la posibilidad de que haya un error en alguna parte". Debo añadir que no soy el tipo de persona que cree tener siempre la razón en todo. )))

---

Yedelkin:
Originalmente estaba mal. Aparentemente, usted no da importancia a un fenómeno como la "saturación de las colas de los eventos". Sobre todo cuando se trata de la transmisión de eventos a posteriori. Echa un vistazo a los materiales de referencia y al foro sobre el tema. La palabra clave es "cola".

---

He echado un vistazo al tema del temporizador. Los puntos clave que destaqué son:

1. Mientras se procesa un evento, los otros no pueden ser procesados.

2. Si la pila de eventos se desborda, los eventos antiguos se eliminan de la cola sin ser procesados.

Tomémoslo en orden. Hay una enumeración de eventos:

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, // Все события включены
  };

Al inicializar, especifica de qué símbolo aceptaremos el evento y qué evento aceptaremos:

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

 return(0);
}

Es decir, aceptaremos el evento CHARTEVENT_TICK sólo del símbolo EURUSD. No hay otros símbolos.

La prueba ha comenzado. Cuando se produce cualquier evento, el programa entra en la función OnChartEvent(), declara matrices de variables para las señales de negociación y comprueba el evento. Si se trata de un evento personalizado, el programa determina la señal en TradeSignalCounter(), luego comprueba si se ha producido una nueva barra en la función TradePerformer() y luego decide otras condiciones dependiendo de esto. La función ha dejado de funcionar y empezará a hacerlo sólo cuando se produzca un evento en el gráfico del EURUSD. En otras palabras, una garrapata en este caso.

void OnChartEvent(const int id,         // идентификатор события
                  const long&   lparam, // флаг события поступившего от агента панели.
                                        // Флаги соответствуют перечислению ENUM_CHART_EVENT_SYMBOL.
                  const double& dparam, // цена
                  const string& sparam  // инструмент 
                 )
{
 // Объявление массивов переменных для торговых сигналов
 static datetime New_Bar[1];  
 static bool UpSignal[1], DnSignal[1];
 
 if(id >= CHARTEVENT_CUSTOM)
   {
    // Получение торговых сигналов
    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);
   }
}

Yedelkin:
Desde el hecho de que TradeSignalCounter()+TradePerformer() manejó eventos de una sola fuente de señales, el estado de la cola de eventos y su posible desbordamiento no cambió de ninguna manera. En otras palabras, la "prohibición de procesar eventos por el símbolo GBRUSD" no eliminó los eventos apropiados de la cola en absoluto. Por tercera vez, llamo la atención sobre el problema: "Ya se insinuó un posible desbordamiento en la cola de eventos" :) Si cree que sólo se trata de "una garrapata de retraso", ¿en qué se basan esas conclusiones?

---

La ejecución de las funciones enumeradas es muy rápida. No se desborda la cola de eventos y no se pierden eventos significativos. Y si la cola incluso se desborda y se pierden eventos, ¿qué nos perderemos? ¿Una garrapata, dos garrapatas, tres? ¿Y qué? Es insignificante en los bares de día.

---

Yedelkin:
El problema es que en la versión original, el manejador de eventos llamaba a funciones cuando los eventos provenían de ambas fuentes de señal, y entonces esas funciones ya filtraban la señal de la fuente "innecesaria". Pero las funciones fueron llamadas cada (!) vez.

---
¿Por qué te aferras a esta segunda fuente?) Ya no hay una segunda fuente. Hay uno - EURUSD, pero el Asesor Experto opera desde el gráfico GBPUSD a EURUSD. Y los resultados son idénticamente erróneos. Un ejemplar. Es decir, son los mismos que si la segunda fuente está presente. )))

-----------

Mejor haz la prueba tú mismo, muestra los resultados de la prueba y escribe (brevemente) lo que hiciste para obtener los resultados correctos de la prueba, si por supuesto lo consigues. El experto más sencillo servirá para esta prueba. Entrada por cualquier condición, Stop Loss, Take Profit. Que sean las barras diarias de los últimos 10 años. Y lo verás por ti mismo. Algunos períodos coincidirán y otros no. Abra el gráfico de resultados para ver dónde está el desajuste.

 
marketeer:
¿Cómo es que no es necesario hacer la sincronización de barras en línea?

Porque usted escribió antes de eso:

comercializadora:

Me refiero a una ejecución real en modo multidivisa (operando en N símbolos en EAs (en cada EA) configurados para cada uno de los símbolos) - esto da una estimación real...

De esto entiendo que por ejecución real te refieres a una prueba online, cuando se ejecutan varios EAs y cada uno se cierne sobre su propio símbolo directamente. Si eso es lo que querías decir, entonces una pregunta. ¿Por qué necesitamos la sincronización de barras en este caso, si cada Asesor Experto se encuentra en su propio símbolo? Tal vez, la sincronización de las barras en este caso es necesaria si el sistema de negociación está organizado de tal manera que se toma una decisión sobre varios símbolos a la vez, por lo que se deben formar barras sobre estos varios símbolos. Me refiero a operar de forma independiente en varios símbolos mientras se está en un símbolo (en cualquier símbolo).

Marketeer:

Todos estos experimentos en el probador son necesarios para estimar el comercio en línea, y la cuestión de este tema no es sobre el probador (que emula en línea), pero en línea, y sobre todo la sincronización de barras en línea es necesaria (para los Asesores Expertos adecuados).

Para mí, los experimentos de los probadores son necesarios para evaluar los resultados del comercio en la historia. Y mi elección del comercio en línea depende de esta evaluación. Por lo tanto, la cuestión de este tema es la cuestión del probador, no la cuestión en línea, por lo que necesitamos la sincronización de las barras en el probador también (para los Asesores Expertos pertinentes). Algunas imágenes en espejo))))

Marketeer:

Lo que intento señalar es que la categoría de "corrección" ha sido sustituida por la identidad de las ejecuciones de los probadores, pero eso no significa que esos datos estén menos sesgados. En particular, ahora ha elegido un intervalo de 10 segundos, que sin duda es más distorsionante que, por ejemplo, un intervalo de 5 segundos o de 1 segundo. Es decir, estás aprovechando alguna característica de las condiciones de funcionamiento del probador que te da el método preferido con el temporizador de 10 segundos.

Sí, cuanto más pequeño sea el intervalo, más preciso será el resultado. Pero, en realidad es necesario, al menos para mí, para la última prueba. Y para la preliminar, seguiría estando de acuerdo con Vladimir(MetaDriver) en que el intervalo de un minuto es suficiente.

Marketeer:

En realidad, con los eventos del temporizador se intenta "atrapar" la llegada de ticks de nuevas barras en todos los símbolos, y es obvio que la mejor manera de hacerlo es el evento OnTick.

Y aquí se ve que no has leído con atención el primer post del hilo. No con los eventos del temporizador, sino con OnChartEvent(). ¿O es un error de imprenta?

 
No podré continuar esta discusión durante un tiempo, así que haré una investigación más exhaustiva más tarde, con una lupa, por así decirlo. Tal vez ayude a entender más rápido dónde me equivoco o dónde hay un error en un método u otro. Gracias a todos por sus opiniones.
 
tol64:

De esto entiendo que por ejecución real te refieres a una prueba online, donde se ejecutan varios EAs y cada uno se cuelga de su propio símbolo directamente. Si eso es lo que quieres decir, entonces una pregunta. ¿Por qué necesitamos la sincronización de barras en este caso, si cada Asesor Experto se encuentra en su propio símbolo? Tal vez, la sincronización de las barras en este caso es necesaria cuando el sistema de comercio está diseñado de tal manera que se toma una decisión sobre la base de varios símbolos a la vez, por lo que las barras en estos varios símbolos deben ser formados.

Es aproximadamente así.


Tol64:

Y aquí se ve que no has leído con atención el primer post del hilo. No con los eventos del temporizador, sino con OnChartEvent(). ¿O es un error de imprenta?

¿Por qué debería ser así? Ahí tienes a OnTimer como tercer número. Ya se ha citado este tema: sólo hay que implementar un método que realice correctamente la prueba. Lo tienes. Esta es la función OnTimer () con un intervalo mínimo. Así que debes tener algo más en mente.


tol64:

Hay uno - EURUSD, pero el Asesor Experto opera en EURUSD desde el gráfico GBPUSD. Y los resultados son idénticamente erróneos.

Si es importante para ti, te recomiendo que preguntes a los desarrolladores cuál es el análogo de fxt-file en 5. Ya escribí que lo más probable es que se generen diferentes bases de ticks para diferentes pruebas.

Razón de la queja: