Se você já tentou montar um Expert Advisor que reage a diferentes sinais de mercado, sabe que espalhar vários if/else pode deixar o código inchado e propenso a erros. O switch em MQL5 oferece um caminho mais limpo, mas a curva de aprendizado surge na hora de mapear valores não‑numéricos e garantir que o compilador não descarte casos críticos. A seguir, mostro como transformar essa dor em um fluxo de decisão rápido, confiável e pronto para otimização.
Estrutura básica do switch em MQL5
- Sintaxe:
switch(expression) { case value1: … break; case value2: … break; default: … } - O
expressiondeve ser um inteiro, enum ou char. Strings não são aceitas diretamente. - Cada
casetermina obrigatoriamente combreak(oureturn,continue).
Quando usar – casos de uso reais
- Seleção de timeframe: escolher lógicas distintas para M1, H1, D1.
- Tipos de ordem: market, pending, stop‑limit.
- Estados de um trade: aberto, em‑stop‑loss, em‑take‑profit.
Exemplo prático
| Código |
|---|
enum TradeState{OPEN, STOPLOSS, TAKEPROFIT, CLOSED}; void OnTick() { TradeState st=GetTradeState(); switch(st) { case OPEN: // lógica de acompanhamento break; case STOPLOSS: // reabertura ou alerta break; case TAKEPROFIT: // registro de lucro break; default: // nada a fazer } } |
Otimização e armadilhas
- Evite
casesobrepostos – o compilador não avisa, mas o primeiro será executado. - Use
enumpara garantir que oswitchreceba apenas valores válidos; isso reduz bugs silenciosos. - Quando precisar comparar strings, converta‑as para um hash ou enum pré‑definido; caso contrário, o
switchfalha na compilação.
FAQ rápido
- Posso usar
switchcomdouble? Não. Converta paraintouenumantes. - Qual a diferença de desempenho em relação a
if/else? Em loops intensivos,switchcostuma ser 15‑20% mais rápido por evitar múltiplas comparações. - E se eu esquecer o
break? O fluxo “cai” para o próximocase, gerando comportamentos inesperados.
Teste o padrão acima em um script de demonstração antes de levar ao seu robô de produção. Se precisar de um guia passo‑a‑passo com exemplos adicionais, dê uma olhada nesta referência oficial que detalha nuances avançadas do switch em MQL5.
Primeiros passos após a compra
- Instale o MetaEditor (incluso no MetaTrader 5).
- Crie um novo arquivo .mq5 em
File → New → Expert Advisor. - Defina
#property script_show_inputsse quiser parâmetros editáveis.
Configuração inicial do switch
| Sintaxe básica | Descrição |
|---|---|
switch (expressão) { case valor1: … break; case valor2: … break; default: … } | Evalua expressão e direciona ao bloco correspondente. |
Em MQL5, expressão deve ser um inteiro ou enumerado. Strings não são suportadas nativamente; use Enum ou converta com StringToInteger() quando necessário.
Fluxograma de decisão
⚡ Evite aninhar múltiplos
if– oswitchgarante O(1) de salto direto.

Rotina recomendada para indicadores
- OnInit() – registre os parâmetros de entrada que alimentam o
switch. - OnCalculate() – chame a função
ProcessSignal()que contém oswitch. - OnDeinit() – libere objetos criados dentro de cada case.
Exemplo prático: seleção de timeframe
enum TF {TF_M1=0, TF_M5, TF_M15, TF_H1, TF_D1}; void ProcessSignal(TF tf) { switch(tf) { case TF_M1: Print("Operando em M1"); break; case TF_M5: Print("Operando em M5"); break; case TF_M15: Print("Operando em M15"); break; case TF_H1: Print("Operando em H1"); break; case TF_D1: Print("Operando em D1"); break; default: Print("Timeframe desconhecido"); break; } } Checklist de otimização
- ✅ Use
enumpara evitar valores fora do intervalo. - ✅ Coloque
breakao final de cada case; omitir pode gerar “fall‑through”. - ✅ Prefira
defaultpara tratamento de erros – evita execuções inesperadas. - ✅ Compile em Release para eliminar código de depuração.
Erros comuns e como corrigi‑los
- Case duplicado – o compilador sinaliza “duplicate case value”. Revise a enumeração.
- Tipo incompatível – tente
intem vez dedouble. Oswitchaceita apenas tipos inteiros. - Falha no
break– gera “fall‑through” inesperado; adicionebreakoureturn.
FAQ rápido
- Posso usar
switchdentro de loops? Sim, mas evite loops infinitos; cada iteração deve garantir a saída de um case. - Qual a diferença entre
switcheif‑else?switchtem salto direto, reduzindo ciclos de CPU em decisões discretas. - É possível usar
switchcombool? Sim, tratetruecomo 1 efalsecomo 0.
Mini dashboard de acompanhamento
| Dia | Tarefa | Status |
|---|---|---|
| Segunda | Implementar enum e switch | ✅ Concluído |
| Terça | Testar todos os cases | ⏳ Em progresso |
| Quarta | Auditar performance | ❌ Pendente |
Para aprofundar a documentação oficial, acesse MetaTrader 5 Documentation.
Quem realmente tira proveito do switch case em MQL5
Operadores de estratégia quantitativa que precisam filtrar rapidamente centenas de sinais – esse é o público‑alvo. Se você programa Expert Advisors que analisam múltiplas condições lógicas em tempo real, o switch reduz o ruído e deixa o código mais legível.
Perfil ideal
- Desenvolvedores com 3+ anos de experiência em MQL4/5.
- Negociantes que implementam state machines (máquinas de estado) para controle de fluxo.
- Programadores que priorizam manutenção e escalabilidade sobre micro‑otimizações de ciclos.
Quem pode ficar na mão
Se sua lógica se resume a dois ou três condições simples, usar if/else continua mais enxuto. O switch adiciona sobrecarga de leitura sem benefício tangível. Novatos que ainda não dominam tipos de dados em MQL5 podem se confundir com o rigor da sintaxe.
Limitações práticas
- Não aceita intervalos; cada case deve ser um valor exato.
- Tipos não inteiros (double, string) exigem cast explícito, o que pode gerar perda de precisão.
- Não há “fall‑through” automático; é preciso usar
breakoureturndeliberadamente.
Checklist rápido antes de adotar
| Critério | Situação |
|---|---|
| Quantidade de ramos > 4 | ✅ |
| Valores discretos (enum, int) | ✅ |
| Necessita de extensibilidade | ✅ |
| Performance crítica (< 0,1 ms) | ⚠️ |
FAQ contextual
- Posso usar strings? Sim, mas só com
Enumouchar*bem definidos; caso contrário o compilador reclama. - Impacto de velocidade? Marginal – o compilador converte
switchem tabelas de salto, geralmente mais rápido que cadeiasifencadeadas. - Funciona em MQL5‑Web? Sim, o runtime mantém compatibilidade total.
Mini cenários reais
Um trader que acompanha 12 pares de moedas usa switch para mapear o resultado de SignalCheck() a estados: BUY, SELL, WAIT. A adição de novos estados (ex.: HEDGE) se dá em uma linha sem tocar nas rotinas de cálculo.
Observações práticas e próximos passos
Teste sempre em modo Strategy Tester antes de liberar. Se a latência ultrapassar o limiar de 0,05 ms nas execuções de OnTick, considere refatorar usando if puro ou tabelas hash externas.
Pronto para implementar? Confira a documentação oficial e baixe o snippet pronto aqui.



