Spread Profile by Hour
- Utilidades
-
Quoc Dat Quach
Software engineer with 8 years in fintech and mobile, writing MQL4/MQL5 since 2017. I build Expert Advisors, indicators, trade and risk-management panels and utilities for MT4/MT5, and I trade forex and gold on MT5 myself. - Versión: 1.0
El «Perfil del spread por hora» genera la distribución del spread de un símbolo para cada hora del día del servidor a partir del historial de ticks de tu bróker, y lo representa en 24 barras. La parte sólida de una barra corresponde al spread mediano de esa hora, mientras que la parte superior más clara alcanza el percentil 90. Introduce el tamaño del stop que sueles utilizar y cada barra se etiquetará con su spread medio como porcentaje de ese stop, de modo que el coste se exprese en la misma unidad que tu riesgo.
Es una herramienta de medición. No realiza órdenes, no utiliza DLL ni WebRequest, y no guarda ningún archivo salvo la exportación a CSV que actives.
Por qué existe: en las estrategias intradía y de scalping, el spread —y no la señal de entrada— suele decidir si una ventaja se mantiene. La terminal muestra el spread en ese momento, y el historial de barras guarda un único valor de spread por barra, lo que oculta lo que ocurrió dentro de la hora. Las mismas reglas pueden funcionar en horas tranquilas y generar pérdidas en el cierre diario o en la apertura de una sesión, simplemente porque el spread en esos momentos es varias veces más amplio. Este indicador lee las propias cotizaciones —cada tick de compra y venta de los últimos N días naturales a través de CopyTicksRange— y las agrupa por hora del día según la hora del servidor.
Lo que calcula para cada hora del servidor, durante los últimos N días naturales (excluyendo el día de hoy), de modo que la imagen no cambie mientras operas:
- El spread mediano y del percentil 90 en puntos para cada hora en el panel; la media, el máximo y el número de cotizaciones correspondientes a cada hora en la exportación a CSV.
- Dos modos de muestreo. Recuento de ticks: cada cotización cuenta una vez. Ponderación temporal: cada cotización cuenta por el tiempo que permaneció válida, hasta un máximo de 60 segundos. El recuento de ticks sobrerrepresenta los mercados rápidos, y estos suelen presentar spreads amplios; la ponderación temporal indica qué spread habrías encontrado en un momento aleatorio de esa hora.
- Un filtro de días laborables, de lunes a viernes, para reglas que operan solo un día de la semana; aumenta con él la profundidad del historial, ya que 20 días naturales solo contienen dos o tres de un mismo día laborable.
- La vista de costes: al introducir un tamaño de stop en puntos, cada barra se etiqueta con el spread mediano como porcentaje de ese stop, y el encabezado muestra la mediana y el percentil 90 de la hora actual en la misma unidad. Cuando la ventana es demasiado estrecha para mostrar una etiqueta en cada barra, solo la barra con la mediana más alta conserva su etiqueta.
- El spread mediano de la hora actual en la divisa de la cuenta por cada lote de 1,00, calculado a partir del valor del tick y el tamaño del tick del símbolo.
- Las horas situadas en ambos extremos de la clasificación de la mediana, hasta tres de cada extremo, en el encabezado. Las horas que comparten una mediana se enumeran juntas o se resumen, por ejemplo, «Más baratas: 23 horas a 6 pt», de modo que los valores iguales nunca se presentan como una clasificación; si todas las horas tienen la misma mediana, el encabezado así lo indica.
- La hora actual del servidor resaltada y el spread en tiempo real representado como una línea discontinua que atraviesa las barras.
- Exportación opcional en formato CSV de la tabla por horas a MQL5\Files\SpreadProfile_<símbolo>_<aaaaammdd>.csv en UTF-8, que se guarda tras cada cálculo.
Cómo se gestiona el historial de ticks, que es la parte que determina si los datos son fiables: se carga un día por paso del temporizador y se libera inmediatamente, de modo que el gráfico sigue respondiendo con rapidez en el oro o las criptomonedas, que registran más de 100 000 ticks al día. Un día que la terminal aún esté descargando se vuelve a intentar durante unos segundos, y un día cuyos ticks no cubran sus propias barras M1 se vuelve a intentar antes de utilizarlo. Los días se leen desde el más reciente hacia atrás. Cuando tres días de negociación consecutivos no devuelven ningún tick (con un filtro de días laborables, tres días consecutivos de ese día laborable), o diez días seguidos no tienen ni ticks ni barras M1, esos días se leen por segunda vez tras una pausa, y si siguen vacíos, la carga se detiene y el encabezado muestra la fecha del día más antiguo realmente utilizado; una laguna de esa duración en el almacenamiento de ticks del bróker interrumpe la carga de la misma manera. El encabezado también contabiliza los días utilizados como parciales —es decir, ticks que no llegaron a la última barra M1— y los días no disponibles —es decir, barras M1 pero sin ticks—. Un símbolo sin historial de ticks alguno lo indica en unos veinte segundos, en lugar de mostrar un panel vacío. El diario obtiene una línea de resumen por cada cálculo —días utilizados, ticks leídos, horas completadas— más una línea que indica el nombre del archivo CSV cuando la exportación está activa.
Cómo interpretar el panel. Cada barra representa una hora del día en hora del servidor. La parte sólida es la mediana: la mitad de las cotizaciones, o la mitad del tiempo en el modo ponderado por el tiempo, tenían un spread igual o inferior a ese valor. La parte más clara es el percentil 90: una de cada diez cotizaciones tenía un spread mayor que ese. Medidas extraídas de las capturas de pantalla, tomadas en una cuenta de demostración a lo largo de 20 días naturales, de los cuales 17 tuvieron ticks:
- EURUSD, recuento de ticks, stop de 50 puntos: la mediana es de 6 puntos en 23 de las 24 horas. A las 21:00, hora del servidor, el rollover diario, es de 34 puntos con un percentil 90 de 58. Eso supone el 12 % del stop durante la mayor parte del día y el 68 % en esa hora concreta.
- GBPUSD, ponderado por tiempo, sin stop introducido: 7 puntos en 23 horas, mediana de 46 y percentil 90 de 94 a las 21:00. En el modo de recuento de ticks, esa misma hora registra 54 y 100, ya que las cotizaciones se agrupan en torno al cambio de día, donde el spread es amplio.
- XAUUSD, recuento de ticks, stop de 1.500 puntos: la mediana es de 182 puntos en cada hora para la que hay datos, lo que supone el 12 % del stop y 18,20 USD por lote de 1,00; por eso, el encabezado indica esto en lugar de clasificar valores iguales. La ruptura diaria a las 21:00 tiene menos ticks que el mínimo y se muestra como un guion.
La aplicación práctica consiste en tomar una decisión sobre las horas: si tu sistema opera en una hora en la que el spread medio representa una gran parte de tu stop, o bien omites esa hora, o amplías el stop, o compruebas que el movimiento esperado lo compense. El percentil 90 muestra cómo es una ejecución desfavorable, aunque no infrecuente.
Verificación independiente. Las estadísticas por hora se han recalculado a partir de los mismos ticks sin procesar mediante una implementación independiente en Python. La mediana, el percentil 90, la media, el máximo y el recuento de ticks coincidieron para cada hora en ambos modos de muestreo; por ejemplo, el EURUSD a las 20:00 con 10 692 ticks y a las 21:00 con 8 097 ticks, y el GBPUSD a las 21:00 en ambos modos. Pruebas de carga en la misma máquina: 20 días de XAUUSD, 4,29 millones de ticks, en 1 a 3 segundos; 60 días filtrados a los lunes, 2,60 millones de ticks, en 1,3 segundos; 365 días de EURUSD, 9,37 millones de ticks a lo largo de 232 días con ticks, en unos 30 segundos, incluida la segunda lectura de los días anteriores al inicio del historial de ticks. Los tiempos dependen de la densidad de ticks de tu bróker y de si los ticks ya se encuentran en el disco.
Parámetros de entrada: profundidad del historial en días naturales (de 1 a 365, por defecto 20), modo de muestreo, filtro de días de la semana, rango del histograma en puntos con un intervalo de desbordamiento, número mínimo de ticks por hora que se mostrarán, tamaño del stop en puntos (0 desactiva las etiquetas de porcentaje), altura de la ventana, siete colores, de los cuales cuatro se derivan automáticamente si se deja en «Ninguno» (fondo del gráfico, texto y cuadrícula a partir de ese fondo, el límite del percentil 90 a partir del color de la barra), tamaño de la fuente y el indicador CSV. Cada parámetro de entrada está documentado con su propio comentario en la terminal.
Notas y limitaciones. La profundidad del historial de ticks depende de tu bróker y de lo que la terminal ya haya descargado. En la primera ejecución con una profundidad elevada, es posible que la terminal siga descargando ticks; un día que aún se está descargando se vuelve a intentar durante unos segundos y, a continuación, se utiliza como parcial o se omite, por lo que, si la carga se detiene antes de tiempo, vuelve a conectar el indicador una vez que haya finalizado la descarga: la segunda ejecución lee desde el disco. Todas las horas son horas del servidor, por lo que un evento como el rollover puede variar en una hora del servidor entre el horario de verano y el de invierno, y una ventana que abarque el cambio mostrará que se divide entre dos horas contiguas. Las cuentas de demostración y reales, así como los tipos de cuenta estándar, «raw» y «zero», pueden presentar spreads muy diferentes para un mismo símbolo; compruébalo en la cuenta con la que operas. El historial de spreads no predice los spreads futuros: las noticias, los días festivos y la escasa liquidez pueden generar spreads muy por encima del percentil 90 que se muestra aquí. El coste por lote utiliza el valor actual del tick, que en el caso de los pares cruzados varía en función del tipo de cambio. El perfil se recalcula una vez por cada nuevo día del servidor y cada vez que cambian los datos de entrada, el símbolo o el marco temporal. El indicador se abre en una ventana independiente y pueden ejecutarse varias copias en un mismo gráfico, cada una en su propia ventana.
