Por qué una operación en MT5 puede fallar aunque tu solicitud a la API sea correcta
Mercado cerrado, volumen o stops inválidos, sin margen o un símbolo con otro nombre: cinco razones por las que un broker rechaza una orden válida en MT5.
En esta página
Tu solicitud es JSON válido, tu clave es correcta, la cuenta está en línea… y aun así la orden es rechazada. La API aceptó tu solicitud; el broker rechazó la operación. Los brokers revisan cada orden con sus propias reglas, y esas reglas pueden decir que no a una solicitud perfectamente formada.
Primero, lee el resultado
Con fxapis, un rechazo del broker llega como 422 ORDER_REJECTED, con el motivo y un indicador retryable:
{
"error": {
"code": "ORDER_REJECTED",
"message": "The broker rejected the order: No money",
"details": [{ "orderId": "…", "state": "rejected", "retryable": false }]
}
}
GET /v1/orders/{id} muestra el código de retorno de MT5 del propio broker (aquí, 10019) tal como lo envió el broker. No se ejecutó nada. La solución depende de la causa.
Las cinco causas más comunes
1. El mercado está cerrado
Código de retorno 10018. El Forex cierra el fin de semana, el oro hace una pausa diaria, los índices siguen el horario de su bolsa, y cada broker fija sus propios horarios para cada símbolo.
Cómo evitarlo: revisa el horario de mercado de la cuenta antes de enviar. GET /v1/accounts/{id}/sessions?instrument=XAUUSD devuelve openNow y nextOpen, leídos de ese broker.
2. El volumen no cumple las reglas del símbolo
Código de retorno 10014. Cada símbolo tiene un volumen mínimo, un máximo y un paso. 0.015 lotes es inválido donde el paso es 0.01; 0.01 es inválido donde el mínimo es 0.1.
Cómo evitarlo: lee las reglas del broker de la cuenta (GET /v1/accounts/{id}/symbols?search=EURUSD devuelve volumeMin, volumeStep y volumeMax) y redondea el tamaño al paso antes de enviar. Envía los volúmenes como texto, "0.10", para que nada se redondee en el camino.
3. Los stops son inválidos
Código de retorno 10016. El stop loss de una compra debe estar por debajo del precio y su take profit por encima (en una venta, al revés), y los brokers suelen exigir una distancia mínima respecto al precio.
Cómo evitarlo: los stops son precios absolutos, no distancias en pips: calcúlalos a partir del precio actual y mantenlos fuera de la distancia mínima del broker. fxapis rechaza un stop que está claramente del lado equivocado antes de enviar nada.
4. No hay margen suficiente
Código de retorno 10019. La cuenta no puede financiar la posición con su apalancamiento. Es común cuando una misma señal se envía con el mismo tamaño a cuentas con saldos muy distintos.
Cómo evitarlo: POST /v1/accounts/{id}/calculate con "kind": "margin" devuelve el margen que necesita una orden sin abrir nada. En órdenes a varias cuentas, ajusta el tamaño de cada cuenta a su saldo con weights.
5. El símbolo tiene otro nombre
El oro es XAUUSD en un broker y XAUUSD.a o GOLD en otro. Si envías el nombre de otro broker, la orden falla antes de poder operar.
Cómo evitarlo: envía instrument en lugar de symbol ("instrument": "XAUUSD") y fxapis opera el símbolo propio de cada cuenta. Si un broker no tiene equivalente, o tiene dos posibles, la orden se rechaza antes de enviar nada, con INSTRUMENT_NOT_OFFERED o INSTRUMENT_AMBIGUOUS.
La guía rápida
| Causa | Código MT5 | ¿Reintentar igual? | Cómo evitarlo |
|---|---|---|---|
| Mercado cerrado | 10018 | No | GET …/sessions |
| Volumen inválido | 10014 | No | Reglas de volumen de GET …/symbols |
| Stops inválidos | 10016 | No | Stops a partir del precio actual |
| Sin dinero suficiente | 10019 | No | POST …/calculate |
| Símbolo distinto | — | No | instrument en lugar de symbol |
| Recotización, precio cambiado, sin cotizaciones | 10004, 10020, 10021 | Como una orden nueva | Revisa primero el precio nuevo |
Más códigos de retorno de MT5, y qué hace fxapis con cada uno
MetaTrader 5 responde cada solicitud de operación con un código de retorno numérico. fxapis entrega el código del broker sin cambios (GET /v1/orders/{id}) y lo clasifica en uno de tres resultados: rechazada (ORDER_REJECTED, no se ejecutó nada), rechazada pero reintentable (ORDER_REJECTED con retryable: true, no se ejecutó nada y una orden nueva puede funcionar) o desconocida (ORDER_UNRESOLVED, se confirma con los registros del broker antes de suponer nada).
| Código | Nombre de MetaQuotes | Qué significa | Resultado en fxapis | Qué hacer |
|---|---|---|---|---|
| 10004 | TRADE_RETCODE_REQUOTE | Recotización | Reintentable | Orden nueva, clave nueva, después de revisar el precio |
| 10006 | TRADE_RETCODE_REJECT | Solicitud rechazada | Rechazada | Lee el mensaje del broker |
| 10011 | TRADE_RETCODE_ERROR | Error al procesar la solicitud | Desconocida | No la reenvíes; consulta la orden |
| 10012 | TRADE_RETCODE_TIMEOUT | Solicitud cancelada por tiempo de espera | Desconocida | No la reenvíes; consulta la orden |
| 10013 | TRADE_RETCODE_INVALID | Solicitud inválida | Rechazada | Revisa los campos de la orden |
| 10014 | TRADE_RETCODE_INVALID_VOLUME | Volumen inválido | Rechazada | Redondea al paso de volumen del símbolo |
| 10015 | TRADE_RETCODE_INVALID_PRICE | Precio inválido | Rechazada | Calcula el precio de la orden pendiente a partir de la cotización actual |
| 10016 | TRADE_RETCODE_INVALID_STOPS | Stops inválidos | Rechazada | Stops del lado correcto, fuera de la distancia mínima |
| 10017 | TRADE_RETCODE_TRADE_DISABLED | Operar está deshabilitado | Rechazada | El símbolo o la cuenta no puede operar ahora; consulta al broker |
| 10018 | TRADE_RETCODE_MARKET_CLOSED | El mercado está cerrado | Rechazada | Revisa antes GET …/sessions |
| 10019 | TRADE_RETCODE_NO_MONEY | No hay dinero suficiente | Rechazada | Menos volumen, o primero POST …/calculate |
| 10020 | TRADE_RETCODE_PRICE_CHANGED | Los precios cambiaron | Reintentable | Orden nueva después de revisar el precio |
| 10021 | TRADE_RETCODE_PRICE_OFF | No hay cotizaciones para procesar la solicitud | Reintentable | Espera las cotizaciones y luego una orden nueva |
| 10024 | TRADE_RETCODE_TOO_MANY_REQUESTS | Solicitudes demasiado frecuentes | Reintentable | Baja el ritmo y luego una orden nueva |
| 10026 | TRADE_RETCODE_SERVER_DISABLES_AT | Trading automático deshabilitado por el servidor | Rechazada | El broker desactivó el trading automático en la cuenta; consulta al broker |
| 10027 | TRADE_RETCODE_CLIENT_DISABLES_AT | Trading automático deshabilitado en el terminal | Rechazada | El trading algorítmico está apagado en el terminal. fxapis ejecuta sus terminales con él encendido; si lo ves, contacta a soporte |
| 10030 | TRADE_RETCODE_INVALID_FILL | Tipo de ejecución inválido | Rechazada | fxapis elige el modo de ejecución que acepta el símbolo; si persiste, contacta a soporte |
| 10031 | TRADE_RETCODE_CONNECTION | Sin conexión con el servidor de operaciones | Desconocida | No la reenvíes; consulta la orden |
| 10033 | TRADE_RETCODE_LIMIT_ORDERS | Se alcanzó el límite de órdenes pendientes | Rechazada | Cancela las órdenes pendientes que ya no necesitas |
| 10034 | TRADE_RETCODE_LIMIT_VOLUME | Se alcanzó el límite de volumen del símbolo | Rechazada | Reduce la exposición en ese símbolo |
| 10040 | TRADE_RETCODE_LIMIT_POSITIONS | Se alcanzó el límite de posiciones abiertas | Rechazada | Cierra posiciones o consulta al broker |
| 10044 | TRADE_RETCODE_CLOSE_ONLY | Solo se permite cerrar | Rechazada | El símbolo es solo de cierre en este broker |
| 10045 | TRADE_RETCODE_FIFO_CLOSE | Solo se permite cerrar por FIFO | Rechazada | Cierra primero la posición más antigua |
| 10046 | TRADE_RETCODE_HEDGE_PROHIBITED | Posiciones opuestas deshabilitadas | Rechazada | La cuenta no permite cobertura; cierra en lugar de abrir el lado contrario |
Los códigos y nombres vienen de los códigos de retorno del servidor de operaciones de MetaQuotes (revisado el 26 de octubre de 2026). Los brokers pueden devolver otros códigos; fxapis trata un código que no reconoce como desconocido, nunca como rechazado, para confirmarlo en lugar de adivinar.
No toda falla es un rechazo
Hay otras dos fallas que se parecen y significan otra cosa:
SEND_FAILED(503): está comprobado que la orden nunca llegó al broker. Es seguro reenviarla, con la misma clave de idempotencia.ORDER_UNRESOLVED(503): todavía nadie sabe si se ejecutó. No la reenvíes. Consulta la orden; fxapis la confirma con los registros del broker.
Próximos pasos
- Las tres fallas: rechazada, nunca enviada y desconocida, en detalle (en inglés).
- Todos los códigos de error, con si conviene reintentar (en inglés).
- Instrumentos y símbolos: un nombre para cada mercado, en todos los brokers (en inglés).
- La API de MT5: cuentas, órdenes e historial, con un resultado registrado para cada operación.