Schau, wie man Roboter kostenlos herunterladen kann
Finden Sie uns auf Facebook!
und werden Sie Mitglied unserer Fangruppe
Interessantes Skript?
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Hat Ihnen das Skript gefallen?
Bewerten Sie es im Terminal MetaTrader 5
Bibliotheken

Local Timezones and Local Session Hours - Bibliothek für den MetaTrader 5

Ansichten:
34
Rating:
(16)
Veröffentlicht:
MQL5 Freelance Benötigen Sie einen Roboter oder Indikator, der auf diesem Code basiert? Bestellen Sie ihn im Freelance-Bereich Zum Freelance

Hallo, Trader.

Diese Bibliothek enthält alle Funktionen, um die aktuelle Ortszeit in einem bestimmten oder allen Forex-Märkten zu ermitteln. Sie können die lokalen Zeiten zwischen Zeitzonen oder in die Serverzeit Ihres Brokers umrechnen. Sie können auch in bestimmten Sitzungen handeln, indem Sie die Start- und Endzeiten der Sitzungen für jede Sitzung separat festlegen. Die Bibliothek kümmert sich um die verschiedenen Zeitverschiebungen und Sommerzeitumstellungen des Brokers und dieser Märkte. So müssen Sie nicht jedes Mal das Rad neu erfinden, wenn Sie einen Expertenberater oder einen technischen Indikator programmieren, der mit Zeitzonen und lokalen Sitzungszeiten zu tun hat.


Was ist die Zeitzone?

Die Zeitzone ist definiert als die Standardzeit in Abhängigkeit von der geografischen Lage des jeweiligen Ortes. Mit anderen Worten, die Zeitzone bezieht sich auf die lokale Zeit einer bestimmten Region, die auf der Erdrotation basiert. Sie wird in UTC (Coordinated Universal Time) definiert, dem Standard, mit dem die Zeit in den einzelnen Regionen der Welt koordiniert wird.

Beispiel: Die Zeit in New York liegt 5 Stunden hinter Greenwich zurück und wird je nach Tageslicht als UTC-5 oder UTC-4 dargestellt. Die Zeit in Sydney ist Greenwich 10 Stunden voraus und wird je nach Tageslicht (Sommer oder Winter) als UTC+10 oder UTC+11 dargestellt. Die Begriffe UTC und GMT werden oft austauschbar verwendet, um Zeitverschiebungen auszudrücken, so dass UTC+2 und GMT+2 oft die gleiche Bedeutung haben.

Der UTC-Offset ist positiv, wenn die Zeitzone östlich von GMT liegt, und er ist negativ, wenn die Zeitzone westlich von GMT liegt.


Zeitzonenbezeichner

//+------------------------------------------------------------------+
//| Zeitzonenbezeichner|
//+------------------------------------------------------------------+
enum ENUM_ZONE_ID
  {
   ZONE_ID_SYDNEY,     // Sydney
   ZONE_ID_TOKYO,      // Tokio
   ZONE_ID_FRANKFURT,  // Frankfurt
   ZONE_ID_LONDON,     // London
   ZONE_ID_NEWYORK,    // New York
   ZONE_ID_UTC,        // UTC
   ZONE_ID_LOCAL,      // LOKAL
   ZONE_ID_BROKER,     // BROKER
   ZONE_ID_CUSTOM      // CUSTOM
  };


Klassenschnittstelle

//+------------------------------------------------------------------+
//| Klasse CTimeZoneInfo.|
//| Zweck: Klasse für den Zugriff auf die lokale Zeit für die angegebene Adresse.
//| Standort sowie Zeitzoneninformationen, Uhrzeit |
//| Änderungen für das laufende Jahr.|
//||
//| Die in der Bibliothek verwendete Offset-Notation:|
//| Bitte beachten Sie, dass die Bibliothek positive Zeitangaben macht.
//| Zonen mit positivem Versatz und negative Zeitzonen |
//| durch negative Offsets.|
//| Im Gegenteil, MQL5's eingebauter TimeGMTOffset() |
Funktion bezeichnet positive Zeitzonen, wie GMT+3, //|
//| durch negative Offsets, wie -10800, und umgekehrt. ||
//+------------------------------------------------------------------+
class CTimeZoneInfo
  {
public:
                     CTimeZoneInfo( ENUM_ZONE_ID placeId, datetime pLocalTime = TIME_NOW );
                    ~CTimeZoneInfo( void );

   string            Name( void );                                                       // Gibt den Namen der Zeitzone zurück
   string            ToString( bool secs = true, bool tzname = true );                   // Gibt eine mit TZ/DST-Offset und tzname formatierte Zeichenfolge der Ortszeit zurück
   bool              RefreshTime( void );                                                // Aktualisieren der aktuellen Ortszeit und Auffüllen der Zeitzoneninformationen
   bool              SetLocalTime( datetime pLocalTime = TIME_NOW );                     // Setzen Sie die Ortszeit für diesen Ort auf die angegebene Zeit

   datetime          TimeLocal( void );                                                  // Gibt die Ortszeit in der Zeitzone zurück
   datetime          TimeUTC( void );                                                    // Gibt die UTC-Zeit zurück (in allen Zeitzonen gleich)
   int               TimeGMTOffset( void );                                              // Positiver Wert für positive Zeitzonen (z. B. GMT+3), sonst negativ. (einschließlich Sommerzeit)
   int               TimeDaylightSavings( void );                                        // Gibt die Sommerzeitkorrektur (in Sekunden) für die Zeitzone zur eingestellten Ortszeit zurück.

   datetime          ConvertLocalTime( ENUM_ZONE_ID destinationId );                     // Ortszeit in dieser Zeitzone in eine andere Zeitzone umrechnen
   bool              GetDaylightSwitchTimes( datetime &dst_start, datetime &dst_end );   // Abrufen der Anfangs- und Endzeiten der Sommerzeit für das Jahr
   datetime          GetDaylightNextSwitch( void );                                      // Ermitteln der Ortszeit für die nächste Sommerzeitumstellung
   void              PrintObject( void );

   //--- statische Methoden, die die Erstellung eines Objekts nicht erfordern.
   static datetime   GetCurrentTimeForPlace ( ENUM_ZONE_ID placeId );                    // Abrufen der aktuellen Ortszeit für die angegebene Zeitzone
   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 );   // Liefert den gesamten tz-Offset (UTC+DST) von GMT für eine Zeitzone zur angegebenen Ortszeit
   static int        TimeDaylightSavings    ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // Gibt die dst-Korrektur in Sekunden zurück, für eine Zeitzone zur angegebenen Ortszeit
   static bool       IsDaylightSavingTime   ( ENUM_ZONE_ID placeId, datetime time = TIME_NOW );   // Prüft, ob eine angegebene Zeit in die Sommerzeit fällt
   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,              // Definiert eine Zeitzone, die nicht in der Bibliothek enthalten ist.
                                        ENUM_ZONE_ID dstSchedule = ZONE_ID_UTC );
   static void       SetUsingGoldSymbol( bool enabled = true );                          // Legt die Option zur Verwendung des Gold-Symbols für die Schätzung der Server-TZ/Uhrzeit fest
  };


Klassenschnittstelle

//+------------------------------------------------------------------+
//| Klasse CSessionHours.|
//| Zweck: Klasse für den Zugriff auf die lokalen Börsensitzungszeiten für |
//| den angegebenen Ort.|
//| Leitet sich von der Klasse CTimeZoneInfo ab.|
//| Hinweis: Die Standard-Sitzungszeiten sind auf 8:00 - 17:00 Uhr eingestellt.
//| Ortszeit für neue CSessionHours-Objekte.
//+------------------------------------------------------------------+
class CSessionHours : public CTimeZoneInfo
  {
public:
                     CSessionHours( ENUM_ZONE_ID placeId );
                    ~CSessionHours( void );

   //--- Methoden zum Zugriff auf die lokale Sitzungszeit
   bool              RefreshTime( void );                            // Aktualisieren der aktuellen Ortszeit und der Sitzungsstunden für den Tag
   bool              SetLocalTime( datetime pLocalTime );

   //--- Methoden zum Aufheben der standardmäßigen lokalen Sitzungszeiten
   bool              BeginLocalTime( int pHour, int pMinute );       // Einstellen der lokalen Sitzungsanfangszeit unter Verwendung einer Anfangsstunde und -minute
   bool              EndLocalTime( int pHour, int pMinute );         // Einstellen der lokalen Sitzungsendzeit unter Verwendung einer Endstunde und -minute

   //--- Methoden für den Zugriff auf lokale Sitzungsstunden
   datetime          BeginLocalTime( void );
   datetime          EndLocalTime( void );
   bool              CheckLocalSession( void );                      // Prüfen Sie, ob die lokale Handelssitzung derzeit aktiv ist.
   int               SecRemainingSession( void );                    // Verbleibende Zeit in Sekunden bis zum Ende der lokalen Sitzung für den Tag.

   //--- statische Methoden, die die Erstellung eines Objekts nicht erfordern.
   static datetime   ForexCloseTime( void );                         // Die Brokerzeit, zu der der Forex-Markt für diese Woche schließt.
   static int        SecRemainingForex( void );                      // Verbleibende Zeit in Sekunden bis zur Schließung des Forex-Marktes für diese Woche.
  };


In der Bibliothek verwendete Offset-Notation

Bitte beachten Sie, dass die Bibliothek positive Zeitzonen durch positive Offsets und negative Zeitzonen durch negative Offsets kennzeichnet.

Dies ist das Gegenteil der in MQL5 eingebauten Funktion TimeGMTOffset(), die positive Zeitzonen, wie GMT+3, durch negative Offsets, wie -10800, bezeichnet und umgekehrt.


Auswahl des Symbols für die Schätzung der Server TZ/DST

Standardmäßig sucht und lädt die Bibliothek das Symbol XAUUSD für die Schätzung der Zeitzonenverschiebung des Servers. XAUUSD kann in Wochen, in denen die US-Sommerzeit und die EU-Sommerzeit nicht übereinstimmen (März und Ende Oktober), zuverlässigere Ergebnisse liefern (insbesondere für Broker, die der EU-Sommerzeit folgen). Wenn sich Ihr Broker an die US-Sommerzeit oder gar nicht an die EU-Sommerzeit hält, ist die Verwendung des Diagrammsymbols ebenfalls möglich. Rufen Sie CTimeZoneInfo::SetUsingGoldSymbol() mit 'false' auf, um das Symbol des aktuellen Charts anstelle von XAUUSD zu verwenden.

Um die Sommerzeit Ihres Brokers zu ermitteln, können Sie dieses Skript verwenden https://www.mql5.com/de/code/48650

//+------------------------------------------------------------------+
//| Legt die Option fest, das Symbol XAUUSD (Gold) zu verwenden, um den Preis zu schätzen.
//| TZ/DST des Servers durch Analyse des Verlaufs der H1-Zitate.
//| TRUE : Gold-Symbol suchen und laden (Standardverhalten).
//| FALSE : verwendet das Symbol des aktuellen Diagramms.
//+------------------------------------------------------------------+
void CTimeZoneInfo::SetUsingGoldSymbol(const bool enabled = true);

Anmerkung:

Als Nebeneffekt, dass XAUUSD eine Stunde nach Forex beginnt, wird die Sommerzeitumstellung eine Stunde später erfolgen (nur im Strategietester, nicht im normalen Modus).


Hinweis zur Kompatibilität mit dem Strategietester

Während des Tests im Strategietester ist TimeGMT() immer gleich der simulierten Serverzeit vonTimeTradeServer().

Die TimeZoneInfo-Bibliothek schätzt die richtigen Zeiten in den Zeitzonen auf der Grundlage der "wahren" GMT durch Analyse der H1-Kurs-Historie und nicht auf der Grundlage der Zeit, die durch den Aufruf der eingebauten TimeGMT-Funktion zurückgegeben wird.

Wenn das XAUUSD-Symbol für die Schätzung der TZ/DST des Servers verwendet wird, erfolgt der Wechsel der Zeitzone eine Stunde später im Strategietester.



I. Arbeiten mit lokalen Zeitzonen

Wie erhält man die aktuelle Zeit?

Die Methode RefreshTime()aktualisiert die aktuelle Ortszeit der Zeitzone. Anhand eines Beispiels soll gezeigt werden, wie die aktuelle Zeit ermittelt werden kann.

   Print("\n========== Get the current time in a timezone ==========");

   CTimeZoneInfo tz(ZONE_ID_TOKYO);
   tz.RefreshTime(); // Auffüllen der aktuellen Zeitzoneninformationen

   Print("Name()      : ", tz.Name());
   Print("TimeLocal() : ", tz.TimeLocal());
   Print("ToString()  : ", tz.ToString());

Ausgabe:

   // ========== Abfrage der aktuellen Zeit in einer Zeitzone ==========
   // Name() : Tokio
   // TimeLocal() : 2024.02.28 19:58:50
   // ToString() : Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo]


Benötigen Sie weitere Informationen?

   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());

ausgabe:

   // ========== Weitere Informationen über eine Zeitzone ==========
   // Name() : New York
   // TimeUTC() : 2024.03.17 16:50:38
   // TimeLocal() : 2024.03.17 12:50:38
   // TimeGMTOffset() : -14400
   // TimeDaylightSavings() : 3600
   // ToString() : Sun, 2024.03.17 12:50:38 GMT-4 [New 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

Anmerkungen:

- Die Methode TimeUTC() gibt die UTC-Zeit zurück, die der GMT-Zeit entspricht.

- Die Methode TimeLocal() gibt die lokale Zeit dieser Zeitzone zurück (die durch den Aufruf der Methoden RefreshTime oder SetLocalTime geändert worden sein könnte).

- Die Methode TimeGMTOffset() gibt die aktuelle Differenz zwischen der Ortszeit dieser Zeitzone und der GMT-Zeit in Sekunden zurück, wobei die Umstellung auf Winter- oder Sommerzeit berücksichtigt wird. Der zurückgegebene Offset beinhaltet die Sommerzeitanpassung der aktuellen Zeitzone. Der GMT-Offset ist positiv, wenn die Zeitzone östlich von (vor) GMT liegt, und er ist negativ, wenn die Zeitzone westlich von (hinter) GMT liegt.

- Die Methode TimeDaylightSavings() gibt die Sommerzeitanpassung in Sekunden zurück, wenn in den Zonen, in denen die Sommerzeit gilt, die Umstellung auf Sommerzeit erfolgt ist. Wurde auf Winterzeit (Standardzeit) umgestellt (oder unterstützt die Zeitzone keine Sommerzeit), wird 0 zurückgegeben. Die Sommerzeitanpassung ist bereits Teil des TimeGMTOffset.


Wie kann die eingebaute benutzerdefinierte Zeitzone für die spätere Verwendung konfiguriert werden?

Die Klasse CTimeZoneInfo enthält eine Methode SetCustomTimeZone , mit der Sie die eingebaute benutzerdefinierte Zeitzone konfigurieren können. Später kann die benutzerdefinierte Zeitzone über den Bezeichner ZONE_ID_CUSTOM verwendet werden. Anhand eines Beispiels soll gezeigt werden, wie die eingebaute benutzerdefinierte Zeitzone mit einem bestimmten Namen, einem Offset von der Greenwich Mean Time (GMT) und einem Tageszeitbezeichner konfiguriert werden kann.

   Print("\n========== Configure the built-in custom timezone ==========");

   string        name  = "Custom+3";               // Name der benutzerdefinierten Zeitzone
   int           baseGMTOffset  = 10800;           // Benutzerdefinierter GMT-Basisversatz der Zeitzone (in Sekunden)
   ENUM_ZONE_ID  daylightRuleId = ZONE_ID_LONDON;  // Zeitplan der benutzerdefinierten Zeitzone für die Sommerzeit

   bool success = CTimeZoneInfo::SetCustomTimeZone(name, baseGMTOffset, daylightRuleId);

   Print("Parameter 'name'            : ", name);
   Print("Parameter 'baseGMTOffset'   : ", baseGMTOffset);
   Print("Parameter 'daylightRuleId'  : ", EnumToString(daylightRuleId));
   Print("SetCustomTimeZone() returns : ", success);

Ausgabe:

   ========== Konfigurieren Sie die integrierte benutzerdefinierte Zeitzone ==========
   // Parameter "Name" : Benutzerdefiniert+3
   // Parameter "baseGMTOffset" : 10800
   // Parameter 'daylightRuleId' : ZONE_ID_LONDON
   // SetCustomTimeZone() gibt zurück: true


Aktuelle Zeit in allen Zeitzonen

Anhand eines Beispiels wollen wir zeigen, wie wir die aktuelle Ortszeit in allen Zeitzonen ermitteln können.

   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());
     }

Ausgabe:

   // ========== Aktuelle Zeit in allen Zeitzonen abfragen ==========
   // 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]
   // London : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [London]
   // New York : 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York]
   // UTC : 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC]
   // Home : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [Home]
   // FXOpen-MT5 : 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]


Dies kann auf andere Weise mit der statischen Methode GetCurrentTimeForPlace() geschehen. Beachten Sie auch, dass es eine weitere statische Methode FormatTimeForPlace() gibt, die verwendet werden kann, um einfache mql-Datetime-Variablen in einen String zu formatieren ( ähnlich wie TimeToString), jedoch mit Wochentag, Datum, Uhrzeit, dem Namen der Zeitzone und Offsets. Diese statischen Methoden erfordern nicht die Erstellung von Objekten, um sie aufzurufen.

   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));
     }

Ausgabe:

   // ========== GetCurrentTimeForPlace() ==========
   // Zeit: 2024.02.28 21:58 | Wed, 2024.02.28 21:58:50 GMT+11 [Sydney] (DST)
   // Zeit : 2024.02.28 19:58 | Wed, 2024.02.28 19:58:50 GMT+9 [Tokyo]
   // Zeit : 2024.02.28 11:58 | Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt]
   // Zeit: 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [London]
   // Zeit: 2024.02.28 05:58 | Wed, 2024.02.28 05:58:50 GMT-5 [New York]
   // Zeit: 2024.02.28 10:58 | Wed, 2024.02.28 10:58:50 GMT+0 [UTC]
   // Zeit: 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [Home]
   // Zeit: 2024.02.28 12:58 | Wed, 2024.02.28 12:58:50 GMT+2 [FXOpen-MT5]


Wie setzt man die Ortszeit für die Zeitzone?

Mit der Methode SetLocalTime()wird dieangegebene Ortszeit eingestellt. Anhand eines Beispiels soll gezeigt werden, wie die Ortszeit für die Zeitzone eingestellt werden kann.

   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());

Ausgabe:

   // ========== Einstellen der Ortszeit für eine Zeitzone ==========
   // New York : 2021.07.15 09:31 | Thu, 2021.07.15 09:31:00 GMT-4 [New York] (DST)
   // New York : 2022.01.23 17:04 | Sun, 2022.01.23 17:04:00 GMT-5 [New York]
   // >>Fehler: Die Zeit 2023.03.12 02:21 existiert nicht in New York. Das liegt daran, dass die Sommerzeit eine Stunde übersprungen hat.

Die Ursache für die letzte Fehlermeldung, die wir erhalten, wird im nächsten Abschnitt erklärt.


Sommerzeit (DST):

Die Sommerzeit ist eine saisonale Zeitumstellungsmaßnahme, bei der die Uhren während eines Teils des Jahres vor die Standardzeit gestellt werden.

siehe https://www.timeanddate.com/time/dst/transition.html

("Sommerzeit überspringen", "Winterzeit zurückstellen")

Wenn die Sommerzeit im Frühjahr beginnt, werden die Uhren um eine bestimmte Zeit, in der Regel um eine Stunde, vorgestellt. Dies bedeutet, dass eine Stunde auf der Uhr übersprungen wird. Im Herbst endet die Sommerzeit in der Regel, und die Uhren werden wieder auf die Standardzeit zurückgestellt.


Beispiel für den Beginn der Sommerzeit

(die nicht vorhandene Stunde)

In den Vereinigten Staaten beginnt die Sommerzeit immer um 02:00 Uhr (2 Uhr) Ortszeit. In dem Moment, in dem die Uhrzeit zum ersten Mal 1:59:59 Standardzeit erreicht, springen die Uhren auf 3:00:00 Sommerzeit vor. Die Stunde von 2:00:00 bis 2:59:59 gibt es also in der Nacht der Umstellung nicht.



II. Abrufen von Zeitzoneninformationen

1. UTC-Abweichung und aktuelle Sommerzeitabweichung

Anhand eines Beispiels soll gezeigt werden, wie der Name der Zeitzone, die UTC-Verschiebung und die aktuelle Sommerzeitverschiebung ermittelt werden können, wenn die Sommerzeit in Kraft ist.

   Print("\n========== UTC offset and current DST offset ==========");

   for(ENUM_ZONE_ID id=0; id <= MAX_ZONE_ID; id++)
     {
      CTimeZoneInfo tz(id);
      tz.RefreshTime(); // Auffüllen der aktuellen Zeitzoneninformationen

      PrintFormat("%-12s: GMT%+g | DST%+g", tz.Name(), tz.TimeGMTOffset()/3600., tz.TimeDaylightSavings()/3600.);
     }

Ausgabe:

   ========== UTC-Abweichung und aktuelle Sommerzeitabweichung ==========
   // Sydney : GMT+11 | DST+1
   // Tokio: GMT+9 | DST+0
   // Frankfurt: GMT+1 | DST+0
   // London : GMT+0 | DST+0
   // New York : GMT-4 | DST+1
   // UTC : GMT+0 | DST+0
   // Home : GMT+2 | DST+0
   // FXOpen-MT5 : GMT+2 | DST+0

Anmerkungen:

- Die Methode TimeGMTOffset() gibt die aktuelle Differenz zwischen der Ortszeit dieser Zeitzone und der GMT-Zeit in Sekunden zurück, wobei die Umstellung auf Winter- oder Sommerzeit berücksichtigt wird. Der zurückgegebene Offset beinhaltet die Sommerzeitanpassung der aktuellen Zeitzone. Der GMT-Offset ist positiv, wenn die Zeitzone östlich von (vor) GMT liegt, und er ist negativ, wenn die Zeitzone westlich von (hinter) GMT liegt.

- Die Methode TimeDaylightSavings() gibt die Sommerzeitanpassung in Sekunden zurück, wenn in den Zonen, in denen die Sommerzeit gilt, die Umstellung auf Sommerzeit erfolgt ist. Wurde auf Winterzeit (Standardzeit) umgestellt (oder unterstützt die Zeitzone keine Sommerzeit), wird 0 zurückgegeben. Die Sommerzeitanpassung ist bereits Teil des TimeGMTOffset.


2. Sommerzeitumstellung für das laufende Jahr

Anhand eines Beispiels soll gezeigt werden, wie wir die Sommerzeitinformationen erhalten können.

   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(); // Auffüllen der aktuellen Zeitzoneninformationen

      //--- nur für Zeitzonen, in denen die Sommerzeit gilt.
      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));
        }
     }

Ausgabe:

   // ========== Sommerzeitumstellung für das aktuelle Jahr ==========
   // Sydney: Sommerzeit beginnt am 2024.04.07 03:00 | Sommerzeit endet am 2024.10.06 02:00
   // Frankfurt: Die Sommerzeit beginnt am 31.03.2024 02:00 | Die Sommerzeit endet am 27.10.2024 03:00
   // London: Die Sommerzeit beginnt am 2024.03.31 01:00 | Die Sommerzeit endet am 2024.10.27 02:00
   // New York: Die Sommerzeit beginnt am 2024.03.10 02:00 | Die Sommerzeit endet am 2024.11.03 02:00

3. Zeitpunkt der nächsten Sommerzeitumstellung

Anhand eines Beispiels wird gezeigt, wie man die Uhrzeit der nächsten Sommerzeitumstellung abrufen kann.

   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();

      //--- nur für Zeitzonen, in denen die Sommerzeit gilt.
      if(nxswitch)
        {
         PrintFormat("%-12s:  Time: %s |  dstNextSwitch: %s", tz.Name(), TimeToString(tz.TimeLocal()), TimeToString(nxswitch));
        }
     }

Ausgabe:

   // ========== Zeitpunkt der nächsten Sommerzeitumstellung ==========
   // Sydney: Uhrzeit: 2024.02.28 21:58 | dstNextSwitch: 2024.04.07 03:00
   // Frankfurt : Zeit: 2024.02.28 11:58 | dstNextSwitch: 2024.03.31 02:00
   // London: Uhrzeit: 2024.02.28 10:58 | dstNextSwitch: 2024.03.31 01:00
   // New York : Zeit: 2024.02.28 05:58 | dstNextSwitch: 2024.03.10 02:00


4. DST-Liste

Anhand eines Beispiels wird gezeigt, wie man die Sommerzeitinformationen für alle Zeitzonen in dieser Bibliothek für eine Reihe von Jahren abrufen kann.

   Print("\n========== DST List ==========");

   datetime dst_start, dst_end;
   int delta_start, delta_end;  // Änderungen der Uhrzeit in Sekunden

   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++)
        {
         //--- nur für Zeitzonen, in denen die Sommerzeit gilt.
         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);
           }
        }

     }

Ausgabe:

   // ========== DST-Liste ==========
   ========= Sydney Sommerzeit (DST) =========
   // Die Sommerzeit beginnt am 2008.04.06 03:00 (-1) und endet am 2008.10.05 02:00 (+1)
   // Die Sommerzeit beginnt am 05.04.2009 03:00 (-1) und endet am 04.10.2009 02:00 (+1)
   // Die Sommerzeit beginnt am 04.04.2010 03:00 (-1) und endet am 03.10.2010 02:00 (+1)
   // Die Sommerzeit beginnt am 2011.04.03 03:00 (-1) und endet am 2011.10.02 02:00 (+1)
   // Die Sommerzeit beginnt am 01.04.2012 03:00 (-1) und endet am 07.10.2012 02:00 (+1)
   // ...
   // ...
   // ...

5. Server GMT-Offset (aktuell)

Der GMT-Offset des Brokers gibt an, um wie viele Sekunden die Brokerzeit der GMT voraus ist, Broker-Offset = TimeTradeServer() - TimeGMT(). Positive Werte bedeuten, dass die Serverzeit der GMT-Zeit voraus ist. Anhand eines Beispiels soll gezeigt werden, wie man den aktuellen GMT-Offset des Brokers ermitteln kann.

   Print("\n========== Current GMT offset of the broker ========== ");

   CTimeZoneInfo broker(ZONE_ID_BROKER);
   broker.RefreshTime();

   Print("Name()          : ", broker.Name());
   Print("TimeLocal()     : ", broker.TimeLocal());  // Maklerzeit
   Print("ToString()      : ", broker.ToString());
   Print("TimeGMTOffset() : ", broker.TimeGMTOffset());

Ausgabe:

   // ========== Aktueller GMT-Offset des Brokers ==========
   // Name() : ICMarketsSC-Demo
   // TimeLocal() : 2024.03.08 06:33:06
   // ToString() : Fri, 2024.03.08 06:33:06 GMT+2 [ICMarketsSC-Demo]
   // TimeGMTOffset() : 7200

Hinweis: Ein wichtiger Hinweis für TimeGMTOffset() ist, dass es den UTC-Offset einschließlich der DST-Korrektur (UTC+DST) zurückgibt. Positive Werte zeigen an, dass die Serverzeit vor (östlich) der GMT liegt.


6. Server GMT-Offset (Historisch)

Die GMT-Verschiebung des Servers in der Vergangenheit kann als Differenz zwischen dem Zeitpunkt des Erscheinens des ersten Balkens der Serverwoche im Chart und der UTC-Zeit, die Sonntag 17 Uhr New Yorker Zeit entspricht, berechnet werden. Anhand eines Beispiels soll gezeigt werden, wie die GMT-Verschiebung des Brokers in der Vergangenheit ermittelt werden kann. In diesem Beispiel werden wir die Zeiten der Chart-Kerzen als vergangene Zeit des Brokers verwenden.

   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());
     }

Ausgabe:

   ========== Vergangene GMT-Offsets des Brokers (Chart-Kerzen) ==========
   // bar #1 Zeit: 2022.03.08 00:00 | offset: 7200 (GMT+2) | Tue, 2022.03.08 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #2 Zeit: 2022.03.09 00:00 | offset: 7200 (GMT+2) | Wed, 2022.03.09 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #3 Time: 2022.03.10 00:00 | offset: 7200 (GMT+2) | Thu, 2022.03.10 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #4 Time: 2022.03.11 00:00 | offset: 7200 (GMT+2) | Fri, 2022.03.11 00:00:00 GMT+2 [ICMarketsSC-Demo]
   // bar #5 Zeit: 2022.03.14 00:00 | offset: 10800 (GMT+3) | Mon, 2022.03.14 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // bar #6 Time: 2022.03.15 00:00 | offset: 10800 (GMT+3) | Tue, 2022.03.15 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // bar #7 Zeit: 2022.03.16 00:00 | offset: 10800 (GMT+3) | Wed, 2022.03.16 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // bar #8 Zeit: 2022.03.17 00:00 | offset: 10800 (GMT+3) | Thu, 2022.03.17 00:00:00 GMT+3 [ICMarketsSC-Demo]
   // bar #9 Time: 2022.03.18 00:00 | offset: 10800 (GMT+3) | Fri, 2022.03.18 00:00:00 GMT+3 [ICMarketsSC-Demo]

Wie Sie in Balken Nr. 5 sehen, hat der Server von +2 Winterzeit auf +3 Sommerzeit umgestellt, und der Zeitpunkt der Umstellung folgt dem US-Sommerzeitplan (2. Sonntag im März). Es gibt fünf D1-Kerzen pro Woche und keine Kerzen am Samstag und Sonntag. Die Zeit auf diesen Servern ist das ganze Jahr über immer 7 Stunden vor New York und wird als NY+7 dargestellt. Beachten Sie, dass NY im Winter -5 und im Sommer -4 ist.

Dies ist die erste Bibliothek in der Codebasis, die in der Lage ist, die GMT-Verschiebung des Servers in der Vergangenheit zu bestimmen (historische GMT-Verschiebungen). Der in den Berechnungen implementierte Algorithmus ist sehr schnell und genau, und er ist - so weit wie möglich - mit verschiedenen Brokern kompatibel (getestet an einer großen Anzahl von Brokern mit unterschiedlichen GMT-Offsets oder Sommerzeitplänen).



III. Umrechnung zwischen Zeitzonen

Umrechnung der aktuellen Ortszeit in eine andere Zeitzone

Verwenden Sie die Methode ConvertLocalTime(), um die eingestellte Ortszeit dieser Zeitzoneninstanz in eine bestimmte Zeitzone zu konvertieren. Diese Methode gibt eine neue Zeit für eine bestimmte Zeitzone zurück.

Anhand eines Beispiels soll gezeigt werden, wie man die"aktuelle" Ortszeit in eine bestimmte Zeitzone umwandeln kann.

   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));

Ausgabe:

   ========== Aktuelle Ortszeit in Sydney in New York umrechnen ==========
   // 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 [New York]


Konvertierung einer bestimmten Ortszeit in eine andere Zeitzone

Anhand eines Beispiels wird gezeigt, wie man eine bestimmte Ortszeit in eine bestimmte Zeitzone umrechnen kann.

   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));

Ausgabe:

   ========== Konvertiert eine bestimmte Ortszeit in Sydney in New 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 [New York] (DST)


Konvertiere die aktuelle Ortszeit in allen Zeitzonen in die Brokerzeit

Anhand eines Beispiels soll gezeigt werden, wie die aktuelle Ortszeit in allen Zeitzonen in die Brokerzeit umgerechnet werden kann.

   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));
     }

Ausgabe:

   ========== Konvertiert die aktuelle Ortszeit in allen Zeitzonen in die Brokerzeit ==========
   // 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 [London] | 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. Arbeiten mit lokalen Sitzungszeiten

A. CTimeZoneInfo-Klasse

Beachten Sie, dass die Verwendung der übergeordneten CTimeZoneInfo-Klasse anstelle der CSessionHours-Klasse nicht zu bevorzugen ist, da sie mehr Codierung erfordert und daher fehleranfällig ist. Anhand eines Beispiels soll gezeigt werden, wie die Forex-Sitzungszeiten in allen Zeitzonen ermittelt und in die Zeit des Brokers umgerechnet werden.

   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();

      //--- Sitzungszeiten auf 8:00 - 17:00 Uhr Ortszeit einstellen
      datetime beginlocal = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "08:00");
      datetime endlocal   = StringToTime(TimeToString(localtime, TIME_DATE) + " " + "17:00");

      //--- Umrechnung in Maklerzeit
      tz.SetLocalTime(beginlocal);
      datetime beginbroker = tz.ConvertLocalTime(ZONE_ID_BROKER);

      tz.SetLocalTime(endlocal);
      datetime endbroker = tz.ConvertLocalTime(ZONE_ID_BROKER);

      //--- lokaler Wochentag in der Zeitzone
      MqlDateTime st;
      TimeToStruct(localtime, st);
      int dow = st.day_of_week;

      //string state_str = ((dow != SATURDAY && dow != SUNDAY) && (localtime >= beginlocal && localtime < endlocal)) ? "offen" : "geschlossen";
      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));

Ausgabe:

   // ======= Lokale Sitzungszeiten (CTimeZoneInfo-Klasse) =======
   // Sydney: Wed, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [Sitzung geschlossen]
   // Tokio: Wed, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [Sitzung geschlossen]
   // Frankfurt : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [session open]
   // London : Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [session open]
   // New York : Wed, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [session open]
   // -----------------------------------
   // broker zeit : 2024.02.28 15:32:30
   // broker time : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5]



B. CSessionHours Klasse

Zweck: Klasse für den Zugriff auf die lokalen Börsensitzungszeiten für den angegebenen Ort.

Abgeleitet von der Klasse CTimeZoneInfo.

Hinweis: Für neue CSessionHours-Objekte sind die Sitzungszeiten standardmäßig auf 8:00 - 17:00 Uhr Ortszeit festgelegt. Diese Standardwerte können nach Belieben überschrieben werden.


Arbeiten mit CSessionHours-Objekten

Lassen Sie uns ein Beispiel für die Verwendung des Objekts sehen.

   Print("\n========== Working with CSessionHours Objects  ==========");

   CSessionHours tz(ZONE_ID_SYDNEY);
   tz.RefreshTime(); // Zeitzone und Sitzungsinformationen auffüllen

   //--- von der Muttergesellschaft
   Print("Name()                : ", tz.Name());
   Print("TimeUTC()             : ", tz.TimeUTC());
   Print("TimeLocal()           : ", tz.TimeLocal());
   Print("ToString()            : ", tz.ToString());
   //--- von Klasse
   Print("BeginLocalTime()      : ", tz.BeginLocalTime());
   Print("EndLocalTime()        : ", tz.EndLocalTime());
   Print("CheckLocalSession()   : ", tz.CheckLocalSession());
   Print("SecRemainingSession() : ", tz.SecRemainingSession());
   Print("SecondsToString()     : ", CSessionHours::SecondsToString(tz.SecRemainingSession()));

Ausgabe:

   // ========== Arbeiten mit CSessionHours-Objekten ==========
   // Name() : Sydney
   // TimeUTC() : 2024.02.28 10:58:50
   // TimeLocal() : 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

CSessionHours bietet mehr Funktionalität mit weniger Code. Anhand eines Beispiels soll gezeigt werden, wie die Forex-Sitzungszeiten in allen Zeitzonen mit der CSessionHours-Klasse ermittelt und in die Zeit des Brokers umgewandelt werden. Beachten Sie, dass die Konvertierung in die Zeit des Brokers ein optionaler Schritt ist, der für die Überprüfung der Start- und Endzeiten der einzelnen Sitzungen nicht erforderlich ist.

   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();

      //--- Die Standard-Sitzungszeiten sind auf 8:00 bis 17:00 Uhr Ortszeit eingestellt.
      datetime beginlocal = tz.BeginLocalTime();
      datetime endlocal   = tz.EndLocalTime();

      //--- Umrechnung in Maklerzeit
      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));

Ausgabe:

   // ======= Lokale Sitzungsstunden (Klasse CSessionHours) =======
   // Sydney: Wed, 2024.02.28 23:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 08:00:00 GMT+2 [FXOpen-MT5] [Sitzung geschlossen]
   // Tokio: Wed, 2024.02.28 01:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] [Sitzung geschlossen]
   // Frankfurt : Wed, 2024.02.28 09:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 18:00:00 GMT+2 [FXOpen-MT5] [session open, ends in 02:27:29]
   // London: Wed, 2024.02.28 10:00:00 GMT+2 [FXOpen-MT5] | Wed, 2024.02.28 19:00:00 GMT+2 [FXOpen-MT5] [session open, ends in 03:27:29]
   // New York : Wed, 2024.02.28 15:00:00 GMT+2 [FXOpen-MT5] | Thu, 2024.02.29 00:00:00 GMT+2 [FXOpen-MT5] [session open, ends in 08:27:29]
   // -----------------------------------
   // broker zeit : 2024.02.28 15:32:30
   // broker time : Wed, 2024.02.28 15:32:30 GMT+2 [FXOpen-MT5]
   // Fx close : Sat, 2024.03.02 00:00:00 GMT+2 [FXOpen-MT5]
   // schließt in : 203249 sec = 2d 08:27:29


Wie kann man die standardmäßigen lokalen Sitzungszeiten außer Kraft setzen?

Anhand eines Beispiels soll gezeigt werden, wie die Standard-Sitzungszeiten in der Klasse CSessionHours außer Kraft gesetzt werden können.

   Print("\n=========== Override the default session hours ===========");

   CSessionHours frankfurt(ZONE_ID_FRANKFURT);

   // Standard-Sitzungszeiten ändern
   frankfurt.BeginLocalTime(9, 0);
   frankfurt.EndLocalTime(19, 0);

   frankfurt.RefreshTime(); // neue Sitzungsstunden auffüllen

   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());

Ausgabe:

   =========== Überschreiben Sie die Standard-Sitzungszeiten ===========
   // neue Sitzungszeiten : Wed, 2024.02.28 09:00:00 GMT+1 [Frankfurt] | Wed, 2024.02.28 19:00:00 GMT+1 [Frankfurt]
   // aktuelle Ortszeit : Wed, 2024.02.28 11:58:50 GMT+1 [Frankfurt]


Wie prüft man, ob Positionen am Wochenende geschlossen sind?

Die statische Methode SecRemainingForex() gibt die verbleibende Zeit in Sekunden bis zur Schließung des Forex-Marktes für diese Woche zurück. Diese Methode sollte vom OnTick()-Ereignishandler(oder besser von OnTimer(), falls kurz vor dem Wochenende keine Ticks mehr kommen) aufgerufen werden, um wiederholt die Schließungsbedingung zu prüfen. Anhand eines Beispiels soll gezeigt werden, wie man am Wochenende auf Schlusspositionen prüfen kann.

   Print("\n======= Check For Closing Positions at Weekend =======");

   int InpHours   = 2;   // Stunden vor dem Wochenende
   int InpMinutes = 30;  // Minuten vor dem Wochenende

   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));

   // Prüfung, ob die verbleibende Zeit das Ziel erreicht hat
   if(sec <= InpHours * 3600 + InpMinutes * 60)
     {
      // CloseAll();
     }

Alternativ kann die vorherige Bedingung auch mit absoluten Zeiten geprüft werden:

   // Prüfen, ob die Zeit des Brokers das Ziel erreicht hat
   if(TimeTradeServer() >= CSessionHours::ForexCloseTime() - (InpHours * 3600 + InpMinutes * 60))
     {
      // CloseAll();
     }

Ausgabe:

   // ======= Check für Schließungspositionen am Wochenende =======
   // Verbleibende Zeit bis zum Wochenende : 3d 03:32:27
   // Alle schließen, wenn die verbleibende Zeit 02:30:00 oder weniger beträgt.




Ende der Woche - Zeitzone des Brokers und Zeitplan der Sommerzeit

Der Forex-Markt öffnet am Sonntag um 17:00 Uhr New Yorker Zeit (GMT-5 im Winter und GMT-4 im Sommer) und schließt am Freitag zur gleichen Zeit. Die Öffnungszeit in NYC entspricht Sun, 10:00 PM UTC im Winter (und Sun, 09:00 PM UTC im Sommer). Der Devisenmarkt schließt am Freitag um 22:00 Uhr UTC im Winter (und um 21:00 Uhr UTC im Sommer). Der Spotmarkt für Gold und Silber beginnt in der Regel eine Stunde später. link

Jeder Forex-Broker hat seine eigene Zeitzone und Serverzeit. Daher ist der Beginn der Handelswoche (H1-Kerzen) von Broker zu Broker unterschiedlich und kann vonSun, 02:00 PM Serverzeit für Broker in San Francisco (GMT-8), bis zuMon, 09:00 AM Serverzeit für Broker in Sydney (GMT+11) variieren. Das Ende der Handelswoche variiert ebenfalls vonFr, 02:00 PM Serverzeit, bisSa, 09:00 AM Serverzeit.

Jeder Broker kann die Sommerzeit (DST) frei wählen. Und die Sommerzeit ist nicht unbedingt die gleiche für diese Zeitzone. Manchmal wird eine Mischung aus EU-Zeitzone und US-Sommerzeit anstelle der EU-Sommerzeit verwendet. Bei Brokern, die sich nicht an den US-Zeitplan halten, variiert die Serverzeit für den Wochenbeginn (und das Wochenende) für denselben Broker im Laufe des Jahres um +/- eine Stunde. Die Methode ForexCloseTime() behandelt diese Abweichungen zwischen und innerhalb von Brokern, indem sie die Uhrzeit des Börsenschlusses in NYC am Freitag um 17:00 Uhr in die Zeit des Brokers umrechnet und dabei die Zeitverschiebungen und die Sommerzeit berücksichtigt, um genaue Ergebnisse zu liefern.

Bei einer Zeitzone von +2 (und +3 im Sommer auf dem US-Zeitplan) gibt es also fünf D1-Kerzen pro Woche. Am Samstag und Sonntag gibt es das ganze Jahr über keine Kerzen. Einfach ausgedrückt, ist die Zeit auf diesen Servern immer 7 Stunden vor New York und wird als NY+7 dargestellt. Dies ist bei weitem die häufigste Einstellung, aber es gibt eine Menge weniger verbreiteter Variationen.



Beispiel-Indikator TestIndi.mq5


iForexSessions - Indikator für MetaTrader 5

Hebt die Forex Market Sessions hervor

Erhalten Sie ihn hier https://www.mql5.com/de/code/48842


Links

Weltzeituhr: https: //www.timeanddate.com/worldclock/

Zeitzonen-Konverter: https: //www.timeanddate.com/worldclock/converter-classic.html


Aktualisierungen:

2024.03.01 - v.1.40 : Redundanter Code in der Klasse CTimeZoneInfo entfernt (wird beim Testen verwendet), weitere Methoden zur Klasse CSessionHours hinzugefügt, TestIndi.mq5 aktualisiert, um die neuen Änderungen zu berücksichtigen.

2024.03.03 - v.1.45 : Den Beispielcode für "Arbeiten mit lokalen Sitzungszeiten - CTimeZoneInfo Klasse" aktualisiert.

2024.03.08 - v.1.50 : Zwei interne Methoden HistoryBrokerOffset und FirstBarOfWeek zur CTimeZoneInfo-Klasse hinzugefügt. Behandlung der Serverzeit in der Vergangenheit (UTC-Offset, Textformatierung, Konvertierungen, etc..).

2024.03.15 - v.1.56 : Skript "SydneySession_Script.mq5" hinzugefügt, um zu zeigen, wie sich die Sitzungszeiten in Sydney im Laufe des Jahres verändern.

2024.03.30 - v.1.65 : Broker GMT-Offset korrigiert. Zurzeit scannt die Bibliothek H1-Balken nur auf dem GOLD-Chart, da dieser bei allen von mir getesteten Brokern die genauesten Startzeiten hat.

2024.04.01 - v.1.67 : Es wurde ein mögliches Problem bei der Berechnung des GMT-Offsets des Brokers in der ersten Stunde der Handelswoche behoben.

2024.04.03 - v.1.70 : Zwischenspeicherung der GMT-Offsets von Brokern in einer Hash-Map zum schnelleren Abruf (z.B. von Indikatoren). Der Broker-Offset-Cache wird einen Eintrag pro Handelswoche enthalten.

2024.04.08 - v.1.72 : Verbesserung der Leistung der Bibliothek um mindestens das 2-3fache. Jetzt wird StructToTime anstelle von StringToTime in der GetNthSunday-Methode verwendet.

2024.04.09 - v.1.75 : Potenzielles Problem bei der Berechnung des GMT-Offsets des Brokers während der Weihnachtsfeiertage bei Brokern mit GMT+0 behoben.

2024.04.11 - v.1.77 : Beschleunigung der GetDaylightSwitchTimes-Methode . Jetzt wird ein statisches Array verwendet, um die Schaltzeiten für das aktuelle Jahr zu speichern.

2024.04.12 - v.1.80 : Problem bei der Berechnung des GMT-Offsets des Brokers bei Brokern, die keinen Goldhandel anbieten, behoben.

2024.04.15 - v.1.82 : SetCustomTimeZone-Methode zur CTimeZoneInfo-Klasse hinzugefügt, mit der Sie die eingebaute benutzerdefinierte Zeitzone mit einem bestimmten Namen, GMT-Offset und DST-Identifikator konfigurieren können. Auf die benutzerdefinierte Zeitzone kann über ZONE_ID_CUSTOM zugegriffen werden.

2024.04.16 - v.1.85 : Die interne Methode GetNthSunday wurde durch die optimierte Methode GetMonthTime ersetzt.

2024.04.17 - v.1.87 : Die interne Methode TimeYear wurde durch die optimierte Methode GetYear ersetzt.

2024.04.18 - v.1.88 : Die interne Methode CreateDateTime wurde hinzugefügt, um Datetime-Werte aus Datumskomponenten (Jahr, Monat und Tag) zu konstruieren. Dies ist 100-120x schneller als der Aufruf der Funktion StructToTime.

2024.10.21 - v.1.90 : Verbesserte Erkennung des GOLD-Symbols mit Fallback auf EURUSD-Symbol.

2024.10.22 - v.1.93 : Schnellere Bestimmung der GMT-Verschiebung des Servers am Wochenende im Live-Handel.

2024.10.26 - v.1.95 : Zwei neue statische Methoden hinzugefügt: TimeGMTOffset() und TimeDaylightSavings(). Umbenennung der Methode HistoryBrokerOffset() in TimeServerGMTOffset().

2024.10.28 - v.1.97 : Alle Makros für den Umgang mit der Zeit wurden in Funktionen umgewandelt, um eine doppelte Auswertung der Parameter im Makrokörper zu vermeiden. Weitere Codebereinigung in anderen Zeilen.

2024.10.30 - v.1.98 : Fehlerhafte Schätzung des GMT-Offsets von XAUEUR-Kursen bei einigen Brokern behoben.

2024.11.01 - v.1.99 : Es wurde eine Option hinzugefügt, um das standardmäßige Laden des Gold-Symbols für die Schätzung der TZ/DST des Servers zu deaktivieren. Rufen Sie CTimeZoneInfo:: SetUsingGoldSymbol() mit 'false' auf, um stattdessen das Symbol des aktuellen Charts zu verwenden.

2024.11.13 - v.2.00 : Verbesserte Schätzung der TZ/DST des Online-Servers und in der Strategie (TimeGMT-Bibliothek wird nicht mehr benötigt). Der Konstruktor akzeptiert Orts- und Zeitparameter. Neue öffentliche Methoden für die Arbeit mit Daten vom Typ datetime. Verbesserte Fehlerbehandlung und Debugging-Unterstützung.

2024.11.14 - v.2.02 : Der Fehler ERR_HISTORY_NOT_FOUND (4401) wurde behoben, wenn versucht wurde, über das Server-Zeitzonen-Objekt auf die XAUUSD,H1-Kursgeschichte zuzugreifen.

2024.11.17 - v.2.03 : Kleinere Fehlerbehebungen.

2024.11.23 - v.2.04 : Kleinere Verbesserungen und Fehlerkorrekturen.

2024.12.05 - v.2.05 : Neue statische Methode DaylightSavingsSupported(placeId) hinzugefügt.

2024.12.12 - v.2.10 : Verbesserte Leistung der Funktionen HistoryServerGMTOffset() und HistoryServerDaylightSavings(), sowie weitere kleinere Codeänderungen.

2024.12.14 - v.2.11 : Verbesserte Leistung der Funktion FindSymbol().

2024.12.17 - v.2.12 : Weitere Optimierung der Funktionen HistoryServerGMTOffset() und HistoryServerDaylightSavings().

2024.12.24 - v.2.13 : Mögliche Probleme in den Funktionen HistoryServerGMTOffset() und HistoryServerDaylightSavings() behoben.

2025.01.12 - v.2.15 : Korrigiertes Problem in HistoryServerDaylightSavings() bei der Suche nach Kursen, die früher als die geladene Historie im Strategietester waren.

2025.10.13 - v.2.17 : Kleinere Verbesserungen und Fehlerbehebungen.


Übersetzt aus dem Englischen von MetaQuotes Ltd.
Originalpublikation: https://www.mql5.com/en/code/48419

CVD (Cumulative Volume Delta) CVD (Cumulative Volume Delta)

Lightweight CVD (Cumulative Volume Delta) für MT5 - M1-basiert, zeigt Kauf-/Verkaufsdruck als Kerzen mit optionalen Rücksetzungen.

ErrorDescription - Aktualisierte Bibliothek ErrorDescription - Aktualisierte Bibliothek

Diese Bibliothek ist eine aktualisierte Version der von MetaQuotes veröffentlichten Bibliothek ErrorDescription.mqh, die einige Funktionen enthält.

Tastatur Tastatur

Arbeiten mit Tastaturdaten

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

easydatabase