MT5 « Not enough money » (134/10019) : 7 causes et solutions
Sommaire
- Qu'est-ce que ERR_NO_MONEY (différence entre 134 et 10019)
- ① ERR_NO_MONEY = 134 (erreur d'exécution via `GetLastError()`)
- ② TRADE_RETCODE_NO_MONEY = 10019 (code retour de `OrderSend()`)
- Diagnostic rapide en 30 secondes
- Causes et solutions (6 scénarios)
- ① Manque réel de fonds
- ② Lot trop important (par rapport au solde)
- ③ Effet de levier faible ou limité en fin de semaine/lors d'événements
- ④ Marge bloquée par des positions existantes
- ⑤ Bonus ou crédit inclus dans le calcul de marge
- ⑥ Différence de taille de contrat selon le type de compte (standard vs cent/micro)
- Particularités selon le broker
- Code MQL5 pour prévenir cette erreur (pour les développeurs d'EA)
- Vérifier la marge nécessaire avant l'envoi de l'ordre
- Normaliser le lot au minimum/au pas autorisé
- Toujours vérifier le retcode de OrderSend
- Arrêt d'urgence basé sur le niveau de marge
- Checklist par ordre de priorité
- Résumé
- FAQ
- Q : Mon solde est suffisant, mais ERR_NO_MONEY apparaît quand même. Pourquoi ?
- Q : Quelle est la différence entre 134 et 10019 ?
- Q : L'erreur n'apparaît pas en backtest mais apparaît en trading réel.
- Q : Avec un EA de type martingale/grille, ERR_NO_MONEY apparaît lorsque les paliers deviennent profonds.
- Q : Peut-on éviter automatiquement ce problème dans le code de l'EA ?
- Q : Avec quel capital minimum peut-on démarrer sans difficulté ?
ERR_NO_MONEY (MT5/MQL5) : la solution complète
Lorsque vous faites tourner un EA et que ERR_NO_MONEY ou not enough money apparaît dans l'onglet Expert ou le journal, on pense immédiatement « je n'ai plus assez de fonds ». Pourtant, cette erreur peut survenir même avec un solde confortable. La cause n'est pas uniquement « fonds à zéro » : le calcul du lot, l'effet de levier, la marge bloquée par des positions existantes, entre autres, peuvent aussi être en jeu.
Cet article s'adresse à la fois aux utilisateurs d'EA sur MT5 et aux développeurs MQL5. Il rassemble en un seul guide la nature exacte de ERR_NO_MONEY, ses 6 causes, les solutions immédiates, les particularités selon le broker, et la prévention définitive côté code. Pour la liste complète des codes d'erreur, consultez le guide général des codes d'erreur MQL5 / MT5.
Cet article se base sur MT5 (build 4xxx) à la date de juin 2026. Les valeurs et noms d'écrans peuvent légèrement varier selon le broker et la build.
Qu'est-ce que ERR_NO_MONEY (différence entre 134 et 10019)
En MQL5, la valeur signifiant « fonds insuffisants » existe sous deux formes selon l'endroit où elle est récupérée. Confondre les deux complique inutilement le diagnostic.
① ERR_NO_MONEY = 134 (erreur d'exécution via GetLastError())
C'est le code d'erreur d'exécution renvoyé par GetLastError(). Le code 134 apparaît lorsque des fonctions de calcul comme OrderCalcMargin() ou OrderCalcProfit(), ou du code de style ancien, déterminent que « la marge nécessaire dépasse la marge libre ».
Signification : fonds insuffisants pour l'opération de trading (not enough money)
Constante : ERR_NO_MONEY
Valeur : 134
② TRADE_RETCODE_NO_MONEY = 10019 (code retour de OrderSend())
Le résultat d'un envoi d'ordre réel via OrderSend() en MQL5 se trouve dans MqlTradeResult.retcode. Lorsque l'ordre est rejeté par le serveur pour cause de fonds insuffisants, ce n'est pas le code 134 mais 10019 (TRADE_RETCODE_NO_MONEY). Il ne s'agit pas d'une erreur côté MT5, mais bien d'un rejet émis par le serveur du broker.
Signification : fonds insuffisants pour exécuter la requête (There is not enough money to complete the request)
Constante : TRADE_RETCODE_NO_MONEY
Valeur : 10019
// Exemple de sortie typique visible dans le journal
2026.06.12 09:15:32.441 EA_NAME XAUUSD,H1: OrderSend error 10019
En pratique :
| Source | Valeur | Contexte d'apparition |
|---|---|---|
GetLastError() | 134 (ERR_NO_MONEY) | Calcul via OrderCalcMargin, vérification interne |
MqlTradeResult.retcode | 10019 (TRADE_RETCODE_NO_MONEY) | OrderSend rejeté par le serveur |
CTrade.ResultRetcode() | 10019 | Ordre rejeté via CTrade |
Si le journal affiche « 134 », le problème se situe au niveau du calcul/de la vérification interne ; si c'est « 10019 » ou not enough money dans l'onglet Expert, c'est un rejet côté serveur. Dans les deux cas, la cause profonde est identique (marge nécessaire > marge disponible), donc la solution est commune.
Diagnostic rapide en 30 secondes
Ouvrez l'onglet « Boîte à outils → Trading » de MT5 et vérifiez ces trois valeurs :
Solde (Balance) : les fonds du compte
Fonds propres (Equity) : solde ± profit/perte flottant(e)
Marge libre (Free Margin): marge disponible pour une nouvelle position ← c'est celle-ci qui compte
Niveau de marge (Margin Level %) : Equity / Margin × 100
- Si la marge libre (Free Margin) est inférieure à la marge nécessaire pour la nouvelle position à ouvrir → l'erreur ERR_NO_MONEY est garantie à 100 %.
- Si l'erreur survient malgré un solde suffisant, la cause est l'une des suivantes : « ② lot trop élevé », « ④ marge bloquée par des positions existantes » ou « ⑥ type de compte incompatible » (voir plus bas).
La marge nécessaire pour une position peut être vérifiée dans MT5 via « Cotations → clic droit sur le symbole → Spécification » (champ « marge pour 1 lot »). En simplifiant :
Marge nécessaire ≈ (Lot × Taille du contrat × Prix) / Effet de levier
Causes et solutions (6 scénarios)
① Manque réel de fonds
Symptôme : les pertes flottantes se sont creusées et la marge libre est passée sous le seuil requis pour une nouvelle position. Fréquent après une série de pertes ou lorsque le niveau de moyenne à la baisse (martingale) est profond.
Solution :
- Effectuer un dépôt supplémentaire, ou
- Clôturer manuellement une partie des positions ouvertes pour libérer de la marge
- Réduire le paramètre
RiskPercentde l'EA pour diminuer la taille des lots futurs
Si ce scénario se répète fréquemment avec un EA donné, cela indique que le lot est structurellement trop important par rapport aux fonds disponibles. Voir ②.
② Lot trop important (par rapport au solde)
Symptôme : malgré un solde suffisant, ERR_NO_MONEY apparaît dès le tout premier ordre. Fréquent en mode lot fixe.
Cause : le paramètre FixedLot n'est pas adapté au solde et à l'effet de levier du compte. Par exemple, sur un compte de 100 000 yens (≈ 670 $), tenter d'ouvrir 0,1 lot sur XAUUSD peut dépasser le solde disponible selon l'effet de levier.
Solution :
- Réduire le lot fixe au minimum (0,01) pour vérifier si l'ordre peut être passé
- Passer au calcul automatique en pourcentage de risque (
UseFixedLot=false/RiskPercent) - Si même 0,01 lot ne passe pas, le problème vient de l'effet de levier ou des fonds du compte → voir ③ et ⑥
Repère : concevoir l'EA pour pouvoir démarrer avec un lot minimum de 0,01 sur un compte standard de 100 000 yens (≈ 670 $) est un critère raisonnable. En dessous de ce montant, ou pour une gestion plus prudente avec des lots réduits, envisagez un « compte cent (micro) », présenté plus loin.
③ Effet de levier faible ou limité en fin de semaine/lors d'événements
Symptôme : le même EA avec le même lot fonctionne sur un autre compte, mais échoue avec ERR_NO_MONEY sur celui-ci. Ou l'erreur se concentre entre le vendredi soir et le lundi matin.
Cause : un effet de levier faible (ex. 1:30 sur un compte réglementé UE, contre 1:1000 sur un compte offshore) peut multiplier la marge nécessaire par plusieurs dizaines. De plus, certains brokers réduisent l'effet de levier le week-end ou autour de publications économiques majeures (XM limite par exemple l'effet de levier à 200:1 le week-end), ce qui peut faire grimper soudainement la marge nécessaire sur une position déjà ouverte. Pour l'or ou les cryptos, un plafond de levier spécifique par symbole peut aussi s'appliquer.
Solution :
- Vérifier l'effet de levier du compte (espace client du broker ou informations du compte dans MT5)
- Vérifier le « taux de marge » dans les spécifications du symbole (parfois plus bas pour certains instruments)
- Utiliser un paramètre évitant de conserver des positions le week-end (
CloseAllBeforeWeekend=true, etc.), ou choisir un broker sans restriction de levier le week-end - Passer à un compte à effet de levier plus élevé ou réduire le lot
④ Marge bloquée par des positions existantes
Symptôme : la première position s'ouvre, mais les suivantes (ou les renforcements de type moyenne à la baisse) échouent avec ERR_NO_MONEY.
Cause : des positions déjà ouvertes bloquent de la marge, ce qui fait passer la marge libre sous le seuil requis pour une nouvelle position. Ce cas est fréquent lorsque plusieurs paires ou plusieurs EA tournent sur un même compte.
Solution :
- Vérifier la marge utilisée (Margin) et la marge libre dans l'onglet « Trading »
- Vérifier si plusieurs EA se disputent la marge sur le même compte (en cas d'utilisation simultanée)
- Limiter le nombre maximal de positions simultanées via les paramètres de l'EA
- Pour les EA de type martingale/grille, la consommation de marge s'accélère fortement à mesure que le nombre de paliers augmente → revoir la limite de paliers, le multiplicateur de lot et les paramètres de clôture d'urgence
⑤ Bonus ou crédit inclus dans le calcul de marge
Symptôme : ERR_NO_MONEY apparaît alors que « solde + bonus » devrait suffire.
Cause : selon le broker, le crédit (bonus) peut être exclu ou seulement partiellement inclus dans le calcul de la marge. Le solde affiché et la marge réellement utilisée par le serveur peuvent donc diverger.
Solution : vérifier dans les conditions de bonus du broker si le crédit est comptabilisé dans la marge. Si ce n'est pas le cas, réduire le lot pour que la marge nécessaire soit couverte uniquement par les fonds réellement déposés.
⑥ Différence de taille de contrat selon le type de compte (standard vs cent/micro)
Symptôme : un même « lot 0,01 » déclenche soudainement ERR_NO_MONEY après un changement de compte, ou inversement produit un lot excessif.
Cause : la taille de contrat diffère d'environ 100 fois entre un compte cent (micro) et un compte standard. Sur un compte cent, 0,01 lot représente une exposition réelle environ 100 fois plus faible. Si l'EA utilise un lot fixe sans distinguer le type de compte, une insuffisance de marge peut survenir sur l'un des deux.
Solution :
- Pour une gestion prudente avec un capital limité, utiliser un compte cent/micro afin d'éviter un risque excessif même au lot minimum
- Concevoir l'EA pour qu'il ne code pas en dur le type de compte, mais détermine le lot en fonction de la marge réellement nécessaire via
OrderCalcMargin()(voir section suivante)
Particularités selon le broker
| Broker | Caractéristiques | Fréquence de ERR_NO_MONEY |
|---|---|---|
| XM | Limitation de l'effet de levier le week-end · Stop Out à 20 % | Moyenne (plus élevée le week-end) |
| Exness | Compte à effet de levier illimité disponible · Stop Out à 0 % | Faible |
| HFM / FXGT etc. | Comptes à effet de levier élevé disponibles | Faible |
Le compte à effet de levier illimité d'Exness (compte Pro/Raw Spread) permet souvent de passer de nouveaux ordres même avec une marge libre quasiment nulle, ce qui rend cette erreur rare. Cela le rend bien adapté aux EA de type martingale, mais attention : le stop out étant moins réactif, le risque de pertes qui s'aggravent est plus élevé en contrepartie. Pour une comparaison des brokers, consultez également la page de comparaison des brokers.
Code MQL5 pour prévenir cette erreur (pour les développeurs d'EA)
Au-delà de « corriger », la bonne approche de conception pour un EA consiste à empêcher purement et simplement ERR_NO_MONEY avant même l'envoi de l'ordre. L'idée : calculer la marge nécessaire avant de passer l'ordre, et ne pas ouvrir de position (ou réduire le lot) si elle est insuffisante.
Vérifier la marge nécessaire avant l'envoi de l'ordre
// Garde-fou avant envoi : vérifier marge nécessaire <= marge libre avant d'appeler OrderSend
bool HasEnoughMargin(ENUM_ORDER_TYPE type, double lots)
{
double price = (type == ORDER_TYPE_BUY)
? SymbolInfoDouble(_Symbol, SYMBOL_ASK)
: SymbolInfoDouble(_Symbol, SYMBOL_BID);
double margin = 0.0;
if(!OrderCalcMargin(type, _Symbol, lots, price, margin))
{
Print("OrderCalcMargin failed: ", GetLastError()); // 134 etc.
return false;
}
double freeMargin = AccountInfoDouble(ACCOUNT_MARGIN_FREE);
if(margin > freeMargin)
{
PrintFormat("Skip: need %.2f > free %.2f (ERR_NO_MONEY guard)", margin, freeMargin);
return false; // Ne pas ouvrir = prévention de ERR_NO_MONEY
}
return true;
}
Normaliser le lot au minimum/au pas autorisé
Envoyer directement une valeur calculée en pourcentage de risque sans ajustement peut ne pas correspondre au lot minimum ou au pas de lot, entraînant un rejet (l'absence de normalisation est une cause classique de rejet d'ordre). Plutôt que d'abandonner lorsque le lot calculé ne peut pas être ouvert tel quel, le réduire à la plage autorisée permet de limiter les occasions manquées.
double NormalizeLot(double lots)
{
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
double step = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
lots = MathFloor(lots / step) * step; // Arrondi au pas
lots = MathMax(minLot, MathMin(maxLot, lots)); // Ajustement entre min et max
return NormalizeDouble(lots, 2);
}
Toujours vérifier le retcode de OrderSend
Ne vous fiez pas uniquement à la valeur de retour (bool) de OrderSend() : vérifiez result.retcode et gérez spécifiquement le code 10019 (TRADE_RETCODE_NO_MONEY).
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_NO_MONEY) // 10019
Print("Not enough money. Réduisez le lot ou effectuez un dépôt.");
else
PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}
Avec CTrade, vous pouvez vérifier si trade.ResultRetcode() vaut 10019, ou consulter trade.ResultRetcodeDescription().
Arrêt d'urgence basé sur le niveau de marge
Mettre en place un dispositif de sécurité qui interrompt les nouvelles ouvertures (ou clôture tout) lorsque le niveau de marge passe sous un certain seuil permet d'éviter à la fois les répétitions de ERR_NO_MONEY et l'effondrement du compte.
double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // Niveau de marge en %
if(level > 0 && level < EmergencyMarginLevel) // Ex. : 150 %
{
// Arrêter les nouvelles entrées et/ou clôturer partiellement les positions si nécessaire
}
Les EA distribués par FXEA365 intègrent nativement le calcul automatique du lot en pourcentage de risque, la vérification de marge avant envoi d'ordre et l'arrêt d'urgence basé sur le niveau de marge (UseMarginEmergencyClose), ce qui permet de les faire fonctionner sans difficulté même avec un capital minimal.
Checklist par ordre de priorité
| Priorité | Vérification | Solution |
|---|---|---|
| 🚨 En premier | Marge libre < marge nécessaire ? | Dépôt, clôture partielle, ou réduction du lot |
| 🚨 En premier | Lot fixe excessif par rapport au solde ? | Passer à 0,01 ou au calcul automatique en % de risque |
| ⚠️ Ensuite | Effet de levier du compte faible ou limité le week-end ? | Compte à levier élevé, clôture le week-end, ou réduction du lot |
| ⚠️ Ensuite | Marge bloquée par des positions existantes ou d'autres EA ? | Réorganiser les positions ouvertes sur le compte |
| ✅ À vérifier | Différence de taille de contrat cent/standard | Adapter le lot au type de compte |
| 🛠 Développement | Se protéger via OrderCalcMargin avant l'envoi | Implémenter le code présenté ci-dessus |
Résumé
ERR_NO_MONEYse présente sous deux formes — 134 (GetLastError) et 10019 (retcode de OrderSend = TRADE_RETCODE_NO_MONEY) — mais la cause profonde reste la même : « marge nécessaire > marge disponible ».- Même avec un solde suffisant, l'erreur peut survenir à cause d'un lot trop élevé, d'un effet de levier faible (y compris les limitations du week-end), d'une marge bloquée par des positions existantes ou d'un type de compte inadapté.
- Les utilisateurs d'EA doivent prévenir le problème via un « lot automatique en % de risque » et un « type de compte adapté » ; les développeurs d'EA doivent mettre en place des mesures définitives : « garde-fou
OrderCalcMarginavant envoi », « normalisation du lot » et « gestion du retcode 10019 ».
Pour l'ensemble des codes d'erreur, consultez le guide général des codes d'erreur MQL5 / MT5, et pour des EA gratuits fonctionnant avec une gestion de capital raisonnable, consultez la liste des EA. Si vous utilisez un EA de ce site et qu'un changement de paramètres ne résout pas le problème, contactez-nous via le formulaire de support en joignant une capture d'écran de l'état de marge de votre compte.
FAQ
Q : Mon solde est suffisant, mais ERR_NO_MONEY apparaît quand même. Pourquoi ?
Parce que le calcul se base non pas sur le solde (Balance) mais sur la marge libre (Free Margin). Si les pertes flottantes ou la marge bloquée par des positions existantes ont réduit la marge libre, une nouvelle position ne peut pas s'ouvrir même avec un solde suffisant. Vérifiez la marge libre dans l'onglet « Trading ».
Q : Quelle est la différence entre 134 et 10019 ?
134 (ERR_NO_MONEY) est l'erreur d'exécution renvoyée par GetLastError(), tandis que 10019 (TRADE_RETCODE_NO_MONEY) est le résultat (retcode) de OrderSend(). Seul le contexte d'apparition diffère ; la cause (fonds insuffisants) est identique.
Q : L'erreur n'apparaît pas en backtest mais apparaît en trading réel.
Cela vient du fait que l'effet de levier, le type de compte (cent/standard) et les positions existantes du compte réel diffèrent des paramètres du test. L'écart d'effet de levier et la différence de taille de contrat ont un impact particulièrement important.
Q : Avec un EA de type martingale/grille, ERR_NO_MONEY apparaît lorsque les paliers deviennent profonds.
C'est un signe précurseur d'un comportement normal. Plus le nombre de paliers augmente, plus la consommation de marge s'accélère. Réduisez la limite de paliers et le multiplicateur de lot, activez impérativement une clôture d'urgence comme UseMarginEmergencyClose, et n'utilisez que des fonds dont la perte serait supportable.
Q : Peut-on éviter automatiquement ce problème dans le code de l'EA ?
Oui. Il suffit de calculer la marge nécessaire avec OrderCalcMargin() avant l'envoi de l'ordre, et de mettre en place un garde-fou qui n'ouvre pas la position (ou réduit le lot) si elle dépasse AccountInfoDouble(ACCOUNT_MARGIN_FREE). Voir l'exemple de code dans le corps de l'article.
Q : Avec quel capital minimum peut-on démarrer sans difficulté ?
Un compte standard de 100 000 yens (≈ 670 $) avec un lot minimum de 0,01 constitue un repère raisonnable. Pour un capital plus faible ou une gestion plus prudente, un compte cent (micro) permet de réduire l'exposition réelle même au lot minimum, ce qui facilite l'évitement de ERR_NO_MONEY.
Associés
📧 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.