Mira cómo descargar robots gratis
¡Búscanos en Twitter!
Pon "Me gusta" y sigue las noticias
¿Es interesante este script?
Deje un enlace a él, ¡qué los demás también lo valoren!
¿Le ha gustado el script?
Evalúe su trabajo en el terminal MetaTrader 5
Visualizaciones:
237
Ranking:
(7)
Publicado:
\MQL5\Include\MQL5Book\
PRTF.mqh (1.49 KB) ver
MqlError.mqh (8.53 KB) ver
DateTime.mqh (2.56 KB) ver
TimeServerDST.mqh (15.66 KB) ver
TimeZoneFmt.mqh (3.35 KB) ver
MQL5 Freelance ¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa

Este script introduce la función TimeServerDaylightSavings() que falta entre las incorporadas, que sólo proporcionan TimeDaylightSavings() para el ordenador local. Además la cabecera adjunta mqh-file incluye algunas otras funciones útiles relacionadas con la hora del servidor, en particular permitiéndole saber si su broker utiliza interruptores DST en general.

Todo esto se basa en el análisis empírico del historial de cotizaciones de tu broker. Toda la idea se describe en el libro de algotrading en la sección sobre el horario de verano (DST). En resumen, el método analiza las estadísticas de las horas de apertura de la semana y deduce las desviaciones GMT de su broker. Dos máximos distintos en las estadísticas de los desfases, si coinciden en horas adyacentes, corresponden muy probablemente al horario estándar ("invierno") y al horario de verano ("verano").

En realidad, este script es una versión refinada y ampliada del script presentado en el libro. Específicamente, las versiones desde octubre de 2024 incluyen una importante corrección de errores: las horas de apertura de las operaciones semanales son detectadas por el mercado de EE.UU., que a su vez se ve afectado por los cambios de DST de acuerdo con la zona horaria de EE.UU. (EST, UTC-5, horario estándar de invierno <--> EDT, UTC-4, horario de verano de ahorro de luz diurna), por eso es importante eliminar el efecto del DST de EE.UU. para obtener un flujo de tiempo natural continuo durante todo el año - esto es lo que se ha hecho en la corrección. Todo el mérito es de amrali.

Ejemplo de cambio de hora de apertura de la semana en las cotizaciones debido al cambio DST


Tenga en cuenta que en los hemisferios norte y sur los husos horarios se ajustan en sentido inverso: en el hemisferio norte se añade 1 hora en "primavera" (marzo o abril) y se resta en "otoño" (octubre o noviembre), mientras que en el hemisferio sur es al revés (porque tienen todas las estaciones intercambiadas).

Debido a la especificidad del análisis se recomienda ejecutar el código para el ticker de Forex más líquido, que suele ser EURUSD.

Aquí está la API:

// Zona horaria del servidor e información actual de DST
struct ServerTimeZone  // según el análisis histórico de los horarios de apertura semanales
{
   int offsetGMT;      // desfase horario en segundos con respecto a UTC/GMT para la semana en curso
   int offsetDST;      // Corrección DST en segundos (incluida en offsetGMT, según MQL5)
   bool supportDST;    // Los cambios DST se detectan en las cotizaciones
};

// Calcular la zona horaria del servidor y el modo DST a partir del historial de cotizaciones H1
ServerTimeZone TimeServerZone(
  const datetime srvtime = 0,     // por defecto, la hora actual, pero puede especificar un momento en el pasado
  const int threshold = THRESHOLD,
  const double lookupYears = 0.0, // por defecto, todas las barras disponibles, de lo contrario 3 años parece suficiente
  const string symbol = NULL)     // por defecto, símbolo del gráfico actual

// Estimación de la hora del servidor Corrección del modo DST (en segundos)
int TimeServerDaylightSavings(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Estimar el desfase horario del servidor (en segundos)
int TimeServerGMTOffsetHistory(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Estimar si el servidor está habilitado para DST (true/false)
bool TimeServerDaylightSavingsSupported(const datetime srvtime = 0,
  const int threshold = THRESHOLD, const double lookupYears = 0.0, const string symbol = NULL);

// Análogo de la función TimeGMTOffset() para el servidor de comercio, diferencia en segundos
int TimeServerGMTOffset(); // TimeGMT() - TimeTradeServer()

Las funciones TimeServerDaylightSavings(), TimeServerGMTOffsetHistory(), TimeServerDaylightSavingsSupported() son sólo envoltorios de TimeServerZone(), así que si necesitas más de una característica es preferible usar la última y leer valores de la estructura ServerTimeZone.

Todas estas funciones toman como primer argumento la hora del servidor a la que se desea obtener la característica correspondiente (en el presente o en el pasado). Si la hora del servidor se deja en 0 (por defecto), el resultado se devuelve para el momento actual.

El segundo argumento, umbral, permite ajustar la sensibilidad de los algoritmos. Por defecto, es 52/4 que es un cuarto de año de estadísticas requeridas para tomar la decisión (detectar la zona horaria sin una posible interferencia de semanas cortas antes/después de las vacaciones). Por otro lado, esta configuración impide la detección rápida de cambios de zona horaria ad hoc (si su corredor decide hacerlo en algún momento). Es posible que desee establecer el umbral en 0 para permitir que los algoritmos detecten cualquier cambio tan pronto como sea posible.

La función TimeServerGMTOffset() no utiliza el análisis histórico sino que calcula el offset directamente a través de funciones MQL5 (como TimeGMT() - TimeTradeServer()).

Por favor, tenga en cuenta que esta función utiliza la misma notación de offset que la función incorporada TimeGMTOffset( ) de MQL5, es decir, las zonas horarias positivas, como GMT+3, se denotan por offsets negativos, como -10800, y viceversa. Esta notación es utilizada por algunos otros lenguajes de programación, como JaveScript, pero también hay otros lenguajes, que denotan zonas horarias positivas por desplazamientos positivos, y zonas horarias negativas por desplazamientos negativos. Compruebe cuidadosamente sus algoritmos.

El script de prueba envía todos los datos adquiridos al registro, por ejemplo:

1 ~ Built-in functions ~
TimeLocal()=2024.10.05 00:39:01 / ok
TimeCurrent()=2024.10.05 00:38:59 / ok
TimeTradeServer()=2024.10.05 00:39:01 / ok
TimeGMT()=2024.10.04 21:39:01 / ok
TimeGMTOffset()=-10800 / ok
TimeDaylightSavings()=0 / ok
2 ~ Add-on over built-in functions ~
TimeServerGMTOffset()=-10800 / ok
3 ~ Estimation of server TZ with DST based on week opening hours in history ~
TimeServerDaylightSavings()=-3600 / ok
    [offsetGMT] [offsetDST] [supportDST]
[0]      -10800       -3600         true

En este caso se detecta que el servidor está actualmente en modo DST, mientras que el ordenador local no lo está.

Por favor, recuerde que los relojes del sistema del ordenador local y del servidor pueden normalmente mostrar tiempos ligeramente diferentes (segundos e incluso minutos), incluso si están en la misma zona horaria. También tenga en cuenta que la función incorporada TimeTradeServer() devuelve una fecha-hora sintética: es la hora del servidor con precisión horaria, pero hereda fracciones intrahorarias del reloj local. Esto se hace así en MQL5 para simplificar las conversiones entre zonas horarias - TimeLocal(), TimeGMT() devuelve en el "formato local" también, y la hora del servidor de comercio.

Puede habilitar la impresión detallada de los datos analizados mediante la directiva de preprocesador

#define  PRINT_DST_DETAILS

que debe colocarse en su código antes de incluir:

#include "TimeServerDST.mqh"

He aquí un ejemplo de los detalles en el registro:

Got 20023 H1 bars, ~834 days
Week opening hours stats:
30  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0 83 54  0
Time Zone changes (UTC±X before/after weekstart):
            [weekstart]    [before] [DSTb] [after] [DSTa]
[0] 2021.07.25 00:00:00 -2147483648  false      -1  false
[1] 2021.11.08 00:00:00           0   true       0  false
[2] 2022.03.14 00:00:00           0  false       0   true
[3] 2022.11.07 00:00:00           0   true       0  false
[4] 2023.03.13 00:00:00           0  false       0   true
[5] 2023.11.06 00:00:00           0   true       0  false
[6] 2024.03.11 00:00:00           0  false       2  false
3 different timezones detected in quotes, 1 DST candidates
Server time offset: UTC+2 STD
TimeServerDaylightSavings()=-3600 / ok

Por favor, siéntase libre de ejecutar el script en su entorno y publicar los registros resultantes en la discusión.


Actualizaciones

2024.10.10 - corrección de errores: Los cambios de horario de verano en EE.UU. (que interferían en las estadísticas de horas de apertura) se eliminan de la línea de tiempo antes del análisis principal.

2024.10.27 - la hora de interés del servidor y el umbral mínimo de estadísticas semanales se añaden como argumentos para todas las funciones; TimeServerGMTOffsetEmpiric() se renombra a TimeServerGMTOffsetHistory().

2024.10.29 - pequeño error corregido para incluir la hora solicitada en el periodo de búsqueda.

2024.10.30 - corregido DST en la matriz TimeZoneChange; la búsqueda se realiza ahora desde el parámetro srvtime, si se especifica.

2024.11.01 - añadido un autoajuste de los cálculos cuando se aplican a metales preciosos, lo que puede proporcionar resultados más fiables en semanas en las que los horarios DST de EE.UU. y DST de la UE no están sincronizados.

2024.11.04 - refinada la detección en línea de la activación/desactivación del horario de verano.

2024.11.07 - añadido almacenamiento en caché de cambios de zona horaria/DST para peticiones masivas en el historial para backtesting de indicadores o eventos económicos.

2024.11.08 - optimizado el rendimiento de la caché mediante una pequeña refactorización del código.

2024.11.16 - ajuste de 1 hora para marcas de tiempo deducidas de metales por amrali.

2024.11.17 - refactorización y correcciones por amrali: se eliminan las reconstrucciones de caché para las peticiones en línea durante los fines de semana, se añade 48 horas de antelación para la detección de cambios de zona horaria durante los fines de semana (con posible transición DST), se utilizan las 00:00 del domingo como límite para las zonas horarias (en lugar de la primera barra de la semana).

2024.11.20 - se ha cambiado el umbral por defecto a 1 (un equilibrio entre la detección rápida de cambios de zona horaria y la eliminación de falsos positivos en semanas no estándar, como después de las vacaciones); se ha añadido un nuevo conjunto de funciones para el formateo de la hora, incluyendo desfases de zona horaria y DST (consulte TimeZoneFmt.mqh); otras pequeñas mejoras.




Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/code/52557

Simplest Logger class for MetaTrader 5 Simplest Logger class for MetaTrader 5

La clase más simple para el registro en MetaTrader 5 con soporte para niveles, formato de mensaje, filtros de inclusión y exclusión en subcadenas.

Ascending Sort A Struct Array By A Field Example Ascending Sort A Struct Array By A Field Example

Este es un ejemplo de ordenación ascendente de una lista de estructura por un campo. Usted puede averiguar y personalizar el algoritmo anterior en función de la finalidad de uso, este es el ejemplo más básico es también una dirección para resolver la ordenación en una matriz de estructura. El algoritmo utilizado en este ejemplo es Quick Sort y Merge Sort.

Custom crosshair cursor with synchronization Custom crosshair cursor with synchronization

Indicador sincronizado de retícula personalizado que muestra el precio y la hora (servidor/local).

Perfect Seconds Chart Perfect Seconds Chart

El indicador gráfico Perfect Seconds le permite convertir velas de minutos de datos en tiempo real en segundos. 1. Elija cualquier número de segundos para cerrar la barra con el tiempo exacto. 1. Elija cualquier número de segundos para cerrar una barra con el tiempo exacto. Funciona incluso si los ticks no están disponibles. 3. No requiere DLL externa. No requiere DLL externa, funciona sin problemas en VPS 4. Código rápido y optimizado 5. 5. Soporta Crypto Pares como BInance, Kucoin y todos los demás intercambios donde Futuros gráfico en vivo se puede convertir en segundos con facilidad. 6. Soporta todo tipo de símbolos como el oro, el oro y el oro. 6. Soporta todo tipo de símbolos como pares de Oro y Forex. 7. Opciones para eliminar el símbolo y las tasas.