← Todos os artigos

Tipos de preenchimento de ordem no MT5 (FOK, IOC, Return): por que a ordem é rejeitada

Por Jackson Jordão · 14 de outubro de 2026 · 6 min

Código de programação numa tela escura com luz azul
Foto: Mohammad Rahmani/Unsplash

Quando o robô envia uma ordem e o servidor responde com TRADE_RETCODE_INVALID_FILL, a causa quase sempre é o mesmo erro: o tipo de preenchimento da ordem (FOK, IOC ou Return) não é aceito pelo ativo ou pelo modo de execução da conta. A correção é consultar o que o símbolo permite e escolher o tipo certo no código, em vez de fixar um único tipo para todos os ativos.

Esse erro costuma aparecer quando o robô é levado de uma corretora para outra, de um ativo de Forex para um da B3, ou da conta demo para a real. A estratégia continua a mesma, mas as regras de execução mudam. Veja o que cada tipo significa e como programar a escolha.

O que são FOK, IOC e Return

O tipo de preenchimento (ENUM_ORDER_TYPE_FILLING) diz ao servidor o que fazer quando não há volume suficiente no mercado para executar a ordem inteira. Segundo a documentação do MQL5, são três políticas principais:

  • ORDER_FILLING_FOK (Fill or Kill, tudo ou nada): a ordem só é executada com o volume completo. Se o mercado não tiver liquidez suficiente, nada é executado.
  • ORDER_FILLING_IOC (Immediate or Cancel, tudo ou parcial): executa o volume que estiver disponível dentro dos limites da ordem e cancela o restante.
  • ORDER_FILLING_RETURN: em uma execução parcial, o volume que sobrou permanece ativo no livro, em vez de ser cancelado.

A diferença aparece quando a ordem é grande ou o ativo tem pouca liquidez. Com um lote pequeno em um ativo líquido, os três costumam se comportar de forma parecida, e é justamente por isso que o problema só surge depois, ao trocar de ativo ou de corretora.

Por que a ordem é rejeitada

A rejeição acontece porque nem todo tipo de preenchimento vale para todo ativo. A documentação traz uma tabela de compatibilidade com o modo de execução do símbolo (SYMBOL_TRADE_EXEMODE):

  • Execução instantânea (SYMBOL_TRADE_EXECUTION_INSTANT) e por solicitação (SYMBOL_TRADE_EXECUTION_REQUEST): FOK e IOC são sempre aceitos, e Return também.
  • Execução a mercado (SYMBOL_TRADE_EXECUTION_MARKET): FOK e IOC dependem das configurações do símbolo, e Return é proibido. Segundo a documentação, ordens Return não são permitidas nesse modo.
  • Execução em bolsa (SYMBOL_TRADE_EXECUTION_EXCHANGE): FOK e IOC dependem das configurações do símbolo, e Return é sempre permitido.
  • Ordens pendentes: precisam usar ORDER_FILLING_RETURN, qualquer que seja o modo de execução.

Ou seja, um robô que sempre envia ORDER_FILLING_FOK funciona em um ativo e é rejeitado em outro. E um robô que sempre envia ORDER_FILLING_RETURN é rejeitado em qualquer ativo com execução a mercado. Os ativos da B3 costumam usar o modo de bolsa, e muitas corretoras de Forex usam execução a mercado ou instantânea, mas o que vale é o que o seu servidor informa para o símbolo. Por isso, a regra é nunca presumir.

Dica: Se a ordem é rejeitada só em um ativo, e não em todos, desconfie do preenchimento antes de mexer na estratégia. Veja também o erro de volume, TRADE_RETCODE_INVALID_VOLUME, que tem outra causa: lote fora do mínimo ou do passo do ativo.

Como consultar o que o ativo aceita

A propriedade SYMBOL_FILLING_MODE, lida com SymbolInfoInteger, devolve os tipos de preenchimento aceitos pelo ativo como uma combinação de flags. A documentação define SYMBOL_FILLING_FOK com valor 1 e SYMBOL_FILLING_IOC com valor 2. Para saber se um tipo é aceito, o código faz um E bit a bit (&) entre o valor lido e a flag.

O raciocínio, em passos, fica assim:

  1. Ler o modo de execução com SymbolInfoInteger(símbolo, SYMBOL_TRADE_EXEMODE).
  2. Ler SYMBOL_FILLING_MODE e testar as flags de FOK e IOC.
  3. Escolher o tipo permitido, com uma ordem de preferência definida pelo robô (por exemplo, FOK, depois IOC).
  4. Usar ORDER_FILLING_RETURN para ordens pendentes e nos casos em que o modo de execução o aceita.
  5. Gravar no log qual tipo foi escolhido e o código de retorno, para facilitar o diagnóstico.

Quem usa a biblioteca padrão tem um atalho. O método SetTypeFillingBySymbol, da classe CTrade, define o tipo de preenchimento conforme as configurações do símbolo informado. Segundo a documentação, se o símbolo aceita FOK e IOC, ele escolhe FOK. Se não for possível definir uma política, o método devolve false, e o robô deve tratar esse caso em vez de ignorá-lo.

Erros comuns de programação

  • Fixar um tipo de preenchimento no código, copiado de um exemplo, e nunca mais conferir.
  • Testar apenas na conta demo, que pode ter configuração diferente da conta real, mesmo na mesma corretora.
  • Usar o mesmo tipo para ordens a mercado e pendentes, quando as pendentes exigem ORDER_FILLING_RETURN.
  • Não verificar o código de retorno de OrderSend ou do CTrade. O robô acha que operou, mas a ordem foi rejeitada.
  • Trocar de ativo ou de corretora sem refazer o teste de envio de ordens.

Esse último ponto aparece com frequência quando o robô sai do Forex e vai para a bolsa. Falamos das outras diferenças dessa troca no artigo sobre B3 e Forex, em /blog/robo-b3-ou-forex-diferencas-programacao-mt5.

Como testar com segurança

Antes de colocar o robô para operar, envie uma ordem de lote mínimo em conta demo, no mesmo ativo e na mesma corretora em que ele vai rodar, e confira o código de retorno. O backtest do Testador de Estratégias não prova que o servidor real aceitará o tipo de preenchimento, então o teste de envio é uma etapa à parte. Para o passo a passo do backtest, veja /blog/como-fazer-backtest-metatrader-5, e para entender por que a conta demo e a real podem diferir, veja /blog/conta-cent-testar-robo-com-dinheiro-real.

Lembre-se de que um robô bem programado reduz erros de execução, mas não elimina o risco do mercado. Nenhum robô garante resultado, e todo teste com dinheiro real deve começar com volume pequeno.

Resumo

  • TRADE_RETCODE_INVALID_FILL indica que o tipo de preenchimento da ordem não é aceito pelo ativo ou pelo modo de execução.
  • FOK executa tudo ou nada, IOC executa o disponível e cancela o resto, e Return mantém o saldo ativo.
  • Em execução a mercado, Return é proibido, e em bolsa e a mercado FOK e IOC dependem do símbolo.
  • Leia SYMBOL_FILLING_MODE e SYMBOL_TRADE_EXEMODE, ou use SetTypeFillingBySymbol da classe CTrade.
  • Confira sempre o código de retorno e teste o envio de ordens no ativo e na corretora reais, primeiro em demo.

Quer um robô que se adapta ao seu ativo e à sua corretora?

Um robô profissional lê as regras do símbolo, trata as rejeições e registra tudo no log, para que você saiba o que aconteceu em cada ordem:

  1. Descreva a estratégia pelo Termo de Referência do site ou fale pelo WhatsApp, informando o ativo e a corretora.
  2. Receba a análise do que é possível automatizar e dos cuidados de execução do seu caso.
  3. Receba o robô testado em conta demo, com o código-fonte.

Orçamento pelo WhatsApp: (84) 99652-3661

Leia também