
No artigo anterior você entendeu a teoria por trás da combinação entre Z-Score e Bandas de Bollinger para reversão à média. Agora é hora de transformar essa lógica em código, um Expert Advisor completo em MQL5, com cada decisão de entrada e saída explicada trecho a trecho.
Da Teoria ao Código: o que a Estratégia precisa fazer
A estratégia tem uma estrutura simples de três camadas:
- Contexto direcional: a EMA 200 define se estamos em um ambiente de alta ou baixa no médio prazo
- Sinal primário: o Z-Score confirma que o preço está em território de afastamento estatístico extremo
- Gatilho de entrada: as Bandas de Bollinger identificam o momento exato em que o preço exauriu o movimento e começou a reverter
Cada camada é independente. O robô só entra quando as três se alinham e sai quando o preço retorna à média representada pela EMA 200, este é o teste que iremos realizar, ok.
Inicialização: criando os handles dos indicadores
Antes de qualquer cálculo, o EA precisa registrar os indicadores que vai utilizar. Isso é feito no OnInit, onde criamos os handles referências internas que o MetaTrader 5 usa para acessar os buffers de cada indicador:
O iBands recebe cinco parâmetros além do símbolo e timeframe: período (20), shift (0), multiplicador do desvio padrão (2.0) e o preço aplicado. O shift = 0 garante que as bandas são calculadas sem deslocamento temporal alinhadas com o candle atual.
O Z-Score: calculado diretamente sobre o preço
O Z-Score não usa um handle de indicador externo. O EA calcula diretamente sobre os preços de fechamento dos últimos N períodos, o que garante controle total sobre a fórmula:
O resultado é um número adimensional: quanto desvios padrão o preço atual está acima ou abaixo da sua média histórica. Valores abaixo de -2.0 indicam afastamento negativo extremo; acima de +2.0, afastamento positivo extremo. Esses são os limiares que o EA usa para filtrar entradas.
Lendo as Bandas de Bollinger: barra atual e barra anterior
A função GetBollinger é o coração da lógica de confirmação. Ela captura dois momentos no tempo para cada banda o candle atual e o candle anterior:
Um detalhe técnico importante: o iBands no MQL5 distribui seus dados em três buffers: 0 para a linha central (SMA), 1 para a banda superior e 2 para a banda inferior. Usar os índices errados é um erro silencioso: o código compila sem problemas, mas lê os dados do buffer errado.
O CopyBuffer(..., 0, 2, ...) copia dois valores começando da barra mais recente. Com ArraySetAsSeries(true), o índice 0 é a barra atual e o índice 1 é a barra imediatamente anterior. Essa diferença de um candle é o que permite detectar o cruzamento de volta para dentro da banda.
A Lógica de Entrada: três camadas, um gatilho
Compra (Long)
Lendo linha a linha:
bid < ema: contexto de médio prazo bearish; a EMA 200 posiciona o EA do lado certo da tendênciazscore <= -2.0: o preço está em território de afastamento estatístico negativo extremo; a reversão é esperada pela distribuição históricabid < bandaInfAnt: o candle anterior fechou abaixo da Banda Inferior, confirmando que houve um rompimento real, não apenas uma aproximaçãobid >= bandaInf: o candle atual já está de volta para dentro da banda; a exaustão vendedora se materializou e o preço iniciou o retorno
A ordem das condições importa para a leitura, mas não para a execução o MQL5 avalia todas antes de agir. O ponto-chave está na quarta condição: entrar enquanto o preço ainda está fora da banda seria apostar na continuação do rompimento, não na reversão. O retorno para dentro da banda é o único sinal de que a exaustão realmente ocorreu.
Venda (Short)
Lógica espelhada: contexto de médio prazo bullish, Z-Score em sobrecompra extrema, rompimento confirmado da Banda Superior no candle anterior, retorno para dentro no candle atual.
Saída: o alvo está na própria tese
A saída não usa as Bandas de Bollinger. O EA fecha a posição quando o preço toca a EMA 200:
Essa escolha é matematicamente consistente com a estratégia: se a tese é que o preço vai reverter à média de longo prazo, o alvo natural é essa média. Definir um take profit fixo em pontos ou em múltiplos de ATR seria sobrepor uma segunda hipótese ao sistema a de que o movimento para exatamente ali. A EMA 200 como alvo elimina essa arbitrariedade.

Parâmetros e Ajustes por Ativo
| Parâmetro | Padrão | Descrição |
|---|---|---|
| EMA_Period | 200 | Âncora de tendência de médio prazo |
| ZScore_Period | 200 | Janela do cálculo estatístico |
| ZScore_Entrada | 2.0 | Limiar de afastamento extremo (±) |
| BB_Period | 20 | Período das Bandas de Bollinger |
| BB_Desvio | 2.0 | Multiplicador do desvio padrão |
Para WINFUT e WDOFUT, onde a volatilidade intraday é mais alta, testar BB_Desvio entre 2.0 e 2.5 ajuda a filtrar rompimentos de banda causados por spike de volatilidade sem intenção de reversão. Para ações como PETR4 e VALE3, os parâmetros padrão são um bom ponto de partida para otimização.
Repositório com Indicador Z-Score e Estrategia de Reversão a Média: forge.mql5
Conclusão
A estratégia Z-Score + Bollinger Bands entrega uma lógica de reversão à média com dois filtros matematicamente coerentes operando em escalas de tempo diferentes: o Z-Score de 200 períodos captura o contexto estatístico de longo prazo, e as Bandas de 20 períodos identificam o ponto local de exaustão e retorno. A EMA 200 como critério de saída fecha o sistema com consistência: entrada no extremo, saída na média.
Na próxima publicação da trilha Reversão à Média, vamos adicionar um filtro de regime baseado no Expoente de Hurst para evitar entradas em mercados com comportamento predominantemente tendencial o complemento natural para tornar esse sistema ainda mais robusto.
Jim Simons O Rei do Quant - Liquidez Importa
FAQs
Por que usar EMA 200 e não a média das próprias Bandas de Bollinger como saída?
A SMA das Bandas tem período de 20 é uma janela curta que se move rapidamente. Em operações de reversão, isso poderia fechar o trade antes que o movimento de retorno se completasse. A EMA 200 é mais estável e representa a média de longo prazo para a qual a estratégia afirma que o preço vai convergir.
O robô funciona em qualquer timeframe?
A lógica foi pensada para gráficos de 1h (H1) para Forex. Em timeframes muito curtos (1 minuto), o número de rompimentos falsos das Bandas aumenta. Em timeframes diários, os períodos padrão de Z-Score e BB podem precisar de ajuste.
Como adicionar um stop loss ao sistema?
A abordagem mais coerente com a estratégia é usar um múltiplo do desvio padrão das Bandas. Por exemplo: stop = entrada ± (banda_superior - banda_inferior) × 0.5. Isso dimensiona o risco em função da volatilidade atual do ativo, não de um valor fixo arbitrário.
Preciso ter lido o artigo anterior para usar este robô?
O EA funciona de forma independente, mas entender a matemática do Z-Score e das Bandas de Bollinger, coberta nos artigos anteriores ajuda a interpretar os sinais, calibrar os parâmetros e diagnosticar comportamentos inesperados em backtesting.







