Atenção! Esta versão do indicador ZigZag é baseada no código ZigZag, publicada aqui com a permissão do autor, PPC. Testei essa versão e corrigi um erro no algoritmo.
Este código é a versão MQL5 do indicador ZigZag para MetaTrader 4.
Atenção! A biblioteca AlexSTAL_OutsideBar.mqh deve estar localizada em ..\MQL5\Include\ pasta do terminal cliente MetaTrader 5.
É só isso?
Eu vejo o ZigZag como uma forma de "comprimir" o gráfico de preços. O ZigZag pode ser calculado usando o preço de fechamento da barra ou os preços máximos/mínimos (o método mais comum).
Enquanto trabalhava com o ZigZag padrão, oferecido pela MetaQuotes, encontrei alguns problemas. O principal deles é que o ZigZag padrão não considera a ocorrência de barras externas.
Em 2007, Rashid Umarov (Rosh) publicou o código Zigzag2 R com o processamento de barras externas (estilo DRAW_ZIGZAG em vez de DRAW_SECTION).
Vamos definir as características da implementação "correta" do ZigZag:
- Os altos e baixos devem ser estritamente alternados;
- O alto deve ser maior (ou igual) entre todas as barras à direita até o próximo baixo (oposto);
- O baixo deve ser menor (ou igual) entre todas as barras à esquerda até o próximo alto (oposto).
Vamos considerar um exemplo (EURUSD, H1, 2006, de 8 a 13 de dezembro). Aqui temos dois casos com a barra externa. O ZigZag típico não consegue construir a "imagem correta".
![Figura 1. ZigZag típico com parâmetros de entrada [12;5;3] e [12;0;0] Figura 1. ZigZag típico com parâmetros de entrada [12;5;3] e [12;0;0]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923773916-zz_011.webp)
Figura 1. ZigZag típico com parâmetros de entrada [12;5;3] e [12;0;0]
![Figura 2. Zigzag2 R com parâmetros de entrada [12;5;3] Figura 2. Zigzag2 R com parâmetros de entrada [12;5;3]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923774923-zz_031.webp)
Figura 2. Zigzag2 R com parâmetros de entrada [12;5;3]
![Figura 3. Zigzag2 R com parâmetros de entrada [12;0;0] Figura 3. Zigzag2 R com parâmetros de entrada [12;0;0]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923775902-zz_021.webp)
Figura 3. Zigzag2 R com parâmetros de entrada [12;0;0]
À primeira vista, a construção correta é apresentada na Figura 3, mas aqui estão algumas características:
- Neste caso, foi construída corretamente devido aos parâmetros de entrada, mas, em geral, o algoritmo deve funcionar com quaisquer parâmetros.
- A barra externa do lado esquerdo não está correta, por causa da ordem de formação de altos/baixos da barra:

Os segmentos do ZigZag devem ser construídos dessa forma.
Testei muitos casos dos seguintes algoritmos ZigZag: ZigZag MT3, ZigZag, Zigzag R, Zigzag2 R, ZigZag_NK, ZigZag_ZUP89_nen, ZigZag_new_nen4, CZigZag, Swing_ZZ_1, DT_ZZ_nen, ZigZag_Talex, Reverse_ZZ, Points_ZZ_1, i_MF_Fractal_ZZ_3in1, ang_Amp_ZZ, ZigzagFr_v1, NonLagZigZag_v2, ZZ_FF_v3, ZigZag Ensign, ZigZag tauber, SQZZ Товаровед, ZZ_2L_nen wellx, Channel ZZ, Azzx_larryzz_3_0, RPoint, RPoint-m v2, ZigZagTF. Mas nenhum deles resolveu o problema corretamente.
Aqui estão as figuras com este indicador:
![Figura 4. ZigZag Profissional com parâmetros de entrada [12;0] Figura 4. ZigZag Profissional com parâmetros de entrada [12;0]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923777684-zz_051.webp)
Figura 4. ZigZag Profissional com parâmetros de entrada [12;0]
![Figura 5. ZigZag Profissional com parâmetros de entrada [23;0] Figura 5. ZigZag Profissional com parâmetros de entrada [23;0]](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923778688-zz_061.webp)
Figura 5. ZigZag Profissional com parâmetros de entrada [23;0]
Algumas características desta versão:
- Algoritmo de uma única passagem
- Recalcula e redesenha apenas o último segmento (o segmento não pode ser cancelado, exceto na atualização do histórico)
- Possui um algoritmo de otimização para os cálculos dentro da barra (não utiliza o recálculo no tick, se o preço mudou dentro da barra 0 (não completada) ou se a mudança de preço for menor que o limite definido pelo parâmetro de entrada MinMotion)
- Possui dois algoritmos para ordenação da formação de altos/baixos: usando o tipo de barra (rápido, mas não preciso) e usando dados de um período inferior (precisa do histórico, você precisa verificar sua presença e correção ou modificar a biblioteca OutsideBar)
Aqui estão alguns exemplos adicionais de construções incorretas do ZigZag:
![Figura 6. EURUSD, H1, 29 de Novembro - 7 de Dezembro. (Linha vermelha: ZigZag com parâmetros de entrada [7;0;0]. Linha azul: Zigzag2 R com parâmetros de entrada [7;0;0].) Figura 6. EURUSD, H1, 29 de Novembro - 7 de Dezembro. (Linha vermelha: ZigZag com parâmetros de entrada [7;0;0]. Linha azul: Zigzag2 R com parâmetros de entrada [7;0;0].)](https://dailyforexmap.s3.ap-northeast-1.amazonaws.com/forum/202511/1763923779494-zz_071.webp)
Figura 6. EURUSD, H1, 29 de Novembro - 7 de Dezembro. (Linha vermelha: ZigZag com parâmetros de entrada [7;0;0]. Linha azul: Zigzag2 R com parâmetros de entrada [7;0;0].)

Figura 7. EURUSD, H1, 2010, 29 de Novembro - 7 de Dezembro. A construção correta dos segmentos do ZigZag.
Conclusão
Infelizmente, esta versão não é perfeita, mas estou trabalhando nela.
Devido ao algoritmo de canal (iHighest/iLowest), às vezes ela ignora os altos.
Por favor, me informe sobre erros e características deste indicador.
Publicações relacionadas
- Calendário Econômico: Monitoramento e Cache para Testes de Estratégia no MetaTrader 5
- Buffers Horários para Coleta de Dados no MetaTrader 5
- Índice de Preferência do Investidor: Um Guia Prático para Traders
- Utilitário de Informações de Séries e Taxas para MetaTrader 5: Maximize Seu Trading
- Utilitário de Informações de Barras e Taxas: Como Usar no MetaTrader 5