Se você já se viu preso na hora de programar estratégias de negociação automática, sabe que o ponto de falha costuma ser a escolha do tipo de ordem. O ENUM_ORDER_TYPE aparece nos exemplos, mas na prática a sua implementação pode virar um labirinto de bugs inesperados, principalmente quando o código precisa lidar com diferentes corretoras ou plataformas de execução.
Tipos de ordem que o ENUM_ORDER_TYPE cobre
- ORDER_TYPE_BUY – compra à vista.
- ORDER_TYPE_SELL – venda à vista.
- ORDER_TYPE_BUY_LIMIT – compra a preço limite.
- ORDER_TYPE_SELL_LIMIT – venda a preço limite.
- ORDER_TYPE_BUY_STOP – compra stop.
- ORDER_TYPE_SELL_STOP – venda stop.
Configuração mínima para evitar surpresas
O erro mais comum é assumir que o enum aceita valores arbitrários. Na verdade, a API valida estritamente os inteiros definidos no cabeçalho. Se você passar 3 esperando BUY_LIMIT, mas a enum foi reordenada em uma atualização, o trade será rejeitado.
| Passo | Ação |
|---|---|
| 1 | Inclua o cabeçalho #include antes de usar o enum. |
| 2 | Use a constante, não o número: ENUM_ORDER_TYPE order = ORDER_TYPE_BUY_LIMIT; |
| 3 | Valide com if(order==ORDER_TYPE_BUY_LIMIT) antes de enviar. |
Exemplo prático: disparando uma ordem limitada
Imagine um robô que compra EURUSD quando o preço rompe 1.0800, mas só se houver liquidez suficiente. O código abaixo demonstra a sequência segura:
ENUM_ORDER_TYPE ot = ORDER_TYPE_BUY_LIMIT; double price = SymbolInfoDouble(_Symbol, SYMBOL_BID); if(price <= 1.0800) { CTrade trade; trade.SetExpertMagicNumber(12345); bool ok = trade.OrderSend(_Symbol, ot, 0.1, price, 5, 0, 0, "Entry", 0, 0, clrBlue); if(!ok) Print("Falha: ",GetLastError()); } Note que a verificação de preço vem antes da chamada. Trocar a ordem dos checks costuma gerar “invalid price” em plataformas que rejeitam ordens fora do range.
FAQ rápido
- Posso usar o mesmo enum para market e limit? Não. Cada tipo tem regras de slippage diferentes.
- E se a corretora não suportar STOP? A chamada falhará silenciosamente; use
OrderCheck()para confirmar. - Existe limite de chamadas por segundo? Sim, a maioria das APIs impõe throttling; agrupe ordens ou use documentação oficial para detalhes.
Quando o ENUM_ORDER_TYPE pode falhar
Em ambientes multi‑thread, o enum em si é thread‑safe, mas a classe CTrade não é. Se duas threads enviam ordens simultâneas, a última pode sobrescrever parâmetros da primeira, resultando em preço ou volume inesperado. A solução prática é envolver o envio em um mutex ou fila de execução.
Ao entender a mecânica interna e as armadilhas de validação, você transforma o ENUM_ORDER_TYPE de um detalhe obscuro em um alavancador de confiabilidade para seu algoritmo de trading.
Primeiros passos após a aquisição
Abra o MetaEditor e inclua #include no cabeçalho do seu script. Em seguida, crie uma instância da classe CTrade:
CTrade trade;Com a classe pronta, o próximo passo é definir a variável que armazenará o tipo de ordem:
ENUM_ORDER_TYPE orderType;Configuração inicial do ENUM_ORDER_TYPE
O enumerador aceita quatro valores:
- ORDER_TYPE_BUY – compra a mercado.
- ORDER_TYPE_SELL – venda a mercado.
- ORDER_TYPE_BUY_LIMIT – compra com preço limite.
- ORDER_TYPE_SELL_LIMIT – venda com preço limite.
Escolha o tipo adequado ao seu plano de trade antes de enviar a ordem:
orderType = ORDER_TYPE_BUY; // exemplo de compra a mercadoChecklist operacional – rotina recomendada
| Etapa | Ação | Verificação |
|---|---|---|
| 1 | Definir orderType | Valor corresponde à estratégia? |
| 2 | Calcular volume (lot size) | Dentro dos limites da conta? |
| 3 | Definir preço de entrada (se necessário) | Preço de limite válido? |
| 4 | Chamar trade.OrderSend() | Retorno = true? |
| 5 | Registrar log | Mensagem gravada no arquivo? |
Exemplo completo – compra limitada com verificação de margem
//--- parâmetros double lotSize = 0.1; double priceLim = SymbolInfoDouble(_Symbol,SYMBOL_BID)-10*_Point; ENUM_ORDER_TYPE order = ORDER_TYPE_BUY_LIMIT; //--- verifica margem disponível if(!trade.CheckMargin(lotSize,_Symbol)) { Print("Margem insuficiente"); return; } //--- envia ordem bool result = trade.OrderSend(_Symbol,order,lotSize,priceLim,0,0,0,"MyOrder"); if(result) Print("Ordem enviada: ",trade.ResultOrder()); else Print("Falha ao enviar: ",trade.ResultRetcode());Observe que o CheckMargin impede a execução caso a conta não suporte o volume desejado.
Fluxograma de decisão rápida
- Início → Definir objetivo (compra ou venda?)
- Sim →
orderType = ORDER_TYPE_BUYouSELL - Não → Precisa de preço limite?
- Sim → Escolher
BUY_LIMITouSELL_LIMIT - Não → Abort
- Enviar ordem → Verificar retorno
- Sucesso → Log e monitoramento
- Falha → Analisar código de erro (documentação oficial)
FAQ rápido
- Posso mudar o tipo de ordem após
OrderSend? Não. Crie uma nova ordem com o tipo desejado. - Qual a diferença entre
ORDER_TYPE_BUY_LIMITeORDER_TYPE_SELL_LIMIT? O primeiro abre posição de compra somente se o preço tocar ou ficar abaixo do limite; o segundo abre venda se o preço tocar ou ficar acima. - Erro 4107 (ERR_TRADE_RETCODE_INVALID_PRICE) costuma aparecer? Sim, quando o preço limite está fora do intervalo permitido pelo broker. Ajuste usando
SymbolInfoDouble(...,SYMBOL_TRADE_STOPS_LEVEL).
Perfil ideal e limites de uso do ENUM_ORDER_TYPE
Se você vive no ecossistema MetaTrader 5 e depende de automação de estratégias, ENUM_ORDER_TYPE pode ser a chave para evitar confusões entre ordens de compra, venda e pending.
Quem deve usar
- Desenvolvedores que escrevem EA (Expert Advisors) com múltiplas rotinas de entrada e saída.
- Analistas quantitativos que precisam mapear rapidamente o tipo de ordem em logs ou dashboards.
- Traders que já utilizam MQL5 e querem padronizar código, evitando strings “BUY”/“SELL”.
Quem pode não ganhar tanto
- Quem ainda opera manualmente, sem scripts – o ganho marginal é quase nulo.
- Programadores iniciantes que ainda não dominam o básico de MQL5; inserir o enum antes de compreender a lógica de ordem pode gerar erros de compilação.
- Usuários de plataformas que não suportam enumerações (ex.: cTrader, NinjaTrader).
Limitações práticas
O enum enumera apenas os tipos nativos da API. Extensões customizadas, como ordens “hedge” específicas de corretoras, permanecem fora do escopo. Além disso, ao usar ENUM_ORDER_TYPE em OrderSend(), a camada de validação ainda aceita valores fora do enum se o código for forçado por int, o que pode gerar trade inesperado.
FAQ contextual
| Pergunta | Resposta curta |
|---|---|
Posso usar ENUM_ORDER_TYPE em loops de pesquisa de posições? | Sim, mas lembre‑se de checar HistorySelect() antes, senão o enum devolve ORDERTYPE_BUY por default. |
Ele substitui o uso de OrderType()? | Não elimina, apenas padroniza a comparação. |
| Impacto de desempenho? | Negligível – é apenas um int interno. |
Checklist rápido antes de adotar
- Seu EA já usa
OrderSend()com verificações de tipo? - Você mantém logs onde o tipo de ordem é crítico?
- O seu código está compilando sem warnings ao converter
intparaENUM_ORDER_TYPE?
Parecer editorial equilibrado
Em termos de custo‑benefício, o ganho de legibilidade supera o esforço de adaptação para quem já tem um portfólio de scripts. Para novatos, a curva de aprendizado pode ser um empecilho maior que a própria utilidade.
Mini cenários reais
Cenário A: Um bot de scalping que abre e fecha dezenas de ordens por minuto. Usar o enum reduz erros de classificação em 30 % nas auditorias de logs.
Cenário B: Um trader que faz apenas 3 operações diárias via interface gráfica. O enum não traz vantagem mensurável.
Próximos passos
Teste o enum em um ambiente de simulação antes de migrar o código de produção. Se os resultados forem consistentes, implemente o padrão em todos os módulos de gerenciamento de risco.
Para baixar o guia completo e exemplos prontos, clique aqui.


