Home > Blog > MT5 "Not enough money" (134/10019): 7 cause e soluzioni

MT5MQL5ErroriRisoluzione problemiEAMargine

MT5 "Not enough money" (134/10019): 7 cause e soluzioni

Pubblicato: 2026-06-12Lettura: circa 7 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

ERR_NO_MONEY (MT5/MQL5): la guida definitiva

Quando si utilizza un EA e nella scheda Expert o nel Journal compare ERR_NO_MONEY o not enough money, è naturale pensare "i fondi sono finiti?". In realtà questo errore può comparire anche con un saldo ampiamente sufficiente. La causa non è solo "fondi a zero": può dipendere dal calcolo del lotto, dalla leva, dal margine bloccato da posizioni esistenti e da altri fattori.

Questo articolo è pensato sia per chi utilizza un EA su MT5 sia per chi sviluppa EA in MQL5, e riunisce in un'unica guida la natura di ERR_NO_MONEY, le sue 6 cause principali, le soluzioni immediate, le particolarità dei singoli broker e la prevenzione permanente lato codice. Per l'elenco completo dei codici di errore, consulta la guida generale ai codici di errore MQL5/MT5.

Questo articolo fa riferimento a MT5 (build serie 4xxx) a giugno 2026. Valori numerici e nomi delle schermate possono variare leggermente a seconda del broker e della build.


Cos'è ERR_NO_MONEY (differenza tra 134 e 10019)

In MQL5 esistono due valori distinti per indicare "fondi insufficienti", a seconda di dove vengono rilevati. Confonderli rende più complessa l'individuazione della causa.

① ERR_NO_MONEY = 134 (errore runtime di GetLastError())

È il codice di errore runtime restituito da GetLastError(). Il valore 134 viene impostato quando funzioni di calcolo come OrderCalcMargin() o OrderCalcProfit(), oppure codice in stile precedente, rilevano che "il margine richiesto supera il margine libero".

Significato: fondi insufficienti per l'operazione di trading richiesta (not enough money)
Costante: ERR_NO_MONEY
Valore  : 134

② TRADE_RETCODE_NO_MONEY = 10019 (retcode di OrderSend())

Il risultato di un invio ordine effettivo tramite OrderSend() in MQL5 viene restituito in MqlTradeResult.retcode. Quando l'ordine viene rifiutato dal server per fondi insufficienti, il codice non è 134 ma 10019 (TRADE_RETCODE_NO_MONEY). Non si tratta di un errore di MT5, bensì di una notifica di rifiuto da parte del server del broker.

Significato: fondi insufficienti per completare l'ordine (There is not enough money to complete the request)
Costante: TRADE_RETCODE_NO_MONEY
Valore  : 10019
// Esempio tipico di output visibile nel log
2026.06.12 09:15:32.441 EA_NAME XAUUSD,H1: OrderSend error 10019

Come distinguerli in pratica:

FonteValoreQuando compare
GetLastError()134 (ERR_NO_MONEY)Calcoli come OrderCalcMargin, controlli interni
MqlTradeResult.retcode10019 (TRADE_RETCODE_NO_MONEY)OrderSend rifiutato dal server
CTrade.ResultRetcode()10019Rifiuto dell'ordine tramite CTrade

Se nel log compare "134", il problema si verifica in fase di calcolo/controllo interno; se compare "10019" oppure "not enough money" nella scheda Expert, il rifiuto avviene lato server. In entrambi i casi la causa di fondo è la stessa (margine richiesto > margine disponibile), quindi la soluzione è comune.


Verifica rapida in 30 secondi

Nella scheda "Toolbox → Trade" di MT5, controlla questi tre valori.

Saldo (Balance)              : liquidità del conto
Patrimonio netto (Equity)    : Saldo ± profitto/perdita non realizzati
Margine libero (Free Margin) : margine disponibile per nuove operazioni ← questo è il valore chiave
Livello di margine % (Margin Level): Equity / Margin × 100
  • Se il margine libero (Free Margin) è inferiore al margine richiesto dalla nuova posizione, otterrai sistematicamente ERR_NO_MONEY.
  • Se compare pur avendo saldo sufficiente, la causa è una tra: "②lotto eccessivo", "④margine bloccato da posizioni esistenti" oppure "⑥tipo di conto diverso", descritte più avanti.

Il margine richiesto per una posizione si può verificare in MT5 su "Market Watch → clic destro sul simbolo → Specifiche" (margine per 1 lotto). In sintesi, la formula è:

Margine richiesto ≈ (Lotto × Dimensione del contratto × Prezzo) / Leva

Cause e soluzioni (6 pattern)

① Fondi effettivamente insufficienti

Sintomo: le perdite non realizzate sono aumentate e il Free Margin è sceso sotto il livello richiesto dalla nuova posizione. Frequente dopo una serie di perdite o con un livello di martingala (nampin) profondo.

Soluzione:

  1. Effettua un deposito aggiuntivo, oppure
  2. Chiudi manualmente parte delle posizioni aperte per liberare margine
  3. Riduci il parametro RiskPercent dell'EA per diminuire i lotti futuri

Se questo pattern si ripete spesso con un determinato EA, significa che i lotti sono comunque troppo grandi rispetto al capitale disponibile. Vedi il punto ②.


② Lotto troppo grande (rispetto al saldo)

Sintomo: pur avendo saldo sufficiente, ERR_NO_MONEY compare fin dal primo ordine. Frequente con lotti fissi.

Causa: FixedLot non è proporzionato al saldo/leva del conto. Ad esempio, con un conto da 100.000 yen (≈$670) che tenta di aprire 0,1 lotti su XAUUSD, a seconda della leva il margine richiesto può superare il saldo.

Soluzione:

  1. Riduci il lotto fisso al minimo (0,01) e verifica se l'ordine viene eseguito
  2. Passa al calcolo automatico basato sul rischio % (UseFixedLot=false / RiskPercent)
  3. Se nemmeno 0,01 lotti riesce a essere aperto, il problema è la leva o i fondi del conto → vedi ③ e ⑥

Indicativamente: un design che permetta di partire da un conto standard con 100.000 yen (≈$670) e lotto minimo 0,01 rappresenta un livello di rischio ragionevole. Con capitale inferiore, o per operare in modo più prudente con lotti ancora più piccoli, valuta un "conto micro (cent)", descritto più avanti.


③ Leva bassa o limitata nel weekend/durante eventi

Sintomo: lo stesso EA con lo stesso lotto funziona su un altro conto ma su questo dà ERR_NO_MONEY, oppure l'errore si concentra tra venerdì sera e lunedì mattina.

Causa: con una leva bassa (es. 1:30 su un conto regolamentato UE contro 1:1000 su un conto offshore), il margine richiesto può variare di decine di volte. Inoltre alcuni broker riducono la leva nei weekend o in prossimità di dati macroeconomici importanti (XM, ad esempio, limita la leva a 200:1 nel weekend), causando un aumento improvviso del margine richiesto mentre una posizione è ancora aperta. Su oro e criptovalute, inoltre, il limite di leva può essere impostato separatamente per singolo simbolo.

Soluzione:

  1. Verifica la leva del conto (area riservata del broker o informazioni del conto in MT5)
  2. Controlla il "margine %" nelle specifiche del simbolo (può essere più basso per alcuni strumenti)
  3. Utilizza un'impostazione che eviti di mantenere posizioni nel weekend (es. CloseAllBeforeWeekend=true), oppure scegli un broker senza restrizioni di leva nel weekend
  4. Passa a un conto con leva più alta o riduci il lotto

④ Margine bloccato da posizioni esistenti

Sintomo: la prima posizione viene aperta correttamente, ma dalla seconda in poi o con l'aggiunta di posizioni (nampin) compare ERR_NO_MONEY.

Causa: le posizioni già aperte bloccano margine, facendo scendere il Free Margin sotto il livello necessario per la nuova operazione. È un problema comune quando si utilizzano più coppie o più EA sullo stesso conto.

Soluzione:

  1. Nella scheda "Trade" controlla il margine utilizzato (Margin) e il Free Margin
  2. Verifica se più EA sullo stesso conto si contendono il margine (in caso di utilizzo di più EA contemporaneamente)
  3. Limita il numero massimo di posizioni simultanee tramite i parametri dell'EA
  4. Negli EA a martingala/griglia, più aumentano i livelli, più rapidamente si consuma il margine → rivedi il limite di livelli, il moltiplicatore del lotto e le impostazioni di chiusura d'emergenza

⑤ Bonus/credito inclusi nel calcolo del margine

Sintomo: "saldo + bonus" dovrebbe essere sufficiente, ma compare comunque ERR_NO_MONEY.

Causa: a seconda del broker, il credito (bonus) può non essere incluso, o essere incluso solo parzialmente, nel calcolo del margine. Il saldo visualizzato e il margine effettivamente utilizzato dal server risultano quindi disallineati.

Soluzione: verifica nei termini del bonus del broker se "il credito viene conteggiato nel margine". Se non lo è, riduci il lotto in modo da coprire il margine richiesto con il solo capitale effettivamente depositato.


⑥ Differenza di dimensione del contratto tra tipi di conto (standard vs cent/micro)

Sintomo: con lo stesso "lotto 0,01", cambiando conto compare improvvisamente ERR_NO_MONEY, oppure al contrario il lotto risulta eccessivo.

Causa: tra un conto cent (micro) e un conto standard la dimensione del contratto differisce di circa 100 volte. Su un conto cent, 0,01 lotti corrisponde a un'esposizione reale di circa 1/100. Se l'EA utilizza un lotto fisso senza distinguere il tipo di conto, su uno dei due si verifica margine insufficiente.

Soluzione:

  1. Per operare con capitale ridotto e in sicurezza, utilizza un conto cent/micro, in modo che anche il lotto minimo non comporti un rischio eccessivo
  2. Progetta l'EA in modo che non codifichi rigidamente il tipo di conto, ma determini il lotto verificando il margine effettivo tramite OrderCalcMargin() (vedi capitolo successivo)

Particolarità per broker

BrokerCaratteristicheFrequenza di ERR_NO_MONEY
XMLimitazione della leva nel weekend, Stop Out 20%Media (più alta nel weekend)
ExnessConti con leva illimitata disponibili, Stop Out 0%Bassa
HFM / FXGT ecc.Conti con leva elevata disponibiliBassa

I conti a leva illimitata di Exness (conti Pro/Raw Spread) spesso consentono di aprire nuovi ordini anche con margine libero praticamente nullo, per cui questo errore compare raramente. Sono adatti agli EA a martingala, ma comportano il rischio opposto: lo stop out non scatta facilmente, con il pericolo di perdite che si amplificano. Per il confronto tra broker, consulta anche la pagina di confronto broker.


Codice MQL5 per prevenire questo errore (per sviluppatori di EA)

Non basta "risolvere" il problema: la progettazione corretta di un EA consiste nell'evitare a monte ERR_NO_MONEY prima ancora di inviare l'ordine. Il punto chiave è "calcolare il margine richiesto prima dell'invio e, se insufficiente, non aprire la posizione o ridurre il lotto".

Verificare il margine richiesto prima dell'invio dell'ordine

// Gate pre-invio: verifica che margine richiesto <= margine libero prima di chiamare 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()); // es. 134
      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;   // Non aprire la posizione = previene ERR_NO_MONEY
   }
   return true;
}

Normalizzare il lotto al minimo e allo step

Se il valore calcolato dal rischio % viene inviato così com'è, può non rispettare il lotto minimo o lo step del lotto e venire rifiutato (la mancata normalizzazione è una causa tipica di rifiuto dell'ordine). Invece di rinunciare quando non è possibile aprire la posizione, ridurre il lotto al valore massimo consentito permette di limitare le occasioni perse.

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;          // Arrotonda allo step
   lots = MathMax(minLot, MathMin(maxLot, lots)); // Limita tra minimo e massimo
   return NormalizeDouble(lots, 2);
}

Controllare sempre il retcode di OrderSend

Non limitarti al valore di ritorno booleano di OrderSend(): controlla anche result.retcode per gestire specificamente il caso 10019 (TRADE_RETCODE_NO_MONEY).

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... costruzione di req ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_NO_MONEY)   // 10019
      Print("Not enough money. È necessario ridurre il lotto o effettuare un deposito.");
   else
      PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}

Se utilizzi CTrade, puoi verificare se trade.ResultRetcode() restituisce 10019, oppure controllare trade.ResultRetcodeDescription().

Arresto d'emergenza basato sul livello di margine

Impostare un meccanismo di sicurezza che blocchi nuove aperture o chiuda tutte le posizioni quando il livello di margine scende sotto una certa percentuale permette di prevenire sia il ripetersi di ERR_NO_MONEY sia il prosciugamento del conto.

double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // Livello di margine %
if(level > 0 && level < EmergencyMarginLevel)          // es. 150%
{
   // Bloccare nuove entrate e, se necessario, chiudere parte delle posizioni aperte
}

Gli EA distribuiti da FXEA365 implementano di serie il "lotto automatico basato sul rischio %", il "controllo del margine prima dell'invio" e l'"arresto d'emergenza basato sul livello di margine" (UseMarginEmergencyClose), permettendo di operare senza forzature anche con capitale minimo.


Checklist per priorità

PrioritàDa verificareSoluzione
🚨 Prima cosaMargine libero < margine richiesto?Deposito, chiusura parziale o riduzione del lotto
🚨 Prima cosaIl lotto fisso è eccessivo rispetto al saldo?Passa a 0,01 o al rischio % automatico
⚠️ SuccessivamenteLeva del conto bassa o limitazione nel weekend?Conto a leva elevata, chiusura nel weekend, riduzione del lotto
⚠️ SuccessivamenteMargine bloccato da posizioni esistenti o altri EA?Riorganizza le posizioni aperte sullo stesso conto
✅ Da controllareDifferenza di dimensione del contratto cent/standardAdatta il lotto al tipo di conto
🛠 SviluppoProtezione preventiva con OrderCalcMarginImplementa il codice sopra riportato

Conclusione

  • ERR_NO_MONEY si presenta in due forme, 134 (GetLastError) e 10019 (retcode di OrderSend = TRADE_RETCODE_NO_MONEY), ma la causa di fondo è sempre la stessa: "margine richiesto > margine disponibile".
  • Può comparire anche con saldo sufficiente, a causa di lotto eccessivo, leva bassa (comprese le limitazioni nel weekend), margine bloccato da posizioni esistenti o tipo di conto diverso.
  • Chi utilizza un EA può prevenire il problema con "lotto automatico basato sul rischio %" e "tipo di conto adeguato"; chi sviluppa un EA dovrebbe implementare in modo permanente "un gate OrderCalcMargin prima dell'invio", "la normalizzazione del lotto" e "la gestione del retcode 10019".

Per l'elenco completo dei codici di errore, consulta la guida generale ai codici di errore MQL5/MT5; per EA gratuiti che funzionano con un'impostazione di capitale ragionevole, consulta l'elenco degli EA. Se stai utilizzando un EA del nostro sito e il problema non si risolve nemmeno modificando le impostazioni, contattaci tramite il modulo di supporto allegando uno screenshot della situazione del margine del tuo conto.


FAQ

D: Ho saldo sufficiente ma compare comunque ERR_NO_MONEY. Perché?

Perché la verifica non si basa sul saldo (Balance) ma sul margine libero (Free Margin). Se le perdite non realizzate o il margine bloccato da posizioni esistenti riducono il Free Margin, non è possibile aprire una nuova posizione anche in presenza di saldo sufficiente. Controlla il Free Margin nella scheda "Trade".

D: Che differenza c'è tra 134 e 10019?

134 (ERR_NO_MONEY) è l'errore runtime restituito da GetLastError(), mentre 10019 (TRADE_RETCODE_NO_MONEY) è il risultato (retcode) di OrderSend(). Cambia solo il punto in cui compare, ma la causa (fondi insufficienti) è la stessa.

D: Non compare nel backtest ma si presenta in reale. Perché?

Perché nel conto reale la leva, il tipo di conto (cent/standard) e le posizioni esistenti differiscono dalle impostazioni di test. In particolare, la differenza di leva e di dimensione del contratto ha un impatto significativo.

D: Con un EA a martingala/griglia, aumentando i livelli compare ERR_NO_MONEY.

È un segnale che precede un comportamento problematico. Più aumentano i livelli, più rapidamente si consuma il margine. Riduci il limite di livelli e il moltiplicatore del lotto, attiva sempre una chiusura d'emergenza come UseMarginEmergencyClose e opera solo con capitale che puoi permetterti di perdere.

D: È possibile evitarlo automaticamente tramite il codice dell'EA?

Sì. Basta calcolare il margine richiesto con OrderCalcMargin() prima dell'invio dell'ordine e inserire un gate che, se il valore supera AccountInfoDouble(ACCOUNT_MARGIN_FREE), impedisca l'apertura della posizione (oppure riduca il lotto). Fai riferimento all'esempio di codice riportato nell'articolo.

D: Con quale capitale minimo si può iniziare senza forzature?

Un livello ragionevole è un conto standard con 100.000 yen (≈$670) e lotto minimo 0,01. Con capitale inferiore, o per operare in modo più prudente, un conto cent (micro) permette di mantenere un'esposizione reale contenuta anche con il lotto minimo, riducendo il rischio di incorrere in ERR_NO_MONEY.

📧 Avvisi prima degli aumenti di prezzo + corso email gratuito di 5 giorni

Tutti gli EA sono a prezzo di lancio e salgono a scatti con le vendite. Ricevi un avviso prima di ogni aumento, più un'email al giorno su trading algoritmico, lettura dei backtest e scelta del broker.

* Privacy rigorosamente protetta. Potete cancellarvi in qualsiasi momento.

Commenti e domande