Off Quotes / Requote no MT5 — erro 10021
Sumário
- Qual é a diferença entre esses dois erros (+ os 136/138 do MT4)?
- ① TRADE_RETCODE_PRICE_OFF = 10021 (nenhuma cotação disponível para processar)
- ② TRADE_RETCODE_REQUOTE = 10004 (requote = novo preço reapresentado)
- ③ Os erros 136 / 138 da era MT4
- Diagnóstico rápido em 30 segundos
- Causas e soluções (5 padrões)
- ① Movimento brusco de mercado / spike de indicador (o preço enviado ficou desatualizado antes de chegar)
- ② Deviation (slippage tolerado) configurado de forma restritiva demais
- ③ Diferença no modo de execução (requote é fenômeno da execução instant)
- ④ Horários ou ativos com cotação rarefeita ou parada
- ⑤ Latência de conexão (VPS distante do servidor da corretora)
- Código MQL5 para reduzir esse erro (para desenvolvedores de EA)
- Configurar o deviation adequadamente, em points
- Reenviar apenas para retcodes relacionados a preço (com o tick mais recente)
- Usar o preço reapresentado no requote (10004)
- Criar horários em que simplesmente não se envia ordem
- Checklist de prioridades
- Conclusão
- Perguntas Frequentes
- P: 10004 e 10021, qual é mais grave?
- P: Uma corretora em que o requote nunca aparece é melhor?
- P: Meu EA no MT4 apresenta os erros 136 / 138. A mesma solução se aplica?
- P: Não ocorre no backtest, mas ocorre em operação real. Por quê?
Off Quotes / Requote (MT5/MQL5) Resolvido Definitivamente
Quando você está operando com um EA e vê off quotes (10021) ou requote (10004) aparecerem no Journal ou na aba Experts, parece que a corretora rejeitou a execução, o que gera insegurança. Mas esses dois casos não são problemas de saldo ou de lote — são problemas de preço. O preço que você enviou e o preço que o servidor tinha naquele instante não coincidiram, só isso. Na maioria das vezes, a causa se resume a: movimento brusco de mercado, deviation (slippage tolerado) mal configurado, tipo de execução ou latência de conexão.
Este artigo é voltado tanto para quem usa EAs no MT5 quanto para quem programa EAs em MQL5. Ele reúne em um único lugar a natureza, as causas, as soluções imediatas e as correções definitivas no código para 10021 (TRADE_RETCODE_PRICE_OFF), 10004 (TRADE_RETCODE_REQUOTE) e os erros 136/138 da era MT4. Para uma lista geral 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. Detalhes de comportamento (se o servidor devolve um requote ou executa diretamente, por exemplo) variam conforme o modo de execução da corretora.
Qual é a diferença entre esses dois erros (+ os 136/138 do MT4)?
As rejeições do tipo "o preço não bate" se dividem em dois tipos, conforme a forma como o servidor responde.
① TRADE_RETCODE_PRICE_OFF = 10021 (nenhuma cotação disponível para processar)
Esse valor é retornado em MqlTradeResult.retcode como resultado de OrderSend() e significa "não há cotações para processar a solicitação" (There are no quotes to process the request). Indica que o servidor não tem um preço válido disponível, ou que o preço enviado está longe demais da cotação atual para ser processado.
Significado: nenhuma cotação disponível para processar a solicitação
Constante: TRADE_RETCODE_PRICE_OFF
Valor: 10021
② TRADE_RETCODE_REQUOTE = 10004 (requote = novo preço reapresentado)
Também retornado em retcode de OrderSend(), mas aqui não é uma simples rejeição — é uma reapresentação de preço (requote): "esse preço não serve, mas que tal este novo?". Os campos bid / ask de MqlTradeResult trazem o preço que o servidor reapresentou.
Significado: Requote — reapresentação de um novo preço
Constante: TRADE_RETCODE_REQUOTE
Valor: 10004
// Exemplo típico visível no log
2026.07.07 21:30:02.118 EA_NAME EURUSD,M5: OrderSend error 10004 (requote)
2026.07.07 21:30:02.310 EA_NAME EURUSD,M5: OrderSend error 10021
③ Os erros 136 / 138 da era MT4
No MQL4 (MT4), o mesmo fenômeno era retornado como código de erro via GetLastError().
| Constante MT4 | Valor | Retcode correspondente no MT5 |
|---|---|---|
ERR_OFF_QUOTES | 136 | 10021 (TRADE_RETCODE_PRICE_OFF) |
ERR_REQUOTE | 138 | 10004 (TRADE_RETCODE_REQUOTE) |
Se você encontrar "error 136" ou "error 138" em artigos antigos ou em logs de EAs da versão MT4, o conteúdo deste artigo se aplica diretamente (no MT4, a prática padrão era chamar RefreshRates() para atualizar o preço antes de reenviar a ordem — a forma equivalente no MT5 é explicada mais adiante).
Diferenciação na prática:
| Retcode | O que o servidor está dizendo | Ação que o EA deve tomar |
|---|---|---|
| 10004 (requote) | "O preço se moveu. Aqui está o novo preço." | Reenviar com o preço mais recente (ou desistir) |
| 10021 (price off) | "Não há cotação disponível para processar." | Aguardar um pouco e reenviar com o tick mais recente |
Ambos são erros temporários (passíveis de retry). Não é possível "eliminá-los por completo" via ajuste de código ou configuração, mas dá para reduzir bastante a frequência.
Diagnóstico rápido em 30 segundos
- Verifique o horário em que o erro ocorreu, pelo timestamp do Journal
- No momento exato de uma divulgação de indicador (NFP, FOMC, etc.) → movimento brusco normal de mercado. Se o EA tiver filtro de notícias, ative-o
- Perto da meia-noite no horário do servidor (rollover) ou gap de abertura da semana → horário de cotação rarefeita. Está dentro do esperado
- Ocorre de forma aleatória, sem relação com horário → suspeite de conexão, VPS ou configuração de deviation
- Verifique em qual ativo o erro ocorreu
- Se estiver concentrado em pares menos líquidos, exóticos ou CFDs → a causa é a baixa liquidez de cotação do próprio ativo
- Teste se ocorre em uma ordem manual
- Se a ordem rápida manual passa normalmente, mas só o EA é rejeitado → é bem provável que o
deviation(slippage tolerado) do EA esteja configurado de forma restritiva demais
- Se a ordem rápida manual passa normalmente, mas só o EA é rejeitado → é bem provável que o
Com esses três pontos, você identifica se o problema é "do mercado", "do ativo" ou "de configuração/ambiente", antes de seguir para as causas específicas abaixo.
Causas e soluções (5 padrões)
① Movimento brusco de mercado / spike de indicador (o preço enviado ficou desatualizado antes de chegar)
Sintoma: 10004/10021 concentrados no horário de divulgação de indicadores econômicos, declarações de autoridades, ou início da semana na segunda-feira.
Causa: O EA recebe o tick, calcula o preço, e nos dezenas ou centenas de milissegundos até a ordem chegar ao servidor, o preço se move alguns pips. O preço enviado já não existe mais, então o servidor devolve um requote (10004) ou "sem cotação" (10021). Isso não é bem um erro — é algo esperado em mercado rápido.
Solução:
- Bloquear novas entradas antes e depois de indicadores (filtro de notícias). Os EAs distribuídos por este site já trazem
EconomicFilterpor padrão - Ampliar o
deviation(slippage tolerado) para um valor realista (ver item ②) - Implementar lógica de retry (código explicado adiante)
② Deviation (slippage tolerado) configurado de forma restritiva demais
Sintoma: Ocorre esporadicamente mesmo em mercado calmo. Ordens manuais passam, mas só o EA é rejeitado.
Causa: MqlTradeRequest.deviation declara "até quantos points de diferença em relação ao preço enviado são aceitáveis". Se esse valor for definido entre 0 e poucos points, até o desvio normal de atualização de tick já é suficiente para gerar rejeição. Também é comum confundir points com pips (em corretoras de 5 dígitos, 1 pip = 10 points).
Solução:
- Comece testando com
deviationentre 10 e 30 points (= 1 a 3 pips). Para estratégias que não são de scalping, 20 points é um ponto de partida seguro - Verifique se não houve confusão de unidade — como pensar "deviation=5" e na prática configurar 0,5 pips
- Se a estratégia não tolera nenhum slippage, aceite a rejeição como parte do funcionamento normal e apenas controle o número de tentativas de retry
③ Diferença no modo de execução (requote é fenômeno da execução instant)
Sintoma: Ocorre com frequência na Corretora A, mas nunca na Corretora B.
Causa: O requote (10004) é um fenômeno específico da execução instant (instant execution). Nesse modo, a ordem diz "execute exatamente neste preço", então, quando o preço se move, o servidor reapresenta um novo preço (requote). Já na execução market (market execution), a ordem diz "execute ao preço de mercado atual", então o requote não pode ocorrer por definição — em vez disso, a ordem é executada diretamente no preço que houver, mesmo que diferente (slippage).
Ou seja, "não aparecer requote" não significa "corretora melhor" — é uma troca entre ser rejeitado ou ser executado com slippage. O modo de execução do símbolo pode ser conferido na aba "Especificação" (Specification) do MT5, no campo Execution, ou via código com SYMBOL_TRADE_EXEMODE.
Solução:
- Verifique o modo de execução da sua conta (muitas contas padrão de corretoras internacionais usam execução market, na qual o requote simplesmente não ocorre)
- Se requotes frequentes prejudicam a estratégia, considere migrar para um tipo de conta ou corretora com execução market
- Mesmo em execução market, algumas corretoras respeitam o
deviatione outras não. Se slippage extremo não é aceitável, verifique o slippage real no histórico de execuções
④ Horários ou ativos com cotação rarefeita ou parada
Sintoma: 10021 ocorre perto da meia-noite no horário do servidor (rollover), logo na abertura da semana, em períodos de baixa liquidez como o Natal, ou em ativos menos líquidos.
Causa: Durante o rollover, o fluxo de cotações pode parar temporariamente ou o spread pode se abrir de forma extrema, devido ao processamento de swap. Logo na abertura da semana ou em ativos de baixa liquidez, simplesmente não há cotação suficiente para processar a ordem. Enviar uma ordem nessas condições resulta em 10021 (sem cotação).
Solução:
- Evite novas entradas entre 23:55 e 0:05 (horário do servidor) (filtro de horário)
- Evite os primeiros minutos após a abertura da semana (configurações do tipo
AvoidMondayOpen) - Adicione um filtro de spread (
MaxSpread). Como o spread se abre justamente nos horários de cotação rarefeita, esse filtro evita esses períodos de forma automática
⑤ Latência de conexão (VPS distante do servidor da corretora)
Sintoma: Frequência claramente mais alta que em outros ambientes, independentemente de horário ou ativo. Ping alto.
Causa: Quanto maior o tempo de ida e volta (latência) até a ordem chegar ao servidor, maior a chance de o preço se mover nesse intervalo. Rodar o EA em um PC doméstico, ou em um VPS em uma região distante da localização do servidor da corretora (geralmente Londres, Nova York etc.), aumenta estruturalmente a frequência de 10004/10021. O ping exibido no canto inferior direito do MT5 é um bom indicador (algumas centenas de ms já é claramente desfavorável; abaixo de algumas dezenas de ms é o ideal).
Solução:
- Verifique o valor de ping no canto inferior direito do MT5; se estiver sempre alto, reavalie o ambiente de execução do EA
- Migre para um VPS em uma região mais próxima do servidor da corretora. Sendo direto: 10004/10021 causados por latência não podem ser reduzidos via código — a única solução é a proximidade física. Veja como escolher em Como Escolher um VPS para EAs
- Quanto mais a estratégia for de scalping, maior o impacto da latência. Para EAs de timeframe diário ou H4, essa causa tem prioridade menor
Código MQL5 para reduzir esse erro (para desenvolvedores de EA)
A estratégia se resume a três pontos: (1) configurar o deviation de forma realista, (2) ao ser rejeitado, buscar o tick mais recente e reenviar, (3) limitar o retry apenas aos retcodes relacionados a preço.
Configurar o deviation adequadamente, em points
MqlTradeRequest req; MqlTradeResult res;
ZeroMemory(req); ZeroMemory(res);
req.action = TRADE_ACTION_DEAL;
req.symbol = _Symbol;
req.type = ORDER_TYPE_BUY;
req.volume = lots;
req.deviation = 20; // Slippage tolerado de 20 points (2.0 pips em 5 dígitos)
// req.price / req.sl / req.tp / req.magic também devem ser configurados
A unidade de deviation é points. Em corretoras com cotação de 5 (ou 3) dígitos, 10 points = 1 pip. Um valor igual a zero ou extremamente pequeno aumenta a taxa de rejeição sem necessidade.
Reenviar apenas para retcodes relacionados a preço (com o tick mais recente)
O ponto-chave é: buscar o preço novamente via SymbolInfoTick() a cada tentativa de retry (reenviar com o preço antigo só gera a mesma rejeição) e limitar o retry aos códigos 10004/10021. Reenviar automaticamente em casos de saldo insuficiente (10019) ou solicitação inválida (10013) não tem efeito e só polui o log.
bool IsRetryableRetcode(uint rc)
{
return (rc == TRADE_RETCODE_REQUOTE // 10004
|| rc == TRADE_RETCODE_PRICE_OFF); // 10021
}
// Reenvia até 3 vezes, atualizando o preço com o tick mais recente
bool SendWithRetry(MqlTradeRequest &req, MqlTradeResult &res, int maxTries = 3)
{
for(int attempt = 0; attempt < maxTries; attempt++)
{
MqlTick tick;
if(!SymbolInfoTick(req.symbol, tick))
{
Print("SymbolInfoTick failed: ", GetLastError());
return false;
}
req.price = (req.type == ORDER_TYPE_BUY) ? tick.ask : tick.bid;
if(OrderSend(req, res) && res.retcode == TRADE_RETCODE_DONE)
return true; // Execução bem-sucedida
if(!IsRetryableRetcode(res.retcode))
{
PrintFormat("OrderSend failed (no retry): retcode=%d", res.retcode);
return false; // Não reenvia para erros fora da família de preço
}
PrintFormat("Retry %d/%d after retcode=%d", attempt + 1, maxTries, res.retcode);
Sleep(200 + 150 * attempt); // Espera crescente: 200ms → 350ms → 500ms
}
Print("Order abandoned after retries (price kept moving).");
return false;
}
O tempo de espera do Sleep() cresce gradualmente porque, no momento de um movimento brusco, disparar tentativas com 0ms de intervalo só resulta na mesma rejeição repetidamente. Por outro lado, esperar demais afasta o preço de entrada da premissa da estratégia, então o ideal é desistir após 2 ou 3 tentativas. Para ordens pendentes (TRADE_ACTION_PENDING), note que o retcode de sucesso é TRADE_RETCODE_PLACED (10008).
Usar o preço reapresentado no requote (10004)
Quando ocorre 10004, os campos bid / ask de MqlTradeResult trazem o preço reapresentado pelo servidor. Reenviar com o tick mais recente, como mostrado acima, já é suficiente na prática, mas se você quiser implementar uma lógica de execução instant do tipo "aceitar o novo preço se estiver dentro da tolerância", basta comparar res.ask / res.bid com o preço originalmente previsto, em points, antes de decidir reenviar.
Criar horários em que simplesmente não se envia ordem
O retry no código é um tratamento paliativo. Um filtro que bloqueia novas entradas em torno do rollover, de indicadores e de momentos de spread ampliado é uma solução mais estrutural.
// Exemplo de filtro de spread: não abre nova posição se o spread estiver ampliado
long spreadPts = SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
if(spreadPts > MaxSpreadPoints)
{
// Não realiza nova entrada (evita automaticamente os horários de cotação rarefeita, propensos a 10021)
return;
}
Os EAs distribuídos pela FXEA365 já implementam de forma padrão filtro de spread, filtro de notícias e retry automático para retcodes relacionados a preço.
Checklist de prioridades
| Prioridade | Verificação | Solução |
|---|---|---|
| 🚨 Primeiro | Está concentrado no momento de divulgação de indicadores/movimentos bruscos? | Ativar filtro de notícias, aceitar como esperado nesse horário |
| 🚨 Primeiro | O deviation está pequeno demais (lembre-se: a unidade é points)? | Ajustar para 10-30 points, verificar confusão entre pips/points |
| ⚠️ Em seguida | Está concentrado em rollover, início de semana ou ativos de baixa liquidez? | Filtro de horário + filtro de spread |
| ⚠️ Em seguida | O modo de execução é instant? | Avaliar também contas com execução market (troca com slippage) |
| ⚠️ Em seguida | O ping está alto (centenas de ms)? | Migrar para um VPS mais próximo do servidor |
| 🛠 Desenvolvimento | O retry está limitado a retcodes de preço? | Buscar novo tick via SymbolInfoTick + limitar a 2-3 tentativas |
Conclusão
- 10021 (TRADE_RETCODE_PRICE_OFF) significa "nenhuma cotação disponível para processar"; 10004 (TRADE_RETCODE_REQUOTE) significa "reapresentação de um novo preço". Pertencem à mesma família de rejeição de preço dos códigos 136/138 da era MT4, e não são problemas de saldo ou lote.
- As causas se resumem a cinco: movimento brusco de mercado, deviation subdimensionado, execução instant, horários/ativos com cotação rarefeita e latência de conexão.
- O requote é um fenômeno específico da execução instant; na execução market, ele se manifesta como slippage. "Não aparecer" não significa "melhor" — é uma troca.
- Desenvolvedores de EA devem implementar solução definitiva com retry de 2-3 tentativas buscando o tick mais recente (limitado a 10004/10021) + ajuste adequado do deviation + filtros de horário/spread. Apenas a parte causada por latência só pode ser reduzida com solução física (VPS mais próximo da corretora).
Para códigos de erro em geral, consulte o Guia Completo de Códigos de Erro MQL5/MT5; para EAs gratuitos que já implementam essas soluções por padrão, veja a Lista de EAs.
Perguntas Frequentes
P: 10004 e 10021, qual é mais grave?
Ambos são erros temporários relacionados a preço, sem grande diferença de gravidade entre eles. 10004 significa "um novo preço foi reapresentado"; 10021 significa "não havia cotação disponível para processar". Se ocorrer isoladamente, não há motivo para preocupação. Só investigue a causa (indicador, rollover, deviation, conexão) se o erro se repetir com frequência em um horário ou ativo específico.
P: Uma corretora em que o requote nunca aparece é melhor?
É bem provável que seja apenas uma diferença de modo de execução. Em contas com execução market, o requote não pode ocorrer por definição, e quando o preço se move, a ordem é executada diretamente no preço disponível, mesmo que diferente (slippage). Como é uma troca entre ser rejeitado ou ser executado com slippage, avalie com base no slippage real observado no histórico de execuções.
P: Meu EA no MT4 apresenta os erros 136 / 138. A mesma solução se aplica?
Sim. O erro 136 (ERR_OFF_QUOTES) corresponde ao 10021, e o 138 (ERR_REQUOTE) corresponde ao 10004; tanto a causa quanto a solução são as mesmas. No MQL4, a prática padrão era chamar RefreshRates() antes de reenviar, para atualizar Bid / Ask, o que segue a mesma lógica de buscar o tick novamente com SymbolInfoTick() no MQL5.
P: Não ocorre no backtest, mas ocorre em operação real. Por quê?
Isso é normal. O Strategy Tester não reproduz (ou simplifica bastante) "o atraso até a ordem chegar ao servidor" e "a variação de preço nesse intervalo", então 10004/10021 só se manifestam em operação forward. Mesmo com um bom resultado em backtest, é necessário ajustar separadamente a configuração de deviation, o retry e o ambiente de execução (VPS) para a operação real.
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.