Meridian Session Clock
- Bibliotheken
-
Syarief Azman Bin Rosli
Hallo und herzlich willkommen auf meinem offiziellen MQL5-Profil!
Ich bin Syarief Azman Bin Rosli, Entwickler algorithmischer Handelssysteme und Software-Ingenieur mit über zehn Jahren Erfahrung in der Entwicklung robuster automatisierter Handelslösungen für MetaTrader 5 und MetaTrader 4. - Version: 1.0
- Aktivierungen: 5
Eine MQL4-Zeitbibliothek: sommerzeitkorrekte Umrechnungen zwischen UTC und 12 Zeitzonen, ein Modell der Serveruhr Ihres Brokers (automatisch aus der Kurshistorie erkannt), die Sitzungen Sydney, Tokyo, London und New York plus eigene, mit Offen-Status, Beginn und Ende und OHLC-Spanne, der FX-Handelstag und das Wochenende. Anders als TimeGMT() liefert sie im Strategietester dieselben Ergebnisse wie live. Sie handelt nie, zeichnet nichts und schreibt keine Dateien. Sie erhalten die kompilierte Meridian_Session_Clock.ex4; diese Seite ist die vollständige API-Referenz.
Schnellstart
- Kopieren Sie Meridian_Session_Clock.ex4 nach MQL4/Libraries (Datei > Dateiordner öffnen).
- Fügen Sie den #import-Block unten in Ihren EA, Indikator oder Ihr Skript ein.
- OnInit: MSC_DetectBroker("EURUSD", 104, base, conf, used), oder MSC_SetBroker(MSC_US_DST, 120), wenn Sie die Serveruhr kennen.
- Verwenden Sie Serverzeiten (TimeCurrent(), Time[i]): MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()).
- Prüfung: Starten Sie das Beispiel unten im Strategietester; das Log zeigt das erkannte Modell und die Zeiten von London zu jedem Bar.
Import-Deklaration (kopierfertig)
#import "Meridian_Session_Clock.ex4"
int MSC_ZoneOffset(int zone, datetime utc);
bool MSC_IsDST(int zone, datetime utc);
datetime MSC_ToZone(datetime utc, int zone);
datetime MSC_FromZone(datetime local, int zone);
datetime MSC_NextChange(int zone, datetime utc);
string MSC_ZoneName(int zone);
bool MSC_SetBroker(int model, int base_minutes);
int MSC_DetectBroker(string symbol, int weeks, int &base_minutes, double &confidence, int &weeks_used);
int MSC_BrokerOffset(datetime utc);
datetime MSC_ServerToUTC(datetime server_time);
datetime MSC_UTCToServer(datetime utc);
int MSC_SessionAdd(int zone, int start_minute, int end_minute, int days_mask);
void MSC_SessionClear();
string MSC_SessionName(int session);
bool MSC_SessionIsOpen(int session, datetime server_time);
datetime MSC_SessionStart(int session, datetime server_time, int index);
datetime MSC_SessionEnd(int session, datetime server_time, int index);
int MSC_SessionRange(string symbol, int timeframe, int session, datetime server_time, int index, double &result[]);
datetime MSC_TradingDayStart(datetime server_time);
bool MSC_IsWeekend(datetime server_time);
int MSC_LastError();
string MSC_ErrorText(int code);
#import
enum MSC_ZONE { MSC_UTC, MSC_LONDON, MSC_FRANKFURT, MSC_ATHENS, MSC_MOSCOW, MSC_DUBAI, MSC_SINGAPORE, MSC_TOKYO,
MSC_SYDNEY, MSC_WELLINGTON, MSC_NEW_YORK, MSC_CHICAGO };
enum MSC_MODEL { MSC_FIXED, MSC_US_DST, MSC_EU_DST };
enum MSC_SESSION { MSC_SYDNEY_SESSION, MSC_TOKYO_SESSION, MSC_LONDON_SESSION, MSC_NEW_YORK_SESSION }; Grundbegriffe
- Drei Arten von Zeit: utc; server (Serverzeit des Brokers: TimeCurrent, Barzeiten); local (Uhrzeit in einer Zone).
- Zonen 0-11: UTC, London, Frankfurt, Athens, Moscow, Dubai, Singapore (auch Hongkong, Shanghai), Tokyo, Sydney, Wellington, New York, Chicago. Die Sommerzeit folgt dem Recht jeder Zone seit 2000, einschließlich der Änderungen USA 2007, Sydney 2000 / 2006 / 2008, Auckland 2007 / 2008 und Moscow 2011 / 2014. Unterstützt 2000-2099; andere Zeiten werden mit denselben Regeln berechnet und melden -2.
- Eine Ortszeit, die beim Umstellen auf Sommerzeit übersprungen oder beim Zurückstellen wiederholt wird, gilt mit dem Versatz vor der Umstellung (New York 02:30 am Umstellungstag im März = 07:30 UTC; 01:30 am Tag im November = 05:30 UTC, das erste Auftreten).
- Brokeruhr = UTC + Versatz. Modelle: 0 FIXED (Basis das ganze Jahr), 1 US DST (Basis + 60 im US-Sommer: "New York close"-Broker, GMT+2 / GMT+3), 2 EU DST (Basis + 60 im EU-Sommer). Standard 1 mit Basis 120.
- Sitzungen werden in der Ortszeit einer Zone definiert, Montag bis Freitag nach Starttag: 0 SYDNEY 07:00-16:00 Sydney, 1 TOKYO 09:00-18:00 Tokyo, 2 LONDON 08:00-17:00 London, 3 NEW YORK 08:00-17:00 New York; eigene IDs 4-15. Eine Instanz läuft vom Beginn (einschließlich) bis zum Ende (ausschließlich). index 0 = die letzte Instanz, die zur angegebenen Zeit oder davor begann (offen oder beendet), -1 die davor, +1 die nächste; -260 bis 260.
API-Referenz
Alle Funktionen setzen MSC_LastError. Falsche Zonen- oder Sitzungs-IDs ergeben -1 und 0, false, "UNKNOWN" oder -1.
MSC_ZoneOffset, MSC_IsDST, MSC_ToZone, MSC_FromZone
Versatz der Zone zu UTC in Minuten bei utc; ob Sommerzeit gilt (Moscow 2011-2014, dauerhaft UTC+4, ist keine Sommerzeit); utc + Versatz als Ortszeit; Ortszeit zurück nach UTC mit der Regel oben.
datetime ny = MSC_ToZone(MSC_ServerToUTC(TimeCurrent()), MSC_NEW_YORK);
MSC_NextChange und MSC_ZoneName
Erste Versatzänderung nach utc (in UTC), 0, wenn innerhalb von drei Jahren keine erfolgt (UTC, Dubai, Singapore, Tokyo, Moscow nach 2014). Name einer Zone wie in der Liste oben.
MSC_SetBroker
model 0-2, base_minutes -720 bis 840 in Schritten von 15. Sonst false und -1.
MSC_DetectBroker
Liest den ersten H1-Bar nach jeder Wochenendlücke (36 Stunden oder mehr) von symbol ("" = Chartsymbol), vom neuesten rückwärts, bis zu weeks (4-520, 0 = 104). Der FX-Markt öffnet sonntags um 17:00 New York, also liefert jede Woche einen Versatz; es gewinnen das Modell und die Basis, die zu den meisten Wochen passen (Gleichstand: US DST, dann EU DST, dann FIXED). Liefert das Modell und wendet es an, wenn mindestens 60 % der Wochen passen; sonst -1 mit -5 NOT DETECTED (base_minutes und confidence werden trotzdem gefüllt). -3 NO DATA ohne H1-Historie. Verwenden Sie ein 24/5-FX-Hauptpaar: Metalle und Indizes öffnen sonntags später und ergeben eine Stunde zu viel (XAUUSD lieferte in den Tests Basis 180 statt 120). Nutzen Sie 52 Wochen oder mehr, damit Zeitumstellungen enthalten sind; Feiertagswochen senken die Konfidenz. Im Strategietester ist nur die vom Tester geladene Historie sichtbar (weeks_used nennt die Zahl der gelesenen Wochen).
int base, used; double conf;
int model = MSC_DetectBroker("EURUSD", 104, base, conf, used); MSC_BrokerOffset, MSC_ServerToUTC, MSC_UTCToServer
Serverversatz in Minuten bei utc; Serverzeit nach UTC (Regel oben für die Stunde um eine Umstellung); UTC nach Serverzeit.
MSC_SessionAdd, MSC_SessionClear, MSC_SessionName
Fügt eine Sitzung hinzu: zone, Beginn und Ende in Minuten nach lokaler Mitternacht (0-1439, verschieden; Ende kleiner als Beginn = über Nacht), days_mask der Starttage (Bit 0 Sonntag bis Bit 6 Samstag, 62 = Montag-Freitag, 1-127). Liefert die ID 4-15, oder -1 mit -1 bzw. -4 SESSION LIMIT. MSC_SessionClear löscht eigene Sitzungen (IDs werden ab 4 wiederverwendet). Namen: SYDNEY, TOKYO, LONDON, NEW YORK, CUSTOM n.
int fra = MSC_SessionAdd(MSC_FRANKFURT, 7 * 60, 15 * 60 + 30, 62); // 07:00-15:30 Frankfurt
MSC_SessionIsOpen, MSC_SessionStart, MSC_SessionEnd
Ob Instanz 0 server_time enthält; Serverzeit von Beginn bzw. Ende der Instanz index. 0 bei Fehler.
if(MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()) && !MSC_SessionIsOpen(MSC_NEW_YORK_SESSION, TimeCurrent())) { } MSC_SessionRange
OHLC der Instanz index aus den Bars von symbol ("" = Chart) auf timeframe (0 = Chart; M1, M5, M15, M30 oder H1), deren Eröffnungszeit in der Instanz liegt. result[] erhält 7 Werte: 0 Open, 1 High, 2 Low, 3 Close, 4 Zeit des ersten Bars am High, 5 Zeit des ersten Bars am Low, 6 Bars. Liefert die Zahl der Bars; 0 mit -3 NO DATA, wenn kein Bar darin liegt; -1 für falschen timeframe, Sitzung oder index. Eine laufende Instanz nutzt die bisherigen Bars.
double r[]; if(MSC_SessionRange("", PERIOD_M15, MSC_TOKYO_SESSION, TimeCurrent(), -1, r) > 0) Print("Tokyo high ", r[1]); MSC_TradingDayStart und MSC_IsWeekend
Serverzeit des letzten 17:00 New York zu server_time oder davor (Beginn des FX-Tages). Wochenende = Freitag 17:00 bis Sonntag 17:00 New York.
MSC_LastError und MSC_ErrorText
Code des letzten Aufrufs; Text: 0 OK, -1 INVALID PARAMETER, -2 OUT OF RANGE, -3 NO DATA, -4 SESSION LIMIT, -5 NOT DETECTED, sonst UNKNOWN.
Lauffähiges Integrationsbeispiel
Ein Expert Advisor; fügen Sie zuerst den Import-Block und die enum-Zeilen von oben ein.
datetime last = 0;
int OnInit()
{
int base, used; double conf;
int m = MSC_DetectBroker("EURUSD", 104, base, conf, used);
if(m < 0) MSC_SetBroker(MSC_US_DST, 120);
PrintFormat("model %d base %d conf %.2f weeks %d: %s", m, base, conf, used, MSC_ErrorText(MSC_LastError()));
return(INIT_SUCCEEDED);
}
void OnTick()
{
if(Time[0] == last) return;
last = Time[0];
datetime now = TimeCurrent();
PrintFormat("London %s - %s server, open %d, FX day since %s, weekend %d",
TimeToString(MSC_SessionStart(MSC_LONDON_SESSION, now, 0)), TimeToString(MSC_SessionEnd(MSC_LONDON_SESSION, now, 0)),
MSC_SessionIsOpen(MSC_LONDON_SESSION, now), TimeToString(MSC_TradingDayStart(now)), MSC_IsWeekend(now));
} Architektur und Hinweise
- Reine Berechnung: Regeln werden berechnet, nicht nachgeschlagen, daher wird nichts heruntergeladen. Brokermodell und Sitzungstabelle gelten je importierendem Programm.
- MetaTrader 4, jedes Symbol und jeder Zeitrahmen; EAs, Indikatoren, Skripte. Sicher im Strategietester und bei der Optimierung: keine DLLs, Dateien, Webanfragen, Chartobjekte, Timer oder globalen Variablen. Nur MSC_DetectBroker und MSC_SessionRange lesen Bars.
- Grenzen: 16 Sitzungen (4 eingebaut), Instanz-index -260 bis 260, Jahre 2000-2099.
- Typische Setups. Sitzungsfilter: nur handeln, solange MSC_SessionIsOpen(MSC_LONDON_SESSION, now). Ausbruch aus der Asien-Spanne: MSC_SessionRange von MSC_TOKYO_SESSION, index 0, zur London-Eröffnung (Tokyo ist dann noch offen). Tageslogik: bei MSC_TradingDayStart zurücksetzen. Backtests: MSC_DetectBroker oder MSC_SetBroker in OnInit aufrufen, nie TimeGMT().
- Screenshots und Video zeigen einen Demo-EA auf Basis dieser Bibliothek; er ist nicht Teil des Kaufs.
Risikohinweis
Sitzungszeiten beschreiben, wann Märkte üblicherweise aktiv sind, nicht wie sich Kurse bewegen. Prüfen Sie den Feiertagskalender Ihres Brokers; testen Sie zuerst auf einem Demokonto.
