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:
- 102
- Ranking:
- Publicado:
-
¿Necesita un robot o indicador basado en este código? Solicítelo en la bolsa freelance Pasar a la bolsa
Hola traders.
Esta biblioteca tiene todas las funciones para obtener la hora local actual en un específico o todos los mercados de Forex. Puedes convertir las horas locales entre zonas horarias o a la hora del servidor de tu broker. También puede operar en sesiones específicas mediante el establecimiento de las horas de inicio y fin de sesión para cada sesión, por separado. La librería se encargará de los diferentes desfases horarios y cambios de hora de verano del broker y de estos mercados. Esto alivia la carga de reinventar la rueda cada vez que se programa un asesor experto o un indicador técnico que tiene que lidiar con las zonas horarias y las horas de las sesiones locales.
¿Qué es la zona horaria?
La zona horaria se define como la hora estándar en función de la representación geográfica de ese lugar. En otras palabras, la zona horaria se refiere a la hora local de una región en particular basada en la rotación de la tierra. Se define en UTC (Tiempo Universal Coordinado), el estándar con el que se coordina la hora mundial por regiones.
Por ejemplo: la hora de Nueva York es 5 horas inferior a la de Greenwich y se representa como UTC-5 o UTC-4 en función de la luz diurna. La hora en Sydney está 10 horas por delante de Greenwich y se representa como UTC+10 o UTC+11 en función de la luz diurna (verano o invierno). Los términos UTC y GMT suelen utilizarse indistintamente para expresar desfases, por lo que UTC+2 y GMT+2 suelen tener el mismo significado.
El desfase UTC es positivo si la zona horaria está al este de GMT, y es negativo si la zona horaria está al oeste de GMT.
Identificadores de zona horaria
//+------------------------------------------------------------------+ //| Identificadores de zona horaria| //+------------------------------------------------------------------+ enum ENUM_ZONE_ID { ZONE_ID_SYDNEY, // Sídney ZONE_ID_TOKYO, // Tokio ZONE_ID_FRANKFURT, // Fráncfort ZONE_ID_LONDON, // Londres ZONE_ID_NEWYORK, // Nueva York ZONE_ID_UTC, // UTC ZONE_ID_LOCAL, // LOCAL ZONE_ID_BROKER, // BROKER ZONE_ID_CUSTOM // PERSONALIZADO };
Interfaz de clase
//+------------------------------------------------------------------+ //| Clase CTimeZoneInfo.| //| Propósito: Clase para acceder a la hora local para el | especificado //| ubicación, así como información de la zona horaria, hora | //| cambios para el año en curso.| //|| //| Notación de desplazamiento utilizada en la biblioteca:| //| Tenga en cuenta que la biblioteca denota tiempo positivo. //| zonas por desfases positivos, y zonas horarias negativas | //| por desplazamientos negativos.| //| Por el contrario, MQL5 incorpora TimeGMTOffset() || //| función denota zonas horarias positivas, como GMT+3, | //| por desplazamientos negativos, como -10800, y viceversa. //+------------------------------------------------------------------+ class CTimeZoneInfo { public: CTimeZoneInfo( ENUM_ZONE_ID placeId, datetime pLocalTime = TIME_NOW ); ~CTimeZoneInfo( void ); string Name( void ); // Devuelve el nombre de la zona horaria string ToString( bool secs = true, bool tzname = true ); // Devuelve una cadena con la hora local formateada con el desfase TZ/DST y tzname bool RefreshTime( void ); // Actualizar la hora local actual y rellenar la información de la zona horaria bool SetLocalTime( datetime pLocalTime = TIME_NOW ); // Establecer la hora local para esta ubicación a la hora especificada datetime TimeLocal( void ); // Devuelve la hora local en la zona horaria datetime TimeUTC( void ); // Devuelve la hora UTC (la misma en todas las zonas horarias) int TimeGMTOffset( void ); // Valor positivo para zonas horarias positivas (por ejemplo, GMT+3), negativo en caso contrario. (incluye DST) int TimeDaylightSavings( void ); // Devuelve la corrección DST (en segundos) para la zona horaria, a la hora local establecida. datetime ConvertLocalTime( ENUM_ZONE_ID destinationId ); // Convertir la hora local de esta zona horaria a una zona horaria diferente bool GetDaylightSwitchTimes( datetime &dst_start, datetime &dst_end ); // Obtener las horas de inicio y fin del horario de verano del año datetime GetDaylightNextSwitch( void ); // Obtener la hora local del próximo cambio de horario de verano void PrintObject( void ); //--- métodos estáticos que no requieren la creación de un objeto. static datetime GetCurrentTimeForPlace ( ENUM_ZONE_ID placeId ); // Obtener la hora local actual para la zona horaria especificada static string FormatTimeForPlace ( datetime time, ENUM_ZONE_ID placeId, bool secs = true, bool tzname = true ); static datetime ConvertTimeForPlace ( datetime time, ENUM_ZONE_ID placeId, ENUM_ZONE_ID destinationId ); static int TimeGMTOffset ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW ); // Devuelve el desfase tz total (UTC+DST) desde GMT, para una zona horaria a una hora local dada static int TimeDaylightSavings ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW ); // Devuelve la corrección dst en segundos, para una zona horaria a una hora local dada static bool IsDaylightSavingTime ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW ); // Comprueba si una hora especificada cae en el horario de verano static bool GetDaylightSwitchTimes ( ENUM_ZONE_ID placeId, int iYear, datetime &dst_start, datetime &dst_end ); static bool GetDaylightSwitchDeltas( ENUM_ZONE_ID placeId, int iYear, int &delta_start, int &delta_end ); static bool SetCustomTimeZone( string name, int baseGMTOffset = 0, // Define una zona horaria que no se encuentra en la biblioteca. ENUM_ZONE_ID dstSchedule = ZONE_ID_UTC ); static void SetUsingGoldSymbol( bool enabled = true ); // Establece la opción de usar el símbolo Gold para estimar la TZ/DST del servidor };
Interfaz de clase
//+------------------------------------------------------------------+ //| Clase CSessionHours.| //| Finalidad: Clase para acceder al horario de la sesión de negociación local para || //| la ubicación especificada.| //| Deriva de la clase CTimeZoneInfo.| //| Nota: El horario de sesión por defecto es de 8:00 a 17:00. //| Hora local para nuevos objetos CSessionHours. //+------------------------------------------------------------------+ class CSessionHours : public CTimeZoneInfo { public: CSessionHours( ENUM_ZONE_ID placeId ); ~CSessionHours( void ); //--- métodos para acceder a la hora local de la sesión bool RefreshTime( void ); // Actualizar la hora local actual y las horas de sesión del día bool SetLocalTime( datetime pLocalTime ); //--- métodos para anular las horas de sesión locales por defecto bool BeginLocalTime( int pHour, int pMinute ); // Establece la hora de inicio de la sesión local usando una hora y minuto de inicio bool EndLocalTime( int pHour, int pMinute ); // Establece la hora de finalización de la sesión local utilizando una hora y minuto finales //--- métodos para acceder a las horas de sesión locales datetime BeginLocalTime( void ); datetime EndLocalTime( void ); bool CheckLocalSession( void ); // Comprueba si la sesión de negociación local está activa. int SecRemainingSession( void ); // Tiempo restante en segundos hasta el cierre de la sesión local del día. //--- métodos estáticos que no requieren la creación de un objeto. static datetime ForexCloseTime( void ); // La hora de cierre del mercado Forex para esta semana. static int SecRemainingForex( void ); // Tiempo restante en segundos hasta el cierre del mercado Forex para esta semana. };
Notación de desfase utilizada en la biblioteca
Tenga en cuenta que la biblioteca denota las zonas horarias positivas por desplazamientos positivos , y las zonas horarias negativas por desplazamientos negativos.
Esto es lo contrario de la función incorporada en MQL5 TimeGMTOffset() que denota zonas horarias positivas, como GMT+3, por desfases negativos, como -10800, y viceversa.
Selección del Símbolo para la Estimación de la TZ/DST del Servidor
Por defecto, la biblioteca 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 gráfico también está bien. Llame a CTimeZoneInfo::SetUsingGoldSymbol() con 'false' para usar 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). || TRUE : buscar y cargar el símbolo Gold (comportamiento por defecto). //| FALSE : utilizar el símbolo del gráfico actual. || //+------------------------------------------------------------------+ void CTimeZoneInfo::SetUsingGoldSymbol(const bool enabled = true);
Nota:
Como efecto secundario de que XAUUSD comienza una hora después de Forex, los cambios de dst se producirán una hora más tarde (sólo en el probador de estrategias, y no en el modo normal).
Nota sobre la compatibilidad con el Probador de Estrategias
Durante las pruebas en el probador de estrategias,TimeGMT() es siempre igual a la hora simulada del servidorTimeTradeServer().
La librería TimeZoneInfo estima los tiempos apropiados en las zonas horarias basándose en el "verdadero" GMT mediante el análisis del historial de cotizaciones H1, y no basándose en el tiempo devuelto al llamar a la función incorporada TimeGMT.
Si el símbolo XAUUSD es usado para estimar la TZ/DST del servidor, entonces los cambios de dst ocurrirán una hora más tarde en el probador de estrategias.
I. Trabajar con zonas horarias locales
¿Cómo obtener la hora actual?
El método RefreshTime()actualizará la hora local actual de la zona horaria. Veamos un ejemplo para mostrar como podemos obtener la hora actual.
Print("\n========== Get the current time in a timezone =========="); CTimeZoneInfo tz(ZONE_ID_TOKYO); tz.RefreshTime(); // rellenar la información de la zona horaria actual Print("Name() : ", tz.Name()); Print("TimeLocal() : ", tz.TimeLocal()); Print("ToString() : ", tz.ToString());
salida:
// ========== Obtener la hora actual en una zona horaria ========== // Nombre() : Tokio // HoraLocal() : 2024.02.28 19:58:50 // ToString() : Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo]
¿Necesita más información?
Print("\n========== More information about a timezone =========="); CTimeZoneInfo tz(ZONE_ID_NEWYORK); tz.RefreshTime(); Print("Name() : ", tz.Name()); Print("TimeUTC() : ", tz.TimeUTC()); Print("TimeLocal() : ", tz.TimeLocal()); Print("TimeGMTOffset() : ", tz.TimeGMTOffset()); Print("TimeDaylightSavings() : ", tz.TimeDaylightSavings()); Print("ToString() : ", tz.ToString()); datetime dst_start, dst_end; tz.GetDaylightSwitchTimes(dst_start, dst_end); Print("dst_start : ", dst_start); Print("dst_end : ", dst_end); Print("GetDaylightNextSwitch() : ", tz.GetDaylightNextSwitch());
salida:
// ========== Más información sobre una zona horaria ========== // Nombre() : Nueva York // TimeUTC() : 2024.03.17 16:50:38 // HoraLocal() : 2024.03.17 12:50:38 // TimeGMTOffset() : -14400 // TimeDaylightSavings() : 3600 // ToString() : Sun, 2024.03.17 12:50:38 GMT-4 [Nueva York] (DST) // dst_start : 2024.03.10 02:00:00 // dst_end : 2024.11.03 02:00:00 // GetDaylightNextSwitch() : 2024.11.03 02:00:00
Notas:
- El método TimeUTC( ) devuelve la hora UTC, que equivale a la hora GMT.
- El método TimeLocal( ) devuelve la hora local de esta zona horaria (que podría haber cambiado como resultado de llamar a los métodos RefreshTime o SetLocalTime ).
- El método TimeGMTOffset( ) devuelve la diferencia actual entre la hora local de esta zona horaria y la hora GMT en segundos, teniendo en cuenta el cambio al horario de invierno o verano. El offset devuelto incluye el ajuste DST de la zona horaria actual. El desfase GMT es positivo si la zona horaria está al este de (por delante de) GMT, y es negativo si la zona horaria está al oeste de (por detrás de) GMT.
- El método TimeDaylightSavings() devuelve el ajuste del horario de verano (DST) en segundos, si se ha realizado el cambio al horario de verano en las zonas donde el DST está en vigor. Si se ha realizado el cambio al horario de invierno (estándar) (o, si la zona horaria no soporta DST), devuelve 0. El ajuste dst ya forma parte del TimeGMTOffset.
¿Cómo configurar la zona horaria personalizada incorporada para su uso posterior?
La clase CTimeZoneInfo incluye un método SetCustomTimeZone , que se puede utilizar para configurar la zona horaria personalizada incorporada. Más tarde, la zona horaria personalizada se puede utilizar a través del identificador ZONE_ID_CUSTOM. Veamos un ejemplo para mostrar cómo podemos configurar la zona horaria personalizada incorporada con un nombre especificado, un desplazamiento respecto a la hora del meridiano de Greenwich (GMT) y un identificador de horario de verano.
Print("\n========== Configure the built-in custom timezone =========="); string name = "Custom+3"; // Nombre de la zona horaria personalizada int baseGMTOffset = 10800; // Desplazamiento GMT base de la zona horaria personalizada (en segundos) ENUM_ZONE_ID daylightRuleId = ZONE_ID_LONDON; // Horario DST de la zona horaria personalizada bool success = CTimeZoneInfo::SetCustomTimeZone(name, baseGMTOffset, daylightRuleId); Print("Parameter 'name' : ", name); Print("Parameter 'baseGMTOffset' : ", baseGMTOffset); Print("Parameter 'daylightRuleId' : ", EnumToString(daylightRuleId)); Print("SetCustomTimeZone() returns : ", success);
Salida:
// ========== Configurar la zona horaria personalizada incorporada ========== // Parámetro 'nombre' : Personalizado+3 // Parámetro 'baseGMTOffset' : 10800 // Parámetro 'daylightRuleId' : ZONE_ID_LONDON // SetCustomTimeZone() vuelve : true
Obtener la Hora Actual en Todas las Zonas Horarias
Veamos un ejemplo para mostrar cómo podemos obtener la hora local actual en todas las zonas horarias.
Print("\n========== Get Current Time in All Timezones =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString()); }
salida:
// ========== Obtener la hora actual en todas las zonas horarias ========== // Sydney : 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // Tokio : 2024.02.28 19:58 | Wed, 2024.02.28 19:58:50 GMT+9 [Tokio] // Frankfurt : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] // Londres : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [Londres] // Nueva York : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [Nueva York] // UTC : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC] // Inicio : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [Inicio] // FXOpen-MT5 : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
Esto se puede hacer de la otra forma utilizando el método estático GetCurrentTimeForPlace(). Además, hay otro método estático FormatTimeForPlace() que puede usarse para formatear variables datetime de mql a una cadena ( similar a TimeToString) pero con el día de la semana, la fecha, la hora, el nombre de la zona horaria y los desfases. Estos métodos estáticos no requieren la creación de objetos para llamarlos.
Print("\n========== GetCurrentTimeForPlace() =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { datetime time = CTimeZoneInfo::GetCurrentTimeForPlace(id); PrintFormat("Time : %s | %s", TimeToString(time), CTimeZoneInfo::FormatTimeForPlace(time, id)); }
salida:
// ========== GetCurrentTimeForPlace() ========== // Hora : 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // Hora : 2024.02.28 19:58 | Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo] // Hora : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] // Hora : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [Londres] // Hora : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [Nueva York] // Hora : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC] // Hora : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [Inicio] // Hora : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
¿Cómo establecer la hora local de la zona horaria?
El método SetLocalTime()establecerá lahora local especificada. Veamos un ejemplo para mostrar como podemos establecer la hora local para la zona horaria.
Print("\n========== Set the local time for a timezone =========="); CTimeZoneInfo tz(ZONE_ID_NEWYORK); if(tz.SetLocalTime(D'2021.07.15 09:31')) PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString()); if(tz.SetLocalTime(D'2022.01.23 17:04')) PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString()); if(tz.SetLocalTime(D'2023.03.12 02:21')) PrintFormat("%-12s: %s | %s", tz.Name(), TimeToString(tz.TimeLocal()), tz.ToString());
salida:
// ========== Establecer la hora local para una zona horaria ========== // Nueva York : 2021.07.15 09:31 | Thu, 2021.07.15 09:31:00 GMT-4 [Nueva York] (DST) // Nueva York : 2022.01.23 17:04 | Sun, 2022.01.23 17:04:00 GMT-5 [Nueva York] // >>Error: La hora 2023.03.12 02:21 no existe en Nueva York. Esto se debe a que el horario de verano se ha saltado una hora.
La causa del último mensaje de error que obtenemos se explicará en el siguiente párrafo.
Horario de verano (DST):
El DST es una medida de cambio de hora estacional en la que los relojes se adelantan a la hora estándar durante parte del año.
consulte https://www.timeanddate.com/time/dst/transition.html
("Salto de verano", "Retroceso de invierno")
Cuando comienza el horario de verano en primavera, los relojes se adelantan un cierto tiempo, normalmente una hora. Esto significa que se salta una hora en el reloj. En otoño, el periodo de DST suele terminar y los relojes vuelven a la hora estándar.
Ejemplo de inicio del horario de verano
(la hora inexistente)
En Estados Unidos, el DST comienza siempre a las 02:00 (2 am) hora local. En el momento en que la hora alcanza por primera vez la 1:59:59 hora estándar, los relojes se adelantan a las 3:00:00 hora de verano. Por lo tanto, la hora que va de las 2:00:00 a las 2:59:59 no existe en la noche del cambio.

II. Obtener información sobre la zona horaria
1. Desplazamiento UTC y desplazamiento DST actual
Veamos un ejemplo para mostrar cómo podemos obtener el nombre de la zona horaria, el desplazamiento UTC y el desplazamiento DST actual si el DST está en efecto.
Print("\n========== UTC offset and current DST offset =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); // rellenar la información de la zona horaria actual PrintFormat("%-12s: GMT%+g | DST%+g", tz.Name(), tz.TimeGMTOffset()/3600., tz.TimeDaylightSavings()/3600.); }
salida:
// ========== desfase UTC y desfase DST actual ========== // Sydney : GMT+11 | DST+1 // Tokio : GMT+9 | DST+0 // Frankfurt : GMT+1 | DST+0 // Londres : GMT+0 | DST+0 // Nueva York : GMT-4 | DST+1 // UTC : GMT+0 | DST+0 // Inicio : GMT+2 | DST+0 // FXOpen-MT5 : GMT+2 | DST+0
Notas:
- El método TimeGMTOffset() devuelve la diferencia actual entre la hora local de esta zona horaria y la hora GMT en segundos, teniendo en cuenta el cambio a horario de invierno o verano. El offset devuelto incluye el ajuste DST de la zona horaria actual. El desfase GMT es positivo si la zona horaria está al este de (por delante de) GMT, y es negativo si la zona horaria está al oeste de (por detrás de) GMT.
- El método TimeDaylightSavings() devuelve el ajuste del horario de verano (DST) en segundos, si se ha realizado el cambio al horario de verano en las zonas donde el DST está en vigor. Si se ha realizado el cambio al horario de invierno (estándar) (o, si la zona horaria no soporta DST), devuelve 0. El ajuste dst ya forma parte del TimeGMTOffset.
2. Cambio de horario DST para el año en curso
Veamos un ejemplo para mostrar cómo podemos obtener la información DST.
Print("\n========== DST switch times for the current year =========="); datetime dst_start, dst_end; for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); // rellenar la información de la zona horaria actual //--- sólo para zonas horarias que observan el horario de verano. if(tz.GetDaylightSwitchTimes(dst_start, dst_end)) { PrintFormat("%-12s: DST starts on %s | DST ends on %s", tz.Name(), TimeToString(dst_start), TimeToString(dst_end)); } }
salida:
// ========== Horario de verano para el año en curso ========== // Sydney : DST comienza el 2024.04.07 03:00 | DST termina el 2024.10.06 02:00 // Frankfurt : DST comienza el 2024.03.31 02:00 | DST termina el 2024.10.27 03:00 // Londres : DST comienza el 2024.03.31 01:00 | DST termina el 2024.10.27 02:00 // New York : DST comienza el 2024.03.10 02:00 | DST termina el 2024.11.03 02:00
3. Hora del próximo cambio DST
Veamos un ejemplo para mostrar como podemos obtener la hora del próximo cambio DST.
Print("\n========== Time of the next DST switch =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo tz(id); tz.RefreshTime(); datetime nxswitch = tz.GetDaylightNextSwitch(); //--- sólo para zonas horarias que observan el horario de verano. if(nxswitch) { PrintFormat("%-12s: Time: %s | dstNextSwitch: %s", tz.Name(), TimeToString(tz.TimeLocal()), TimeToString(nxswitch)); } }
salida:
// ========== Hora del próximo cambio DST ========== // Sydney : Hora: 2024.02.28 21:58 | dstNextSwitch: 2024.04.07 03:00 // Frankfurt : Hora: 2024.02.28 11:58 | dstNextSwitch: 2024.03.31 02:00 // Londres : Hora: 2024.02.28 10:58 | dstNextSwitch: 2024.03.31 01:00 // Nueva York : Hora: 2024.02.28 05:58 | dstNextSwitch: 2024.03.10 02:00
4. Lista DST
Veamos un ejemplo para mostrar cómo podemos obtener la información DST para todas las zonas horarias en esta biblioteca para un rango de años.
Print("\n========== DST List =========="); datetime dst_start, dst_end; int delta_start, delta_end; // cambios de reloj en seg for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { CTimeZoneInfo timezone(id); PrintFormat("========= %s Summer Time (DST) =========", timezone.Name()); for(int year=2008; year<=2030; year++) { //--- sólo para zonas horarias que observan el horario de verano. if(CTimeZoneInfo::GetDaylightSwitchTimes(id, year, dst_start, dst_end)) { CTimeZoneInfo::GetDaylightSwitchDeltas(id, year, delta_start, delta_end); PrintFormat("DST starts on %s (%+d) and ends on %s (%+d)",TimeToString(dst_start), delta_start/3600, TimeToString(dst_end), delta_end/3600); } } }
salida:
// ========== Lista DST ========== // ========= Horario de verano de Sydney (DST) ========= // DST comienza el 2008.04.06 03:00 (-1) y termina el 2008.10.05 02:00 (+1) // DST comienza el 2009.04.05 03:00 (-1) y termina el 2009.10.04 02:00 (+1) // DST comienza el 2010.04.04 03:00 (-1) y termina el 2010.10.03 02:00 (+1) // DST comienza el 2011.04.03 03:00 (-1) y termina el 2011.10.02 02:00 (+1) // DST comienza el 2012.04.01 03:00 (-1) y termina el 2012.10.07 02:00 (+1) // ... // ... // ...
5. Offset GMT del Servidor (Actual)
El offset GMT del broker indica cuántos segundos está adelantada la hora del broker con respecto a GMT, offset broker = TimeTradeServer() - TimeGMT(). Valores positivos indican que la hora del servidor está adelantada respecto a GMT. Veamos un ejemplo para mostrar como podemos obtener el offset GMT actual del broker.
Print("\n========== Current GMT offset of the broker ========== "); CTimeZoneInfo broker(ZONE_ID_BROKER); broker.RefreshTime(); Print("Name() : ", broker.Name()); Print("TimeLocal() : ", broker.TimeLocal()); // tiempo de agente Print("ToString() : ", broker.ToString()); Print("TimeGMTOffset() : ", broker.TimeGMTOffset());
salida:
// ========== Desplazamiento GMT actual del corredor ========== // Nombre() : ICMarketsSC-Demo // HoraLocal() : 2024.03.08 06:33:06 // ToString() : Fri, 2024.03.08 06:33:06 GMT+2 [ICMarketsSC-Demo] // TimeGMTOffset() : 7200
Nota: Una nota importante para el TimeGMTOffset() es que devolverá el offset utc incluyendo la corrección dst (UTC+DST). Valores positivos indican que la hora del servidor está adelantada (al este) de GMT.
6. Offset GMT del servidor (Histórico)
Los desfases GMT pasados del servidor pueden calcularse como la diferencia entre la hora de aparición de la primera barra de la semana del servidor en el gráfico, y la hora UTC correspondiente al domingo a las 5 PM, hora de Nueva York. Veamos un ejemplo para mostrar cómo podemos obtener los desfases GMT pasados del broker. Para este ejemplo, utilizaremos las horas de las velas del gráfico como hora pasada del broker.
Print("\n========== Past GMT offsets of the broker (chart candles) =========="); datetime bartimes[]; int copied = CopyTime(Symbol(), PERIOD_D1, D'2022.03.18', 9, bartimes); if(copied<=0) Print("CopyTime() failed."); for(int i =0; i < copied; i++) { datetime t = bartimes[i]; CTimeZoneInfo broker(ZONE_ID_BROKER); broker.SetLocalTime(t); PrintFormat("bar #%i Time: %s | offset: %5d (GMT%+g) | %s", i+1, TimeToString(broker.TimeLocal()), broker.TimeGMTOffset(), broker.TimeGMTOffset()/3600.0, broker.ToString()); }
salida:
// ========== Desplazamientos GMT pasados del corredor (velas del gráfico) ========== // bar #1 Hora: 2022.03.08 00:00 | offset: 7200 (GMT+2) | Tue, 2022.03.08 00:00:00 GMT+2 [ICMarketsSC-Demo] // bar #2 Hora: 2022.03.09 00:00 | offset: 7200 (GMT+2) | Wed, 2022.03.09 00:00:00 GMT+2 [ICMarketsSC-Demo] // bar #3 Hora: 2022.03.10 00:00 | offset: 7200 (GMT+2) | Thu, 2022.03.10 00:00:00 GMT+2 [ICMarketsSC-Demo] // bar #4 Hora: 2022.03.11 00:00 | offset: 7200 (GMT+2) | Fri, 2022.03.11 00:00:00 GMT+2 [ICMarketsSC-Demo] // bar #5 Hora: 2022.03.14 00:00 | offset: 10800 (GMT+3) | Mon, 2022.03.14 00:00:00 GMT+3 [ICMarketsSC-Demo] // bar #6 Hora: 2022.03.15 00:00 | offset: 10800 (GMT+3) | Tue, 2022.03.15 00:00:00 GMT+3 [ICMarketsSC-Demo] // bar #7 Hora: 2022.03.16 00:00 | offset: 10800 (GMT+3) | Wed, 2022.03.16 00:00:00 GMT+3 [ICMarketsSC-Demo] // bar #8 Hora: 2022.03.17 00:00 | offset: 10800 (GMT+3) | Thu, 2022.03.17 00:00:00 GMT+3 [ICMarketsSC-Demo] // bar #9 Hora: 2022.03.18 00:00 | offset: 10800 (GMT+3) | Fri, 2022.03.18 00:00:00 GMT+3 [ICMarketsSC-Demo]
Como, usted ve en la barra #5, el servidor ha cambiado de +2 horario de invierno a +3 horario de verano, y el tiempo del cambio sigue el horario DST de EE.UU. (2do Domingo de Marzo). Hay cinco velas D1 por semana, y no hay velas en Sábado y Domingo. El tiempo en estos servidores es siempre 7 horas adelante de Nueva York a través del año y representado como NY+7. Note que NY es -5 en invierno, y -4 en verano.
Esta es la primera biblioteca en el código base capaz de determinar el desfase GMT del servidor en el pasado (desfases GMT históricos). El algoritmo implementado en los cálculos es muy rápido y preciso, y es compatible - en la medida de lo posible - con diferentes brokers (probado en un gran número de brokers con diferentes desfases GMT u horarios DST).
III. Conversión entre zonas horarias
Convertir la hora local actual a otra zona horaria
Utilice el método ConvertLocalTime() para convertir la hora local de esta instancia de zona horaria a una zona horaria específica. Este método devuelve una nueva hora de una zona horaria determinada.
Veamos un ejemplo para mostrar cómo podemos convertir la hora local"actual" a una zona horaria específica.
Print("\n========== Convert current local time in Sydney to New York =========="); CTimeZoneInfo sydney(ZONE_ID_SYDNEY); sydney.RefreshTime(); datetime localtime = sydney.TimeLocal(); datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK); PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString()); PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));
salida:
// ========== Convertir la hora local actual de Sydney a Nueva York ========== // 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [Nueva York]
Convertir una hora local concreta a otra zona horaria
Veamos un ejemplo para mostrar cómo podemos convertir una hora local específica a una zona horaria específica.
Print("\n========== Convert a specific local time in Sydney to New York =========="); CTimeZoneInfo sydney(ZONE_ID_SYDNEY); sydney.SetLocalTime(D'2016.05.21 14:47:08'); datetime localtime = sydney.TimeLocal(); datetime converted = sydney.ConvertLocalTime(ZONE_ID_NEWYORK); PrintFormat("%s | %s", TimeToString(localtime), sydney.ToString()); PrintFormat("%s | %s", TimeToString(converted), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_NEWYORK));
salida:
// ========== Convertir una hora local específica de Sydney a Nueva York ========== // 2016.05.21 14:47 | Sat, 2016.05.21 14:47:08 GMT+10 [Sydney] // 2016.05.21 00:47 | Sat, 2016.05.21 00:47:08 GMT-4 [Nueva York] (DST)
Convertir la hora local actual en todas las zonas horarias a la hora del broker
Veamos un ejemplo para mostrar como podemos convertir la hora local actual en todas las zonas horarias a la hora del broker.
Print("\n========== Convert the current local time in all timezones to the broker time =========="); for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++) { datetime localtime = CTimeZoneInfo::GetCurrentTimeForPlace(id); datetime converted = CTimeZoneInfo::ConvertTimeForPlace(localtime, id, ZONE_ID_BROKER); PrintFormat("%-49s | %s", CTimeZoneInfo::FormatTimeForPlace(localtime, id), CTimeZoneInfo::FormatTimeForPlace(converted, ZONE_ID_BROKER)); }
salida:
// ========== Convertir la hora local actual en todas las zonas horarias a la hora del broker ========== // Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 10:58:50 GMT+0 [Londres] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 05:58:50 GMT-5 [New York] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 10:58:50 GMT+0 [UTC] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 12:58:50 GMT+2 [Home] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] // Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]
IV. Trabajar con las horas locales de la sesión
A. Clase CTimeZoneInfo
Tenga en cuenta que el uso de la clase CTimeZoneInfo padre, en lugar de la clase CSessionHours , no es preferible, ya que requiere más codificación y por lo tanto propenso a errores. Veamos un ejemplo para mostrar como obtenemos las horas de la sesión Forex en todas las zonas horarias, y las convertimos a la hora del broker.
Print("\n======= Local Session Hours (CTimeZoneInfo Class) ======="); const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK}; for(int i = 0; i < ArraySize(ids); i++) { ENUM_ZONE_ID id = ids[i]; CTimeZoneInfo tz(id); tz.RefreshTime(); datetime localtime = tz.TimeLocal(); //--- fijar el horario de la sesión de 8:00 a 17:00 hora local datetime beginlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "08:00"); datetime endlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "17:00"); //--- conversión a tiempo de broker tz.SetLocalTime(beginlocal); datetime beginbroker = tz.ConvertLocalTime(ZONE_ID_BROKER); tz.SetLocalTime(endlocal); datetime endbroker = tz.ConvertLocalTime(ZONE_ID_BROKER); //--- día local de la semana en zona horaria MqlDateTime st; TimeToStruct(localtime, st); int dow = st.day_of_week; //string state_str = ((dow != SÁBADO && dow != DOMINGO) && (localtime >= beginlocal && localtime < endlocal)) ? "abierto" : "cerrado"; string state_str = ((dow != SATURDAY && dow != SUNDAY) && (TimeTradeServer() >= beginbroker && TimeTradeServer() < endbroker)) ? "open" : "closed"; PrintFormat("%-12s: %s | %s [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str); } Print("-----------------------------------"); Print("broker time : ", TimeTradeServer()); Print("broker time : ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER));
salida:
// ======= Horario de sesión local (Clase CTimeZoneInfo) ======= // Sydney : Wed, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [sesión cerrada] // Tokio : Mié, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Mié, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [sesión cerrada]. // Frankfurt : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [sesión abierta]. // Londres : Mié, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Mié, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [sesión abierta]. // Nueva York : Wed, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [sesión abierta] // ----------------------------------- // broker time : 2024.02.28 15:32:30 // broker time : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5]
B. Clase CSessionHours
Propósito: Clase para acceder a las horas locales de la sesión de negociación para la ubicación especificada.
Deriva de la clase CTimeZoneInfo.
Nota: El horario de sesión por defecto para los nuevos objetos CSessionHours es de 8:00 am - 5:00 pm hora local. Estos valores predeterminados pueden modificarse según se desee.
Trabajar con objetos CSessionHours
Veamos un ejemplo de cómo utilizar el objeto.
Print("\n========== Working with CSessionHours Objects =========="); CSessionHours tz(ZONE_ID_SYDNEY); tz.RefreshTime(); // rellenar la zona horaria y la información de la sesión //--- del padre Print("Name() : ", tz.Name()); Print("TimeUTC() : ", tz.TimeUTC()); Print("TimeLocal() : ", tz.TimeLocal()); Print("ToString() : ", tz.ToString()); //--- de la clase Print("BeginLocalTime() : ", tz.BeginLocalTime()); Print("EndLocalTime() : ", tz.EndLocalTime()); Print("CheckLocalSession() : ", tz.CheckLocalSession()); Print("SecRemainingSession() : ", tz.SecRemainingSession()); Print("SecondsToString() : ", CSessionHours::SecondsToString(tz.SecRemainingSession()));
salida:
// ========== Trabajar con objetos CSessionHours ========== // Nombre() : Sydney // TimeUTC() : 2024.02.28 10:58:50 // HoraLocal() : 2024.02.28 21:58:50 // ToString() : Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST) // BeginLocalTime() : 2024.02.28 08:00:00 // EndLocalTime() : 2024.02.28 17:00:00 // CheckLocalSession() : false // SecRemainingSession() : 0 // SecondsToString() : 00:00:00
Local Session Hours
El CSessionHours proporciona más funcionalidad con menos código. Veamos un ejemplo para mostrar como obtenemos las horas de sesión Forex en todas las zonas horarias utilizando la Clase CSessionHours , y las convertimos a la hora del broker. Tenga en cuenta que la conversión a la hora del broker es un paso opcional, y no es necesario para comprobar las horas de inicio y fin de cada sesión.
Print("\n======= Local Session Hours (CSessionHours Class) ======="); const ENUM_ZONE_ID ids[] = {ZONE_ID_SYDNEY, ZONE_ID_TOKYO, ZONE_ID_FRANKFURT, ZONE_ID_LONDON, ZONE_ID_NEWYORK}; for(int i = 0; i < ArraySize(ids); i++) { ENUM_ZONE_ID id = ids[i]; CSessionHours tz(id); tz.RefreshTime(); //--- el horario de sesión por defecto es de 8:00 a 17:00 hora local datetime beginlocal = tz.BeginLocalTime(); datetime endlocal = tz.EndLocalTime(); //--- conversión a tiempo de broker datetime beginbroker = CTimeZoneInfo::ConvertTimeForPlace(beginlocal, id, ZONE_ID_BROKER); datetime endbroker = CTimeZoneInfo::ConvertTimeForPlace(endlocal, id, ZONE_ID_BROKER); string state_str = tz.CheckLocalSession() ? "open, ends in " + CSessionHours::SecondsToString(tz.SecRemainingSession()) : "closed"; PrintFormat("%-12s: %s | %s [session %s]", tz.Name(), CTimeZoneInfo::FormatTimeForPlace(beginbroker, ZONE_ID_BROKER), CTimeZoneInfo::FormatTimeForPlace(endbroker, ZONE_ID_BROKER), state_str); } Print("-----------------------------------"); Print("broker time : ", TimeTradeServer()); Print("broker time : ", CTimeZoneInfo::FormatTimeForPlace(TimeTradeServer(), ZONE_ID_BROKER)); Print("Fx close : ", CTimeZoneInfo::FormatTimeForPlace(CSessionHours::ForexCloseTime(), ZONE_ID_BROKER)); int sec = CSessionHours::SecRemainingForex(); Print("closes in : ", sec, " sec = ", CSessionHours::SecondsToString(sec));
salida:
// ======= Horas de la sesión local (Clase CSessionHours) ======= // Sydney : Wed, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [sesión cerrada] // Tokio : Mié, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Mié, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [sesión cerrada]. // Frankfurt : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [sesión abierta, finaliza en 02:27:29]. // Londres : Mié, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Mié, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [sesión abierta, termina en 03:27:29]. // Nueva York : Wed, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [sesión abierta, termina en 08:27:29]. // ----------------------------------- // broker time : 2024.02.28 15:32:30 // broker time : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5] // Cierre Fx : Sat, 2024.03.02 00:00:00 GMT+2 [FXOpen-MT5] // cierra en : 203249 seg = 2d 08:27:29
¿Cómo anular las horas locales de sesión por defecto?
Veamos un ejemplo para mostrar cómo podemos anular las horas de sesión por defecto en la clase CSessionHours .
Print("\n=========== Override the default session hours ==========="); CSessionHours frankfurt(ZONE_ID_FRANKFURT); // cambiar los tiempos de sesión por defecto frankfurt.BeginLocalTime(9, 0); frankfurt.EndLocalTime(19, 0); frankfurt.RefreshTime(); // rellenar las horas de la nueva sesión datetime beginlocal = frankfurt.BeginLocalTime(); datetime endlocal = frankfurt.EndLocalTime(); PrintFormat("new session hours : %s | %s", CTimeZoneInfo::FormatTimeForPlace(beginlocal, ZONE_ID_FRANKFURT), CTimeZoneInfo::FormatTimeForPlace(endlocal, ZONE_ID_FRANKFURT)); PrintFormat("current local time : %s", frankfurt.ToString());
salida:
// =========== Anular las horas de sesión por defecto =========== // nuevo horario de sesión : Mié, 2024.02.28 09:00:00 GMT+1 [Frankfurt] | Mié, 2024.02.28 19:00:00 GMT+1 [Frankfurt] // hora local actual : Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt]
¿Cómo Comprobar el Cierre de Posiciones en Fin de Semana?
El método estático SecRemainingForex() devolverá el tiempo restante en segundos hasta el cierre del mercado Forex para esta semana. Este método debería ser llamado desde el manejador de eventos OnTick()(o mejor desde OnTimer() en caso de que no haya ticks justo antes del fin de semana) para comprobar repetidamente la condición de cierre. Veamos un ejemplo para mostrar como podemos comprobar las posiciones de cierre en fin de semana.
Print("\n======= Check For Closing Positions at Weekend ======="); int InpHours = 2; // Horas antes del fin de semana int InpMinutes = 30; // Minutos antes del fin de semana int sec = CSessionHours::SecRemainingForex(); PrintFormat("Time remaining till the weekend : %s", CSessionHours::SecondsToString(sec)); PrintFormat("Close all if remaining time becomes %s or less.", CSessionHours::SecondsToString(InpHours * 3600 + InpMinutes * 60)); // comprueba si el tiempo restante ha alcanzado el objetivo if(sec <= InpHours * 3600 + InpMinutes * 60) { // CerrarTodos(); }
Alternativamente, se puede comprobar la condición anterior utilizando tiempos absolutos:
// comprueba que el tiempo del corredor ha alcanzado el objetivo if(TimeTradeServer() >= CSessionHours::ForexCloseTime() - (InpHours * 3600 + InpMinutes * 60)) { // CerrarTodos(); }
salida:
// ======= Compruebe los puestos que se cierran el fin de semana en ======= // Tiempo restante hasta el fin de semana : 3d 03:32:27 // Cerrar todo si el tiempo restante es 02:30:00 o menos.
Fin de Semana - Zona Horaria del Broker y Horario DST
El mercado Forex abre el domingo a las 17:00 hora de Nueva York (GMT-5 en invierno y GMT-4 en verano) y cierra el viernes a la misma hora. La hora de apertura en NYC corresponde al dom, 10:00 PM UTC en invierno (y al dom, 09:00 PM 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 servidor para brokers en San Francisco (GMT-8), hastael Lun, 09:00 AM hora del servidor para brokers en Sydney (GMT+11). El final de la semana de negociación también varía desde elviernes alas 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 . El método ForexCloseTime() maneja estas variaciones inter e intra corredor convirtiendo la hora de cierre en NYC en Vie, 17:00 a la hora del corredor, teniendo en cuenta los desfases horarios y el DST, proporcionando así resultados precisos.
El uso de una zona horaria de +2 (y +3 en verano en el horario de EE.UU.) significa, por tanto, que hay cinco velas D1 por semana. No hay velas los sábados y domingos de todo el año. 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 un montón de variaciones menos comunes.
Ejemplo de indicador TestIndi.mq5

iForexSessions - indicador para MetaTrader 5
Destaca las Sesiones del Mercado Forex
Consígalo aquí https://www.mql5.com/es/code/48842
Enlaces
Reloj mundial: https: //www.timeanddate.com/worldclock/
Convertidor de zona horaria: https: //www.timeanddate.com/worldclock/converter-classic.html
Actualizaciones:
2024.03.01 - v.1.40 : Eliminado código redundante en la clase CTimeZoneInfo (utilizada durante las pruebas), añadidos más métodos a la clase CSessionHours, actualizado TestIndi.mq5 para reflejar los nuevos cambios.
2024.03.03 - v.1.45 : Actualizado el código de ejemplo para "Trabajar con horas de sesión local - Clase CTimeZoneInfo".
2024.03.08 - v.1.50 : Añadidos dos métodos internos HistoryBrokerOffset y FirstBarOfWeek a la clase CTimeZoneInfo. Manejo de la hora del servidor en el pasado (desplazamiento UTC, formato de texto, conversiones, etc.).
2024.03.15 - v.1.56 : Añadido script "SydneySession_Script.mq5" para mostrar cómo fluctúan las horas de sesión en Sydney a lo largo del año.
2024.03.30 - v.1.65 : Corregido el offset GMT del broker. Actualmente, la librería escanea barras H1 sólo en el gráfico GOLD ya que tiene las horas de inicio más precisas en todos los brokers que he probado.
2024.04.01 - v.1.67 : Corregido un posible problema en el cálculo del offset GMT del broker durante la primera hora de la semana de negociación.
2024.04.03 - v.1.70 : Almacenamiento en caché de las desviaciones GMT del corredor en un mapa hash para una recuperación más rápida (por ejemplo, desde los indicadores). La caché de offset de broker contendrá una entrada por semana de negociación.
2024.04.08 - v.1.72 : Mejorado el rendimiento de la biblioteca por lo menos 2-3 veces. Ahora se utiliza StructToTime en lugar de StringToTime dentro del método GetNthSunday.
2024.04.09 - v.1.75 : Corregido problema potencial en el cálculo del offset GMT del broker durante las vacaciones de Navidad en brokers GMT+0.
2024.04.11 - v.1.77 : Aceleración del método GetDaylightSwitchTimes. Ahora utiliza una matriz estática para memorizar las horas de cambio para el año en curso.
2024.04.12 - v.1.80 : Corregido problema en el cálculo del offset GMT del broker en brokers que no ofrecen trading en oro.
2024.04.15 - v.1.82 : Añadido el método SetCustomTimeZone a la clase CTimeZoneInfo, que puede utilizar para configurar la zona horaria personalizada incorporada con un nombre especificado, desplazamiento GMT e identificador DST. Se puede acceder a la zona horaria personalizada a través de ZONE_ID_CUSTOM.
2024.04.16 - v.1.85 : Sustituido el método interno GetNthSunday por el método más optimizado GetMonthTime.
2024.04.17 - v.1.87 : Sustituido el método interno TimeYear por el método más optimizado GetYear.
2024.04.18 - v.1.88 : Añadido el método interno CreateDateTime para construir valores datetime a partir de componentes de fecha (año, mes y día). Esto es 100-120 veces más rápido que llamar a la función StructToTime.
2024.10.22 - v.1.93 : Determinación más rápida del desfase GMT del servidor durante el fin de semana en las operaciones en directo.
2024.10.26 - v.1.95 : Añadidos dos nuevos métodos estáticos: TimeGMTOffset() y TimeDaylightSavings(). Renombrado el método HistoryBrokerOffset() a TimeServerGMTOffset().
2024.10.28 - v.1.97 : Convertidas todas las macros que tratan del 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.98 : Corregido problema de estimación errónea del desfase GMT de las cotizaciones XAUEUR en algunos brokers.
2024.11.01 - v.1.99 : 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 CTimeZoneInfo:: SetUsingGoldSymbol() con 'false' para utilizar el símbolo del gráfico actual, en su lugar.
2024.11.13 - v.2.00 : Mejora de la estimación de tz/dst del servidor en línea y en la estrategia de estrategia (biblioteca TimeGMT ya no es necesario). Constructor acepta parámetros de lugar y hora. Nuevos métodos públicos para trabajar con datos de tipo datetime. Mejorada la gestión de errores y el soporte de depuración.
2024.11.14 - v.2.02 : Corregido error ERR_HISTORY_NOT_FOUND (4401) al intentar acceder al histórico de cotizaciones XAUUSD,H1 por el objeto timezone del servidor.
2024.11.17 - v.2.03 : Corrección de errores menores.
2024.11.23 - v.2.04 : Mejoras y correcciones menores.
2024.12.05 - v.2.05 : Añadido nuevo método estático DaylightSavingsSupported(placeId).
2024.12.12 - v.2.10 : Mejorado el rendimiento de las funciones HistoryServerGMTOffset() y HistoryServerDaylightSavings(), y otros cambios menores de código.
2024.12.14 - v.2.11 : Mejora del rendimiento de la función FindSymbol().
2024.12.17 - v.2.12 : Mayor optimización de las funciones HistoryServerGMTOffset() y HistoryServerDaylightSavings().
2024.12.24 - v.2.13 : Corregido posible problema en las funciones HistoryServerGMTOffset() y HistoryServerDaylightSavings().
2025.01.12 - v.2.15 : Corregida incidencia en HistoryServerDaylightSavings() de búsqueda de histórico de cotizaciones anterior al histórico cargado en el probador de estrategias.
2025.10.13 - v.2.17 : Mejoras menores y corrección de errores.
Traducción del inglés realizada por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/en/code/48419
CVD (Cumulative Volume Delta)
Lightweight CVD (Cumulative Volume Delta) para MT5 - basado en M1, muestra la presión de compra/venta como velas con reinicios opcionales.
ErrorDescription - Biblioteca actualizada
Esta biblioteca es una versión actualizada de la biblioteca ErrorDescription.mqh publicada por MetaQuotes, con algunas características incluidas.
Teclado
Trabajar con datos del teclado
Class For Working With Databases In A Simplified Manner
easydatabase
