Meridian Session Clock
- Bibliothèque
-
Syarief Azman Bin Rosli
Bonjour et bienvenue sur mon profil officiel MQL5 !
Je suis Syarief Azman Bin Rosli, développeur de systèmes de trading algorithmique et ingénieur quantitatif avec plus de dix ans d'expérience spécialisée dans la création de solutions de trading automatisées pour MetaTrader 5 et MetaTrader 4. - Version: 1.0
- Activations: 5
Bibliothèque de temps pour MQL4 : conversions exactes, heure d'été comprise, entre UTC et 12 fuseaux horaires, un modèle de l'horloge du serveur de votre courtier (détecté automatiquement à partir de l'historique des prix), les sessions de Sydney, Tokyo, London et New York plus les vôtres, avec état ouvert, heures de début et de fin et plage OHLC, le jour de trading FX et le week-end. Contrairement à TimeGMT(), elle donne les mêmes réponses dans le Testeur de stratégie qu'en réel. Elle ne trade jamais, ne dessine rien et n'écrit aucun fichier. Vous recevez le fichier compilé Meridian_Session_Clock.ex4 ; cette page est la référence complète de l'API.
Démarrage rapide
- Copiez Meridian_Session_Clock.ex4 dans MQL4/Libraries (Fichier > Ouvrir le dossier des données).
- Collez le bloc #import ci-dessous dans votre EA, indicateur ou script.
- OnInit : MSC_DetectBroker("EURUSD", 104, base, conf, used), ou MSC_SetBroker(MSC_US_DST, 120) si vous connaissez l'horloge du serveur.
- Utilisez les heures serveur (TimeCurrent(), Time[i]) : MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()).
- Vérification : lancez l'exemple ci-dessous dans le Testeur de stratégie ; le journal affiche le modèle détecté et les horaires de London à chaque barre.
Déclaration d'import (prête à copier)
#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 }; Notions
- Trois sortes d'heures : utc ; server (heure du serveur du courtier : TimeCurrent, heures des barres) ; local (heure murale dans un fuseau).
- Fuseaux 0-11 : UTC, London, Frankfurt, Athens, Moscow, Dubai, Singapore (aussi Hong Kong, Shanghai), Tokyo, Sydney, Wellington, New York, Chicago. L'heure d'été suit la loi de chaque fuseau depuis 2000, y compris les changements des États-Unis 2007, Sydney 2000 / 2006 / 2008, Auckland 2007 / 2008 et Moscow 2011 / 2014. Plage prise en charge 2000-2099 ; les autres dates sont calculées avec les mêmes règles et signalent -2.
- Une heure locale sautée par le passage à l'heure d'été, ou répétée par le retour à l'heure d'hiver, est lue avec le décalage en vigueur avant le changement (New York 02:30 le jour du changement de mars = 07:30 UTC ; 01:30 le jour de novembre = 05:30 UTC, la première occurrence).
- Horloge du courtier = UTC + décalage. Modèles : 0 FIXED (base toute l'année), 1 US DST (base + 60 pendant l'été américain : courtiers « New York close », GMT+2 / GMT+3), 2 EU DST (base + 60 pendant l'été européen). Par défaut 1 avec base 120.
- Les sessions sont définies dans l'heure locale d'un fuseau, du lundi au vendredi selon le jour de début : 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 ; ids personnalisés 4-15. Une instance va du début (inclus) à la fin (exclue). index 0 = la dernière instance commencée à l'heure donnée ou avant (ouverte ou terminée), -1 la précédente, +1 la suivante ; de -260 à 260.
Référence de l'API
Toutes les fonctions mettent à jour MSC_LastError. Des ids de fuseau ou de session invalides donnent -1 et 0, false, "UNKNOWN" ou -1.
MSC_ZoneOffset, MSC_IsDST, MSC_ToZone, MSC_FromZone
Décalage du fuseau par rapport à UTC en minutes à utc ; si l'heure d'été est en vigueur (Moscow 2011-2014, UTC+4 permanent, n'est pas une heure d'été) ; utc + décalage en heure locale ; heure locale ramenée en UTC avec la règle ci-dessus.
datetime ny = MSC_ToZone(MSC_ServerToUTC(TimeCurrent()), MSC_NEW_YORK);
MSC_NextChange et MSC_ZoneName
Premier changement de décalage après utc (en UTC), 0 s'il n'y en a aucun sur trois ans (UTC, Dubai, Singapore, Tokyo, Moscow après 2014). Nom d'un fuseau, comme dans la liste ci-dessus.
MSC_SetBroker
model 0-2, base_minutes de -720 à 840 par pas de 15. Sinon false et -1.
MSC_DetectBroker
Lit la première barre H1 après chaque trou de week-end (36 heures ou plus) de symbol ("" = symbole du graphique), de la plus récente vers le passé, jusqu'à weeks (4-520, 0 = 104). Le marché FX ouvre le dimanche à 17:00 New York, donc chaque semaine donne un décalage ; le modèle et la base qui conviennent au plus grand nombre de semaines l'emportent (égalité : US DST, puis EU DST, puis FIXED). Renvoie le modèle et l'applique s'il convient à au moins 60 % des semaines ; sinon -1 avec -5 NOT DETECTED (base_minutes et confidence sont tout de même remplis). -3 NO DATA sans historique H1. Utilisez une paire FX majeure 24/5 : métaux et indices ouvrent plus tard le dimanche et lisent une heure de trop (XAUUSD a donné une base de 180 au lieu de 120 lors des tests). Utilisez 52 semaines ou plus pour inclure les changements d'heure ; les semaines fériées font baisser la confiance. Dans le Testeur de stratégie, seul l'historique chargé par le testeur est visible (weeks_used indique le nombre de semaines lues).
int base, used; double conf;
int model = MSC_DetectBroker("EURUSD", 104, base, conf, used); MSC_BrokerOffset, MSC_ServerToUTC, MSC_UTCToServer
Décalage du serveur en minutes à utc ; heure serveur vers UTC (règle ci-dessus pour l'heure autour d'un changement) ; UTC vers heure serveur.
MSC_SessionAdd, MSC_SessionClear, MSC_SessionName
Ajoute une session : zone, début et fin en minutes après minuit local (0-1439, différents ; fin inférieure au début = de nuit), days_mask des jours de début (bit 0 dimanche à bit 6 samedi, 62 = lundi-vendredi, 1-127). Renvoie l'id 4-15, ou -1 avec -1 ou -4 SESSION LIMIT. MSC_SessionClear supprime les sessions personnalisées (les ids sont réutilisés à partir de 4). Noms : 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
Si l'instance 0 contient server_time ; heure serveur du début ou de la fin de l'instance index. 0 en cas d'erreur.
if(MSC_SessionIsOpen(MSC_LONDON_SESSION, TimeCurrent()) && !MSC_SessionIsOpen(MSC_NEW_YORK_SESSION, TimeCurrent())) { } MSC_SessionRange
OHLC de l'instance index à partir des barres de symbol ("" = graphique) sur timeframe (0 = graphique ; M1, M5, M15, M30 ou H1) dont l'heure d'ouverture est dans l'instance. result[] reçoit 7 valeurs : 0 ouverture, 1 plus haut, 2 plus bas, 3 clôture, 4 heure de la première barre au plus haut, 5 heure de la première barre au plus bas, 6 barres. Renvoie le nombre de barres ; 0 avec -3 NO DATA si aucune barre n'est dedans ; -1 pour un timeframe, une session ou un index invalide. Une instance en cours utilise les barres déjà formées.
double r[]; if(MSC_SessionRange("", PERIOD_M15, MSC_TOKYO_SESSION, TimeCurrent(), -1, r) > 0) Print("Tokyo high ", r[1]); MSC_TradingDayStart et MSC_IsWeekend
Heure serveur du dernier 17:00 New York à server_time ou avant (début du jour FX). Week-end = vendredi 17:00 à dimanche 17:00 New York.
MSC_LastError et MSC_ErrorText
Code du dernier appel ; texte : 0 OK, -1 INVALID PARAMETER, -2 OUT OF RANGE, -3 NO DATA, -4 SESSION LIMIT, -5 NOT DETECTED, sinon UNKNOWN.
Exemple d'intégration fonctionnel
Un Expert Advisor ; collez d'abord le bloc d'import et les lignes enum ci-dessus.
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));
} Architecture et remarques
- Calcul pur : les règles sont calculées, pas consultées, rien n'est donc téléchargé. Le modèle du courtier et la table des sessions sont conservés par programme qui importe la bibliothèque.
- MetaTrader 4, tout symbole et toute unité de temps ; EA, indicateurs, scripts. Sûre dans le Testeur de stratégie et l'optimisation : pas de DLL, fichiers, requêtes web, objets graphiques, timers ni variables globales. Seules MSC_DetectBroker et MSC_SessionRange lisent des barres.
- Limites : 16 sessions (4 intégrées), index d'instance de -260 à 260, années 2000-2099.
- Réglages types. Filtre de session : ne trader que tant que MSC_SessionIsOpen(MSC_LONDON_SESSION, now). Cassure du range asiatique : MSC_SessionRange de MSC_TOKYO_SESSION, index 0, à l'ouverture de London (Tokyo est encore ouverte). Logique journalière : réinitialiser à MSC_TradingDayStart. Backtests : appeler MSC_DetectBroker ou MSC_SetBroker dans OnInit, jamais TimeGMT().
- Les captures et la vidéo montrent un EA de démonstration construit avec cette bibliothèque ; il ne fait pas partie de l'achat.
Avertissement sur les risques
Les horaires de session décrivent quand les marchés sont habituellement actifs, pas comment les prix évolueront. Vérifiez le calendrier des jours fériés de votre courtier ; testez d'abord sur un compte démo.
