Inicio > Blog > Solución completa a Market closed (10018 / error 132)

MT5MQL5ErroresSolución de problemasEA

Solución completa a Market closed (10018 / error 132)

Publicado: 2026-07-07Lectura: aprox. 8 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

Solución completa a Market closed (MT5/MQL5)

Cuando en el log de tu EA aparece Market closed o market is closed, solo en la mitad de los casos se debe a algo tan simple como "es fin de semana". El patrón que realmente genera dudas es cuando aparece en pleno horario de un día laborable, o cuando otros símbolos operan con normalidad pero uno en concreto no deja de dar el error.

La causa no se limita al "fin de semana": puede deberse a la sesión de negociación propia de cada símbolo (el corte diario del oro o de los índices bursátiles), un desfase entre la hora del servidor de tu bróker y tu hora local, o restricciones en el modo de negociación del símbolo (close-only, etc.), entre otros motivos. Este artículo está pensado tanto para quienes usan un EA en MT5 como para quienes programan EAs en MQL5, y reúne de forma definitiva qué es realmente Market closed, sus 6 causas, un diagnóstico de 30 segundos y cómo prevenirlo de forma permanente desde el código. Para un 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 serie 4xxx) a fecha de julio de 2026. Los horarios de sesión y los nombres de pantalla pueden variar según el bróker y la build.


Qué es Market closed (diferencias entre 10018 y 132)

El código que indica "el mercado está cerrado" es distinto en MT5 y en MT4 (MQL4). Interprétalo según la plataforma que uses y de dónde obtengas el valor.

① TRADE_RETCODE_MARKET_CLOSED = 10018 (MT5 / código de retorno de OrderSend())

El resultado de un OrderSend() enviado desde MQL5 se guarda en MqlTradeResult.retcode. Cuando el servidor de trading determina que "este símbolo está fuera de su horario de negociación" y rechaza la orden, el código devuelto es 10018. No se trata de un error interno de MT5, sino de un rechazo enviado por el servidor del bróker.

Significado: el mercado está cerrado (Market is closed)
Constante: TRADE_RETCODE_MARKET_CLOSED
Valor: 10018
// Ejemplo típico de salida que se puede ver en el log
2026.07.06 23:05:11.204 EA_NAME XAUUSD,M5: OrderSend error 10018 [Market closed]

② ERR_MARKET_CLOSED = 132 (MT4 / GetLastError() en MQL4)

En MT4 (MQL4), cuando OrderSend() falla, GetLastError() devuelve 132. El significado es el mismo que el 10018: "mercado cerrado". Si usas también un EA en versión MT4, la misma causa se manifiesta como 10018 en MT5 y como 132 en MT4.

Significado: el mercado está cerrado (Market is closed)
Constante: ERR_MARKET_CLOSED (MQL4)
Valor: 132

Referencia práctica:

PlataformaOrigenValor
MT5 (MQL5)MqlTradeResult.retcode / CTrade.ResultRetcode()10018
MT4 (MQL4)GetLastError() tras el fallo de OrderSend()132

En ambos casos la causa raíz es la misma: se envió una orden fuera de la sesión de negociación del servidor (o el símbolo tiene restringida la negociación). Como la solución también es común, la explicamos a continuación de forma conjunta.


Diagnóstico en 30 segundos

Antes de reiniciar el EA a ciegas, revisa estos 4 puntos para acotar la causa.

  1. Revisa la sesión de negociación del símbolo — En la ventana de precios (Market Watch), haz clic derecho sobre el símbolo → "Especificación (Specification)" → "Sesiones de negociación". Ahí aparece el horario de negociación por día de la semana (en hora del servidor). Si la hora actual está fuera de ese rango, ahí tienes la respuesta.
  2. Comprueba la hora del servidor — La hora que se muestra en la parte superior de la ventana de precios es la hora del servidor del bróker. La sesión se evalúa con esa hora, no con el reloj de tu ordenador. Es habitual que difiera varias horas respecto a tu hora local.
  3. Verifica el modo de negociación — En la misma pantalla de "Especificación", comprueba que el campo "Negociación" no esté en algo distinto de Full access (por ejemplo Disabled o Close only). Si es así, incluso dentro de la sesión se rechazarán las órdenes nuevas.
  4. Pruébalo con otro símbolo — Si el mismo EA o la misma orden manual funciona en un par FX principal como EURUSD, el problema no está en la cuenta ni en el EA, sino en la sesión/restricción de ese símbolo concreto.

Causas y soluciones (6 patrones)

① Todo el mercado está cerrado por fin de semana o festivo

Síntoma: El error aparece en sábado o domingo, o en fechas como fin de año o Navidad. Se produce en todos los símbolos.

Causa: El mercado de divisas, por lo general, no opera desde el cierre del viernes hasta la apertura del lunes en hora del servidor. En festivos (Año Nuevo, Navidad, etc.) el mercado permanece cerrado o reduce su horario aunque sea día laborable. Si el EA intenta enviar órdenes durante el fin de semana por procesamiento de velas pendientes o por la lógica del timeframe, se producen 10018/132 de forma repetida.

Solución:

  1. El error en sí es inofensivo. Se resuelve solo cuando el mercado vuelve a abrir.
  2. Si no quieres que se ensucie el log, añade en el EA una comprobación de día de la semana/sesión para que directamente no envíe la orden (ver el código más adelante).
  3. Como el calendario de festivos varía según el bróker, consulta el aviso de cierres de tu propio bróker.

② Fuera de la sesión de negociación específica del símbolo (corte diario)

Síntoma: El error aparece en día laborable, pero solo en ciertos símbolos (oro, plata, índices bursátiles CFD, energía, etc.). Suele producirse casi siempre a la misma hora cada día.

Causa: Los pares de divisas pueden negociarse casi las 24 horas en días laborables, pero los metales preciosos y los índices bursátiles CFD tienen un corte de negociación diario que dura desde varios minutos hasta varias horas. Este corte suele coincidir con el mantenimiento del mercado del activo subyacente o con el rollover, y el horario varía según el bróker y el símbolo. Si el EA envía una orden durante ese corte, se produce el 10018.

Solución:

  1. Consulta en "Especificación → Sesiones de negociación" el horario exacto de corte de ese símbolo (ese es el único dato correcto; no des por bueno el horario que aparezca en un blog de terceros, ya que varía según el bróker).
  2. Usa el filtro horario del EA (TradeStartHour/TradeEndHour, etc.) para evitar ese corte.
  3. Si desarrollas el EA, revisa SymbolInfoSessionTrade() en el código (ver más abajo).

Cabe destacar que muchos brokers permiten negociar criptomonedas (BTCUSD, etc.) también los fines de semana, pero esto también depende de cada bróker. No des por sentado que "al ser cripto, funciona 24/7"; compruébalo siempre en la pantalla de especificación.


③ Confusión entre la hora del servidor y la hora local

Síntoma: El error aparece "a pesar de que, según la especificación, debería estar dentro del horario de negociación". Es frecuente al usar brokers extranjeros.

Causa: Tanto el horario de sesión que figura en la especificación como la hora que muestra MT5 corresponden siempre a la hora del servidor del bróker. Muchos brokers extranjeros usan GMT+2/+3 (con el cierre de Nueva York configurado a medianoche), lo que supone un desfase de 6 a 7 horas respecto a la hora local. Un caso típico: en tu hora local "todavía es viernes por la noche", pero en la hora del servidor ya es sábado.

Solución:

  1. Acostúmbrate a razonar siempre en base a la hora que muestra la ventana de precios (= hora del servidor).
  2. Lo habitual es que los parámetros del EA (filtro de horario de negociación, etc.) deban indicarse en hora del servidor. Revisa si los configuraste pensando en tu hora local por error.
  3. En el código, usa TimeTradeServer() (no evalúes la sesión con TimeLocal()).

④ El símbolo tiene la negociación deshabilitada o solo permite cerrar (SYMBOL_TRADE_MODE)

Síntoma: Dentro del horario de sesión y en día laborable, un símbolo concreto rechaza todas las órdenes nuevas. A veces solo se permite cerrar posiciones.

Causa: Los brokers pueden configurar el modo de negociación por símbolo.

SYMBOL_TRADE_MODESignificado
SYMBOL_TRADE_MODE_FULLSin restricciones (normal)
SYMBOL_TRADE_MODE_CLOSEONLYSolo permite cerrar (no se puede abrir). Habitual en CFDs próximos a deslistarse o antes de un cambio de vencimiento
SYMBOL_TRADE_MODE_DISABLEDNegociación completamente deshabilitada
SYMBOL_TRADE_MODE_LONGONLY / SHORTONLYSolo se permite comprar / solo se permite vender

También puede haber diferencias de configuración entre cuenta demo y cuenta real, o símbolos disponibles según el tipo de cuenta.

Solución:

  1. Revisa el campo "Negociación" en la pantalla de "Especificación".
  2. Si está en Close only, olvídate de abrir nuevas posiciones y limítate a gestionar las existentes. Si quieres seguir operando ese instrumento de forma permanente, comprueba si existe otro símbolo con distinto vencimiento o sufijo (por ejemplo, US500.f).
  3. Si permanece en Disabled, consulta con el bróker si ese tipo de cuenta permite negociar ese símbolo.

⑤ Justo tras la apertura del lunes o la reanudación de una sesión

Síntoma: El error o el rechazo de la orden aparece solo durante los primeros minutos tras la apertura del mercado el lunes, o justo después de reanudarse la sesión tras un corte diario.

Causa: Desde el instante en que la sesión "abre" hasta que la ejecución de órdenes se estabiliza, pasa un tiempo. Justo tras la apertura, la liquidez es escasa y el spread se dispara, y algunos brokers no aceptan órdenes hasta que empiezan a fluir cotizaciones estables (lo que se traduce en un rechazo tipo mercado cerrado). Esto suele afectar típicamente a EAs que generan señales a primera hora del lunes o a EAs de oro que buscan aprovechar la reanudación tras el corte.

Solución:

  1. Añade un filtro que evite abrir posiciones nuevas durante los primeros minutos tras la apertura (por ejemplo, AvoidMondayOpen). Por eso los EAs distribuidos en este sitio evitan por defecto el horario de 0 a 3 horas del lunes (hora del servidor).
  2. Combina siempre esto con un filtro de spread (MaxSpread). Una ejecución con el spread anómalo de justo tras la apertura puede resultar más dañina en forma de pérdida que el propio error.
  3. Diseña el EA para que, si recibe un 10018, no reintente de inmediato, sino que espere a la siguiente vela.

⑥ Suspensión de la negociación por noticias o eventos

Síntoma: El error aparece de forma temporal antes o después de la publicación de datos económicos relevantes, o durante movimientos anómalos en un símbolo concreto.

Causa: Algunos brokers o símbolos suspenden temporalmente la negociación (halt) o restringen las órdenes nuevas durante eventos de gran impacto. En los índices bursátiles CFD, esta suspensión puede estar vinculada a los circuit breakers del mercado del activo subyacente. Las órdenes enviadas durante ese periodo se rechazan como un cierre de mercado.

Solución:

  1. Es algo temporal: se resuelve por sí solo con el paso del tiempo.
  2. Usar el filtro de noticias económicas (UseEconomicFilter en los EAs de este sitio) para bloquear la apertura de nuevas posiciones antes y después de las publicaciones permite evitar el error y, al mismo tiempo, el riesgo de un movimiento brusco.

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

Market closed no debe gestionarse "reaccionando después de que salga el error", sino con un diseño correcto que compruebe la sesión y el modo de negociación antes de enviar la orden, y no la envíe si el mercado está cerrado. Además de mantener el log limpio, se evitan solicitudes innecesarias al servidor y reintentos descontrolados.

Comprobar si estamos dentro de la sesión de negociación

SymbolInfoSessionTrade() devuelve la hora de inicio/fin (en segundos desde las 0:00, en hora del servidor) de la sesión número i para el día de la semana indicado. Para símbolos con varias sesiones (por ejemplo, índices con un corte diario), se recorren todas las sesiones en un bucle.

// Determina si la hora actual del servidor está dentro de la sesión de negociación de este símbolo
bool IsTradeSessionOpen(const string symbol)
{
   MqlDateTime dt;
   TimeToStruct(TimeTradeServer(), dt);           // Evaluar siempre con la hora del servidor
   int now = dt.hour*3600 + dt.min*60 + dt.sec;   // Segundos transcurridos desde las 0:00

   datetime from, to;
   for(uint i = 0; SymbolInfoSessionTrade(symbol, (ENUM_DAY_OF_WEEK)dt.day_of_week, i, from, to); i++)
   {
      int f = (int)from;                 // Segundos desde las 0:00
      int t = (int)to;                   // El fin a las 24:00 se representa como 86400
      if(now >= f && now < t)
         return true;
   }
   return false;   // No hay sesión para este día (fin de semana, etc.) o está fuera de todas las sesiones
}

Comprobar el modo de negociación (SYMBOL_TRADE_MODE)

// Determina si el modo de negociación permite abrir una posición nueva
bool IsNewEntryAllowed(const string symbol, ENUM_ORDER_TYPE type)
{
   long mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
   if(mode == SYMBOL_TRADE_MODE_DISABLED)  return false; // Negociación deshabilitada
   if(mode == SYMBOL_TRADE_MODE_CLOSEONLY) return false; // Solo cierre = no se permite abrir
   if(mode == SYMBOL_TRADE_MODE_LONGONLY  && type != ORDER_TYPE_BUY)  return false;
   if(mode == SYMBOL_TRADE_MODE_SHORTONLY && type != ORDER_TYPE_SELL) return false;
   return true;   // SYMBOL_TRADE_MODE_FULL, etc.
}

Combinarlo como filtro previo al envío de la orden

// Dentro de OnTick: aunque salte la señal, no se envía si el mercado está cerrado
if(!IsTradeSessionOpen(_Symbol) || !IsNewEntryAllowed(_Symbol, ORDER_TYPE_BUY))
{
   // Evita el 10018 de antemano. Se registra una sola línea en el log y se espera a la siguiente vela
   return;
}

Cómo gestionar el caso en que, aun así, se reciba un 10018

Existen casos que pueden saltarse este filtro, como el desfase en la actualización de la información de sesión o el rechazo justo tras la apertura, y es imposible reducirlos a cero. La regla de oro es revisar el retcode de OrderSend() y, si es 10018, no reintentar de inmediato (esperar hasta la siguiente vela). Reintentar sin parar mientras el mercado está cerrado solo ensucia el log sin mejorar nada.

MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... construir req ...
if(!OrderSend(req, res) || res.retcode != TRADE_RETCODE_DONE)
{
   if(res.retcode == TRADE_RETCODE_MARKET_CLOSED)   // 10018
      Print("Market closed. Skip and wait for the next session.");
   else
      PrintFormat("OrderSend failed: retcode=%d, lastError=%d", res.retcode, GetLastError());
}

Siendo sinceros, los EAs que envían órdenes justo tras la apertura del lunes o alrededor de un corte diario (especialmente en oro e índices bursátiles) se topan con este error de forma habitual. Un EA que tenga en cuenta los horarios —comprobación de sesión, espera tras la apertura y cierre antes del fin de semana— no solo evita errores innecesarios, sino también ejecuciones desfavorables en tramos horarios de baja liquidez. Los EAs distribuidos por FXEA365 implementan de serie la prevención de apertura del lunes (AvoidMondayOpen), filtros horarios y cierre antes del fin de semana (CloseAllBeforeWeekend).


Lista de comprobación por prioridad

PrioridadComprobaciónSolución
🚨 Primero¿Es fin de semana o festivo ahora mismo (en hora del servidor)?Solo hay que esperar. El error en sí es inofensivo
🚨 Primero¿Estamos dentro del rango de "Sesiones de negociación" de la especificación?Evitar el corte propio del símbolo con un filtro horario
⚠️ Después¿Se está confundiendo la hora del servidor con la hora local?Reconfigurar tomando como referencia la hora de la ventana de precios
⚠️ Después¿El modo de negociación está en Full access?Si es Close only / Disabled, consultar las condiciones del bróker
✅ Revisar¿No es justo tras la apertura o tras el fin de un corte?Esperar unos minutos + filtro de spread
🛠 Desarrollo¿Se comprueba la sesión/modo antes de enviar la orden?Implementar el filtro con SymbolInfoSessionTrade

Resumen

  • Market closed es el 10018 (TRADE_RETCODE_MARKET_CLOSED) en MT5 y el 132 (ERR_MARKET_CLOSED) en MT4. En ambos casos significa lo mismo: "orden enviada fuera de la sesión de negociación o con la negociación restringida".
  • No solo aparece en fin de semana: también puede deberse al corte diario propio de cada símbolo (oro, índices), a un desfase con la hora del servidor, a restricciones de SYMBOL_TRADE_MODE o a rechazos justo tras la apertura. Si aparece en día laborable, revisa primero "Especificación → Sesiones de negociación".
  • El horario de sesión varía según el bróker y el símbolo. Solo es correcto el horario que aparece en la pantalla de especificación de tu propio MT5.
  • Los desarrolladores de EAs deben implementar una prevención permanente combinando SymbolInfoSessionTrade() + SYMBOL_TRADE_MODE + TimeTradeServer() como filtro previo al envío de la orden. Si se recibe un 10018, no reintentar de inmediato: esperar a la siguiente vela.

Para el listado general de códigos de error, consulta la guía completa de códigos de error de MQL5 / MT5; y para EAs gratuitos con filtro horario y prevención de sesión incorporados de serie, revisa el listado de EAs.


Preguntas frecuentes

P: Me aparece Market closed en pleno día laborable. ¿Por qué?

Suele deberse al horario de corte propio de ese símbolo (corte diario) o a una restricción en el modo de negociación del símbolo. El oro, la plata y los índices bursátiles CFD tienen tramos horarios en los que no se puede operar aunque sea día laborable. Haz clic derecho sobre el símbolo en la ventana de precios → "Especificación" → revisa "Sesiones de negociación" y el campo "Negociación".

P: ¿Cuál es la diferencia entre 10018 y 132?

Solo cambia la plataforma; el significado es el mismo. El 10018 (TRADE_RETCODE_MARKET_CLOSED) es el código de retorno de OrderSend() en MT5, y el 132 (ERR_MARKET_CLOSED) es el valor de GetLastError() en MT4 (MQL4). La solución es la misma en ambos casos.

P: Mi EA sigue dando el error durante todo el fin de semana. ¿Puedo dejarlo así?

No supone ningún perjuicio real. Se detiene por sí solo en cuanto el mercado vuelve a abrir. Ahora bien, si te molesta que se ensucie el log o que las notificaciones push no dejen de sonar, la solución de fondo es añadir en el EA una comprobación de día de la semana/sesión que evite directamente el envío de la orden (consulta el código de este artículo).

P: También me apareció Market closed con criptomonedas (BTCUSD). ¿No se supone que se negocian 24 horas?

Que un CFD de criptomonedas se pueda operar también los fines de semana depende de cada bróker. Algunos brokers suspenden la negociación el fin de semana o establecen breves cortes de mantenimiento. Igual que con los pares de divisas, comprueba en "Especificación → Sesiones de negociación" el horario real en el que puedes operar con tu bróker.

📧 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