EA avec filtre de sessions MT5 : Asian, London, New York en MQL5
Découvrez comment programmer un Expert Advisor (EA) qui négocie uniquement pendant les sessions asiatique, londonienne ou new-yorkaise. Un filtre horaire indispensable pour éviter les trades en dehors des heures de forte liquidité.
1. Pourquoi filtrer les sessions de trading dans un EA MQL5 ?
Le marché Forex est un environnement 24h/24, mais toutes les heures ne se valent pas. Les sessions asiatique (Tokyo), londonienne (Londres) et new-yorkaise (New York) ont des caractéristiques propres en termes de volatilité, de liquidité et de spread. Un EA qui trade en continu risque d’ouvrir des positions pendant les périodes calmes (comme le chevauchement asiatique-européen tardif) ou les week-ends virtuels. En intégrant un filtre de sessions, vous concentrez l’activité de votre robot sur les plages horaires où les mouvements sont les plus prévisibles et les spreads les plus serrés. Cela améliore significativement le ratio risque/récompense et réduit le nombre de faux signaux générés par un marché stagnant.
L’implémentation d’un filtre de sessions dans un EA MQL5 repose sur la gestion du temps serveur du broker (TimeCurrent) et la définition d’horaires de début et de fin pour chaque session. Contrairement à MQL4, MQL5 offre une meilleure gestion des datetime et des structures, ce qui facilite l’écriture d’un code propre et maintenable. L’objectif est de créer un système flexible où le trader peut activer ou désactiver chaque session via des paramètres d’entrée, et même définir des heures personnalisées pour s’adapter aux changements d’heure saisonniers.
2. Définir les horaires des sessions : une approche structurée
La première étape consiste à définir les plages horaires pour chaque session. En MQL5, nous utilisons une structure simple pour stocker les heures de début et de fin. Voici un extrait de code pour initialiser ces horaires en fonction du fuseau horaire du serveur (souvent GMT+2 ou GMT+3 en été) :
// Structure pour une session
struct Session
{
int start_hour;
int start_min;
int end_hour;
int end_min;
};
// Initialisation des sessions (heures serveur, exemple pour GMT+2)
Session AsianSession = {0, 0, 9, 0}; // 00:00 - 09:00
Session LondonSession = {8, 0, 17, 0}; // 08:00 - 17:00
Session NYSession = {13, 0, 22, 0}; // 13:00 - 22:00
Ces heures sont données à titre d’exemple et doivent être ajustées en fonction du fuseau horaire de votre broker. Une bonne pratique est de rendre ces paramètres modifiables via des inputs. Cela permet à l’utilisateur de les adapter sans toucher au code. Pour simplifier, nous pouvons utiliser des entiers pour l’heure de début et de fin, puis les convertir en datetime dans la fonction de vérification.
3. La fonction de vérification de session : le cœur du filtre
Le cœur du filtre est une fonction booléenne qui compare l’heure actuelle du serveur avec les plages horaires définies. En MQL5, nous utilisons la fonction TimeCurrent() pour obtenir le timestamp actuel, puis nous extrayons l’heure et les minutes. Voici une implémentation robuste qui gère les chevauchements et les sessions qui s’étendent sur minuit (comme la session asiatique qui peut commencer le soir et finir le matin) :
bool IsSessionActive(const Session &s, int current_hour, int current_min)
{
int start = s.start_hour * 60 + s.start_min;
int end = s.end_hour * 60 + s.end_min;
int now = current_hour * 60 + current_min;
// Session normale (même jour)
if(start < end)
return (now >= start && now < end);
// Session qui chevauche minuit (ex: 22:00 - 02:00)
else
return (now >= start || now < end);
}
Cette fonction convertit tout en minutes pour éviter les erreurs de comparaison horaire. Elle est appelée à chaque tick dans OnTick(). Si aucune session active n’est détectée, l’EA ne doit pas ouvrir de nouvelles positions. On peut également l’utiliser pour fermer les positions existantes à la fin d’une session, selon la stratégie.
4. Intégration dans l’EA : paramètres d’entrée et logique de trading
Pour rendre le filtre pleinement fonctionnel, nous devons l’intégrer dans la logique principale de l’EA. Les paramètres d’entrée permettent à l’utilisateur d’activer ou désactiver chaque session :
input bool TradeAsian = true; // Activer la session asiatique
input bool TradeLondon = true; // Activer la session londonienne
input bool TradeNY = true; // Activer la session new-yorkaise
// Dans OnTick()
void OnTick()
{
MqlDateTime dt;
TimeCurrent(dt);
int hour = dt.hour;
int min = dt.min;
bool sessionActive = false;
if(TradeAsian && IsSessionActive(AsianSession, hour, min)) sessionActive = true;
if(TradeLondon && IsSessionActive(LondonSession, hour, min)) sessionActive = true;
if(TradeNY && IsSessionActive(NYSession, hour, min)) sessionActive = true;
if(!sessionActive)
{
// Ne pas trader, ou fermer les positions si nécessaire
return;
}
// Logique de trading normale ici (signaux, entrées, sorties)
// ...
}
Cette approche modulaire permet de combiner plusieurs sessions (par exemple, trader uniquement le chevauchement Londres-New York). En ajoutant un paramètre input bool CloseAtSessionEnd = false;, l’EA peut également fermer toutes les positions à la fin de la session active, ce qui est utile pour les stratégies intraday. N’oubliez pas de gérer le changement d’heure été/hiver : il est plus sûr d’utiliser un décalage horaire fixe par rapport à GMT (par exemple, via une input input int GMTOffset = 2;) plutôt que de coder en dur les heures locales.
5. Optimisation et pièges à éviter
Un filtre de sessions peut sembler simple, mais plusieurs subtilités peuvent le rendre inefficace. Premièrement, assurez-vous que TimeCurrent() est bien synchronisé avec le serveur de votre broker. Certains brokers utilisent un fuseau horaire différent de celui de votre PC. Utilisez TimeTradeServer() si nécessaire. Deuxièmement, méfiez-vous des sessions qui se chevauchent : si vous autorisez plusieurs sessions, un trade peut être ouvert pendant une session et fermé pendant une autre, ce qui peut être souhaitable ou non selon la stratégie. Troisièmement, pour les stratégies scalping, un filtre trop strict peut réduire le nombre de trades. À l’inverse, pour les stratégies de tendance, il est souvent préférable de ne trader que pendant la session la plus volatile (Londres ou New York).
Enfin, pensez à ajouter un contrôle de la journée de la semaine : le marché est généralement calme le lundi matin et le vendredi après-midi. Vous pouvez intégrer un filtre supplémentaire avec dt.day_of_week pour éviter ces périodes. Un EA avec un bon filtre horaire est un EA qui respecte le rythme du marché, et c’est souvent la clé d’une performance constante sur le long terme.
Besoin d’un EA sur-mesure ? Demander un devis gratuit
Questions fréquentes
Comment gérer le changement d’heure été/hiver dans mon EA MQL5 ?
La meilleure solution est d’utiliser un paramètre d’entrée pour le décalage horaire par rapport à GMT (par exemple, input int GMTOffset = 2;). Ensuite, dans votre code, vous ajoutez ce décalage à l’heure UTC obtenue via TimeGMT(). Ainsi, vous pouvez passer de GMT+2 à GMT+3 simplement en modifiant le paramètre, sans avoir à modifier les horaires de session. Certains brokers fournissent aussi le fuseau horaire via TerminalInfoInteger(TERMINAL_TIME_OFFSET).
Puis-je utiliser ce filtre de sessions pour des stratégies sur d’autres actifs que le Forex ?
Oui, absolument. Le concept de session peut s’appliquer à tout actif négocié 24h/24 ou sur des plages horaires définies. Pour les indices comme le DAX ou le S&P500, vous pouvez définir des sessions correspondant aux heures d’ouverture des bourses européennes ou américaines. Pour les cryptomonnaies, même si le marché est continu, un filtre horaire basé sur les sessions asiatiques ou américaines peut améliorer la qualité des signaux.
Mon EA ouvre des trades en dehors des sessions définies, pourquoi ?
Plusieurs causes possibles : 1) Vérifiez que votre fonction IsSessionActive est bien appelée avant toute logique d’ouverture de trade. 2) Assurez-vous que les horaires de session correspondent au fuseau horaire de votre broker (utilisez TimeCurrent() et non TimeLocal()). 3) Si vous utilisez des ordres en attente, vérifiez qu’ils ne sont pas placés pendant une session active mais exécutés plus tard. 4) Enfin, vérifiez que vos paramètres d’entrée TradeAsian, etc., sont bien en mode true ou false comme vous le souhaitez.