Unsupported filling mode: error 10030 de MT5
Contenido
- Qué es el 10030 (TRADE_RETCODE_INVALID_FILL)
- Los 4 tipos de modo de ejecución (type_filling)
- Por qué se considera "no válido": SYMBOL_FILLING_MODE
- Por qué aparece justo "el día que se cambia de bróker"
- Relación con el modo de ejecución (SYMBOL_TRADE_EXEMODE)
- Primero, un diagnóstico rápido de 30 segundos
- ① Comprobar el modo permitido del símbolo (pantalla de MT5)
- ② Revisar los parámetros de entrada del EA
- ③ Comprobarlo por código (para desarrolladores)
- Solución permanente: código MQL5 que lee el flag y elige el modo automáticamente
- Función de detección automática
- Uso en OrderSend
- Si se usa CTrade
- Precaución al usar órdenes limitadas (BOC)
- Consideraciones sobre el bróker (revisar de nuevo al migrar)
- Lista de comprobación por prioridad
- Resumen
- Preguntas frecuentes
- P: Un EA que funcionaba hasta ayer, al cambiar de bróker, ya no puede enviar ninguna orden y da error 10030. ¿Está averiado el EA?
- P: ¿Debería usar FOK o IOC?
- P: En el backtest no aparece, pero en cuenta real sí me sale el 10030.
- P: Con el mismo bróker, a veces me sale el 10030 según el símbolo y a veces no.
- P: No puedo modificar el código del EA (solo tengo el .ex5). ¿Qué puedo hacer?
Solución definitiva al Unsupported filling mode (error 10030 de MT5)
Un EA que hasta ayer funcionaba con total normalidad en otro bróker, y que justo al pasarlo a la nueva cuenta empieza a llenar la pestaña Expert de mensajes Unsupported filling mode u OrderSend error 10030, dejando de poder enviar una sola orden: este es uno de los problemas más "clásicos" al migrar de bróker en la operativa con EA en MT5. El EA no está roto, ni hay ningún problema con la cuenta. Sencillamente, el "modo de ejecución" (filling mode) especificado en la orden no está permitido para ese símbolo en el nuevo bróker, y nada más.
Este artículo es la guía definitiva, tanto para usuarios de EA en MT5 como para desarrolladores que programan EA en MQL5, sobre qué es realmente TRADE_RETCODE_INVALID_FILL (10030), qué significan FOK/IOC/RETURN, cómo comprobarlo en 30 segundos y cómo solucionarlo 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 está basado en MT5 (build 4xxx) a fecha de julio de 2026. Los nombres de pantalla y la terminología pueden variar ligeramente según el bróker y la build.
Qué es el 10030 (TRADE_RETCODE_INVALID_FILL)
El resultado de OrderSend() se guarda en MqlTradeResult.retcode. El código 10030 = TRADE_RETCODE_INVALID_FILL que aparece ahí es una notificación de rechazo por parte del servidor, que indica que "el type_filling (modo de ejecución) especificado en la solicitud no está permitido para este símbolo".
Significado: el modo de ejecución (filling type) especificado no está soportado
Constante: TRADE_RETCODE_INVALID_FILL
Valor : 10030
Mensaje : Unsupported filling mode / Invalid order filling type
// Ejemplo típico de lo que se ve en el log
2026.07.07 09:15:32.441 EA_NAME EURUSD,M15: OrderSend error 10030
2026.07.07 09:15:32.441 EA_NAME EURUSD,M15: failed market buy 0.10 EURUSD [Unsupported filling mode]
Lo importante es que el capital, el lotaje y el precio no tienen absolutamente nada que ver. El 10030 es un problema exclusivo del campo MqlTradeRequest.type_filling de la solicitud, y basta con corregir ese campo para que la misma orden se ejecute sin problemas.
Los 4 tipos de modo de ejecución (type_filling)
El ENUM_ORDER_TYPE_FILLING de MQL5 tiene cuatro valores.
| Constante | Nombre común | Significado |
|---|---|---|
ORDER_FILLING_FOK | Fill or Kill | Se ejecuta solo si se puede llenar la totalidad del volumen. Si en una orden de 1 lote solo hay liquidez para 0.7 lotes, se cancela la orden entera |
ORDER_FILLING_IOC | Immediate or Cancel | Se ejecuta de inmediato la parte que se pueda llenar y se cancela el resto. Si solo se llenan 0.7 lotes, los 0.3 restantes desaparecen |
ORDER_FILLING_RETURN | Return | Se ejecuta la parte disponible y el volumen restante queda en el libro como orden pendiente (a la espera de más ejecuciones). Se usa en ejecución de tipo bursátil |
ORDER_FILLING_BOC | Book or Cancel | Solo se acepta si queda en el libro de forma pasiva (a la espera); se rechaza si el precio implicaría una ejecución inmediata. Exclusivo para órdenes limitadas y stop limit (añadido en builds más recientes) |
En un EA de Forex habitual, en la práctica prácticamente solo se usan FOK o IOC. RETURN tiene sentido en ejecución de tipo bursátil (Exchange execution), como acciones o futuros, y BOC es para el caso especial de querer forzar órdenes tipo maker.
Por qué se considera "no válido": SYMBOL_FILLING_MODE
Qué modo de ejecución se acepta lo determina un indicador que el bróker configura por símbolo (SYMBOL_FILLING_MODE). Desde MQL5 se puede consultar así:
long flags = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
// Si está activo el flag SYMBOL_FILLING_FOK, FOK está permitido
// Si está activo el flag SYMBOL_FILLING_IOC, IOC está permitido
SYMBOL_FILLING_MODE es un campo de bits que indica qué combinación de FOK e IOC está permitida (si ambos están permitidos, se activan ambos flags). RETURN no forma parte de este flag; su disponibilidad depende del modo de ejecución del símbolo (se explica más adelante).
En resumen, el esquema del 10030 es simple:
type_filling enviado por el EA ∉ modos de ejecución permitidos para ese símbolo → 10030
Y eso es todo.
Por qué aparece justo "el día que se cambia de bróker"
La razón por la que el 10030 se conoce como "el error clásico de la migración de bróker" es esta:
- Los modos de ejecución permitidos varían según el bróker y según el símbolo. Un bróker puede permitir solo FOK en sus símbolos de Forex, otro solo IOC, y otro ambos. Es normal que incluso dentro de un mismo bróker la configuración difiera entre Forex y CFD de acciones.
- Muchos EA tienen el type_filling escrito de forma fija en el código. Por ejemplo, un EA con
request.type_filling = ORDER_FILLING_FOK;funcionará durante años sin problema en un bróker A que permita FOK. Como funciona en el entorno del autor, se distribuye sin que nadie lo detecte como un fallo. - Si el bróker B de destino no permite FOK, todas las órdenes fallan desde el primer intento. En el backtest muchas veces no se manifiesta (el comportamiento del tester suele ser más permisivo que el del servidor real), por lo que solo se hace visible "el día que se pasa a cuenta real".
Es decir, el 10030 no es tanto un fallo del EA como la exposición de una suposición fija sobre el entorno. Dicho de otro modo, si se corrige para que lea el flag de permisos del símbolo y elija el modo de forma dinámica, se obtiene un EA que funciona en cualquier bróker (se muestra el código más adelante).
Relación con el modo de ejecución (SYMBOL_TRADE_EXEMODE)
Además del modo de ejecución de la orden, cada símbolo tiene un modo de ejecución de operaciones que influye en qué modos de ejecución tienen sentido.
| Modo de ejecución | Constante | Ejemplo típico | Tendencia del modo de ejecución |
|---|---|---|---|
| Instant | SYMBOL_TRADE_EXECUTION_INSTANT | Algunos brókeres de Forex (habitual en tipo DD) | Ejecución al precio indicado. Entorno de FOK/IOC + requotes |
| Market | SYMBOL_TRADE_EXECUTION_MARKET | La mayoría de Forex/CFD (tipo NDD) | Ejecución a mercado. FOK o IOC (según configuración del bróker) |
| Exchange | SYMBOL_TRADE_EXECUTION_EXCHANGE | Acciones, futuros | Ejecución que se envía al libro. RETURN es lo habitual |
| Request | SYMBOL_TRADE_EXECUTION_REQUEST | Legado | Ejecución por solicitud (poco común actualmente) |
Las combinaciones exactas permitidas dependen de la configuración del servidor de cada bróker, pero a nivel práctico basta con recordar que "en ejecución Market de Forex/CFD será FOK o IOC, y en ejecución de tipo bursátil será RETURN". El modo de ejecución también se puede comprobar con SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE).
Primero, un diagnóstico rápido de 30 segundos
① Comprobar el modo permitido del símbolo (pantalla de MT5)
Ve a Observación del mercado → clic derecho sobre el símbolo → Especificación y mira la fila de "Ejecución" (Filling). Debería mostrar Fill or Kill, Immediate or Cancel, o ambos. Si el EA está enviando un modo que no aparece ahí, el 10030 está confirmado.
② Revisar los parámetros de entrada del EA
Los EA bien diseñados suelen tener una entrada tipo FillingType / Filling Mode. Si la tienen, basta con ajustarla al modo permitido comprobado en el paso ① para resolverlo (sin necesidad de tocar el código).
③ Comprobarlo por código (para desarrolladores)
long flags = SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);
PrintFormat("%s filling: FOK=%s IOC=%s exemode=%d",
_Symbol,
((flags & SYMBOL_FILLING_FOK) != 0) ? "yes" : "no",
((flags & SYMBOL_FILLING_IOC) != 0) ? "yes" : "no",
(int)SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE));
Ejecutando esto en un script se obtiene en una sola línea el estado real de los modos permitidos para ese bróker y ese símbolo.
Solución permanente: código MQL5 que lee el flag y elige el modo automáticamente
La forma correcta de resolver el 10030 no es "ajustarlo a mano cada vez que se migra", sino hacer que el propio EA lea el flag de permisos del símbolo y elija el modo automáticamente. A continuación, la implementación estándar que se puede usar directamente.
Función de detección automática
// Devuelve el modo de ejecución realmente permitido para ese símbolo
// Orden de prioridad: FOK → IOC → RETURN (alternativa para tipo bursátil)
ENUM_ORDER_TYPE_FILLING GetFillingMode(const string symbol)
{
long flags = SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);
if((flags & SYMBOL_FILLING_FOK) != 0)
return ORDER_FILLING_FOK; // Solo ejecuta si se puede llenar todo el volumen (sin ejecución parcial)
if((flags & SYMBOL_FILLING_IOC) != 0)
return ORDER_FILLING_IOC; // Ejecuta la parte posible, cancela el resto
return ORDER_FILLING_RETURN; // Sin flags = tipo bursátil, etc. Se envía con RETURN
}
Uso en OrderSend
MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
req.action = TRADE_ACTION_DEAL;
req.symbol = _Symbol;
req.volume = lots;
req.type = ORDER_TYPE_BUY;
req.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
req.deviation = 20;
req.magic = MagicNumber;
req.type_filling = GetFillingMode(_Symbol); // ← sin valor fijo en el código
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
if(res.retcode == TRADE_RETCODE_INVALID_FILL) // 10030
PrintFormat("Unsupported filling mode: sent=%d, allowed flags=%d",
(int)req.type_filling,
(int)SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE));
else
PrintFormat("OrderSend failed: retcode=%d", res.retcode);
}
Con esto, el mismo binario funciona igual tanto en un bróker exclusivo de FOK como en uno exclusivo de IOC. Ya no hace falta ajustar nada a mano en cada migración.
Si se usa CTrade
La biblioteca estándar CTrade incluye SetTypeFillingBySymbol(), que configura automáticamente el modo de ejecución a partir del flag de permisos del símbolo.
#include <Trade/Trade.mqh>
CTrade trade;
int OnInit()
{
trade.SetExpertMagicNumber(MagicNumber);
trade.SetTypeFillingBySymbol(_Symbol); // Lee el flag de permisos y lo configura automáticamente
return INIT_SUCCEEDED;
}
Si el 10030 aparece por culpa de un código antiguo con un valor fijo como trade.SetTypeFilling(ORDER_FILLING_FOK);, basta con sustituirlo por esta línea para resolverlo. Si se prefiere especificarlo manualmente, se obtiene el mismo efecto pasando el resultado de GetFillingMode() mencionado antes a SetTypeFilling().
Precaución al usar órdenes limitadas (BOC)
ORDER_FILLING_BOC (Book or Cancel) es exclusivo para órdenes limitadas y stop limit, y se rechaza si se indica un precio que implicaría una ejecución inmediata. Usarlo en una orden a mercado es un error, así que no hace falta incluir BOC como opción en EA que operan a mercado.
Consideraciones sobre el bróker (revisar de nuevo al migrar)
- La configuración de modos de ejecución permitidos no solo varía entre brókeres, sino también entre símbolos (grupos de instrumentos) dentro de un mismo bróker. Es habitual encontrar configuraciones donde Forex permite IOC pero los CFD de acciones solo permiten RETURN.
- La configuración también puede cambiar al modificar el tipo de cuenta o el servidor. No solo al migrar de bróker: también pueden aparecer 10030 de repente tras un traslado de servidor, un cambio de tipo de cuenta o una revisión de la especificación de un instrumento dentro del mismo bróker.
- Por tanto, como norma operativa, conviene adoptar el hábito de "si cambia la cuenta, el servidor o el símbolo, volver a comprobar el modo de ejecución en la pantalla de especificación (o mediante script)". Con un EA que incorpore la detección automática, esta comprobación deja de ser necesaria.
La información sobre "este símbolo de tal bróker solo admite FOK" queda desactualizada en cuanto el bróker cambia su configuración de servidor, por lo que no se detalla en este artículo. Comprueba siempre la especificación del símbolo en tu propia cuenta.
Lista de comprobación por prioridad
| Prioridad | Comprobación | Solución |
|---|---|---|
| 🚨 Primero | Si el campo "Ejecución" de la especificación del símbolo coincide con lo que envía el EA | Ajustarlo al modo permitido |
| 🚨 Primero | Si el EA tiene una entrada de tipo FillingType | Se resuelve solo cambiando la entrada (sin tocar código) |
| ⚠️ Después | Si el type_filling está fijado en el código del EA | Sustituirlo por GetFillingMode() / SetTypeFillingBySymbol() |
| ⚠️ Después | Si hubo migración de bróker, cambio de servidor o de tipo de cuenta | Volver a comprobar la especificación tras cualquier cambio |
| ✅ Verificar | Diferencias en el modo de ejecución (Instant/Market/Exchange) | En instrumentos de tipo bursátil se asume RETURN |
| 🛠 Desarrollo | Si se gestiona el 10030 de forma específica según el retcode | Registrar en el log el modo enviado y los flags permitidos |
Resumen
Unsupported filling mode(10030 / TRADE_RETCODE_INVALID_FILL) es un rechazo del servidor que ocurre cuando eltype_filling(FOK / IOC / RETURN / BOC) de la orden no está permitido para ese símbolo. El capital y el lotaje no tienen ninguna relación con esto.- Como los modos permitidos varían según el bróker y según el símbolo, un EA con el type_filling fijado en el código generará 10030 de golpe justo el día de la migración de bróker. Este es el patrón típico de este error.
- Para el usuario, la solución inmediata es "campo de ejecución de la especificación del símbolo → ajustar la entrada del EA". Para el desarrollador, la solución permanente consiste en leer el flag de
SymbolInfoInteger(SYMBOL_FILLING_MODE)y elegir el modo automáticamente (o usarCTrade::SetTypeFillingBySymbol()).
Para el listado general de códigos de error, consulta la guía completa de códigos de error de MQL5 / MT5. Los EA que distribuye FXEA365 implementan la detección automática del modo de ejecución y funcionan independientemente del bróker (listado de EA).
Preguntas frecuentes
P: Un EA que funcionaba hasta ayer, al cambiar de bróker, ya no puede enviar ninguna orden y da error 10030. ¿Está averiado el EA?
No está averiado. Sencillamente, el nuevo bróker no permite para ese símbolo el modo de ejecución que el EA tiene especificado (por ejemplo, FOK). Revisa el campo "Ejecución" de la especificación del símbolo y ajusta la entrada del EA (FillingType, etc.), o corrige el código para que use detección automática, y volverá a funcionar como antes.
P: ¿Debería usar FOK o IOC?
Si el símbolo permite ambos, la diferencia en el comportamiento se nota "cuando falta liquidez". FOK cancela toda la orden si no se puede llenar el volumen completo (evita quedarse con una posición a medias), mientras que IOC deja abierta la parte que sí se ha llenado (puede haber ejecución parcial). Con los tamaños de lote habituales en el trading personal de Forex, la falta de liquidez en sí es poco frecuente, así que en la práctica apenas hay diferencia. No hay problema en priorizar FOK, como hace el código de detección automática.
P: En el backtest no aparece, pero en cuenta real sí me sale el 10030.
El procesamiento de ejecución del Strategy Tester no reproduce completamente la configuración del servidor real, por lo que una discrepancia en el type_filling puede no manifestarse en las pruebas. En el primer uso en cuenta real o demo, comprueba primero el campo de ejecución en la especificación del símbolo.
P: Con el mismo bróker, a veces me sale el 10030 según el símbolo y a veces no.
Es un comportamiento normal (y posible). Como el permiso del modo de ejecución se configura por símbolo, es habitual que, por ejemplo, los pares de Forex permitan IOC mientras que los CFD de acciones solo permitan RETURN, variando según el grupo de instrumentos. Si tu EA opera con múltiples símbolos, asegúrate de leer SYMBOL_FILLING_MODE para cada símbolo por separado.
P: No puedo modificar el código del EA (solo tengo el .ex5). ¿Qué puedo hacer?
Primero comprueba si el EA tiene algún parámetro de entrada relacionado con FillingType. Si no lo tiene, ese EA no se puede usar con el bróker y símbolo actuales. Deberás pedirle al autor que lo adapte, o bien operarlo en un bróker/tipo de cuenta que sí permita el modo de ejecución que el EA da por hecho.
Relacionado
📧 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.