Pon "Me gusta" y sigue las noticias
Deje un enlace a él, ¡qué los demás también lo valoren!
Evalúe su trabajo en el terminal MetaTrader 5
- Visualizaciones:
- 74
- Ranking:
- Publicado:
-
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa
Función TimeGMT()
Devuelve la hora GMT, que se calcula teniendo en cuenta el cambio DST por la hora local en el ordenador donde se está ejecutando el terminal cliente . Existen 2 variantes de la función.
Llamada sin parámetros
datetime TimeGMT();
Llamada con parámetro de tipo MqlDateTime
datetime TimeGMT( MqlDateTime& dt_struct // Variable de tipo estructura );
Sin embargo, durante las pruebas en el probador de estrategias,TimeGMT() es siempre igual a la hora simulada del servidor TimeTradeServer().
Biblioteca TimeGMT
Esta librería arreglará la función TimeGMT() para proporcionar el GMT verdadero durante las pruebas en el probador de estrategias. La librería instalará ganchos API globales (vía sustitución de macros) para las dos versiones de TimeGMT.
class CTimeGMT { public: static datetime TimeGMT(void); static datetime TimeGMT(MqlDateTime &dt_struct); }
Uso:
Antes de probar un asesor experto que utiliza filtro de noticias o cualquier restricción de tiempo en el probador de estrategias, sólo tiene que incluir esta línea al principio del código, a continuación, volver a compilar la fuente en MetaEditor.
#include "TimeGMT.mqh"
- Opcionalmente, para ver los mensajes de depuración añadir esta línea antes de la directiva #include:
#define PRINT_GMT_DETAILS No se requieren otras modificaciones o cualquier llamada a funciones para el asesor experto o indicador.
- TimeGMT se fija sólo si se detecta el probador de la estrategia.
- El arreglo funciona en el símbolo seleccionado en el probador de estrategias.
- No hay errores de cálculo durante los fines de semana o las vacaciones de Navidad.
- Baja sobrecarga y rápido tiempo de cálculo en el probador de estrategias.
El recálculo del offset del broker tiene lugar sólo al inicio del asesor experto y cada domingo y lunes a medianoche. El desplazamiento del corredor calculado se almacenará en la memoria caché y se utilizará para las siguientes llamadas a TimeGMT.
Selección del Símbolo para la Estimación de la TZ/DST del Servidor
Por defecto, la librería buscará y cargará el símbolo XAUUSD para la estimación del desfase horario del servidor. XAUUSD puede proporcionar resultados más fiables (especialmente para los corredores que siguen el horario DST de la UE ) en las semanas en que los horarios DST de EE.UU. y DST de la UE no están sincronizados (marzo y finales de octubre). Opcionalmente, si su corredor sigue el horario DST de EE.UU., o ningún horario en absoluto, a continuación, utilizando el símbolo del gráfico también está bien. Llame CTimeGMT::SetUsingGoldSymbol() con 'false' para utilizar el símbolo del gráfico actual, en lugar de XAUUSD.
Para determinar el horario de verano (DST) de su broker, puede utilizar este script https://www.mql5.com/es/code/48650
//+------------------------------------------------------------------+ //| Establece la opción de utilizar el símbolo XAUUSD (Oro) para estimar la ||. //| TZ/DST del servidor por análisis del historial de citas H1. || //| TRUE : buscar y cargar el símbolo Gold (comportamiento por defecto). || //| FALSE : utilizar el símbolo del gráfico actual. || //+------------------------------------------------------------------+ void CTimeGMT::SetUsingGoldSymbol(const bool enabled = true);
Nota:
Como un efecto secundario que XAUUSD comienza una hora después de Forex, por lo tanto los cambios dst ocurrirán una hora más tarde en el probador de estrategias.
TimeGMT_TestEA
Para explorar la biblioteca en el probador de estrategias, se prueba un asesor experto de demostración en el probador de estrategias
estos son los resultados de ejecutar el asesor experto en el probador de estrategias:
AUDUSD,M1 (ICMarketsSC-Demo): 1 minutes OHLC ticks generating AUDUSD,M1: testing of Experts\TimeGMT_TestEA.ex5 from 2023.03.05 00:00 to 2023.05.01 00:00 started with inputs: timer_hours=24 2023.03.05 00:00:00 TimeCurrent() = Sun, 2023.03.05 00:00:00 | TimeTradeServer() = Sun, 2023.03.05 00:00:00 | TimeGMT() = Sat, 2023.03.04 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.06 00:00:00 TimeCurrent() = Mon, 2023.03.06 00:00:00 | TimeTradeServer() = Mon, 2023.03.06 00:00:00 | TimeGMT() = Sun, 2023.03.05 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.07 00:00:00 TimeCurrent() = Tue, 2023.03.07 00:00:00 | TimeTradeServer() = Tue, 2023.03.07 00:00:00 | TimeGMT() = Mon, 2023.03.06 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.08 00:00:00 TimeCurrent() = Wed, 2023.03.08 00:00:00 | TimeTradeServer() = Wed, 2023.03.08 00:00:00 | TimeGMT() = Tue, 2023.03.07 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.09 00:00:00 TimeCurrent() = Thu, 2023.03.09 00:00:00 | TimeTradeServer() = Thu, 2023.03.09 00:00:00 | TimeGMT() = Wed, 2023.03.08 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.10 00:00:00 TimeCurrent() = Fri, 2023.03.10 00:00:00 | TimeTradeServer() = Fri, 2023.03.10 00:00:00 | TimeGMT() = Thu, 2023.03.09 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.11 00:00:00 TimeCurrent() = Fri, 2023.03.10 23:56:59 | TimeTradeServer() = Sat, 2023.03.11 00:00:00 | TimeGMT() = Fri, 2023.03.10 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.12 00:00:00 TimeCurrent() = Fri, 2023.03.10 23:56:59 | TimeTradeServer() = Sun, 2023.03.12 00:00:00 | TimeGMT() = Sat, 2023.03.11 22:00:00 | BrokerOffset = 7200 (GMT+2) 2023.03.13 00:00:00 TimeCurrent() = Mon, 2023.03.13 00:00:00 | TimeTradeServer() = Mon, 2023.03.13 00:00:00 | TimeGMT() = Sun, 2023.03.12 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.14 00:00:00 TimeCurrent() = Tue, 2023.03.14 00:00:00 | TimeTradeServer() = Tue, 2023.03.14 00:00:00 | TimeGMT() = Mon, 2023.03.13 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.15 00:00:00 TimeCurrent() = Wed, 2023.03.15 00:00:00 | TimeTradeServer() = Wed, 2023.03.15 00:00:00 | TimeGMT() = Tue, 2023.03.14 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.16 00:00:00 TimeCurrent() = Thu, 2023.03.16 00:00:00 | TimeTradeServer() = Thu, 2023.03.16 00:00:00 | TimeGMT() = Wed, 2023.03.15 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.17 00:00:00 TimeCurrent() = Fri, 2023.03.17 00:00:00 | TimeTradeServer() = Fri, 2023.03.17 00:00:00 | TimeGMT() = Thu, 2023.03.16 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.18 00:00:00 TimeCurrent() = Fri, 2023.03.17 23:56:59 | TimeTradeServer() = Sat, 2023.03.18 00:00:00 | TimeGMT() = Fri, 2023.03.17 21:00:00 | BrokerOffset = 10800 (GMT+3) 2023.03.19 00:00:00 TimeCurrent() = Fri, 2023.03.17 23:56:59 | TimeTradeServer() = Sun, 2023.03.19 00:00:00 | TimeGMT() = Sat, 2023.03.18 21:00:00 | BrokerOffset = 10800 (GMT+3)
Actualizaciones:
2024.03.30 - v.1.25 : Corregido el offset GMT del broker. Actualmente, la biblioteca explora barras H1 sólo en el gráfico de ORO, ya que tiene los tiempos de inicio más precisos.
2024.04.09 - v.1.33 : Corregido posible problema en el cálculo del offset GMT del broker durante las vacaciones de Navidad en brokers GMT+0.
2024.04.12 - v.1.35 : Corregido problema en el cálculo del offset GMT del broker en algunos brokers que no ofrecen trading con oro.
2024.07.07 - v.1.36 : Corregida incidencia en la correcta detección del símbolo ORO en algunos brokers.
2024.10.21 - v.1.40 : Mejorada la detección del símbolo ORO con un fallback al símbolo EURUSD.
2024.10.26 - v.1.47 : Añadido mejor manejo de errores y código de depuración. Renombrado el método HistoryBrokerOffset() a TimeServerGMTOffset().
2024.10.28 - v.1.49 : Convertidas todas las macros que tratan con el tiempo en funciones para evitar la doble evaluación de parámetros dentro del cuerpo de la macro. Más limpieza de código en otras líneas.
2024.10.30 - v.1.50 : Corregido problema de estimación errónea del desfase GMT de las cotizaciones XAUEUR en algunos brokers.
2024.11.23 - v.1.55 : Añadida una opción para desactivar la carga por defecto del símbolo Gold para la estimación de la TZ/DST del servidor. Llame CTimeGMT::SetUsingGoldSymbol() con 'false' para utilizar el símbolo del gráfico actual, en su lugar.
2024.12.12 - v.1.60 : Mejora del rendimiento de la función HistoryServerGMTOffset() y otros cambios menores en el código.
2024.12.14 - v.1.61 : Mejora del rendimiento de la función FindSymbol().
2024.12.17 - v.1.62 : Optimización adicional de la función HistoryServerGMTOffset().
2024.12.24 - v.1.63 : Corregido posible problema en la función HistoryServerGMTOffset().
Zona Horaria del Broker y Horario DST
La Hora Media de Greenwich (GMT), también llamada Tiempo Universal Coordinado (UTC) se utiliza como referencia mundial oficial para la hora. A menudo verá zonas horarias representadas como UTC - 3h o GMT - 3h. En este ejemplo, el (-3h) se refiere a que esa zona horaria tiene tres horas menos que UTC o GMT. UTC+3h o GMT +3h se refiere a que esa zona horaria está tres horas por delante de UTC o GMT. La diferencia horaria entre nuestra hora local y GMT (UTC) se denomina desfase GMT.
El mercado Forex abre el domingo a las 17:00 hora de Nueva York (GMT-5:00 en invierno y GMT-4:00 en verano) y cierra el viernes a la misma hora. La hora de inicio del mercado Forex el dom, 17:00 de Nueva York corresponde al dom, 22: 00 U TC en invierno (y al dom, 21:00 UTC en verano). El mercado de divisas cierra el viernes a las 22:00 UTC en invierno (y a las 21:00 UTC en verano). El mercado al contado del oro y la plata suele comenzar una hora más tarde. enlace
Cada corredor de divisas tiene su zona horaria y la hora de su servidor. Por lo tanto, el inicio de la semana de negociación (velas H1) es variable entre los brokers, y puede variar desde elDom, 02:00 PM hora del servidorpara brokers en San Francisco (GMT-8), hastael Lun, 09:00 AM hora del servidorpara brokers en Sydney (GMT+11). El final de la semana de negociación también varía desdeel viernes a las 14:00,horadel servidor, hastael sábado a las 09:00, hora del servidor.
Cada broker es libre de elegir su horario de verano (DST). Y el DST no es necesariamente el mismo para esa zona horaria. A veces lo mezclan usando una zona horaria de la UE y un DST de EE.UU. en lugar del DST de la UE. Para los corredores que no siguen el horario de EE.UU., la hora del servidor para el inicio (y fin) de semana varía en +/- una hora para el mismo corredor a lo largo del año. Para manejar estas variaciones, el recálculo del offset del broker tiene que hacerse semanalmente, para que los cambios de DST en el broker puedan ser detectados a tiempo.
El uso de una zona horaria de +2 (y +3 en verano en el horario de EE.UU.) por lo tanto significa que las velas de cada semana comienzan en la medianoche del lunes, y hay cinco velas D1 por semana y el inicio de una vela diaria (y H4) es el comienzo de un nuevo día FX. Cada semana termina justo antes de la medianoche del sábado. No hay velas los sábados y domingos.Simplemente, la hora en estos servidores está siempre 7 horas por delante de Nueva York y se representa como NY+7. Con mucho, esta es la configuración más común, pero hay muchas variaciones menos comunes.
Detalles del cálculo del GMT verdadero
Cuando una llamada a TimeGMT() es interceptada por la librería, primero comprueba si no se está ejecutando en el probador de estrategias, entonces devuelve la función original. Si el probador de estrategias es detectado, el código comienza a calcular el offset del broker (ver más adelante), luego el valor de retorno es simplemente el resultado de restar este offset de la hora actual del servidor de operaciones en la terminal cliente.
true GMT = TimeTradeServer() - ServerGMTOffset (of the current trading week)
El propio'ServerGMTOffset' puede estimarse, mediante el análisis del historial de cotizaciones H1, como la diferencia entre dos horas conocidas:
1) la hora a la que aparece la primera barra de la semana de negociación en el gráfico GOLD (FstBarWk),
2) la hora UTC correspondiente al inicio de la negociación del ORO en Nueva York a las 18:00 horas del domingo .
ServerGMTOffset = FstBarWk - UTC (NY Sun, 18:00)
El cálculo de BrokerOffset utiliza una modificación optimizada del algoritmo que fue publicado por Carl Schreiber aquí en Dealing with time (2) funciones
Según https://www.timeanddate.com/time/change/usa/new-york
- En Nueva York, el DST comienza (horario de verano) a las 02:00 am hora local del segundo domingo de marzo. El reloj se adelantará una hora a GMT-4, por lo que la hora UTC correspondiente para NY Sun, 18:00 es (Sun, 22:00 UTC).
- Como, el DST termina (horario de invierno) en Nueva York a las 02:00 hora local del primer domingo de noviembre, el reloj se atrasará una hora hasta GMT-5, por lo que la hora UTC correspondiente para NY Sun, 18:00 es (Sun, 23:00 UTC).
Por ejemplo, si la FstBarWk en el gráfico GOLD comienza en Mon, 01:00, y es invierno en Nueva York en esa barra, entonces BrokerOffset puede calcularse como:
ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 23:00 UTC) = 2 hours (GMT+2)
y, si es verano en Nueva York, entonces BrokerOffset:
ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 22:00 UTC) = 3 hours (GMT+3)
Conversión de las horas de sesión a la hora del servidor del broker
Los operadores pueden utilizar TimeGMT() para convertir las horas de sesión a la hora del servidor correspondiente para determinar cuándo abrirán o cerrarán determinados mercados. Por ejemplo, si un operador quiere operar en la sesión asiática (Tokio), debe ajustar sus horas de negociación, en consecuencia
1] Determinar el desplazamiento del servidor de operaciones del corredor
int ServerGMTOffset = TimeTradeServer() - TimeGMT();
2] Convertir las horas locales de los mercados específicos a la hora del servidor del corredor correspondiente.
datetime Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset El segundo término de la ecuación (xxx_GMTOffset) debe incrementarse en +1 hora, si la zona horaria de destino se encuentra actualmente en el horario de verano.
Durante las pruebas en el probador de estrategias, Time GMT() es siempre igual a la hora del servidor simulado de TimeTradeServer(), por lo tanto la conversión de los tiempos de sesión se vuelve errónea . Esta librería arreglará la función TimeGMT() para proveer el GMT verdadero, por lo tanto los tiempos de sesión convertidos se vuelven precisos durante las pruebas en el probador de estrategias.
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/code/48291
Simple Bar Timer
Es un script para mostrar el tiempo restante hasta que llegue la siguiente barra.
Funciones de X a tiempo, Y a precio y viceversa
Funciones para usar en lugar de ChartXYToTimePrice y ChartTimePriceToXY, trabajando correcta y rápidamente en todo el rango de parámetros de entrada.
Statistical Zigzag
Se trata de un zigzag que crea nuevos puntos de giro en zigzag en función de la superación de un umbral de volatilidad
Historex: export the history of rates and ticks to CSV-files
Este es un script para exportar tasas y ticks del símbolo del gráfico actual a archivos CSV compatibles con el formato de exportación/importación de MT5.
