Inicio > Blog > MT5 "Not enough money" (134/10019): 7 causas y soluciones

MT5MQL5ErroresSolución de problemasEAMargen

MT5 "Not enough money" (134/10019): 7 causas y soluciones

Publicado: 2026-06-12Lectura: aprox. 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): solución completa

Cuando tienes un EA en funcionamiento y en la pestaña Expertos o en el diario aparece ERR_NO_MONEY o not enough money, es fácil pensar «¿ya me quedé sin fondos?». Pero este error puede aparecer incluso con saldo de sobra. La causa no es solo «fondos en cero»: también influyen el cálculo del lote, el apalancamiento, el margen retenido por posiciones existentes y varios factores más.

Este artículo es la guía definitiva tanto para quienes operan EAs en MT5 como para quienes los programan en MQL5. Cubre de una sola vez qué es realmente ERR_NO_MONEY, sus 6 causas, soluciones inmediatas, particularidades según el bróker y cómo prevenirlo de forma permanente desde el código. Para el listado general de códigos de error, consulta la guía completa de códigos de error de MQL5 / MT5.

Este artículo se basa en MT5 (build serie 4xxx) a fecha de junio de 2026. Los valores numéricos y nombres de pantallas pueden variar ligeramente según el bróker o la build.


Qué es ERR_NO_MONEY (diferencia entre 134 y 10019)

En MQL5 existen dos valores distintos para representar «fondos insuficientes», según de dónde se obtengan. Confundirlos alarga innecesariamente el diagnóstico.

① ERR_NO_MONEY = 134 (error de runtime de GetLastError())

Es el código de error de runtime que devuelve GetLastError(). El valor 134 se activa cuando funciones de cálculo como OrderCalcMargin() u OrderCalcProfit(), o código de estilo antiguo, determinan que «el margen necesario supera el margen libre».

Significado: no hay fondos suficientes para la operación (not enough money)
Constante  : ERR_NO_MONEY
Valor      : 134

② TRADE_RETCODE_NO_MONEY = 10019 (código de retorno de OrderSend())

El resultado del envío real de una orden mediante OrderSend() se guarda en MqlTradeResult.retcode. Cuando el servidor rechaza la orden por falta de fondos, el valor no es 134, sino 10019 (TRADE_RETCODE_NO_MONEY). No es un error de MT5, sino una notificación de rechazo del servidor del bróker.

Significado: no hay fondos suficientes para completar la solicitud (There is not enough money to complete the request)
Constante  : TRADE_RETCODE_NO_MONEY
Valor      : 10019
// Ejemplo típico de salida en el log
2026.06.12 09:15:32.441 EA_NAME XAUUSD,H1: OrderSend error 10019

Cómo distinguirlos en la práctica:

OrigenValorCuándo aparece
GetLastError()134 (ERR_NO_MONEY)Cálculos como OrderCalcMargin, verificaciones internas
MqlTradeResult.retcode10019 (TRADE_RETCODE_NO_MONEY)OrderSend fue rechazado por el servidor
CTrade.ResultRetcode()10019Rechazo de orden a través de CTrade

Si en el log aparece «134», el problema está en la fase de cálculo/verificación interna; si aparece «10019» o el mensaje not enough money en la pestaña Expertos, el problema está en la fase de rechazo del servidor. En ambos casos la causa raíz es la misma (margen necesario > margen disponible), así que la solución es común.


Diagnóstico rápido en 30 segundos

En MT5, revisa estos tres valores en la pestaña «Caja de herramientas → Trading»:

Balance (Balance)            : efectivo de la cuenta
Equidad (Equity)             : balance ± ganancia/pérdida flotante
Margen libre (Free Margin)   : margen disponible para nuevas operaciones ← esto es clave
Nivel de margen (Margin Level %): Equity / Margin × 100
  • Si el margen libre (Free Margin) es menor que el margen necesario para la posición que quieres abrir → aparecerá ERR_NO_MONEY el 100% de las veces.
  • Si aparece a pesar de tener saldo suficiente, la causa está en alguno de los siguientes puntos: «② lote excesivo», «④ margen retenido por posiciones existentes» o «⑥ tipo de cuenta diferente».

El margen necesario para una posición se puede consultar en MT5 en «Cotizaciones → clic derecho sobre el símbolo → Especificaciones» (margen para 1 lote). De forma aproximada:

Margen necesario ≈ (Lote × Tamaño del contrato × Precio) / Apalancamiento

Causas y soluciones (6 patrones)

① Falta de margen real

Síntoma: las pérdidas flotantes han crecido y el margen libre ha quedado por debajo de lo necesario para una nueva operación. Es frecuente tras una racha de pérdidas o con muchos niveles de un sistema de promediado (martingala).

Solución:

  1. Depositar fondos adicionales, o
  2. Cerrar manualmente parte de las posiciones abiertas para liberar margen
  3. Reducir el RiskPercent del EA para que los lotes futuros sean más pequeños

Si este patrón se repite constantemente con un EA, el lote es demasiado grande para el capital disponible. Pasa al punto ②.


② El lote es demasiado grande (en relación con el saldo)

Síntoma: hay saldo suficiente, pero ERR_NO_MONEY aparece desde la primera operación. Es común en configuraciones de lote fijo.

Causa: FixedLot no está ajustado al saldo ni al apalancamiento de la cuenta. Por ejemplo, con una cuenta de 100.000 yenes (≈$670) e intentando abrir 0.1 lotes en XAUUSD, según el apalancamiento el margen necesario puede superar el saldo.

Solución:

  1. Bajar el lote fijo al mínimo (0.01) y comprobar si se puede abrir
  2. Cambiar a cálculo automático por riesgo % (UseFixedLot=false / RiskPercent)
  3. Si ni siquiera se puede abrir 0.01, el problema es de apalancamiento o de capital insuficiente → ver ③ y ⑥

Referencia: un diseño razonable es poder empezar con un lote mínimo de 0.01 en una cuenta estándar de 100.000 yenes (≈$670). Si tu capital es menor o prefieres operar con aún más margen de seguridad, considera una cuenta micro (cent), como se explica a continuación.


③ Apalancamiento bajo o restringido por fin de semana/eventos

Síntoma: el mismo EA y el mismo lote funcionan en otra cuenta, pero en esta da ERR_NO_MONEY. O bien el error se concentra entre el viernes por la tarde y el lunes por la mañana.

Causa: un apalancamiento bajo (por ejemplo, 1:30 en cuentas reguladas de la UE frente a 1:1000 en brokers offshore) puede multiplicar por decenas el margen necesario. Además, algunos brókers reducen el apalancamiento los fines de semana o alrededor de indicadores importantes (XM, por ejemplo, limita el apalancamiento a 200:1 los fines de semana), lo que puede disparar de golpe el margen necesario mientras hay posiciones abiertas. En oro o criptomonedas también puede haber límites de apalancamiento específicos por símbolo.

Solución:

  1. Comprobar el apalancamiento de la cuenta (en el área de cliente del bróker o en la información de la cuenta en MT5)
  2. Revisar el «índice de margen» en las especificaciones del símbolo (puede ser más bajo para ciertos instrumentos)
  3. Usar una configuración que cierre posiciones antes del fin de semana (CloseAllBeforeWeekend=true, etc.), o cambiar a un bróker sin restricción de apalancamiento en fin de semana
  4. Cambiar a una cuenta con mayor apalancamiento o reducir el lote

④ El margen está retenido por posiciones existentes

Síntoma: la primera posición se abre sin problema, pero desde la segunda en adelante, o al añadir posiciones (promediado), aparece ERR_NO_MONEY.

Causa: las posiciones ya abiertas retienen margen, por lo que el margen libre queda por debajo de lo necesario para una nueva operación. Es habitual cuando se operan varios pares o varios EAs en la misma cuenta.

Solución:

  1. Revisar el margen usado (Margin) y el margen libre en la pestaña «Trading»
  2. Verificar si varios EAs están compitiendo por el margen de la misma cuenta (en caso de operar varios EAs)
  3. Limitar el número máximo de posiciones simultáneas mediante parámetros del EA
  4. En EAs de promediado o grid, cuantos más niveles se abran, más rápido se consume el margen → revisar el límite de niveles, el multiplicador de lote y los ajustes de cierre de emergencia

⑤ Bonos o crédito incluidos en el cálculo del margen

Síntoma: debería ser suficiente considerando «saldo + bono», pero aparece ERR_NO_MONEY de todas formas.

Causa: según el bróker, el crédito (bono) puede no incluirse, o incluirse solo parcialmente, en el cálculo del margen. Esto genera una diferencia entre el saldo mostrado y el margen que realmente usa el servidor.

Solución: revisar en los términos del bono del bróker si el crédito se computa como margen. Si no se computa, reducir el lote para que el margen necesario se cubra solo con el depósito real.


⑥ Diferencia en el tamaño de contrato según el tipo de cuenta (estándar vs. cent/micro)

Síntoma: con el mismo «lote 0.01», al cambiar de cuenta aparece de repente ERR_NO_MONEY, o, al contrario, el lote resulta excesivo.

Causa: el tamaño de contrato de una cuenta cent (micro) es aproximadamente 100 veces menor que el de una cuenta estándar. Un lote de 0.01 en cuenta cent representa una exposición real de aproximadamente 1/100. Si el EA usa un lote fijo sin distinguir el tipo de cuenta, puede quedarse sin margen en una de ellas.

Solución:

  1. Para operar con poco capital y de forma más segura, usar una cuenta cent/micro, de modo que incluso el lote mínimo no implique un riesgo excesivo
  2. Diseñar el EA para que no dependa de un tipo de cuenta fijo, sino que determine el lote consultando el margen real necesario con OrderCalcMargin() (ver siguiente sección)

Particularidades según el bróker

BrókerCaracterísticasFrecuencia de ERR_NO_MONEY
XMRestricción de apalancamiento en fin de semana, Stop Out 20%Media (más alta en fines de semana)
ExnessCuentas con apalancamiento ilimitado, Stop Out 0%Baja
HFM / FXGT, etc.Cuentas con apalancamiento altoBaja

Las cuentas de apalancamiento ilimitado de Exness (cuentas Pro/Raw Spread) suelen permitir nuevas órdenes incluso con margen libre prácticamente en cero, por lo que este error aparece con menor frecuencia. Esto encaja bien con EAs de promediado, pero tiene la contrapartida de que el stop out apenas actúa, lo que puede hacer que las pérdidas crezcan más de lo previsto; tenlo en cuenta. Para comparar brókers, consulta también la página de comparación de brókers.


Código en MQL5 para prevenir este error (para desarrolladores de EAs)

Más allá de «solucionarlo», el diseño correcto de un EA consiste en evitar por completo que ERR_NO_MONEY llegue a producirse antes de enviar la orden. La clave está en calcular el margen necesario antes de operar y, si no es suficiente, no abrir la posición o reducir el lote.

Comprobar el margen necesario antes de enviar la orden

// Filtro previo al envío: comprobar margen necesario <= margen libre antes de llamar a 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;   // No abrir la posición = evita ERR_NO_MONEY de antemano
   }
   return true;
}

Normalizar el lote al mínimo y al step

Si se envía directamente el valor calculado a partir del riesgo %, puede no ajustarse al lote mínimo o al step de lote y la orden será rechazada (un fallo de normalización es una causa típica de rechazo). En lugar de renunciar cuando no se puede abrir el lote calculado, reducirlo al rango permitido minimiza las oportunidades perdidas.

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;          // Redondear al step
   lots = MathMax(minLot, MathMin(maxLot, lots)); // Ajustar entre mínimo y máximo
   return NormalizeDouble(lots, 2);
}

Comprobar siempre el retcode de OrderSend

No basta con mirar el valor de retorno (bool) de OrderSend(); hay que revisar result.retcode y manejar específicamente el código 10019 (TRADE_RETCODE_NO_MONEY).

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... construir req ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_NO_MONEY)   // 10019
      Print("Not enough money. Es necesario reducir el lote o depositar fondos.");
   else
      PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}

Si usas CTrade, puedes comprobar si trade.ResultRetcode() es 10019, o revisar trade.ResultRetcodeDescription().

Parada de emergencia según el nivel de margen

Añadir un mecanismo de seguridad que detenga nuevas entradas o cierre todas las posiciones cuando el nivel de margen caiga por debajo de un porcentaje determinado evita tanto la repetición de ERR_NO_MONEY como la quiebra de la cuenta.

double level = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL); // Nivel de margen %
if(level > 0 && level < EmergencyMarginLevel)          // Ejemplo: 150%
{
   // Detener nuevas entradas y, si es necesario, cerrar parte de las posiciones abiertas
}

Los EAs distribuidos por FXEA365 implementan de forma estándar el cálculo automático de lote por riesgo %, la verificación de margen previa al envío de órdenes y la parada de emergencia por nivel de margen (UseMarginEmergencyClose), por lo que pueden operar sin problemas incluso con capital reducido.


Lista de comprobación por prioridad

PrioridadRevisarSolución
🚨 Primero¿Margen libre < margen necesario?Depositar fondos, cerrar parte de las posiciones o reducir el lote
🚨 Primero¿El lote fijo es excesivo para el saldo?Bajar a 0.01 o pasar a riesgo % automático
⚠️ Después¿Apalancamiento bajo o restricción de fin de semana?Cuenta de mayor apalancamiento, cierre antes del fin de semana o reducir el lote
⚠️ Después¿Margen retenido por posiciones existentes u otros EAs?Reorganizar las posiciones abiertas en la misma cuenta
✅ ComprobarDiferencia de tamaño de contrato cent/estándarAjustar el lote al tipo de cuenta
🛠 DesarrolloProtección con OrderCalcMargin antes de enviar la ordenImplementar el código mostrado arriba

Resumen

  • ERR_NO_MONEY tiene dos caras: 134 (GetLastError) y 10019 (retcode de OrderSend = TRADE_RETCODE_NO_MONEY), pero en el fondo ambas se deben a lo mismo: «margen necesario > margen disponible».
  • Puede aparecer aunque haya saldo, debido a lote excesivo, apalancamiento bajo (incluidas restricciones de fin de semana), margen retenido por posiciones existentes o diferencias de tipo de cuenta.
  • Quien opera EAs puede prevenirlo usando «lote automático por riesgo %» y el «tipo de cuenta adecuado»; quien desarrolla EAs debe implementar de forma permanente un «filtro con OrderCalcMargin antes de enviar la orden», «normalización del lote» y «manejo del retcode 10019».

Para el listado general de códigos de error, consulta la guía completa de códigos de error de MQL5 / MT5; para EAs gratuitos que funcionan con una configuración de capital razonable, revisa el listado de EAs. Si usas un EA de este sitio y el problema persiste incluso después de ajustar la configuración, contacta a través del formulario de soporte adjuntando una captura de pantalla del estado del margen de tu cuenta.


Preguntas frecuentes

P: Tengo saldo suficiente, pero aparece ERR_NO_MONEY. ¿Por qué?

Porque la comprobación no se hace sobre el balance (Balance), sino sobre el margen libre (Free Margin). Si las pérdidas flotantes o el margen retenido por posiciones existentes han reducido el margen libre, no se podrá abrir una nueva posición aunque el saldo sea suficiente. Revisa el margen libre en la pestaña «Trading».

P: ¿Cuál es la diferencia entre 134 y 10019?

134 (ERR_NO_MONEY) es el error de runtime que devuelve GetLastError(), mientras que 10019 (TRADE_RETCODE_NO_MONEY) es el resultado (retcode) de OrderSend(). Solo difieren en dónde aparecen; la causa (falta de fondos) es la misma.

P: No aparece en el backtest, pero sí en cuenta real.

Se debe a que el apalancamiento, el tipo de cuenta (cent/estándar) y las posiciones existentes de la cuenta real difieren de la configuración de la prueba. Las diferencias de apalancamiento y de tamaño de contrato tienen especial impacto.

P: Con EAs de promediado o grid, al aumentar los niveles aparece ERR_NO_MONEY.

Es prácticamente el paso previo a un comportamiento esperado. Cuantos más niveles se abren, más rápido se consume el margen. Reduce el límite de niveles y el multiplicador de lote, activa siempre un cierre de emergencia como UseMarginEmergencyClose, y opera solo con capital que puedas permitirte perder.

P: ¿Se puede evitar automáticamente desde el código del EA?

Sí. Basta con calcular el margen necesario con OrderCalcMargin() antes de enviar la orden y añadir un filtro que impida abrir la posición (o reduzca el lote) si supera AccountInfoDouble(ACCOUNT_MARGIN_FREE). Consulta el ejemplo de código incluido en el artículo.

P: ¿Con cuánto capital se puede empezar sin forzar la cuenta?

Un punto de partida razonable es una cuenta estándar de 100.000 yenes (≈$670) con un lote mínimo de 0.01. Si dispones de menos capital o prefieres operar con más margen de seguridad, usar una cuenta cent (micro) reduce la exposición real incluso con el lote mínimo, lo que facilita evitar el ERR_NO_MONEY.

📧 Avisos antes de subidas de precio + curso gratuito de 5 días por email

Todos los EAs están a precio de lanzamiento y suben por escalones según las ventas. Reciba aviso antes de cada subida, más un email diario sobre trading algorítmico, cómo leer backtests y elegir bróker.

* Privacidad estrictamente protegida. Puedes darte de baja en cualquier momento.

Comentarios y preguntas