Solução Completa para Market Closed (10018 / Erro 132)
Sumário
- O que é Market Closed (diferença entre 10018 e 132)
- ① TRADE_RETCODE_MARKET_CLOSED = 10018 (MT5 / código de retorno do `OrderSend()`)
- ② ERR_MARKET_CLOSED = 132 (MT4 / `GetLastError()` do MQL4)
- Diagnóstico rápido em 30 segundos
- Causas e soluções (6 padrões)
- ① Fim de semana ou feriado — mercado inteiro fechado
- ② Fora da sessão de negociação específica do ativo (break diário)
- ③ Confusão entre horário do servidor e horário local
- ④ Símbolo com negociação desabilitada ou somente para fechamento (SYMBOL_TRADE_MODE)
- ⑤ Logo após a abertura de segunda-feira ou reabertura de sessão
- ⑥ Suspensão de negociação por notícias ou eventos
- Código em MQL5 para prevenir este erro (para desenvolvedores de EA)
- Verificar se está dentro da sessão de negociação
- Verificar o modo de negociação (SYMBOL_TRADE_MODE)
- Reunindo tudo como um gate antes do envio da ordem
- Tratamento para quando o 10018 ainda assim é retornado
- Checklist de prioridades
- Resumo
- Perguntas frequentes
- P: O erro Market closed aparece no meio de um dia útil. Por quê?
- P: Qual é a diferença entre 10018 e 132?
- P: Meu EA continua gerando esse erro nos fins de semana. Posso deixar assim?
- P: O erro Market closed apareceu também em criptomoedas (BTCUSD). Elas não deveriam negociar 24 horas?
Solução Completa para Market Closed (MT5/MQL5)
Quando aparece Market closed ou market is closed no log do seu EA, achar que "é só porque é fim de semana" resolve apenas metade dos casos. O erro aparece no meio de um dia útil, ou então funciona normalmente em outros ativos mas falha só em um símbolo específico — esse padrão confunde muitos traders.
A causa não é apenas o "fim de semana": ela pode estar em sessões de negociação específicas por ativo (breaks diários do ouro ou de índices), defasagem entre o horário do servidor da corretora e o seu horário local, ou restrições no modo de negociação do símbolo (como close-only), entre outros fatores. Este artigo é a referência definitiva tanto para quem usa EAs no MT5 quanto para quem programa EAs em MQL5: vamos cobrir a natureza real do erro, os 6 motivos possíveis, um diagnóstico rápido de 30 segundos e a prevenção definitiva via código. Para a lista completa de códigos de erro, consulte o guia completo de códigos de erro MQL5 / MT5.
Este artigo parte do MT5 (série de build 4xxx) em julho de 2026. Horários de sessão e nomes de telas podem variar conforme a corretora e a build.
O que é Market Closed (diferença entre 10018 e 132)
O código que representa "o mercado está fechado" é diferente entre o MT5 e o MT4 (MQL4). Interprete de acordo com a plataforma e a origem do valor.
① TRADE_RETCODE_MARKET_CLOSED = 10018 (MT5 / código de retorno do OrderSend())
No MQL5, o resultado do OrderSend() fica armazenado em MqlTradeResult.retcode. Quando o servidor de negociação avalia que "este símbolo está fora do horário de negociação" e rejeita a ordem, o código retornado é 10018. Não se trata de um erro interno do MT5, e sim de uma notificação de rejeição vinda do servidor da corretora.
Significado: mercado fechado (Market is closed)
Constante: TRADE_RETCODE_MARKET_CLOSED
Valor: 10018
// Exemplo típico de saída visível no log
2026.07.06 23:05:11.204 EA_NAME XAUUSD,M5: OrderSend error 10018 [Market closed]
② ERR_MARKET_CLOSED = 132 (MT4 / GetLastError() do MQL4)
No MT4 (MQL4), quando o OrderSend() falha, o GetLastError() subsequente retorna 132. O significado é o mesmo de 10018: "mercado fechado". Se você usa EAs em MT4 e MT5 em paralelo, a mesma causa aparece como 10018 no MT5 e 132 no MT4.
Significado: mercado fechado (Market is closed)
Constante: ERR_MARKET_CLOSED (MQL4)
Valor: 132
Uso prático — tabela comparativa:
| Plataforma | Onde é obtido | Valor |
|---|---|---|
| MT5 (MQL5) | MqlTradeResult.retcode / CTrade.ResultRetcode() | 10018 |
| MT4 (MQL4) | GetLastError() após falha do OrderSend() | 132 |
Em ambos os casos, a causa raiz é a mesma: "uma ordem foi enviada fora da sessão de negociação do servidor" (ou o símbolo está com a negociação restrita). Como o tratamento também é comum aos dois casos, vamos explicar tudo junto a seguir.
Diagnóstico rápido em 30 segundos
Antes de reiniciar o EA às cegas, verifique estes 4 pontos para identificar a causa provável.
- Verifique a sessão de negociação do símbolo — Na Observação de Mercado (Market Watch), clique com o botão direito no símbolo em questão → "Especificação (Specification)" → "Sessões de negociação". Ali estão os horários de negociação disponíveis por dia da semana (em horário do servidor). Se o horário atual estiver fora dessa janela, essa é a resposta.
- Confira o horário do servidor — O horário exibido no topo da janela de Observação de Mercado é o horário do servidor da corretora. A verificação de sessão é feita com base nesse horário, não no relógio do seu computador. É comum haver uma diferença de várias horas em relação ao horário do Brasil.
- Confira o modo de negociação — Na mesma tela de "Especificação", veja se o campo "Negociação" está diferente de
Full access(por exemplo,DisabledouClose only). Se estiver, novas ordens serão rejeitadas mesmo dentro da sessão. - Teste com outro ativo — Se o mesmo EA ou ordem manual funcionar normalmente em um par principal como EURUSD, o problema não é a conta nem o EA, e sim a sessão/restrição daquele ativo específico.
Causas e soluções (6 padrões)
① Fim de semana ou feriado — mercado inteiro fechado
Sintoma: o erro aparece no sábado, domingo, ou em datas como fim de ano e Natal. Ocorre em todos os ativos.
Causa: o mercado forex geralmente fica fechado do fechamento de sexta-feira até a abertura de segunda-feira, em horário do servidor. Em feriados (Ano Novo, Natal etc.), mesmo em dias úteis pode haver fechamento ou negociação reduzida. Se o EA tentar enviar ordens durante o fim de semana por causa do processamento de barras ou do timeframe, os erros 10018/132 aparecem repetidamente.
Solução:
- O erro em si é inofensivo. Ele se resolve naturalmente quando o mercado reabre
- Se você não quiser poluir o log, implemente no EA uma verificação de dia da semana e de sessão para evitar o envio da ordem desde o início (código mais adiante)
- Como o calendário de feriados varia por corretora, consulte o cronograma de fechamento divulgado pela sua corretora
② Fora da sessão de negociação específica do ativo (break diário)
Sintoma: o erro ocorre mesmo em dia útil, mas apenas em ativos específicos (ouro, prata, CFDs de índices, energia etc.). Costuma acontecer quase sempre no mesmo horário todos os dias.
Causa: pares de forex podem ser negociados quase 24 horas em dias úteis, mas metais preciosos e CFDs de índices têm pausas diárias de negociação que variam de dezenas de minutos a algumas horas. Isso está alinhado à manutenção da bolsa do ativo subjacente ou ao rollover, e o horário varia conforme a corretora e o ativo. Se o EA enviar uma ordem durante essa pausa, o erro 10018 aparece.
Solução:
- Verifique em "Especificação → Sessões de negociação" o horário exato de pausa daquele ativo específico (o horário mostrado ali é a única fonte correta — não confie no horário de blogs de terceiros, pois varia entre corretoras)
- Use o filtro de horário do EA (
TradeStartHour/TradeEndHouretc.) para evitar o período de pausa - Desenvolvedores devem verificar
SymbolInfoSessionTrade()no código (explicado adiante)
Vale notar que, em muitas corretoras, criptomoedas (BTCUSD etc.) podem ser negociadas também nos fins de semana, mas isso também depende da corretora. Não presuma que "por ser cripto, deve ser 24/7" — confirme sempre na tela de especificação.
③ Confusão entre horário do servidor e horário local
Sintoma: o erro aparece mesmo quando "deveria estar dentro do horário de negociação segundo a especificação". Comum ao usar corretoras internacionais.
Causa: tanto o horário de sessão exibido na especificação quanto o relógio mostrado no MT5 são sempre o horário do servidor da corretora. Muitas corretoras internacionais usam GMT+2/+3 (configurado para que o fechamento de Nova York coincida com meia-noite), o que gera uma diferença de 6 a 7 horas em relação ao horário do Brasil. É comum que, quando no seu horário local "ainda é sexta à noite", no horário do servidor já seja sábado.
Solução:
- Acostume-se a pensar sempre com base no horário exibido na janela de Observação de Mercado (= horário do servidor)
- Os parâmetros do EA (como filtros de horário de negociação) normalmente devem ser configurados em horário do servidor. Revise se você não configurou pensando no horário do Brasil por engano
- No código, use
TimeTradeServer()(nunca faça a verificação de sessão comTimeLocal())
④ Símbolo com negociação desabilitada ou somente para fechamento (SYMBOL_TRADE_MODE)
Sintoma: mesmo dentro do horário de sessão e em dia útil, todas as novas ordens de um ativo específico são rejeitadas. Às vezes apenas o fechamento de posições funciona.
Causa: as corretoras podem configurar o modo de negociação por símbolo individualmente.
| SYMBOL_TRADE_MODE | Significado |
|---|---|
SYMBOL_TRADE_MODE_FULL | Sem restrições (normal) |
SYMBOL_TRADE_MODE_CLOSEONLY | Somente fechamento permitido (sem novas ordens). Comum em CFDs prestes a ser deslistados ou antes da troca de vencimento |
SYMBOL_TRADE_MODE_DISABLED | Negociação totalmente desabilitada |
SYMBOL_TRADE_MODE_LONGONLY / SHORTONLY | Permite apenas compra ou apenas venda |
Também pode haver diferenças de configuração entre conta demo e conta real, ou nos ativos disponíveis conforme o tipo de conta.
Solução:
- Verifique o campo "Negociação" na tela de "Especificação"
- Se estiver em
Close only, desista de novas ordens e foque em gerenciar as posições existentes. Se quiser continuar operando aquele ativo permanentemente, verifique se há um símbolo equivalente com outro vencimento ou sufixo (por exemplo,US500.f) - Se permanecer em
Disabled, consulte a corretora sobre a disponibilidade de negociação para o seu tipo de conta
⑤ Logo após a abertura de segunda-feira ou reabertura de sessão
Sintoma: o erro ou a rejeição de execução ocorre apenas nos primeiros minutos após a abertura do mercado na segunda-feira, ou logo após o fim de um break diário.
Causa: existe um intervalo entre o momento em que a sessão "abre" e o momento em que as execuções se tornam realmente estáveis. Logo após a abertura, a liquidez é baixa e o spread se alarga de forma extrema, e algumas corretoras não aceitam ordens até que as cotações comecem a fluir normalmente (tratando isso como mercado fechado e rejeitando a ordem). Isso costuma afetar EAs que geram sinais logo na abertura de segunda-feira, ou EAs de ouro que buscam operar logo após o fim do break.
Solução:
- Implemente um filtro que evite novas ordens durante os primeiros minutos após a abertura (parâmetro como
AvoidMondayOpen). É por isso que os EAs distribuídos neste site têm como padrão evitar o horário entre 0h e 3h de segunda-feira (horário do servidor) - Use sempre um filtro de spread (
MaxSpread) em conjunto. Uma execução com spread anormal logo após a abertura pode ser mais prejudicial financeiramente do que o próprio erro - Projete o EA para que, ao receber o erro 10018, não tente reenviar imediatamente, aguardando até a próxima barra
⑥ Suspensão de negociação por notícias ou eventos
Sintoma: o erro ocorre temporariamente antes ou depois da divulgação de indicadores importantes, ou durante movimentos anormais em um ativo específico.
Causa: algumas corretoras e ativos suspendem temporariamente a negociação (halt) ou restringem novas ordens durante eventos relevantes. Em CFDs de índices, a suspensão pode estar vinculada ao circuit breaker do mercado do ativo subjacente. Ordens enviadas durante esse período são rejeitadas como se o mercado estivesse fechado.
Solução:
- É uma situação temporária, que se resolve com o tempo
- Usar o filtro de indicadores econômicos (
UseEconomicFilterdos EAs deste site) para bloquear novas ordens antes e depois dos indicadores permite evitar o erro e o risco de movimentos bruscos ao mesmo tempo
Código em MQL5 para prevenir este erro (para desenvolvedores de EA)
Market closed não deve ser tratado "depois que o erro aparece" — o design correto é verificar a sessão e o modo de negociação antes de enviar a ordem, e não enviá-la se o mercado estiver fechado. Isso não só limpa o log, como também evita requisições desnecessárias ao servidor e loops descontrolados de retry.
Verificar se está dentro da sessão de negociação
SymbolInfoSessionTrade() retorna o horário de início/fim (em segundos a partir de 0h no horário do servidor) da sessão número i de um determinado dia da semana. Para lidar com ativos que têm múltiplas sessões (como índices com break diário), percorremos todas as sessões em um loop.
// Verifica se o horário atual do servidor está dentro da sessão de negociação deste símbolo
bool IsTradeSessionOpen(const string symbol)
{
MqlDateTime dt;
TimeToStruct(TimeTradeServer(), dt); // sempre verificar com o horário do servidor
int now = dt.hour*3600 + dt.min*60 + dt.sec; // segundos decorridos desde 0h
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 0h
int t = (int)to; // término às 24:00 vira 86400
if(now >= f && now < t)
return true;
}
return false; // nenhuma sessão correspondente para este dia (fim de semana etc.) ou fora de todas as sessões
}
Verificar o modo de negociação (SYMBOL_TRADE_MODE)
// Verifica se o modo de negociação permite abrir uma nova posição
bool IsNewEntryAllowed(const string symbol, ENUM_ORDER_TYPE type)
{
long mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
if(mode == SYMBOL_TRADE_MODE_DISABLED) return false; // negociação desabilitada
if(mode == SYMBOL_TRADE_MODE_CLOSEONLY) return false; // somente fechamento = sem novas ordens
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.
}
Reunindo tudo como um gate antes do envio da ordem
// Dentro do OnTick: mesmo que o sinal seja gerado, não envia a ordem se o mercado estiver fechado
if(!IsTradeSessionOpen(_Symbol) || !IsNewEntryAllowed(_Symbol, ORDER_TYPE_BUY))
{
// Previne o erro 10018 antes que ele ocorra. Registra apenas uma linha no log e aguarda a próxima barra
return;
}
Tratamento para quando o 10018 ainda assim é retornado
Não é possível eliminar completamente casos que escapam ao gate, como defasagem na atualização das informações de sessão ou rejeições logo após a abertura. A regra de ouro é verificar o retcode do OrderSend() e, ao receber 10018, não tentar novamente de imediato (aguardar até a próxima barra). Reenviar repetidamente durante o fechamento apenas polui o log sem trazer nenhuma melhoria.
MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
// ... monta o 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());
}
Sinceramente, EAs que enviam ordens logo após a abertura de segunda-feira ou nos períodos próximos a breaks diários (especialmente em ouro e índices) esbarram nesse erro com frequência no dia a dia. Um EA que respeita o cronograma do mercado — com verificação de sessão, pausa logo após a abertura e fechamento antes do fim de semana — não só evita erros desnecessários, como também previne execuções ruins em horários de baixa liquidez. Os EAs distribuídos pela FXEA365 já implementam nativamente prevenção de abertura de segunda-feira (AvoidMondayOpen), filtro de horário e fechamento antes do fim de semana (CloseAllBeforeWeekend).
Checklist de prioridades
| Prioridade | Verificação | Solução |
|---|---|---|
| 🚨 Primeiro | É fim de semana ou feriado agora (em horário do servidor)? | Basta esperar. O erro em si é inofensivo |
| 🚨 Primeiro | Está dentro da janela de "Sessões de negociação" da especificação? | Evite o período de pausa específico do ativo com um filtro de horário |
| ⚠️ Depois | Você não está confundindo horário do servidor com horário do Brasil? | Reconfigure tendo como base o horário exibido na Observação de Mercado |
| ⚠️ Depois | O modo de negociação está como Full access? | Se estiver Close only / Disabled, confirme as especificações com a corretora |
| ✅ Confirmar | Não é logo após a abertura ou o fim de um break? | Pausa de alguns minutos + filtro de spread |
| 🛠 Desenvolvimento | O EA verifica sessão/modo antes de enviar a ordem? | Implemente o gate com SymbolInfoSessionTrade |
Resumo
Market closedé o código 10018 (TRADE_RETCODE_MARKET_CLOSED) no MT5 e 132 (ERR_MARKET_CLOSED) no MT4. O significado é o mesmo: "ordem enviada fora da sessão de negociação/durante restrição de negociação".- Além do fim de semana, o erro também ocorre por breaks diários específicos de cada ativo (ouro, índices), defasagem em relação ao horário do servidor, restrições de SYMBOL_TRADE_MODE e rejeições logo após a abertura. Se aparecer em dia útil, comece verificando "Especificação → Sessões de negociação".
- O horário de sessão varia por corretora e por ativo. Somente o horário exibido na tela de especificação do seu MT5 é a resposta correta.
- Desenvolvedores de EA devem implementar a prevenção definitiva com um gate antes do envio da ordem usando
SymbolInfoSessionTrade()+SYMBOL_TRADE_MODE+TimeTradeServer(). Ao receber o 10018, não reenviar imediatamente — aguardar até a próxima barra.
Para a lista completa de códigos de erro, consulte o guia completo de códigos de erro MQL5 / MT5, e para EAs gratuitos com filtro de horário e prevenção de sessão já integrados, veja o ranking de EAs.
Perguntas frequentes
P: O erro Market closed aparece no meio de um dia útil. Por quê?
A causa é o horário de pausa específico daquele ativo (break diário) ou uma restrição no modo de negociação do símbolo. Ouro, prata e CFDs de índices têm horários em que não é possível negociar mesmo em dias úteis. Clique com o botão direito no símbolo na Observação de Mercado → "Especificação" → confira os campos "Sessões de negociação" e "Negociação".
P: Qual é a diferença entre 10018 e 132?
O significado é o mesmo; a diferença é apenas a plataforma. 10018 (TRADE_RETCODE_MARKET_CLOSED) é o código de retorno do OrderSend() no MT5, e 132 (ERR_MARKET_CLOSED) é o valor do GetLastError() no MT4 (MQL4). O tratamento é o mesmo para ambos.
P: Meu EA continua gerando esse erro nos fins de semana. Posso deixar assim?
Não há dano real. O erro para naturalmente quando o mercado reabre. Porém, se a poluição do log ou as notificações push constantes incomodarem, a solução definitiva é implementar no EA uma verificação de dia da semana/sessão para pular o envio da ordem desde o início (veja o código no corpo do artigo).
P: O erro Market closed apareceu também em criptomoedas (BTCUSD). Elas não deveriam negociar 24 horas?
A possibilidade de negociar criptomoedas em CFD também nos finais de semana depende da corretora. Algumas corretoras suspendem a negociação nos fins de semana ou têm pequenas janelas de manutenção. Assim como nos pares de forex, confira em "Especificação → Sessões de negociação" o horário de negociação realmente disponível na sua corretora.
Relacionados
📧 Avisos antes de aumentos de preço + curso gratuito de 5 dias por e-mail
Todos os EAs estão em preço de lançamento e sobem em degraus conforme as vendas. Receba aviso antes de cada aumento, além de um e-mail diário sobre trading algorítmico, leitura de backtests e escolha de corretora.
* Privacidade rigorosamente protegida. Você pode cancelar a inscrição a qualquer momento.