Accueil > Blog > Market closed (10018 / erreur 132) : résolution complète

MT5MQL5ErreurDépannageEA

Market closed (10018 / erreur 132) : résolution complète

Publié : 2026-07-07Lecture : env. 8 min
This article reflects information as of its publish date. EA performance figures (PF, DD, annual return) change with live trading and re-validation — check the latest on the EA pages. See the latest EA results

Market closed (MT5/MQL5) : résolution complète

Quand Market closed ou market is closed apparaît dans les logs d'un EA, se dire « c'est normal, c'est le week-end » ne suffit que dans la moitié des cas. Elle survient en pleine semaine, ou bien uniquement sur un instrument précis alors que les ordres passent normalement sur d'autres. C'est ce schéma qui pose problème à énormément de traders.

La cause n'est pas seulement le « week-end » : il peut s'agir de la session de trading propre à chaque instrument (coupure quotidienne sur l'or ou les indices boursiers), d'un décalage entre l'heure du serveur du broker et votre heure locale, ou d'une restriction du mode de trading du symbole (close-only, etc.). Cet article s'adresse à la fois aux utilisateurs d'EA sur MT5 et aux développeurs d'EA en MQL5 : il détaille la nature exacte de Market closed, ses 6 causes, un diagnostic en 30 secondes et une prévention permanente côté code. Pour la liste complète des codes d'erreur, consultez le guide complet des codes d'erreur MQL5 / MT5.

Cet article se base sur MT5 (build 4xxx) en date de juillet 2026. Les horaires de session et les noms d'écrans peuvent varier selon le broker et la build.


Qu'est-ce que Market closed (différence entre 10018 et 132)

Le code signifiant « le marché est fermé » diffère entre MT5 et MT4 (MQL4). Reportez-vous à la bonne plateforme et à l'endroit où la valeur a été récupérée.

① TRADE_RETCODE_MARKET_CLOSED = 10018 (MT5 / code retour de OrderSend())

En MQL5, le résultat d'un ordre passé via OrderSend() se trouve dans MqlTradeResult.retcode. 10018 est le code renvoyé lorsque le serveur de trading juge que cet instrument est actuellement hors des heures de trading et rejette l'ordre. Il ne s'agit pas d'une erreur interne à MT5, mais d'un rejet notifié par le serveur du broker.

Signification : marché fermé (Market is closed)
Constante : TRADE_RETCODE_MARKET_CLOSED
Valeur : 10018
// Exemple typique visible dans les logs
2026.07.06 23:05:11.204 EA_NAME XAUUSD,M5: OrderSend error 10018 [Market closed]

② ERR_MARKET_CLOSED = 132 (MT4 / GetLastError() en MQL4)

Sur MT4 (MQL4), lorsque OrderSend() échoue, GetLastError() renvoie 132. Le sens est identique à 10018 : « marché fermé ». Si vous utilisez également une version MT4 de votre EA, la même cause apparaîtra sous la forme 10018 sur MT5 et 132 sur MT4.

Signification : marché fermé (Market is closed)
Constante : ERR_MARKET_CLOSED (MQL4)
Valeur : 132

En pratique :

PlateformeSourceValeur
MT5 (MQL5)MqlTradeResult.retcode / CTrade.ResultRetcode()10018
MT4 (MQL4)GetLastError() après échec de OrderSend()132

Dans les deux cas, la cause profonde est la même : « un ordre a été envoyé en dehors de la session de trading du serveur » (ou le trading de l'instrument est restreint). Le traitement étant commun, il est détaillé ci-dessous.


Diagnostic en 30 secondes

Avant de redémarrer l'EA à l'aveugle, ces quatre points permettent de cerner la cause.

  1. Vérifier la session de trading de l'instrument — dans la fenêtre Market Watch, clic droit sur le symbole concerné → « Spécification » → « Sessions de trading ». Les horaires de trading autorisés par jour de la semaine (heure serveur) y sont indiqués. Si l'heure actuelle tombe hors de cette plage, c'est la réponse.
  2. Vérifier l'heure du serveur — l'heure affichée en haut de la fenêtre Market Watch est l'heure du serveur du broker. L'évaluation de la session se fait sur cette heure, pas sur l'horloge de votre PC. Un décalage de plusieurs heures avec l'heure française est courant.
  3. Vérifier le mode de trading — dans le même écran « Spécification », le champ « Trading » doit-il être autre chose que Full access (Disabled, Close only, etc.) ? Si c'est le cas, les nouvelles positions sont refusées même pendant la session.
  4. Tester un autre instrument — si le même EA ou un ordre manuel passe sans problème sur une paire FX majeure comme EURUSD, le problème ne vient ni du compte ni de l'EA, mais bien de la session/restriction propre à cet instrument.

Causes et solutions (6 cas)

① Le marché entier est fermé (week-end, jour férié)

Symptôme : l'erreur apparaît le samedi, le dimanche, ou lors des fêtes de fin d'année, de Noël, etc. Elle touche tous les instruments.

Cause : le marché du forex est globalement fermé de la clôture du vendredi à l'ouverture du lundi, en heure serveur. Les jours fériés (Nouvel An, Noël, etc.) entraînent une fermeture ou un trading réduit même en semaine. Si l'EA tente de passer un ordre le week-end à cause d'un traitement de fin de bougie ou d'une contrainte d'unité de temps, les erreurs 10018/132 s'enchaînent.

Solution :

  1. L'erreur elle-même est inoffensive. Elle disparaît naturellement à la réouverture du marché
  2. Pour ne pas polluer les logs, ajoutez côté EA une vérification du jour/de la session afin de ne pas envoyer l'ordre du tout (voir le code plus bas)
  3. Le calendrier des jours fériés diffère selon chaque broker : consultez l'annonce des horaires de fermeture de votre broker

② En dehors de la session de trading propre à l'instrument (coupure quotidienne)

Symptôme : l'erreur survient en semaine, uniquement sur certains instruments (or, argent, CFD sur indices boursiers, énergie, etc.), presque toujours à la même heure chaque jour.

Cause : les paires FX se négocient quasiment 24 h/24 en semaine, mais les métaux précieux et les CFD sur indices comportent chaque jour une coupure de trading de quelques dizaines de minutes à plusieurs heures. Cette coupure correspond à la maintenance de la bourse sous-jacente ou au rollover, et ses horaires varient selon le broker et l'instrument. Un ordre envoyé par l'EA pendant cette coupure génère un code 10018.

Solution :

  1. Consultez « Spécification → Sessions de trading » pour connaître la plage horaire exacte de coupure de cet instrument (c'est la seule information fiable : ne vous fiez pas aux horaires trouvés sur un blog tiers, ils diffèrent d'un broker à l'autre)
  2. Utilisez le filtre horaire de l'EA (TradeStartHour/TradeEndHour, etc.) pour éviter la plage de coupure
  3. Côté développement, vérifiez SymbolInfoSessionTrade() dans le code (voir plus bas)

Notez que de nombreux brokers permettent de trader les cryptomonnaies (BTCUSD, etc.) le week-end, mais cela dépend là aussi du broker. Ne partez pas du principe que « la crypto, c'est forcément 24/7 » : vérifiez toujours l'écran de spécification.


③ Confusion entre heure du serveur et heure locale

Symptôme : l'erreur apparaît alors que « d'après la session indiquée dans la spécification, on devrait être dans les heures de trading ». Fréquent avec les brokers étrangers.

Cause : les horaires de session indiqués dans la spécification, tout comme l'heure affichée dans MT5, sont systématiquement exprimés en heure du serveur du broker. De nombreux brokers étrangers utilisent GMT+2/+3 (configuré pour que la clôture de New York corresponde à minuit), ce qui décale l'heure du serveur de 6 à 7 heures par rapport à l'heure française. Un cas typique : il est encore « vendredi soir » en heure locale, alors qu'il est déjà samedi côté serveur.

Solution :

  1. Prenez l'habitude de raisonner à partir de l'heure affichée dans Market Watch (= heure serveur)
  2. Les paramètres de l'EA (filtre d'horaires de trading, etc.) sont généralement à renseigner en heure serveur. Vérifiez que vous ne les avez pas réglés en pensant à l'heure française
  3. Dans le code, utilisez TimeTradeServer() (ne testez jamais la session avec TimeLocal())

④ Symbole en trading désactivé ou en clôture uniquement (SYMBOL_TRADE_MODE)

Symptôme : même en semaine et pendant la session, toutes les nouvelles positions sont refusées sur un instrument précis. Parfois, seule la clôture de position fonctionne.

Cause : les brokers peuvent configurer le mode de trading au niveau de chaque symbole.

SYMBOL_TRADE_MODESignification
SYMBOL_TRADE_MODE_FULLAucune restriction (cas normal)
SYMBOL_TRADE_MODE_CLOSEONLYClôture uniquement (nouvelles positions interdites). Cas d'un CFD proche de sa radiation ou de son changement d'échéance
SYMBOL_TRADE_MODE_DISABLEDTrading totalement désactivé
SYMBOL_TRADE_MODE_LONGONLY / SHORTONLYAchat uniquement / vente uniquement

Il arrive aussi que la configuration diffère entre compte démo et compte réel, ou que les instruments disponibles varient selon le type de compte.

Solution :

  1. Vérifiez le champ « Trading » de l'écran « Spécification »
  2. En mode Close only, renoncez aux nouvelles positions et gérez les positions existantes. Si vous souhaitez continuer à trader cet instrument durablement, vérifiez s'il existe un symbole équivalent avec une autre échéance ou un autre suffixe (par exemple US500.f)
  3. Si le mode reste Disabled, demandez au broker si cet instrument est accessible pour votre type de compte

⑤ Juste après l'ouverture du lundi ou la reprise de session

Symptôme : l'erreur ou le rejet d'exécution survient uniquement pendant les quelques minutes qui suivent l'ouverture du marché le lundi, ou juste après la fin d'une coupure quotidienne.

Cause : un délai existe entre le moment où la session « s'ouvre » et celui où l'exécution devient réellement stable. Juste après l'ouverture, la liquidité est faible et le spread s'élargit fortement ; certains brokers refusent même les ordres tant que les cotations ne circulent pas encore (traité comme un marché fermé). C'est un cas typique pour les EA qui émettent un signal dès l'ouverture du lundi, ou les EA sur l'or visant la reprise après une coupure.

Solution :

  1. Ajoutez un filtre qui évite les nouvelles positions pendant les X minutes suivant l'ouverture (AvoidMondayOpen, etc.). C'est pour cette raison que les EA distribués sur ce site évitent par défaut la plage 0h-3h du lundi (heure serveur)
  2. Combinez toujours un filtre de spread (MaxSpread). Une exécution sur un spread anormal juste après l'ouverture fait bien plus mal qu'une simple erreur
  3. Concevez le système pour ne pas relancer immédiatement après un 10018, mais attendre la bougie suivante

⑥ Suspension du trading liée à l'actualité ou à un événement

Symptôme : erreur temporaire autour de la publication d'indicateurs économiques majeurs, ou lors d'une variation anormale sur un instrument donné.

Cause : certains brokers ou instruments suspendent temporairement le trading (halt) ou restreignent les nouvelles positions lors d'événements majeurs. Sur les CFD d'indices boursiers, un arrêt peut aussi survenir en lien avec un coupe-circuit du marché sous-jacent. Les ordres passés pendant cette période sont rejetés comme s'il s'agissait d'une fermeture de marché.

Solution :

  1. La situation est temporaire et se résout après un délai
  2. Un filtre d'indicateurs économiques (UseEconomicFilter sur les EA de ce site) permet de bloquer les nouvelles positions autour des annonces, évitant à la fois l'erreur et le risque de mouvement brutal

Code MQL5 pour prévenir cette erreur (pour les développeurs d'EA)

Market closed ne doit pas être traitée « après coup » : la bonne conception consiste à vérifier la session et le mode de trading avant l'envoi de l'ordre, et ne rien envoyer si le marché est fermé. Cela permet non seulement d'avoir des logs propres, mais aussi d'éviter des requêtes serveur inutiles et un emballement des tentatives.

Vérifier si l'on est dans la session de trading

SymbolInfoSessionTrade() renvoie l'heure de début/fin (en secondes depuis minuit, heure serveur) de la i-ème session pour le jour de la semaine indiqué. Pour gérer les instruments à sessions multiples (indices avec coupure quotidienne, par exemple), on parcourt toutes les sessions en boucle.

// Détermine si l'heure serveur actuelle se situe dans la session de trading de ce symbole
bool IsTradeSessionOpen(const string symbol)
{
   MqlDateTime dt;
   TimeToStruct(TimeTradeServer(), dt);           // toujours évaluer en heure serveur
   int now = dt.hour*3600 + dt.min*60 + dt.sec;   // secondes écoulées depuis minuit

   datetime from, to;
   for(uint i = 0; SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)dt.day_of_week, i, from, to); i++)
   {
      int f = (int)from;                 // secondes depuis minuit
      int t = (int)to;                   // une fin à 24h00 vaut 86400
      if(now >= f && now < t)
         return true;
   }
   return false;   // aucune session ce jour-là (week-end, etc.) ou hors de toutes les sessions
}

Vérifier le mode de trading (SYMBOL_TRADE_MODE)

// Détermine si une nouvelle entrée est autorisée selon le mode de trading
bool IsNewEntryAllowed(const string symbol, ENUM_ORDER_TYPE type)
{
   long mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
   if(mode == SYMBOL_TRADE_MODE_DISABLED)  return false; // trading désactivé
   if(mode == SYMBOL_TRADE_MODE_CLOSEONLY) return false; // clôture uniquement = pas de nouvelle position
   if(mode == SYMBOL_TRADE_MODE_LONGONLY  && type != ORDER_TYPE_BUY)  return false;
   if(mode == SYMBOL_TRADE_MODE_SHORTONLY && type != ORDER_TYPE_SELL) return false;
   return true;   // SYMBOL_TRADE_MODE_FULL, etc.
}

Regrouper ces vérifications en verrou avant envoi

// Dans OnTick : même si un signal se déclenche, ne rien envoyer si le marché est fermé
if(!IsTradeSessionOpen(_Symbol) || !IsNewEntryAllowed(_Symbol, ORDER_TYPE_BUY))
{
   // Évite le 10018 en amont. On garde une seule ligne de log et on attend la bougie suivante
   return;
}

Gérer le cas où 10018 est quand même renvoyé

Il reste impossible d'éliminer totalement les cas qui passent au travers du verrou, comme un décalage dans la mise à jour des informations de session ou un rejet juste après l'ouverture. La règle est de ne jamais relancer immédiatement en cas de retcode 10018 (attendre la bougie suivante). Multiplier les tentatives pendant une fermeture ne fait que polluer les logs, sans rien améliorer.

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... construction de req ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_MARKET_CLOSED)   // 10018
      Print("Market closed. Skip and wait for the next session.");
   else
      PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}

En pratique, un EA qui envoie des ordres juste après l'ouverture du lundi ou autour d'une coupure quotidienne (notamment sur l'or et les indices) se heurte quotidiennement à cette erreur. Un EA conçu avec le calendrier en tête — vérification de session, prudence juste après l'ouverture, clôture avant le week-end — évite non seulement les erreurs inutiles, mais aussi les mauvaises exécutions dans les plages de faible liquidité. Les EA distribués par FXEA365 intègrent en standard l'évitement de l'ouverture du lundi (AvoidMondayOpen), un filtre horaire et une clôture avant le week-end (CloseAllBeforeWeekend).


Check-list par priorité

PrioritéÀ vérifierSolution
🚨 D'abordSommes-nous en week-end/jour férié (en heure serveur) ?Il suffit d'attendre. L'erreur elle-même est inoffensive
🚨 D'abordSommes-nous dans la plage de « Sessions de trading » de la spécification ?Éviter la coupure propre à l'instrument via un filtre horaire
⚠️ EnsuiteY a-t-il confusion entre heure serveur et heure française ?Se recaler sur l'heure affichée dans Market Watch
⚠️ EnsuiteLe mode de trading est-il en Full access ?Si Close only / Disabled, vérifier les conditions auprès du broker
✅ À vérifierSommes-nous juste après l'ouverture ou juste après une coupure ?Attente de X minutes + filtre de spread
🛠 DéveloppementLa session/le mode sont-ils vérifiés avant l'envoi de l'ordre ?Implémenter un verrou via SymbolInfoSessionTrade

En résumé

  • Market closed correspond au code 10018 sur MT5 (TRADE_RETCODE_MARKET_CLOSED) et 132 sur MT4 (ERR_MARKET_CLOSED). Le sens est identique : « ordre en dehors de la session de trading / trading restreint ».
  • Au-delà du week-end, cela peut aussi provenir de la coupure quotidienne propre à l'instrument (or, indices), d'un décalage avec l'heure serveur, d'une restriction SYMBOL_TRADE_MODE, ou d'un rejet juste après l'ouverture. Si l'erreur survient en semaine, commencez par « Spécification → Sessions de trading ».
  • Les horaires de session varient selon le broker et l'instrument. Seuls les horaires indiqués dans l'écran de spécification de votre propre MT5 font foi.
  • Les développeurs d'EA doivent mettre en place un verrou permanent avant l'envoi de l'ordre combinant SymbolInfoSessionTrade(), SYMBOL_TRADE_MODE et TimeTradeServer(). En cas de 10018, ne pas relancer immédiatement : attendre la bougie suivante.

Pour l'ensemble des codes d'erreur, consultez le guide complet des codes d'erreur MQL5 / MT5 ; pour des EA gratuits intégrant en standard l'évitement de session et les filtres horaires, consultez la liste des EA.


FAQ

Q : Market closed apparaît en pleine semaine, en journée. Pourquoi ?

Cela provient soit d'une plage de coupure de trading propre à cet instrument (coupure quotidienne), soit d'une restriction du mode de trading du symbole. L'or, l'argent et les CFD sur indices boursiers comportent des plages horaires non négociables chaque jour, même en semaine. Faites un clic droit sur le symbole dans Market Watch → « Spécification », puis vérifiez les champs « Sessions de trading » et « Trading ».

Q : Quelle différence entre 10018 et 132 ?

Seule la plateforme diffère, le sens est identique. 10018 (TRADE_RETCODE_MARKET_CLOSED) est le code retour de OrderSend() sur MT5, tandis que 132 (ERR_MARKET_CLOSED) est la valeur de GetLastError() sur MT4 (MQL4). Le traitement est le même.

Q : Mon EA génère des erreurs en continu le week-end. Peut-on laisser faire sans risque ?

Il n'y a aucun impact réel. Cela s'arrête naturellement à la réouverture du marché. Mais si les logs pollués ou les notifications push continues vous gênent, la solution durable consiste à ajouter côté EA une vérification du jour/de la session pour empêcher l'envoi même de l'ordre (voir le code dans l'article).

Q : Market closed apparaît aussi sur une cryptomonnaie (BTCUSD). Ce n'est pourtant pas censé se trader 24h/24 ?

La possibilité de trader les CFD crypto le week-end dépend entièrement du broker. Certains brokers suspendent le trading le week-end ou prévoient une courte coupure de maintenance. Comme pour les paires FX, vérifiez les horaires de trading réellement applicables chez votre broker via « Spécification → Sessions de trading ».

📧 Alertes avant hausse de prix + cours gratuit de 5 jours par e-mail

Tous les EA sont au prix de lancement et augmentent par paliers selon les ventes. Soyez averti avant chaque hausse, plus un e-mail quotidien sur le trading algo, la lecture des backtests et le choix du courtier.

* Confidentialité strictement protégée. Vous pouvez vous désabonner à tout moment.

Commentaires et questions