- Generar ticks en el probador
- Gestión del tiempo en el comprobador: temporizador, Sleep, GMT
- Pruebas de visualización: gráfico, objetos, indicadores
- Pruebas multidivisa
- Criterios de optimización
- Obtener estadísticas financieras de prueba: TesterStatistics
- Evento OnTester
- Sintonización automática: ParameterGetRange y ParameterSetRange
- Grupo de eventos OnTester para el control de la optimización
- Enviar marcos de datos de los agentes al terminal
- Obtener marcos de datos en terminal
- Directivas del preprocesador para el probador
- Gestionar la visibilidad de los indicadores: TesterHideIndicators
- Emulación de operaciones de depósito y retirada
- Parada forzada de la prueba: TesterStop
- Ejemplo de Gran Asesor Experto
- Cálculos matemáticos
- Depuración y creación de perfiles
- Limitaciones de las funciones del probador
Pruebas multidivisa
Como usted sabe, el probador de MetaTrader 5 le permite probar estrategias que operan con múltiples instrumentos financieros. Desde un punto de vista puramente técnico, en función de los recursos de hardware del ordenador, es posible simular el trading simultáneo de todos los instrumentos disponibles.
Simular este tipo de estrategias impone al probador varios requisitos técnicos adicionales:
- Generación de secuencias de ticks para todos los instrumentos
- Cálculo de indicadores para todos los instrumentos
- Cálculo de los requisitos de margen y emulación de otras condiciones de trading para todos los instrumentos
Al acceder al historial por primera vez, el probador descarga automáticamente del terminal el historial de los instrumentos necesarios. Si el terminal no contiene el historial requerido, lo solicitará a su vez al servidor de trading. Por lo tanto, antes de probar un Asesor Experto multidivisa, se recomienda seleccionar los instrumentos necesarios en la página Observación de Mercado del terminal y descargar la cantidad de datos deseada.
El agente carga el historial que falta con un pequeño margen para proporcionar los datos necesarios para el cálculo de indicadores o la copia por el Asesor Experto en el momento de la prueba. La cantidad mínima de historial descargado del servidor de trading depende del marco temporal. Por ejemplo, para plazos de D1 y menos, es de un año. En otras palabras: el historial preliminar se descarga desde el principio del año anterior en relación con la fecha de inicio del probador. Esto da al menos 1 año de historial si la simulación se solicita a partir del 1 de enero, y un máximo de casi dos años si se pide a partir de diciembre. Para un marco temporal semanal, se solicita un historial de 100 barras, es decir, aproximadamente dos años (un año tiene 52 semanas). Para la simulación en un marco temporal mensual, el agente solicitará 100 meses (lo que equivale al historial de unos 8 años: 12 meses * 8 años = 96). En cualquier caso, en marcos temporales inferiores al de trabajo, se dispondrá de un número de barras proporcionalmente mayor. Si los datos existentes no son suficientes para la profundidad predefinida del historial preliminar, este hecho se registrará en el registro de pruebas.
No se puede configurar (cambiar) este comportamiento. Por lo tanto, si necesita proporcionar un número especificado de barras históricas del marco temporal actual desde el principio, debe establecer una fecha de inicio anterior para la prueba y luego «esperar» en el código del Asesor Experto a la fecha de inicio del trading requerida o a un número suficiente de barras. Antes de eso, debería saltarse todos los eventos.
El probador también emula su propia Observación de Mercado, de la que el programa puede obtener información sobre los instrumentos. Por defecto, al inicio de la simulación, el probador Market Watch contiene un solo símbolo: el símbolo sobre el que se inicia la prueba. Todos los símbolos adicionales se añaden automáticamente al probador Observación de Mercado cuando se accede a ellos a través de las funciones de la API. En el primer acceso a un símbolo de «terceros» desde un programa MQL, el agente de simulación sincronizará los datos del símbolo con el terminal.
Se puede acceder a los datos de los símbolos adicionales en los siguientes casos:
- Utilización de indicadores técnicos, iCustom, o IndicatorCreate para el par símbolo/marco temporal
- Consulta de otro símbolo Observación de Mercado:
- SeriesInfoInteger
- Bars
- SymbolSelect
- SymbolIsSynchronized
- SymbolInfoDouble
- SymbolInfoInteger
- SymbolInfoString
- SymbolInfoTick
- SymbolInfoSessionQuote
- SymbolInfoSessionTrade
- MarketBookAdd
- MarketBookGet
- Consulta de las series temporales del par símbolo/marco temporal mediante las siguientes funciones:
- CopyBuffer
- CopyRates
- CopyTime
- CopyOpen
- CopyHigh
- CopyLow
- CopyClose
- CopyTickVolume
- CopyRealVolume
- CopySpread
Además, puede solicitar explícitamente el historial de los símbolos deseados llamando a la función SymbolSelect en el manejador OnInit. El historial se cargará por adelantado antes de que comience la simulación del Asesor Experto.
En el momento en que se accede a otro símbolo por primera vez, el proceso de simulación se detiene y el historial del par símbolo/período se descarga del terminal al agente de simulación. La generación de secuencias de ticks también está activada en este momento.
Cada instrumento genera su propia secuencia de ticks según el modo de generación de ticks establecido.
La sincronización de barras de diferentes símbolos es de particular importancia cuando se implementan Asesores Expertos multidivisa, ya que la corrección de los cálculos depende de ello. Se considera que un estado está sincronizado cuando las últimas barras de todos los símbolos utilizados tienen la misma hora de apertura.
El probador genera y reproduce su secuencia de ticks para cada instrumento. Al mismo tiempo, se abre una nueva barra en cada instrumento, independientemente de cómo se abran las barras en otros instrumentos. Esto significa que al probar un Asesor Experto multidivisa, es posible que se produzca una situación (y la mayoría de las veces sucede) en la que una nueva barra ya se haya abierto en un instrumento, pero aún no en otro.
Por ejemplo, si estamos probando un Asesor Experto utilizando datos del símbolo EURUSD y una nueva vela horaria se ha abierto para este símbolo, recibiremos el evento OnTick. Pero al mismo tiempo, no hay garantía de que se haya abierto una nueva vela en GBPUSD, que también podríamos estar utilizando.
Por lo tanto, el algoritmo de sincronización implica que debe comprobar las cotizaciones de todos los instrumentos y esperar a que se igualen las horas de apertura de las últimas barras.
Esto no plantea ninguna duda mientras se utilicen los modos de simulación de ticks reales, emulación de todos los ticks u OHLC M1. Con estos modos se genera un número suficiente de ticks dentro de una vela para esperar el momento de la sincronización de barras de diferentes símbolos. Sólo tiene que completar la función OnTick y comprobar la aparición de una nueva barra en GBPUSD en el siguiente tick. Pero cuando se prueba en el modo «Sólo precios de apertura», no habrá ningún otro tick, ya que el Asesor Experto es llamado sólo una vez por barra, y puede parecer que este modo no es adecuado para probar Asesores Expertos multidivisa. De hecho, el probador permite detectar el momento en que se abre una nueva barra en otro símbolo utilizando la función Sleep (en un bucle) o un temporizador.
En primer lugar, consideremos un ejemplo de Asesor Experto SyncBarsBySleep.mq5, que demuestra la sincronización de barras a través de Sleep.
Un par de parámetros de entrada le permiten establecer el tamaño de Pause en segundos para esperar las barras de otro símbolo, así como el nombre de ese otro símbolo (OtherSymbol), que debe ser diferente del símbolo del gráfico.
input uint Pause = 1; // Pause (seconds)
|
Para identificar patrones en el retraso de los horarios de apertura de las barras, describimos una clase simple BarTimeStatistics que contiene un campo para contar el número total de barras (total) y el número de barras en las que no hubo sincronización inicialmente (late), es decir, el otro símbolo llegó tarde.
class BarTimeStatistics
|
El objeto de esta clase imprime las estadísticas recibidas en su destructor. Dado que vamos a hacer que este objeto sea estático, el informe se imprimirá al final de la prueba.
Si el modo de generación de ticks seleccionado en el probador difiere de los precios de apertura, lo detectaremos utilizando la función getTickModel que vimos con anterioridad y devolverá una advertencia.
void OnTick()
|
A continuación, OnTick proporciona el algoritmo de sincronización de trabajo.
// time of the last known bar for _Symbol
|
Vamos a configurar el probador para ejecutar el Asesor Experto en EURUSD, H1, que es el instrumento más líquido. Vamos a utilizar los parámetros por defecto del Asesor Experto, es decir, USDJPY será el «otro» símbolo.
Como resultado de la prueba, el registro contendrá las siguientes entradas (mostramos intencionadamente los registros relacionados con la descarga del historial del USDJPY, que se produjo durante la primera llamada a iTime).
2022.04.15 00:00:00 Last bar on EURUSD is 2022.04.15 00:00 USDJPY: load 27 bytes of history data to synchronize in 0:00:00.001 USDJPY: history synchronized from 2020.01.02 to 2022.04.20 USDJPY,H1: history cache allocated for 8109 bars and contains 8006 bars from 2021.01.04 00:00 to 2022.04.14 23:00 USDJPY,H1: 1 bar from 2022.04.15 00:00 added USDJPY,H1: history begins from 2021.01.04 00:00 2022.04.15 00:00:00 Bars are in sync at 2022.04.15 00:00:00 2022.04.15 01:00:00 Last bar on EURUSD is 2022.04.15 01:00 2022.04.15 01:00:00 Wait 1 seconds... 2022.04.15 01:00:01 Bars are in sync at 2022.04.15 01:00:01 2022.04.15 02:00:00 Last bar on EURUSD is 2022.04.15 02:00 2022.04.15 02:00:00 Wait 1 seconds... 2022.04.15 02:00:01 Bars are in sync at 2022.04.15 02:00:01 ... 2022.04.20 23:59:59 95 bars on USDJPY was late among 96 total bars on EURUSD (99.0%) |
Puede ver que las barras del USDJPY se retrasan regularmente. Si selecciona USDJPY, H1 en la configuración del probador y EURUSD en los parámetros del Asesor Experto, obtendrá la imagen opuesta.
2022.04.15 00:00:00 Last bar on USDJPY is 2022.04.15 00:00 EURUSD: load 27 bytes of history data to synchronize in 0:00:00.002 EURUSD: history synchronized from 2018.01.02 to 2022.04.20 EURUSD,H1: history cache allocated for 8109 bars and contains 8006 bars from 2021.01.04 00:00 to 2022.04.14 23:00 EURUSD,H1: 1 bar from 2022.04.15 00:00 added EURUSD,H1: history begins from 2021.01.04 00:00 2022.04.15 00:00:00 Bars are in sync at 2022.04.15 00:00:00 2022.04.15 01:00:00 Last bar on USDJPY is 2022.04.15 01:00 2022.04.15 01:00:00 Wait 1 seconds... 2022.04.15 01:00:01 Bars are in sync at 2022.04.15 01:00:01 2022.04.15 02:00:00 Last bar on USDJPY is 2022.04.15 02:00 2022.04.15 02:00:00 Wait 1 seconds... 2022.04.15 02:00:01 Bars are in sync at 2022.04.15 02:00:01 ... 2022.04.20 23:59:59 23 bars on EURUSD was late among 96 total bars on USDJPY (24.0%) |
Aquí, en la mayoría de los casos, no hubo necesidad de esperar: las barras de EURUSD ya existían en el momento en que se formó la barra de USDJPY.
Hay otra forma de sincronizar las barras: utilizando un temporizador. En el libro se incluye un ejemplo de este tipo de Asesor Experto, SyncBarsByTimer.mq5. Tenga en cuenta que los eventos del temporizador, por regla general, se producen dentro de la barra (porque la probabilidad de acertar exactamente el comienzo es muy baja). Por ello, las barras están casi siempre sincronizadas.
También podríamos recordarle la posibilidad de sincronizar las barras mediante el indicador espía EventTickSpy.mq5, pero este se basa en eventos personalizados que sólo funcionan cuando se realizan simulaciones visuales. Además, para este tipo de indicadores que requieren una respuesta para cada tick, es importante utilizar la directiva #property tester_everytick_calculate. Ya hemos hablado de ello en la sección Simulación de indicadores y se lo recordaremos una vez más en la sección dedicada a las directivas del probador específicas.