- 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
Generar ticks en el probador
La presencia del manejador OnTick en el Asesor Experto no es obligatoria para que se pruebe en el probador. El Asesor Experto puede utilizar una o varias de las otras funciones conocidas:
- OnTick - manejador de eventos para la llegada de un nuevo tick
- OnTrade - manejador de eventos de trading
- OnTradeTransaction - manejador de operaciones de trading
- OnTimer - manejador de señales de temporizador
- OnChartEvent - manejador de eventos en el gráfico, incluidos los gráficos personalizados
Al mismo tiempo, dentro del probador, el principal equivalente del curso temporal es un hilo de ticks, que contiene no sólo los cambios de precio, sino también el tiempo con precisión de milisegundos. Por lo tanto, para probar los Asesores Expertos, es necesario generar secuencias de ticks. El probador de MetaTrader 5 tiene 4 modos de generación de ticks:
- Ticks reales (si el bróker facilita su historial)
- Cada tick (emulación basada en las cotizaciones disponibles en el marco temporal M1)
- Precios OHLC de barras de un minuto (1 minuto OHLC)
- Sólo precios de apertura (1 tick por barra)
Más adelante analizaremos otro modo de funcionamiento, los cálculos matemáticos, ya que no está relacionado con las cotizaciones y los ticks.
Cualquiera de los cuatro modos que elija el usuario, el terminal carga los datos históricos disponibles para la simulación. Si se ha seleccionado el modo de ticks reales, y el bróker no dispone de ellos para este instrumento, entonces se utiliza el modo «Todos los ticks». El probador indica la naturaleza de la generación de ticks en su informe de forma gráfica y en porcentaje (donde 100 % significa que todos los ticks son reales).
El historial del instrumento seleccionado en los ajustes del probador se sincroniza y el terminal lo descarga del servidor de trading antes de iniciar el proceso de simulación. Al mismo tiempo, por primera vez, el terminal descarga el historial del servidor de trading hasta la profundidad requerida (con un cierto margen, en función del marco temporal, al menos 1 año antes del inicio de la prueba), para no solicitarlo posteriormente. En el futuro sólo se producirá la descarga de nuevos datos. Todo ello va acompañado de los correspondientes mensajes en el registro del probador.
El agente de simulación recibe el historial del instrumento probado del terminal de cliente inmediatamente después de iniciarse la simulación. Si el proceso de simulación utiliza datos de otros instrumentos (por ejemplo, se trata de un Asesor Experto multidivisa), en este caso el agente de simulación solicita el historial necesario al terminal de cliente en la primera llamada. Si el terminal dispone de datos históricos, éstos se transfieren inmediatamente a los agentes de simulación. Si faltan datos, el terminal los solicitará y descargará del servidor, y luego los transferirá a los agentes de simulación.
También se utilizan instrumentos adicionales cuando se calcula el precio de los tipos cruzados durante las operaciones de trading. Por ejemplo, al probar una estrategia en EURCHF con una divisa de depósito en dólares estadounidenses, antes de procesar la primera operación de trading, el agente de simulación solicitará el historial de EURUSD y USDCHF al terminal de cliente, aunque la estrategia no se refiera directamente a estos instrumentos.
En este sentido, antes de probar una estrategia multidivisa, se recomienda descargar primero todos los datos históricos necesarios en el terminal de cliente. Esto ayudará a evitar retrasos en la simulación/optimización asociados a la reanudación de los datos. Puede descargar el historial, por ejemplo, abriendo los gráficos correspondientes y desplazándolos hasta el principio del historial.
Veamos ahora con más detalle los modos de generación de ticks.
Ticks reales del historial
La simulación y la optimización en ticks reales son lo más parecido a las condiciones reales. Se trata de los ticks de bolsas y proveedores de liquidez.
Si hay una barra de minutos en el historial del símbolo, pero no hay datos de ticks para ese minuto, el probador generará ticks en el modo «Todos los ticks» (ver más adelante). Esto le permite construir el gráfico correcto en el probador en caso de datos de tick incompletos del bróker. Además, los datos de ticks pueden no coincidir con las barras de minutos por diversas razones. Por ejemplo, debido a desconexiones u otros fallos en la transmisión de datos de la fuente al terminal de cliente. En la simulación, los datos por minutos se consideran más fiables.
Los ticks se almacenan en la caché de símbolos del probador de estrategias. El tamaño de la caché no es superior a 128,000 ticks. Cuando llegan nuevos ticks, se expulsan los datos más antiguos. Sin embargo, utilizando la función CopyTicks, se pueden obtener ticks fuera de la caché (sólo cuando se realizan una simulación utilizando ticks reales). En este caso, los datos se solicitarán a la base de datos de ticks del probador, que se corresponde plenamente con la base de datos similar del terminal de cliente. En esta base no se realizan ajustes por barras de minutos. Por lo tanto, los ticks que aparecen en él pueden diferir de los que aparecen en la caché.
Todos los ticks (emulación)
Si el historial de ticks reales no está disponible o si necesita minimizar el tráfico de red (porque el archivo de ticks reales puede consumir recursos importantes), puede optar por generar artificialmente ticks basados en las cotizaciones disponibles del marco temporal M1.
El historial de cotizaciones de los instrumentos financieros se transmite desde el servidor de trading al terminal de cliente de MetaTrader 5 en forma de bloques de barras de minutos muy apretados. El procedimiento de consulta del historial y las construcciones de los marcos temporales requeridos se estudiaron detalladamente en la sección Aspectos técnicos de la organización y el almacenamiento de series temporales.
El elemento mínimo del historial de precios es una barra de minutos, de la que puede obtener información sobre cuatro valores de precios OHLC: Open, High, Low y Close.
Una nueva barra de minutos se abre no en el momento en que comienza un nuevo minuto (el número de segundos pasa a ser 0), sino cuando se produce un tick, es decir, un cambio de precio de al menos un punto. Del mismo modo, no podemos determinar a partir de la barra con precisión de un segundo cuándo llegó el tick correspondiente al precio de cierre de esta barra de un minuto: sólo conocemos el último precio de la barra de un minuto, que se registró como precio de Cierre.
Así, para cada barra de minutos, conocemos 4 puntos de control, que podemos decir con seguridad que el precio ha estado allí. Si la barra tiene sólo 4 ticks, entonces esta información es suficiente para la simulación, pero por lo general, el volumen de ticks es de más de 4. Esto significa que es necesario generar puntos de control adicionales para los ticks que se produjeron entre los precios Open, High, Low y Close. Los fundamentos de la generación de ticks en el modo «Todos los ticks» se describen en la documentación.
Al realizar la simulación en el modo «Todos los ticks», la función OnTick del Asesor Experto será llamada en todos los ticks que se generen. El Asesor Experto recibirá los precios Ask/Bid/Last y precio de la misma manera que cuando trabaja en línea.
El modo de simulación «Todos los ticks» es el más preciso (después del modo de ticks reales), pero también el que requiere más tiempo. Para la evaluación primaria de la mayoría de las estrategias de trading suele bastar con utilizar uno de los dos modos de simulación simplificados: en los precios OHLC M1 o en la apertura de las barras del marco temporal seleccionado.
1 minuto OHLC
En el modo «1 minuto OHLC», la secuencia de ticks se construye sólo por los precios OHLC de las barras de minutos, el número de llamadas a la función OnTick se reduce significativamente; por lo tanto, el tiempo de simulación también se reduce. Se trata de un modo muy eficaz y útil que ofrece un compromiso entre la precisión de las pruebas y la velocidad. No obstante, hay que tener cuidado cuando se trata del Asesor Experto de otra persona.
La negativa a generar ticks intermedios adicionales entre los precios Open, High, Low y Close conduce a la aparición de un determinismo rígido en la evolución de los precios a partir del momento en que se define el precio Open. Esto hace posible crear un «Grial de simulación» que muestre un bonito gráfico de balance con tendencia al alza cuando se realiza la simulación.
Para una barra de un minuto, se conocen 4 precios, de los cuales el primero es Open, y el último es Close. Los precios registrados entre ellos son High y Low, y se pierde la información sobre el orden en que se producen, pero sabemos que el precio High es mayor o igual que Open, y Low es menor o igual que Open.
Tras recibir el precio Open, tenemos que analizar únicamente el siguiente tick para determinar si es High o Low. Si el precio está por debajo de Open, esto es Low: comprar en este tick, ya que el siguiente tick corresponderá al precio High, en el cual cerramos la operación de compra y abrimos una de venta. El siguiente tick es el último de la barra, Close, en el que cerramos venta.
Si un tick con un precio superior al precio de apertura viene después de nuestro precio, entonces la secuencia de transacciones se invierte. Aparentemente, se podría operar en cada barra de este modo. Cuando se prueba un Asesor Experto de este tipo en el historial, todo va perfectamente, pero en línea fallará.
Un efecto similar puede producirse involuntariamente, debido a una combinación de características del algoritmo de cálculo (por ejemplo, el cálculo de estadísticas) y la generación de ticks.
Por lo tanto, siempre es importante probarlo en el modo «Todos los ticks» o, mejor, basado en ticks reales después de encontrar la configuración óptima del Asesor Experto en los modos de simulación aproximados («1 minuto OHLC» y «Sólo precios de apertura»).
Sólo precios de apertura
En este modo, los ticks se generan utilizando los precios OHLC del marco temporal seleccionado para la simulación. En este caso, la función OnTick sólo se ejecuta una vez, al principio de cada barra. Debido a esta característica, los niveles de stop y las órdenes pendientes pueden activarse a un precio diferente del solicitado (especialmente cuando se realiza la simulación en marcos temporales superiores). A cambio de esto, tenemos la oportunidad de realizar rápidamente una simulación de evaluación del Asesor Experto.
Por ejemplo, el Asesor Experto se prueba en EURUSD H1 en el modo «Sólo precios de apertura». En este caso, el número total de ticks (puntos de control) será 4 veces superior al número de barras de hora que caen dentro del intervalo analizado. Pero en este caso, el manejador OnTick sólo será llamado en la apertura de las barras de hora. Para el resto de ticks («ocultos» para el Asesor Experto), se realizan las siguientes comprobaciones necesarias para una correcta simulación:
- cálculo de los requisitos de margen
- activación de Stop Loss y Take Profit
- activación de órdenes pendientes
- eliminación de órdenes pendientes a su vencimiento
Si no hay posiciones abiertas ni órdenes pendientes, entonces no hay necesidad de estas comprobaciones en ticks ocultos, y el aumento de velocidad puede ser significativo.
Una excepción cuando se generan ticks en el modo «Sólo precios de apertura» son los periodos W1 y MN1: para estos marcos temporales, los ticks se generan para los precios OHLC de cada día, no semanales ni mensuales, respectivamente.
Este modo «Sólo precios de apertura» es muy adecuado para probar estrategias que realizan operaciones sólo en la apertura de la barra y no utilizan órdenes pendientes, y no utilizan los niveles Stop Loss y Take Profit. Para la clase de estrategias de este tipo se conserva toda la precisión de simulación necesaria.
La API de MQL5 no permite al programa averiguar en qué modo se está ejecutando en el probador. Al mismo tiempo, esto puede ser importante para los Asesores Expertos o los indicadores que utilizan, que no están diseñados, por ejemplo, para funcionar correctamente a precios de apertura u OHLC. A este respecto, aplicamos un sencillo mecanismo de detección de modos. El código fuente se adjunta en el archivo TickModel.mqh.
Vamos a declarar nuestra enumeración con los modos existentes.
enum TICK_MODEL
|
Excepto el primer elemento, que se reserva para el caso en que el modo aún no se ha determinado o no se puede determinar por alguna razón, todos los demás elementos están dispuestos en orden descendente de calidad de simulación, empezando por real y terminando con los precios de apertura (para ellos, el desarrollador debe comprobar la estrategia de compatibilidad con el hecho de que su trading se lleva a cabo sólo en la apertura de una nueva barra). El último modo TICK_MODEL_MATH_CALC funciona sin ticks en absoluto; lo consideraremos por separado.
El principio de detección del modo se basa en la comprobación de la disponibilidad de ticks y sus tiempos en los dos primeros ticks al iniciar la prueba. La comprobación en sí está envuelta en la función getTickModel, que el Asesor Experto debe llamar desde el manejador OnTick. Dado que la comprobación se realiza una vez, el modelo de variable estática se describe dentro de la función inicialmente establecida en TICK_MODEL_UNKNOWN. Almacenará y conmutará el estado actual de la comprobación, que será necesaria para distinguir entre los modos OHLC y los precios de apertura.
TICK_MODEL getTickModel()
|
En el primer tick analizado, el modelo es igual a TICK_MODEL_UNKNOWN, y se intenta obtener ticks reales llamando a CopyTicks.
if(model == TICK_MODEL_UNKNOWN)
|
Si tiene éxito, la detección termina inmediatamente con el ajuste del modelo a TICK_MODEL_REAL. Si no se dispone de ticks reales, el sistema devolverá un determinado código de error, según el cual podemos sacar las siguientes conclusiones. El código de error ERR_NOT_ENOUGH_MEMORY corresponde al modo de emulación de ticks. No está del todo claro por qué el código es así, pero se trata de un rasgo característico, y aquí lo utilizamos. En los otros dos modos de generación de ticks, obtendremos el error ERR_FUNCTION_NOT_ALLOWED.
Puede distinguir un modo del otro por el tiempo de tick. Si resulta ser un no-múltiplo del marco temporal para un tick, entonces estamos hablando del modo OHLC. Sin embargo, el problema aquí es que el primer tick en ambos modos puede estar alineado con la hora de apertura de la barra. Así, obtendremos el valor TICK_MODEL_OPEN_PRICES, pero es necesario especificarlo. Por lo tanto, para la conclusión final, debe analizarse un tick más (volver a llamar a la función sobre él si antes se recibió TICK_MODEL_OPEN_PRICES). Para este caso, se proporciona la siguiente rama if dentro de la función.
else if(model == TICK_MODEL_OPEN_PRICES)
|
Comprobemos el funcionamiento del detector en un sencillo Asesor Experto TickModel.mq5. En el parámetro de entrada TickCount, especificamos el número máximo de ticks analizados, es decir, cuántas veces se llamará a la función getTickModel. Sabemos que con dos es suficiente, pero para asegurarnos de que el modelo no cambia después, se sugieren 5 ticks por defecto. También proporcionamos el parámetro RequireTickModel que indica al Asesor Experto que finalice la operación si el nivel de simulación es inferior al solicitado. Por defecto, su valor es TICK_MODEL_UNKNOWN, lo que significa que no hay restricción de modo.
input int TickCount = 5;
|
En el manejador OnTick, ejecutamos nuestro código sólo si funciona en el probador.
void OnTick()
|
Intentemos ejecutar el Asesor Experto en el probador con diferentes modos de generación de ticks eligiendo una combinación común de EURUSD H1.
El parámetro RequireTickModel en el Asesor Experto se establece en OHLC M1. Si el modo de prueba es «Todos los ticks», recibiremos el mensaje correspondiente en el registro, y el Asesor Experto seguirá funcionando.
[time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2022.04.01 00:00:30 1.10656 1.10679 1.10656 0 1648771230000 14 0.00000 NOT_ENOUGH_MEMORY 1 TICK_MODEL_GENERATED [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2022.04.01 00:01:00 1.10656 1.10680 1.10656 0 1648771260000 12 0.00000 2 TICK_MODEL_GENERATED [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2022.04.01 00:01:30 1.10608 1.10632 1.10608 0 1648771290000 14 0.00000 3 TICK_MODEL_GENERATED |
Los modos OHLC M1 y ticks reales también son adecuados, y en este último caso, no habrá código de error.
[time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2022.04.01 00:00:00 1.10656 1.10687 0.0000 0 1648771200122 134 0.00000 1 TICK_MODEL_REAL [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2022.04.01 00:00:00 1.10656 1.10694 0.0000 0 1648771200417 4 0.00000 2 TICK_MODEL_REAL [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2022.04.01 00:00:00 1.10656 1.10691 0.0000 0 1648771200816 4 0.00000 3 TICK_MODEL_REAL |
Sin embargo, si cambia el modo en el probador a «Sólo precios de apertura», el Asesor Experto se detendrá después del segundo tick.
[time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2022.04.01 00:00:00 1.10656 1.10679 1.10656 0 1648771200000 14 0.00000 FUNCTION_NOT_ALLOWED 1 TICK_MODEL_OPEN_PRICES [time] [bid] [ask] [last] [volume] [time_msc] [flags] [volume_real] [0] 2022.04.01 01:00:00 1.10660 1.10679 1.10660 0 1648774800000 14 0.00000 2 TICK_MODEL_OPEN_PRICES Tick model is incorrect (TICK_MODEL_OHLC_M1 or better is required), terminating ExpertRemove() function called |
Este método requiere ejecutar una prueba y esperar un par de ticks para determinar el modo. En otras palabras: no podemos detener la prueba antes de tiempo devolviendo un error de OnInit. Es más: al iniciar una optimización con el tipo de generación de ticks incorrecto, no podremos detener la optimización, cosa que sólo se puede hacer desde la función OnTesterInit. Así, el probador intentará completar todas las pasadas durante la optimización, aunque se detendrán al principio. Esta es la limitación actual de la plataforma.