Gérer plusieurs timeframes dans un EA MQL5 sans indicateur externe
Découvrez comment analyser plusieurs unités de temps (M5, H1, H4, D1) directement depuis votre Expert Advisor MQL5, sans charger d’indicateur personnalisé. Une méthode robuste pour filtrer vos signaux et éviter les faux breakouts.
Pourquoi utiliser plusieurs timeframes dans un EA MQL5 sans indicateur externe ?
Lorsque l’on développe un robot de trading, la tentation est grande d’ajouter des indicateurs pour chaque timeframe. Pourtant, la plupart des EAs les plus performants se basent sur l’action du prix brute (prix Open, High, Low, Close) sur différentes périodes. L’approche “multiple timeframes ea mql5 sans indicateur” présente plusieurs avantages :
- Performance accrue : Moins d’appels à des indicateurs signifie moins de calculs et un EA plus rapide.
- Fiabilité : Les données de prix sont toujours disponibles, même en cas de problème de connexion.
- Transparence : Vous comprenez exactement ce que votre EA analyse, sans boîte noire.
- Compatibilité : Fonctionne sur tous les brokers, sans dépendre d’indicateurs tiers.
Dans cet article, nous allons construire un squelette d’EA capable de lire les prix de n’importe quel timeframe (M1 à MN1) en utilisant uniquement les fonctions natives de MQL5 : CopyRates et iTime.
Étape 1 : Récupérer les données de plusieurs timeframes avec CopyRates
La fonction clé pour implémenter un multiple timeframes ea mql5 sans indicateur est CopyRates. Elle permet de copier en une seule fois les données OHLCV (Open, High, Low, Close, Volume) d’un symbole et d’un timeframe donné dans un tableau de structures MqlRates.
//--- Exemple : Récupérer les 3 dernières bougies de H1 et H4
MqlRates ratesH1[], ratesH4[];
ArraySetAsSeries(ratesH1, true);
ArraySetAsSeries(ratesH4, true);
// Copie des 3 bougies H1
int copiedH1 = CopyRates(_Symbol, PERIOD_H1, 0, 3, ratesH1);
if(copiedH1 != 3) { Print("Erreur copie H1"); return; }
// Copie des 3 bougies H4
int copiedH4 = CopyRates(_Symbol, PERIOD_H4, 0, 3, ratesH4);
if(copiedH4 != 3) { Print("Erreur copie H4"); return; }
// Maintenant, vous pouvez lire :
// ratesH1[0].close // Fermeture de la dernière bougie H1
// ratesH4[0].high // Plus haut de la dernière bougie H4
Astuce : Utilisez ArraySetAsSeries pour que l’index 0 corresponde à la bougie la plus récente. Cela rend le code plus intuitif.
Étape 2 : Créer une structure de données pour gérer les timeframes dynamiquement
Pour éviter de dupliquer le code pour chaque timeframe, nous allons créer une structure et une fonction utilitaire. Cette approche rend votre multiple timeframes ea mql5 sans indicateur modulaire et facile à étendre.
//--- Définition de la structure
struct TimeframeData
{
ENUM_TIMEFRAMES tf; // Timeframe (ex: PERIOD_H1)
MqlRates rates[]; // Tableau des bougies
datetime lastUpdate; // Dernière mise à jour
};
//--- Fonction pour mettre à jour un timeframe
bool UpdateTimeframe(TimeframeData &data, int bars=3)
{
if(TimeCurrent() - data.lastUpdate < PeriodSeconds(data.tf)/2)
return true; // Pas besoin de mettre à jour trop souvent
ArraySetAsSeries(data.rates, true);
int copied = CopyRates(_Symbol, data.tf, 0, bars, data.rates);
if(copied != bars)
return false;
data.lastUpdate = TimeCurrent();
return true;
}
//--- Utilisation dans OnTick()
TimeframeData tfH1, tfH4;
tfH1.tf = PERIOD_H1;
tfH4.tf = PERIOD_H4;
if(!UpdateTimeframe(tfH1) || !UpdateTimeframe(tfH4))
return; // Sortie si les données ne sont pas disponibles
Étape 3 : Analyser la tendance principale en comparant les timeframes
Le cœur d'un multiple timeframes ea mql5 sans indicateur réside dans la logique de confirmation. Voici une méthode simple pour déterminer la tendance :
- Tendance haussière : Le plus bas de la bougie H4 actuelle est supérieur au plus bas de la bougie H4 précédente, ET la bougie H1 est haussière (close > open).
- Tendance baissière : Le plus haut de la bougie H4 actuelle est inférieur au plus haut de la bougie H4 précédente, ET la bougie H1 est baissière.
//--- Exemple de logique de tendance
bool TendanceHaussiere()
{
// H4 : creux ascendants
if(ratesH4[0].low > ratesH4[1].low && ratesH4[1].low > ratesH4[2].low)
{
// H1 : confirmation haussière
if(ratesH1[0].close > ratesH1[0].open)
return true;
}
return false;
}
bool TendanceBaissiere()
{
// H4 : sommets descendants
if(ratesH4[0].high < ratesH4[1].high && ratesH4[1].high < ratesH4[2].high)
{
// H1 : confirmation baissière
if(ratesH1[0].close < ratesH1[0].open)
return true;
}
return false;
}
Étape 4 : Intégrer la gestion des timeframes dans votre EA complet
Voici comment structurer la fonction OnTick() de votre multiple timeframes ea mql5 sans indicateur :
void OnTick()
{
// 1. Mise à jour des données
if(!UpdateTimeframe(tfM15, 5) || !UpdateTimeframe(tfH1, 3) || !UpdateTimeframe(tfH4, 3))
{
Print("Données timeframes non disponibles");
return;
}
// 2. Filtre de tendance (H4 et H1)
if(!TendanceHaussiere() && !TendanceBaissiere())
return; // Pas de trade si tendance neutre
// 3. Signal d'entrée (M15)
bool signalAchat = (TendanceHaussiere() && SignalAchatM15());
bool signalVente = (TendanceBaissiere() && SignalVenteM15());
// 4. Exécution
if(signalAchat && PositionsTotal() == 0)
OuvrirAchat();
if(signalVente && PositionsTotal() == 0)
OuvrirVente();
}
//--- Fonction pour le signal sur M15 (exemple : breakout)
bool SignalAchatM15()
{
// Prix actuel > plus haut des 2 dernières bougies M15
return (ratesM15[0].close > ratesM15[1].high && ratesM15[1].high > ratesM15[2].high);
}
Étape 5 : Optimiser les performances et éviter les erreurs courantes
Pour que votre EA reste rapide et fiable :
- Limitez le nombre de bougies copiées : Copiez 3 à 5 bougies par timeframe, pas 100.
- Utilisez
PeriodSeconds: Pour ne pas copier les données à chaque tick, mettez à jour les timeframes plus hautes (H4, D1) moins souvent. - Gérez les symboles multiples : Si votre EA trade sur plusieurs paires, créez un tableau de structures
TimeframeDatapour chaque symbole. - Testez avec le Strategy Tester : Activez "Tous les ticks" pour vérifier que votre EA réagit correctement aux changements de timeframes.
- Attention aux décalages : Les timeframes plus hautes (H4, D1) se ferment à des heures fixes. Vérifiez
rates[0].timepour savoir si la bougie est fermée ou en cours.
Besoin d'un EA sur-mesure ? Demander un devis gratuit
Questions fréquentes
Puis-je utiliser CopyRates avec un timeframe personnalisé (ex: 3 heures) ?
Non, CopyRates ne supporte que les timeframes standards (M1, M5, M15, M30, H1, H4, D1, W1, MN1). Pour un timeframe personnalisé, vous devrez soit utiliser des indicateurs personnalisés, soit agréger manuellement les données depuis un timeframe inférieur (ex: copier 12 bougies M15 pour simuler une bougie H3).
Mon EA ralentit avec 3 timeframes, que faire ?
Assurez-vous de ne copier que le nombre minimum de bougies nécessaires (3 à 5). Utilisez la vérification TimeCurrent() - data.lastUpdate pour limiter les appels à CopyRates. Sur un timeframe H4, une mise à jour toutes les 30 secondes est suffisante. Évitez également d'appeler CopyRates dans des boucles inutiles.
Comment éviter les erreurs de données lors du changement de symbole ?
Utilisez Symbol() pour vérifier que vous êtes sur le bon graphique. Si votre EA trade plusieurs paires, créez un dictionnaire (tableau associatif) avec le symbole comme clé. Avant chaque appel à CopyRates, vérifiez que le symbole est bien sélectionné avec SymbolSelect(symbol, true).
Est-ce que cette méthode fonctionne pour les indices et les matières premières ?
Oui, CopyRates fonctionne pour tous les instruments disponibles dans MetaTrader 5, qu'il s'agisse de forex, d'indices, de matières premières ou de cryptomonnaies. Assurez-vous simplement que le symbole est correct et que vous avez accès aux données historiques.