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

TimeGMT library for the strategy tester - Bibliothek für den MetaTrader 5

Ansichten:
47
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

TimeGMT() Funktion

Gibt die GMT zurück, die unter Berücksichtigung der Sommerzeitumstellung durch die lokale Zeit auf dem Computer, auf dem das Client-Terminal läuft, berechnet wird. Es gibt 2 Varianten der Funktion.

Aufruf ohne Parameter

datetime  TimeGMT();

Aufruf mit Parameter vom Typ MqlDateTime

datetime  TimeGMT(
   MqlDateTime&  dt_struct      // Variable vom Typ Struktur
   );

Beim Testen im Strategietester ist TimeGMT()jedoch immer gleich der von TimeTradeServer() simulierten Serverzeit.



TimeGMT-Bibliothek

Diese Bibliothek korrigiert die TimeGMT()-Funktion, so dass beim Testen im Strategietester die wahre GMT-Zeit angezeigt wird. Die Bibliothek installiert globale API-Hooks (über Makro-Substitution) für die beiden Versionen von TimeGMT.

class CTimeGMT
  {
public:
   static datetime   TimeGMT(void);
   static datetime   TimeGMT(MqlDateTime &dt_struct);
  }

Verwendung:

Vor dem Testen eines Expert Advisors, der einen News-Filter oder eine Zeitbeschränkung im Strategietester verwendet, fügen Sie einfach diese Zeile am Anfang des Codes ein und kompilieren Sie dann den Quellcode in MetaEditor neu.

#include "TimeGMT.mqh"

- optional, um Debug-Meldungen zu sehen, fügen Sie diese Zeile vor der #include-Direktive ein:

#define  PRINT_GMT_DETAILS

Es sind keine weiteren Änderungen oder Funktionsaufrufe für den Expert Advisor oder Indikator erforderlich.

  • TimeGMT wird nur korrigiert, wenn der Strategietester erkannt wird.
  • Die Korrektur wirkt sich auf das im Strategietester ausgewählte Symbol aus.
  • Keine Berechnungsfehler während der Wochenenden oder Weihnachtsfeiertage.
  • Geringer Overhead und schnelle Berechnungszeit im Strategietester

Die Neuberechnung des Broker-Offsets findet nur beim Start des Expert Advisors und jeden Sonntag und Montag um Mitternacht statt. Der berechnete Broker-Offset wird im Speicher zwischengespeichert und bei nachfolgenden Aufrufen von TimeGMT verwendet.

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

Standardmäßig sucht und lädt die Bibliothek das XAUUSD-Symbol 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 (vor allem für Broker, die sich an die EU-Sommerzeit halten). Wenn sich Ihr Broker an die US-Sommerzeit oder gar nicht an die EU-Sommerzeit hält, können Sie auch das Chart-Symbol verwenden: Rufen Sie CTimeGMT::SetUsingGoldSymbol() mit "false" auf, um das aktuelle Chart-Symbol 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 CTimeGMT::SetUsingGoldSymbol(const bool enabled = true);

Anmerkung:

Als Nebeneffekt beginnt XAUUSD eine Stunde nach Forex, so dass die Sommerzeitumstellung im Strategietester eine Stunde später erfolgt.



ZeitGMT_TestEA

Um die Bibliothek im Strategietester zu testen, wird ein Demo-Expert Advisor im Strategietester getestet


Dies sind die Ergebnisse der Ausführung des Expert Advisors im Strategietester:

AUDUSD,M1 (ICMarketsSC-Demo): 1 minutes OHLC ticks generating
AUDUSD,M1: testing of Experts\TimeGMT_TestEA.ex5 from 2023.03.05 00:00 to 2023.05.01 00:00 started with inputs:
  timer_hours=24
2023.03.05 00:00:00   TimeCurrent() = Sun, 2023.03.05 00:00:00  | TimeTradeServer() = Sun, 2023.03.05 00:00:00  | TimeGMT() = Sat, 2023.03.04 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.06 00:00:00   TimeCurrent() = Mon, 2023.03.06 00:00:00  | TimeTradeServer() = Mon, 2023.03.06 00:00:00  | TimeGMT() = Sun, 2023.03.05 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.07 00:00:00   TimeCurrent() = Tue, 2023.03.07 00:00:00  | TimeTradeServer() = Tue, 2023.03.07 00:00:00  | TimeGMT() = Mon, 2023.03.06 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.08 00:00:00   TimeCurrent() = Wed, 2023.03.08 00:00:00  | TimeTradeServer() = Wed, 2023.03.08 00:00:00  | TimeGMT() = Tue, 2023.03.07 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.09 00:00:00   TimeCurrent() = Thu, 2023.03.09 00:00:00  | TimeTradeServer() = Thu, 2023.03.09 00:00:00  | TimeGMT() = Wed, 2023.03.08 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.10 00:00:00   TimeCurrent() = Fri, 2023.03.10 00:00:00  | TimeTradeServer() = Fri, 2023.03.10 00:00:00  | TimeGMT() = Thu, 2023.03.09 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.11 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sat, 2023.03.11 00:00:00  | TimeGMT() = Fri, 2023.03.10 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.12 00:00:00   TimeCurrent() = Fri, 2023.03.10 23:56:59  | TimeTradeServer() = Sun, 2023.03.12 00:00:00  | TimeGMT() = Sat, 2023.03.11 22:00:00 | BrokerOffset = 7200 (GMT+2)
2023.03.13 00:00:00   TimeCurrent() = Mon, 2023.03.13 00:00:00  | TimeTradeServer() = Mon, 2023.03.13 00:00:00  | TimeGMT() = Sun, 2023.03.12 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.14 00:00:00   TimeCurrent() = Tue, 2023.03.14 00:00:00  | TimeTradeServer() = Tue, 2023.03.14 00:00:00  | TimeGMT() = Mon, 2023.03.13 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.15 00:00:00   TimeCurrent() = Wed, 2023.03.15 00:00:00  | TimeTradeServer() = Wed, 2023.03.15 00:00:00  | TimeGMT() = Tue, 2023.03.14 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.16 00:00:00   TimeCurrent() = Thu, 2023.03.16 00:00:00  | TimeTradeServer() = Thu, 2023.03.16 00:00:00  | TimeGMT() = Wed, 2023.03.15 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.17 00:00:00   TimeCurrent() = Fri, 2023.03.17 00:00:00  | TimeTradeServer() = Fri, 2023.03.17 00:00:00  | TimeGMT() = Thu, 2023.03.16 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.18 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sat, 2023.03.18 00:00:00  | TimeGMT() = Fri, 2023.03.17 21:00:00 | BrokerOffset = 10800 (GMT+3)
2023.03.19 00:00:00   TimeCurrent() = Fri, 2023.03.17 23:56:59  | TimeTradeServer() = Sun, 2023.03.19 00:00:00  | TimeGMT() = Sat, 2023.03.18 21:00:00 | BrokerOffset = 10800 (GMT+3)


Aktualisierungen:

2024.03.30 - v.1.25 : Broker GMT-Offset behoben. Derzeit scannt die Bibliothek H1-Balken nur auf dem GOLD-Chart, da dieser die genauesten Startzeiten hat.

2024.04.09 - v.1.33 : Mögliches Problem bei der Berechnung des GMT-Offsets des Brokers während der Weihnachtsfeiertage bei Brokern mit GMT+0 behoben.

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

2024.07.07 - v.1.36 : Ein Problem bei der korrekten Erkennung des GOLD-Symbols bei einigen Brokern wurde behoben.

2024.10.21 - v.1.40 : Verbesserte Erkennung des GOLD-Symbols mit einem Fallback zum EURUSD-Symbol.

2024.10.22 - v.1.45 : Schnellere Bestimmung des GMT-Offsets des Servers am Wochenende im Strategietester.

2024.10.26 - v.1.47 : Bessere Fehlerbehandlung und Debugging-Code hinzugefügt. Umbenennung der Methode HistoryBrokerOffset() in TimeServerGMTOffset().

2024.10.28 - v.1.49 : 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.50 : Fehlerhafte Schätzung des GMT-Offsets von XAUEUR-Kursen bei einigen Brokern behoben.

2024.11.23 - v.1.55 : 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 CTimeGMT::SetUsingGoldSymbol() mit 'false' auf, um stattdessen das Symbol des aktuellen Charts zu verwenden.

2024.12.12 - v.1.60 : Verbesserte Leistung der Funktion HistoryServerGMTOffset() und andere kleinere Codeänderungen.

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

2024.12.17 - v.1.62 : Weitere Optimierung der Funktion HistoryServerGMTOffset().

2024.12.24 - v.1.63 : Mögliches Problem in der Funktion HistoryServerGMTOffset() behoben.



Zeitzone des Brokers und Zeitplan für Sommerzeit

Greenwich Mean Time (GMT), auch Coordinated Universal Time (UTC) genannt, wird als offizielle Weltreferenz für die Zeit verwendet. Sie werden oft Zeitzonen wie UTC - 3h oder GMT - 3h sehen. In diesem Beispiel bedeutet (-3h), dass diese Zeitzone drei Stunden hinter UTC oder GMT liegt. UTC+3h oder GMT +3h würde bedeuten, dass diese Zeitzone drei Stunden vor UTC oder GMT liegt. Der Zeitunterschied zwischen unserer Ortszeit und GMT (UTC) wird als GMT-Offset bezeichnet.

Der Devisenmarkt öffnet am Sonntag um 17:00 Uhr New Yorker Zeit (GMT-5:00 im Winter und GMT-4:00 im Sommer) und schließt am Freitag zur gleichen Zeit. Die Startzeit des Devisenmarktes in New York am Sonntag um 17:00 Uhr entspricht dem Sonntag um 10:00 Uhr UTC im Winter (und dem Sonntag um 09:00 Uhr UTC im Sommer). Der Devisenmarkt schließt im Winter um 10:00 PM UTC (und im Sommer um 09:00 PM UTC). 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 Serverzeitfür Broker in San Francisco (GMT-8), bis zuMon, 09:00 AM Serverzeitfü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 ein und denselben Broker im Laufe des Jahres um +/- eine Stunde. Um diese Schwankungen auszugleichen, muss die Neuberechnung des Broker-Offsets wöchentlich erfolgen, damit die Sommerzeitänderungen beim Broker rechtzeitig erkannt werden können.

Bei einer Zeitzone von +2 (und +3 im Sommer in den USA) beginnen die Kerzen jede Woche um Mitternacht am Montag, und es gibt fünf D1-Kerzen pro Woche, und der Beginn einer Tageskerze (und H4) ist der Beginn eines neuen FX-Tages. Jede Woche endet kurz vor Mitternacht am Samstag. Am Samstag und Sonntag gibt es keine Kerzen.Die Zeit auf diesen Servern isteinfach immer 7 Stunden vor New York und wird als NY+7 dargestellt.Dies ist bei weitem die häufigste Einstellung, aber es gibt auch viele weniger verbreitete Varianten.


Details zur Berechnung der wahren GMT

Wenn ein Aufruf von TimeGMT() von der Bibliothek abgefangen wird, prüft sie zunächst, ob sie nicht im Strategietester läuft, und gibt dann die ursprüngliche Funktion zurück. Wenn der Strategietester erkannt wird, beginnt der Code mit der Berechnung des Broker-Offsets (siehe später). Der Rückgabewert ist dann einfach das Ergebnis der Subtraktion dieses Offsets von der aktuellen Zeit des Handelsservers im Client-Terminal.

true GMT  = TimeTradeServer() - ServerGMTOffset (of the current trading week)

Der'ServerGMTOffset' selbst kann durch die Analyse der H1-Kursentwicklung als Differenz zwischen zwei bekannten Zeiten geschätzt werden:

1) dem Zeitpunkt, zu dem der erste Balken der Handelswoche auf dem GOLD-Chart erscheint (FstBarWk),

2) der entsprechenden UTC-Zeit für den Beginn des GOLD-Handels in New York am Sonntag um 18:00 Uhr .

ServerGMTOffset = FstBarWk - UTC (NY Sun, 18:00)  

Die Berechnung des BrokerOffsets verwendet eine optimierte Modifikation des Algorithmus, der von Carl Schreiber hier in Dealing with time (2) Funktionen veröffentlicht wurde


Gemäß https://www.timeanddate.com/time/change/usa/new-york

  • In New York beginnt die Sommerzeit am zweiten Sonntag im März um 02:00 Uhr Ortszeit. Die Uhr wird um eine Stunde auf GMT-4 vorgestellt, so dass die entsprechende UTC-Zeit für NY Sun, 18:00 Uhr ist (Sun, 22:00 UTC).

  • Da die Sommerzeit (Winterzeit) in New York am ersten Sonntag im November um 02:00 Uhr Ortszeit endet, wird die Uhr um eine Stunde auf GMT-5 zurückgestellt, so dass die entsprechende UTC-Zeit für NY Sun, 18:00 Uhr (Sun, 23:00 UTC) ist.

Wenn zum Beispiel der FstBarWk auf dem GOLD-Chart um Mo, 01:00 Uhr beginnt und es zu diesem Zeitpunkt Winter in New York ist, dann kann der BrokerOffset wie folgt berechnet werden:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 23:00 UTC) = 2 hours (GMT+2)

und wenn es in New York Sommer ist, dann BrokerOffset:

ServerGMTOffset = (FstBarWK, Mon, 01:00) – (Sun, 22:00 UTC) = 3 hours (GMT+3)



Umrechnung der Sitzungsstunden in die Serverzeit des Brokers

Händler können TimeGMT() verwenden, um Sitzungszeiten in die entsprechende Serverzeit umzuwandeln, um zu bestimmen, wann bestimmte Märkte öffnen oder schließen. Wenn ein Händler zum Beispiel in der asiatischen (Tokio) Session handeln möchte, muss er seine Handelszeiten entsprechend anpassen

1] Bestimmung des Offsets des Handelsservers des Brokers

int ServerGMTOffset = TimeTradeServer() - TimeGMT();

    2] Umrechnung der Ortszeiten der einzelnen Märkte in die entsprechende Serverzeit des Brokers

    datetime Server_time = Tokyo_time – Tokyo_GMTOffset + ServerGMTOffset

    Der zweite Term in der Gleichung (xxx_GMTOffset) sollte um +1 Stunde erhöht werden, wenn die Zielzeitzone derzeit in der Sommerzeit liegt.

    Während des Testens im Strategietester ist TimeGMT() immer gleich der simulierten Serverzeit von TimeTradeServer(), daher wird die Konvertierung der Sitzungszeiten falsch. Diese Bibliothek korrigiert die Funktion TimeGMT(), um die wahre GMT zu liefern, so dass die konvertierten Sitzungszeiten während des Testens im Strategietester genau werden.


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

    Simple Bar Timer Simple Bar Timer

    Es ist ein Skript, das die verbleibende Zeit bis zum Eintreffen des nächsten Taktes anzeigt.

    Funktionen für X zu Zeit, Y zu Preis und umgekehrt Funktionen für X zu Zeit, Y zu Preis und umgekehrt

    Funktionen zur Verwendung anstelle von ChartXYToTimePrice und ChartTimePriceToXY, die korrekt und schnell über den gesamten Bereich der Eingabeparameter arbeiten

    Statistical Zigzag Statistical Zigzag

    Es handelt sich um einen Zickzackkurs, der beim Überschreiten einer Volatilitätsschwelle neue Zickzack-Wendepunkte erzeugt

    Historex: export the history of rates and ticks to CSV-files Historex: export the history of rates and ticks to CSV-files

    Dies ist ein Skript zum Exportieren von Kursen und Ticks des aktuellen Chart-Symbols in CSV-Dateien, die mit dem Export/Import-Format von MT5 kompatibel sind.