Exchange Ticks Corrections
- Utilidades
-
Aleksei Kuznetsov
Report de Optimización Avanzado
¿Optimizas estrategias de negocio en Meta Trader 5 (MT5)? Utiliza una presentación ampliada y más visual de los resultados de optimización con las ventajas de páginas HTML interactivas.
Brevemente, las ventajas son: - Versión: 1.0
- Activaciones: 5
Ajuste de los ticks para el simulador MQ, que permitirá probar estrategias para instrumentos bursátiles y obtener resultados más cercanos al trading real que los que se obtienen en el simulador con los ticks guardados.
Probado en MOEX a través del bróker F..am. No se ha comprobado el funcionamiento en otras bolsas, pero es posible que también presenten un problema similar.
Las primeras 10 ventas a 30 $, luego a 50 $.
Principio de funcionamiento:
- el script lee los ticks guardados del instrumento en cuestión
- se identifican automáticamente, según determinados criterios, los ticks de las sesiones no operativas y se eliminan. Se determinan el cierre matutino y el vespertino de la negociación. El inicio de las sesiones ha cambiado: la sesión matutina comenzaba inicialmente a las 10:00, pero desde 2025 empieza a las 07:00, mientras que la sesión vespertina duraba de 18:40 a 19:05, ahora se comprime en 5 minutos, de las 18:55 a las 19:00. Dado que el horario ha cambiado, utilizar una sola de las tablas de sesiones bursátiles resultaría erróneo, por lo que he escrito un identificador automático. Quizá en el futuro cree una variante en la que se puedan configurar las sesiones de negociación manualmente, ya que es más fiable, pero requiere más trabajo previo para elaborar un calendario de los cambios en los horarios (puede que resulte complicado encontrar todas las fechas de los cambios).
- Dado que los ticks de Ask y Bid a menudo no coinciden con los ticks de Last anteriores y posteriores, se eliminan todos los ticks de Ask y Bid
- Se crean nuevos precios de Ask y Bid basándose en los ticks «Last», partiendo de la hipótesis de que todos los ticks «Last» se ejecutan a los precios de Ask y Bid. Los precios no se registran como un tick independiente, sino que se añaden a los ticks «Last» que los han modificado
- Si se produce una gran serie de ticks «Last» en un milisegundo con precios diferentes, los precios de «Ask» o «Bid» solo se añaden al último tick de ese milisegundo, ya que ningún robot tiene tiempo de colocar su operación en ese milisegundo. Estas series de operaciones se producen debido a una operación de mercado de gran volumen, que desmonta de inmediato varios niveles en la pila de órdenes.
- Todos los ticks «Last» con la misma dirección y precio se agrupan en un único tick con un volumen igual a la suma de los volúmenes de todos los ticks agrupados. Este tick puede formarse tanto en 1 milisegundo como en varios segundos. Es posible que el precio no varíe durante varios minutos, pero para que coincida el gráfico de velas, los ticks se generan al menos una vez por minuto, siempre que haya habido al menos un tick en ese minuto.
- Se realiza un ajuste en los precios Ask y Bid generados: si Ask <= Bid, se establece Ask > Bid en 1 punto o según el Last.
- Los ticks obtenidos se guardan en un símbolo personalizado, en el que se deben realizar las pruebas.
- Antes de ejecutar el script, es necesario descargar los ticks reales del instrumento deseado; para ello, ejecute en el simulador cualquier experto para el periodo de tiempo deseado; el simulador descargará todos los ticks seleccionados; repita la prueba tras 2-5 minutos, ya que el simulador puede tardar un tiempo en completar la descarga de los ticks
- Ejecuta el script en el gráfico del instrumento deseado
- Rellena los parámetros de entrada (fecha de inicio, «Action» —reinicio completo o descarga de ticks recientes—, «PostFix» —para el nombre del símbolo personalizado que se va a crear—; LoadByYears: si dispones de poca memoria, esta opción funcionará por bloques de un año, en lugar de descargar de una vez datos de 5 a 10 años; por ejemplo, GAZP descargó en memoria 11 GB de datos de ticks correspondientes a 5 años, mientras que al trabajar por años, solo se descargan 3 GB)
- ejecuta el script y espera a que termine (GAZP tardó casi 2 minutos en procesar 5 años)
- Ya puedes empezar a realizar pruebas en el simulador con el símbolo personalizado que has creado
Descripción de los problemas con las sesiones NO operativas que se encuentran en las cotizaciones guardadas:
1) Dado que en las cotizaciones no se han eliminado los ticks de la sesión no comercial, el simulador opera también con ellos, mientras que la bolsa rechazará cualquier orden durante ese tiempo.
Ejemplos:
: de 18:40 a 19:05 no se realiza ninguna operación, pero en el simulador las operaciones se ejecutan durante ese tiempo https://www.mql5.com/ru/forum/516827/page11#comment_60568825
if(Tick.time== D'2024.06.07 18:49:55'){ OrderSend(_Symbol, OP_SELL, 1.0, n(Tick.bid), 0, n(130.0),0,NULL,3);}
2) Si una operación se abrió en horario de negociación y no se cerró antes de que finalizara la sesión bursátil, y atraviesa ticks fuera del horario de negociación, los TP/SL y otras órdenes pendientes pueden activarse fuera del horario de negociación en el simulador (pero no en la bolsa). Y dado que, fuera del horario de negociación, la bolsa (o el bróker) establecía un Bid > Ask con una distancia de varias velas diarias, el simulador obtiene enormes deslizamientos positivos y convierte incluso una estrategia primitiva en el «Santo Grial» del simulador. Ejemplo en las capturas de pantalla.
Eliminar los ticks fuera del horario de negociación ayudará a librarse de estos problemas. El script detecta automáticamente los ticks fuera del horario de negociación y los elimina.
Nota importante: dado que se eliminarán varios minutos del historial, los indicadores MA y otros se calcularán sin esas barras y los valores serán diferentes.
Descripción de los problemas con los ticks de Ask y Bid presentes en las cotizaciones guardadas:
1) Los ticks de Ask y Bid no se actualizan con la frecuencia suficiente, por lo que las operaciones realizadas a un mismo precio «Last» se registran con valores de Ask o Bid obsoletos.
2) A veces, los ticks de Ask y Bid no coinciden con los precios «Last» anteriores y posteriores a ellos, mientras que los ticks «Last» se activan precisamente en función de Ask y Bid, por lo que deberían coincidir. A veces hay una diferencia de 10 puntos o más; en las capturas de pantalla se muestra una diferencia de 30 puntos.
Por estas razones, el script elimina por completo los ticks de «Ask» y «Bid» guardados y crea otros nuevos basados en «Last».
Todos los errores se han comunicado a los desarrolladores; es posible que los corrijan. Pero, por ahora, se puede realizar el test utilizando símbolos personalizados creados por este script. Como ventaja adicional, las pruebas se aceleran entre 4 y 5 veces gracias a la agrupación de los ticks «Last» con el mismo precio y al hecho de que los precios «Ask» y «Bid» no se añaden como ticks independientes, sino que se añaden a los ticks «Last» con los indicadores necesarios.
Problemas que no es posible resolver ni siquiera con este script.
No es posible lograr una coincidencia exacta de los resultados de las operaciones por las siguientes razones:
1) En el mercado real, la bolsa o el operador envía los ticks de «Ask» y «Bid» entre 10 y 30 ms después de los ticks «Last» que los modifican. Ejemplo:
FP 0 16:55:35.242 test_trail (GAZP,H1) 2026.10.30 16:55:35.51 bid:117.22 ask:117.23 last:117.25 vol:64 flags:1080 BUY LAST VOL
MR 0 16:55:35.252 test_trail (GAZP,H1) 2026.10.30 16:55:35.61 bid:117.23 ask:117.25 last:117.25 vol:64 flags:1030 BID ASK
En los ticks guardados, los precios de Ask y Bid se actualizan con menos frecuencia y, a menudo, los precios no coinciden.
En los ticks corregidos, los precios de Ask y Bid se añaden al tick que los modificó, es decir, se aplican en el mismo milisegundo.
Se observa una diferencia en ambas variantes. En la variante con ticks corregidos, la diferencia es menor y los resultados se acercan más a la negociación real.
2) En el trading real, la bolsa o el bróker envía ticks espaciados cada varios milisegundos; se omiten casi todos los ticks dentro de una serie de ticks de un milisegundo o de varios. OnTick se ejecuta con menos frecuencia, mientras que en el simulador se ejecuta en cada tick guardado.
En los ticks ajustados del simulador, OnTick se ejecuta igualmente en cada tick y también habrá diferencias con respecto al mercado real; por ejemplo, el simulador ejecutará una orden a un precio que se habría omitido en el mercado real.
3) En el mercado real, la bolsa o el operador ejecuta todas las órdenes con un retraso de red de varios milisegundos, mientras que en el simulador lo hace de forma instantánea.
4) El simulador ejecuta las órdenes limitadas solo cuando se agota por completo el nivel en el libro de órdenes con el primer tick del siguiente nivel, partiendo de la hipótesis de que tu orden es la última de la cola. En el mercado real, tu orden puede no ser la última y se ejecutará cuando el precio toque el nivel y retroceda; el simulador no reaccionará al contacto, sino solo al pasar al siguiente precio. Me di cuenta de esta particularidad al comparar la ejecución de mi ejemplo de prueba: https://www.mql5.com/ru/forum/518455/page12#comment_60642029
Es decir, no es posible lograr una coincidencia total, pero las pruebas con ticks ajustados ofrecen resultados más cercanos a los reales que las pruebas con ticks guardados.
Para crear y comprobar el funcionamiento del script se utilizó el código https://www.mql5.com/ru/market/product/206598/comments#comment_60673660, que reproduce con exactitud las entradas en el trading real en la bolsa y en el simulador con ticks ajustados (véanse las capturas de pantalla), gracias a las órdenes limitadas y al redondeo del precio para la ejecución de la orden. A continuación, las operaciones se cierran por el stop-loss o por el stop-loss tras un «trailing». Existen diferencias en los resultados: mayores en la prueba con ticks guardados y menores en la de ticks ajustados.
Capturas de pantalla:
1) En la parte superior, 8 operaciones de la negociación real con un resultado diario de -3,4 rublos; en la parte inferior, la prueba con ticks ajustados con un resultado de -4,2 rublos; la diferencia es de -0,8 rublos
2) En la parte superior, las mismas operaciones reales representadas como posiciones, con un resultado de -3,4 rublos; en la parte inferior, una prueba con ticks guardados, con un resultado de +1 rublo; la diferencia es de +4,4 rublos. Motivos: hay más operaciones, ya que los ticks de Ask y Bid no se ajustan a los precios de Last y, debido a su escasa frecuencia, las operaciones se cierran con valores de Ask y Bid obsoletos, lo que provoca un deslizamiento positivo.
3) Ejemplo de activación de un stop loss en el simulador fuera del horario de negociación, a precios correspondientes a varias barras diarias por debajo de los precios actuales ; todas las operaciones de venta «salen ganando» tanto en una caída del mercado como en una subida. «Ganancia»: varios miles de rublos.
4) Ejemplo de activación del SL en el simulador fuera del horario de negociación, a precios correspondientes a varias barras diarias por encima de los precios actuales ; todas las operaciones son de compra («Buy») y «generan ganancias» tanto en las caídas como en las subidas del mercado. La «ganancia» es de varios miles de rublos.
5) Ejemplo de activación del SL en el simulador con ticks ajustados, tras eliminar los ticks no negociables; todas las operaciones son de venta. La «magia» del simulador desapareció y se obtuvo una pequeña pérdida.
6) Ejemplo de activación del SL en el simulador con ticks ajustados y sin los ticks no negociables: todas las operaciones son de compra. La ganancia, cercana a la real, es de unos 120 rublos.
7) Comparación de los registros de ticks de GAZP (255 ticks) y los ticks corregidos de GAZP_Fixed (41 ticks) en 2 segundos.
A la izquierda, GAZP tiene ticks de Ask y Bid que son inadecuadamente más altos que los ticks de Last, aproximadamente en 30 puntos; este es uno de los ejemplos de por qué decidí eliminarlos. Vemos muchos ticks de Last a un mismo precio: son todas las operaciones en la bolsa.
A la derecha, los GAZP_Fixed corregidos. Debido a la eliminación de los ticks de Ask y Bid, el primero que aparece es el tick Last, que ha modificado el precio, y a él se le ha añadido el precio de Ask; el volumen es igual a la suma de los dos ticks GAZP: 1 + 3 = 4. Todos los ticks «Last» con el mismo precio se agrupan en uno solo con un volumen total.
También se observa una gran serie de ticks en un milisegundo debido a una compra de unos 36 000 lotes, que abarcó varios niveles en el «stack». Los precios de venta (Ask) para ellos solo se registran en el primer y último tick.
En los hilos de debate he adjuntado más detalles y archivos para reproducir la situación.
Si alguien quiere comprobarlo todo por su cuenta y comparar los ticks, adjunto lo siguiente:
- exportación de los ticks guardados en la terminal GAZP del 30 de octubre de 2026,
- una exportación de los GAZP_Fixed corregidos del 30 de octubre de 2026; podéis importar los ticks a vuestro terminal y ejecutar el experto para comprobar su funcionamiento.
- Impresión de los ticks recibidos en OnTick() durante la negociación real del 30 de octubre de 2026.
- Registro de operaciones y órdenes de negociación de ese día. Estas operaciones se pueden ver en las capturas de pantalla y en la descripción.
- Código del robot que funcionó tanto en una cuenta real como en el simulador, y el archivo de configuración de la prueba correspondiente al 30 de octubre de 2026.
- Exportación de los ticks corregidos correspondientes al periodo de enero a mayo de 2026 y archivo de configuración del experto para comprobar la presencia de «gralidad» en el simulador con los ticks del bróker y su eliminación en los ticks corregidos.
