Mira cómo descargar robots gratis
¡Búscanos en Facebook!
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
Librerías

Local Timezones and Local Session Hours - librería para MetaTrader 5

Visualizaciones:
102
Ranking:
(16)
Publicado:
TimeZoneInfo.mqh (121.12 KB) ver
SessionHours.mqh (17.48 KB) ver
print_times.mq5 (1.7 KB) ver
examples.mq5 (67.07 KB) ver
TestIndi.mq5 (14.95 KB) ver
MQL5 Freelance ¿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.21 - v.1.90 : Mejorada la detección del símbolo ORO con retorno al símbolo EURUSD.

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) 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 ErrorDescription - Biblioteca actualizada

Esta biblioteca es una versión actualizada de la biblioteca ErrorDescription.mqh publicada por MetaQuotes, con algunas características incluidas.

Teclado Teclado

Trabajar con datos del teclado

Class For Working With Databases In A Simplified Manner Class For Working With Databases In A Simplified Manner

easydatabase