Calculer le spread en temps réel dans un EA MQL5 : guide complet pour traders algorithmiques
Maîtrisez la surveillance du spread en temps réel avec MQL5 pour optimiser vos entrées et minimiser les coûts de transaction. Découvrez des fonctions natives, des astuces d’optimisation et des cas d’usage concrets pour vos Expert Advisors.
Introduction : pourquoi le spread en temps réel est crucial pour vos EA MQL5
Le spread (différence entre le prix Bid et Ask) représente le coût immédiat de chaque transaction. Pour un trader algorithmique, ignorer cette variable revient à trader les yeux fermés : une exécution pendant un pic de spread peut annuler plusieurs trades gagnants. Sur MetaTrader 5, le langage MQL5 offre des outils performants pour calculer le spread en temps réel mql5, mais leur utilisation correcte nécessite une compréhension fine des mécanismes internes.
Que vous développiez un scalpeur haute fréquence, un robot de trading de news ou un EA longue tendance, intégrer la surveillance dynamique du spread vous permettra d’éviter les slippages excessifs, d’optimiser vos stops et de filtrer les périodes de faible liquidité. Dans cet article, nous allons explorer les fonctions clés de MQL5, les pièges à éviter et des exemples de code prêts à l’emploi pour intégrer cette mesure dans vos Expert Advisors. Prêt à rendre vos EA plus intelligents ? Suivez le guide.
1. Les fonctions natives MQL5 pour obtenir le spread en temps réel
MQL5 met à disposition plusieurs fonctions pour interroger les propriétés du symbole. La plus directe est SymbolInfoInteger() avec l’identifiant SYMBOL_SPREAD. Cette fonction retourne le spread en points (pips pour les paires Forex) au moment de l’appel. Exemple d’utilisation dans un EA :
// Obtenir le spread actuel en points
int currentSpread = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
Print("Spread actuel : ", currentSpread, " points");
Pour une mesure plus précise, vous pouvez utiliser SymbolInfoDouble() avec SYMBOL_ASK et SYMBOL_BID, puis calculer la différence. Cette approche est recommandée si vous souhaitez exprimer le spread en devise de dépôt ou en pips réels (en fonction du point size) :
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double spreadInPoints = (ask - bid) / _Point;
Attention : SYMBOL_SPREAD peut être mis à jour avec un léger décalage selon le type de cotation (bid/ask). Pour un calcul spread temps réel mql5 fiable, préférez toujours l’écart calculé à partir des prix bruts. Cette méthode vous permet également de détecter les spreads variables en période de volatilité.
2. Surveiller le spread en continu avec OnTick() et OnTimer()
Pour une surveillance dynamique, placez votre calcul dans le gestionnaire d’événements OnTick(). Chaque tick met à jour les prix, vous obtenez donc le spread le plus récent. Cependant, pour éviter une surcharge CPU, surtout sur des paires très liquides (EURUSD, GBPUSD), utilisez un intervalle de temps via OnTimer() :
int OnInit() {
EventSetTimer(1); // Appel toutes les secondes
return(INIT_SUCCEEDED);
}
void OnTimer() {
double spread = (SymbolInfoDouble(_Symbol, SYMBOL_ASK) -
SymbolInfoDouble(_Symbol, SYMBOL_BID)) / _Point;
if(spread > maxAllowedSpread) {
// Logique de blocage des trades
}
}
Cette approche est idéale pour les EA scalpeurs qui doivent réagir rapidement aux variations de spread. Combinez-la avec un filtre de spread maximum : si le spread dépasse un seuil défini (ex : 2 pips pour l’EURUSD), vous désactivez temporairement les nouvelles entrées. Cela évite d’exécuter des trades sur des conditions défavorables.
Astuce : pour les EA multi-symboles, stockez les spreads dans un tableau associatif et mettez-les à jour dans une boucle sur tous les symboles ouverts.
3. Intégrer le spread dans votre logique de gestion des risques
Le spread impacte directement le stop-loss et le take-profit. Un EA intelligent doit ajuster ces niveaux en fonction du spread actuel. Voici un exemple de fonction qui calcule un stop-loss avec une marge de sécurité :
double CalculateStopLoss(double entryPrice, int stopPoints, bool isBuy) {
double spread = (SymbolInfoDouble(_Symbol, SYMBOL_ASK) -
SymbolInfoDouble(_Symbol, SYMBOL_BID)) / _Point;
double adjustedStop = stopPoints + (spread * 0.5); // 50% du spread en buffer
if(isBuy) {
return entryPrice - (adjustedStop * _Point);
} else {
return entryPrice + (adjustedStop * _Point);
}
}
Cette technique garantit que votre stop ne sera pas déclenché par un simple pic de spread. De plus, incluez le spread dans le calcul du volume de position pour respecter votre risque maximum : un spread élevé réduit le volume admissible. Utilisez AccountInfoDouble(ACCOUNT_BALANCE) et un pourcentage de risque fixe pour déterminer la taille de lot.
N’oubliez pas de tester ces paramètres en backtest avec des données ticks réelles (tick data) pour vérifier le comportement de votre EA face aux variations de spread historiques.
4. Pièges à éviter lors du calcul du spread en temps réel
Plusieurs erreurs courantes peuvent fausser votre calcul spread temps réel mql5 :
- Confondre points et pips : Sur MetaTrader 5, le point est la plus petite unité de prix. Pour les paires Forex, 1 pip = 10 points (pour la plupart des brokers). Vérifiez le
_Digitsdu symbole. - Utiliser SymbolInfoInteger() sans vérifier le type de cotation : Certains CFD ou indices ont des spreads variables. La fonction
SYMBOL_SPREADpeut retourner une valeur figée si le broker utilise un spread fixe. - Ignorer les périodes de rollover : Pendant le changement de jour, les spreads peuvent exploser. Programmez une pause de trading entre 21h et 23h UTC.
- Ne pas gérer les erreurs de cotation : Si
SymbolInfoDouble()retourne 0, votre spread sera infini. Ajoutez une conditionif(ask == 0 || bid == 0) return;.
Pour un EA robuste, ajoutez un compteur de ticks et une vérification de la fraîcheur des données : si aucun tick reçu depuis plus de 5 secondes, considérez le spread comme invalide.
MarketInfo() (fonction héritée de MQL4 mais toujours compatible) ou mieux, abonnez-vous aux événements de profondeur de marché via MarketBookAdd(). Cette méthode vous donne le spread réel du carnet d’ordres, idéal pour les stratégies scalpeurs avancées. Attention : nécessite un compte ECN et des droits broker spécifiques.
5. Exemple complet : EA avec filtre de spread dynamique
Voici un squelette d’EA qui intègre un filtre de spread en temps réel et bloque les trades si le spread dépasse un seuil configurable :
input int MaxSpreadPoints = 30; // Spread max en points
input double LotSize = 0.1;
int OnInit() {
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
void OnTimer() {
double spread = (SymbolInfoDouble(_Symbol, SYMBOL_ASK) -
SymbolInfoDouble(_Symbol, SYMBOL_BID)) / _Point;
if(spread > MaxSpreadPoints) {
Comment("Spread trop élevé : ", spread, " points. Trading bloqué.");
return;
}
// Logique de trading ici
if(ShouldOpenBuy()) {
OrderSend(_Symbol, OP_BUY, LotSize, SymbolInfoDouble(_Symbol, SYMBOL_ASK),
3, 0, 0, "Buy", 0, 0, clrNONE);
}
}
Ce code minimaliste illustre le principe. Pour un EA professionnel, ajoutez une gestion des erreurs (slippage, requotes), un trailing stop ajusté au spread, et un système de logs. Testez systématiquement avec le Strategy Tester de MT5 en mode “Tous les ticks” pour valider votre filtre.
Besoin d’un EA sur-mesure avec gestion avancée du spread ? Demander un devis gratuit
Questions fréquentes sur le calcul du spread en temps réel MQL5
Pourquoi mon spread calculé est-il différent de celui affiché sur la plateforme ?
La plateforme MetaTrader 5 affiche souvent le spread moyen ou le dernier spread calculé par le serveur. Votre code calcule le spread instantané entre le dernier Ask et le dernier Bid reçus. Une différence de 1 à 2 points est normale due aux délais de transmission. Pour une concordance parfaite, utilisez SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) qui correspond à la valeur affichée.
Comment obtenir le spread en devise de dépôt (ex : en USD) ?
Multipliez le spread en pips par la valeur du pip en devise de dépôt. Pour une paire comme EURUSD, 1 pip = 10 USD pour un lot standard (100 000 unités). Utilisez SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE) pour obtenir la valeur d’un tick, puis calculez : double spreadCost = spreadInPips * tickValue * 10 (car 1 pip = 10 ticks pour la plupart des paires).
Puis-je utiliser le spread pour filtrer les périodes de news ?
Oui, c’est une excellente pratique. Avant une annonce économique majeure (NFP, décision de taux), le spread augmente souvent de 2 à 5 fois sa valeur normale. Configurez votre EA pour qu’il cesse toute nouvelle entrée si le spread dépasse 150% du spread moyen calculé sur les 5 dernières minutes. Vous pouvez stocker les spreads dans un tableau glissant pour calculer une moyenne mobile.
Quelle est la différence entre spread fixe et spread variable pour mon EA ?
Un spread fixe (brokers market maker) reste constant, votre EA n’a pas besoin de filtre. Un spread variable (brokers ECN/STP) fluctue en fonction de la liquidité. Pour ces derniers, le calcul spread temps réel mql5 est indispensable. Testez votre EA en backtest avec des données de ticks historiques pour simuler les variations de spread.