und werden Sie Mitglied unserer Fangruppe
Veröffentliche einen Link auf das Skript, damit die anderen ihn auch nutzen können
Bewerten Sie es im Terminal MetaTrader 5
- Ansichten:
- 34
- Rating:
- Veröffentlicht:
-
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.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)
Lightweight CVD (Cumulative Volume Delta) für MT5 - M1-basiert, zeigt Kauf-/Verkaufsdruck als Kerzen mit optionalen Rücksetzungen.
ErrorDescription - Aktualisierte Bibliothek
Diese Bibliothek ist eine aktualisierte Version der von MetaQuotes veröffentlichten Bibliothek ErrorDescription.mqh, die einige Funktionen enthält.
Tastatur
Arbeiten mit Tastaturdaten
Class For Working With Databases In A Simplified Manner
easydatabase
