Bova abordagem para interpretar a divergência clássica e oculta. Parte II

Alexander Lasygin | 4 dezembro, 2019

Introdução

No artigo anterior, consideramos uma abordagem não-padrão para interpretar a divergência, em particular analisamos as construções gráficas associadas a ela e estudamos brevemente a divergência em si mesma, a qualidade da sua detecção e da sua classificação. No entanto, o artigo não abordava a filtragem de trades relacionados a esse padrão. Bem, o que estamos acostumados a tomar como certo nem sempre é tão claro. Será que a divergência na sua forma clássica ainda pode ser eficiente? Será que o mercado mude tanto que esta abordagem não seja mais útil? Nesta parte, examinaremos mais profundamente a versão clássica e sua interpretação não padrão, e também tentaremos retornar um veredicto para esta estratégia. Se o resultado for positivo, tentaremos aumentar sua eficácia.

Termos e conceitos

Antes de tudo, gostaria de esclarecer o fundamento para ter criado este material e qual a sua natureza não-padrão. Ao querer criar um robô de negociação baseado nos princípios da divergência, criei um grupo, no qual me foi atribuído o papel de analista técnico. Minha tarefa consistia em reunir o máximo de informações sobre este tópico e em analisar grande parte das ferramentas da análise técnica, para encontrar a melhor opção.

Além disso, eu devia analisar o que poderia acontecer após a formação do sinal. Todas as minhas pesquisas e análises foram uma perda de tempo e de esforço. Para encontrar algo, só precisava tirar um tempo para pensar e, assim, não perder tempo nem recursos. Este trabalho tinha seu próprio valor, sendo assim, criamos um indicador diferente do existente, alteramos e excluímos conceitos que apenas estavam complicando a análise técnica. Não apenas atualizamos a divergência como padrão, mas também a simplificamos e eliminamos todos os tipos de classes "A, B, C".

Demos uma nova vida à divergência como sinal. No processo, ficou claro que qualquer ajuste (suavização ou recontagem) não tem nada a ver com o comportamento do mercado. Isso seria adaptar os fatos à nossa percepção. Nosso objetivo não é escrever uma dissertação sobre este tópico. O que precisamos é entender se o padrão em questão serve para negociar ou se é algo falso. Mas falaremos mais sobre isso mais tarde. Ter procurado informações sobre este tópico não deu resultados. Ficamos com a impressão de que os autores tinham definitivamente a mesma fonte de informações básicas.

Obtive a melhor descrição da estratégia baseada neste princípio no livro de Alexander Elder "The Strongest Signal in Technical Analysis". Lida esta obra, fiquei com ainda mais perguntas. O autor estabelece como condição obrigatória que o indicador deve cruzar a linha zero, no entanto, no capítulo "Missing the Right Shoulder", ele descreve momentos em que essa é uma condição opcional.

Naquele momento, o terminal MetaStock não possuía este tipo de MACD linear, pois tratava-se de apenas dois MAs desenhados na sub-janela do terminal sem nenhuma ligação ao zero. Em outras palavras, não pode ser usado da maneira descrita pelo autor. Elder usa uma versão do MACD, chamada de OsMA no terminal MetaTrader 4/5, mas intitulada de MACD ao longo do livro, sem descrição de convergência (divergência reversa). No livro, o termo convergência descreve divergências entre o comportamento do preço e o do indicador. Além disso, ele rejeita qualquer análise usando outros indicadores que não possuem a linha de equilíbrio (cruzamento zero). Em particular, é mencionado o estocástico.

Para uma análise mais aprofundada, outros autores adicionaram a divisão do padrão principal nos três subgrupos A, B e C. Como a opinião existente é que quanto maior a divergência, maior o sinal, não consideraremos a convergência. Isto me faz pensar em se os meus antigos conhecimentos eram válidos na realidade. Mostrei esta distribuição como um exemplo no material anterior. A explicação de por que eu não concordo com a gradação em questão está além do escopo da primeira parte, por isso decidi deixar tudo como está.

Não usaremos maioria desses termos, mas faremos uso de alguns para descrever de maneira geral o que acontece. A leitura deste material pode fazer com que você adote o meu ponto de vista, isto é, aceite que a discrepância existe como um fato e que a distribuição divergência-convergência é considerada no contexto de construções gráficas adicionais descritas no artigo anterior, enquanto a divergência em si é condicionalmente dividida em "parada" e "reversão". Por que condicionalmente? Acontece que, o sinal é essencialmente um sinal de parada, assim, só com o sinal de confirmação entenderemos se o mercado irá reverter ou não.

Para evitar não ter fundamentos, vamos considerar alguns dos exemplos mencionados acima.

Divergência Classe «А»

É considerada a mais forte.

Baixista — o novo máximo do preço é maior que o anterior, enquanto o novo máximo do indicador é menor que o anterior.

Altista — a nova baixa do preço é mais baixa que a anterior, enquanto a nova baixa do indicador é mais alta que a anterior.


Fig. 1

Observamos uma divergência semelhante após um forte movimento de preços (momento). Na maioria das vezes, esse impulso é um sinal para o surgimento de uma nova tendência, o que significa que a divergência classe A com seu momento cancela essa regra, bem como a inércia do comportamento do mercado e, em geral, toda a teoria de ondas. A metade direita da figura superior pode causar dúvidas sobre se o padrão foi detectado corretamente. As figuras abaixo parecem não causar dúvidas.


Fig. 2

Tal começo pode causar duas, três ou mais divergências. Quanto mais forte o momento, mais a tendência pode durar. Isso contradiz a ideia de que quanto maior a divergência, mais forte o sinal.

Divergência Classe B

Sinal de mercado menos significativo.

Baixista — máximos do gráfico no mesmo nível, enquanto o máximo direito do oscilador é mais baixo que o esquerdo.

Altista — baixas do preço no mesmo nível, enquanto o ombro direito do indicador é mais alto que o esquerdo.

Isso lembra os padrões clássicos de velas "Topo Duplo" e "Fundo Duplo". Na fonte, é descrito como um "forte padrão de reversão de mercado". Portanto, é um padrão de reversão, não de parada, que está entre os cinco principais padrões.


Fig. 3

O último subtipo.

Divergência Classe C

É considerada a mais fraca. Acredita-se que esse padrão deve ser ignorado completamente.

Baixista — aqui no gráfico de preços é observado um novo máximo, enquanto os picos do indicador estão no mesmo nível.

Altista — o preço forma uma nova baixa, enquanto os baixos do oscilador são iguais.


Fig. 4

Esse comportamento dos preços é característico de fortes níveis de suporte e resistência, durante a chamada “falsa quebra” ou ações ativas dos formadores de mercado. Está associado à inércia do indicador. Embora o sinal não possa ser chamado de um ponto de entrada inequívoco, certamente não deve ser ignorado.

Existem muitas outras inconsistências, pelas quais decidi estudar esse tópico com mais detalhes. Não mudaremos termos e conceitos globalmente para não enganar aqueles que estão familiarizados com eles e aqueles que continuarão estudando materiais relacionados.

Vamos analisar nossos indicadores.

MACD

O indicador MACD foi criado por Gerald Appel para analisar o preço de ações. O indicador é muito popular entre traders. Essa popularidade se deve ao fato de sua eficácia ter sido testada há anos. Como resultado disso, atualmente existem muitos materiais relacionados disponíveis. Seu próprio nome Convergência e Divergência de Médias Móveis (em inglês, Moving Average Convergence/Divergence) sugere que é como se fosse projetado especificamente para esse fim. Existem dois tipos de indicadores: MACD linear e histograma MACD. 

MACD linear:

Onde:

P — preço, geralmente igual ao preço de fechamento do período Close, embora outras opções também estejam disponíveis (Open, High, Low, Close, Median Price, Typical Price, etc.)

Por padrão, são usadas as seguintes configurações de MACD:

Ambas as versões estão presentes no MetaTrader 5, mas têm nomes diferentes (MACD e OsMA). Deve-se lembrar que o MACD no terminal é que o MACD linear, já o histograma MACD é o OsMA.

  

Fig. 5

Vamos considerar os dois tipos.

O MACD do MetaTrader 5 é apresentado como um indicador de tendência, portanto, espera-se que o desvio clássico reflita com precisão o final da tendência. No entanto, não é assim tão simples. Isso decorre não apenas de diferentes regras de interpretação de indicadores, mas também da variedade de tipos do próprio padrão. Na primeira parte, afirmei que a interseção zero era um sinal claro do fim da tendência geral. Isso não é bem verdade. Há outra opinião de que uma leve saída do zero dá um sinal mais forte de reversão.


Fig. 6

Neste caso, o cruzamento 0 é uma condição obrigatória. Em particular, essa opinião é compartilhada por Alexander Elder. E essa não é a mais global das discordâncias. Ambas as regras podem ser usadas, enquanto a aplicação de cada uma delas deve ser considerada dentro de uma situação específica do mercado.

No entanto, o principal problema ocorre com a definição do padrão. Nosso oscilador é baseado nos preços de fechamento das velas. Por que procuramos novos máximos e mínimos?

  

Fig. 7

  

Fig. 8

  

Fig. 9

Qual é o método certo? O que é mais importante, o preço ou as leituras do indicador? Outra desvantagem do indicador é o longo período de cálculo, 26 a 12, o que o torna inadequado para detectar movimentos de preço insignificantes. A versão clássica de como determinar a divergência implica encontrar um par de fractais no indicador e compará-los com o movimento do preço. No entanto, o fractal não se forma como movimentos de preço menores. Para maior clareza, melhoraremos a versão padrão. Pintaremos as barras em cores diferentes, dependendo da direção do movimento. Isso não é difícil de fazer. Vamos modificar o código padrão na string

#property indicator_buffers 4

4 a 5

#property indicator_buffers 5

string

#property indicator_type1   DRAW_HISTOGRAM

muda para

#property indicator_type1   DRAW_COLOR_HISTOGRAM

e

#property indicator_color1  Silver

fica

#property indicator_color1  Green,Red,Gold

Outro buffer é adicionado às variáveis

double                   Color_buff[];

e o bloco de inicialização agora fica assim

   SetIndexBuffer(0,ExtMacdBuffer,INDICATOR_DATA);
   SetIndexBuffer(1,Color_buff,INDICATOR_COLOR_INDEX);
   SetIndexBuffer(2,ExtSignalBuffer,INDICATOR_DATA);
   SetIndexBuffer(3,ExtFastMaBuffer,INDICATOR_CALCULATIONS);
   SetIndexBuffer(4,ExtSlowMaBuffer,INDICATOR_CALCULATIONS);

Aqui 

   SetIndexBuffer(1,Color_buff,INDICATOR_COLOR_INDEX);

não pode ser adicionado no final, pois deve ter índice 1; caso contrário, não funcionará.

Agora, para identificar o fractal, precisamos de pelo menos três velas, por isso, vamos fazer as alterações apropriadas no bloco relacionadas ao número de barras de cálculo.

if(prev_calculated==0)
      limit=2;
   else limit=prev_calculated-1;

Adicione algumas linhas no bloco principal

//--- calculate MACD
   for(i=limit;i<rates_total && !IsStopped();i++)
     {
      ExtMacdBuffer[i]=ExtFastMaBuffer[i]-ExtSlowMaBuffer[i];
      //--- calculate Color Macd
      if(ExtMacdBuffer[i]>ExtMacdBuffer[i-1])
         Color_buff[i]=0.0; // set color Green
      else
         Color_buff[i]=1.0; // set color Red
     }
//---

Finalmente, vamos adicionar um bloco no qual determinaremos o extremo MACD. Para evitar redesenho, faremos isso depois do fechamento da barra atual. Para isso, realizaremos o cálculo com um deslocamento de uma barra.

for(i=limit;i<rates_total-1 && !IsStopped();i++)
     {
      if((ExtMacdBuffer[i-1]<0 && ExtMacdBuffer[i]>ExtMacdBuffer[i-1] && ExtMacdBuffer[i-1]<ExtMacdBuffer[i-2]) || 
         (ExtMacdBuffer[i-1]>0 && ExtMacdBuffer[i]<ExtMacdBuffer[i-1] && ExtMacdBuffer[i-1]>ExtMacdBuffer[i-2]))
         Color_buff[i-1]=2.0; // set color Gold
     }

Essa variante implica que, quando a linha MACD estiver acima de zero, identificamos apenas fractais UP; e quando o MACD estiver abaixo de zero, apenas DNs. Isto está errado. Além disso, usaremos a variante, na qual o tipo de fractal (UP ou DN) não depende de como a linha principal do indicador está posicionada em relação a zero.

Vemos que é difícil automatizar alguns momentos em que o padrão existe e, portanto, apenas a observação visual dá um resultado positivo.

  

Fig. 10

Uma tentativa de compensar essa falha foi implementada na classe Expert/Signal/SignalMACD. A documentação contém o seguinte:


 Fig. 11

Novamente, a descrição "o primeiro fundo analisado do oscilador é mais baixo que o anterior, e o preço correspondente é mais baixo que o anterior" nos traz de volta à questão do ovo ou galinha. O que vem primeiro, o comportamento do preço ou a leitura do indicador? Como as leituras dos indicadores formadas com base nos preços podem ser mais importantes que as séries de preços? Além disso, a descrição não fornece nenhuma informação específica. Quantas barras devem ser usadas no cálculo: três, cinco ou o histórico inteiro? Esse método pode ser atribuído a métodos não-padrão, mas sua implementação na versão clássica apresenta mais desvantagens do que vantagens. No entanto, não se deve rejeitar completamente. Em alguns casos específicos, é aplicável apenas este indicador.

Como uma das variantes de automação, podemos considerar o uso simultâneo de MACD + OsMA. O indicador OsMA foi aprimorado de maneira semelhante ao MACD.


Fig. 12

Como sabemos, o OsMA é um MACD, com a diferença de que como histograma é exibida a diferença entre o sinal e a linha principal do MACD. O OsMA é mais sensível que o MACD, embora nem sempre seja suficiente e, portanto, o indicador pode perder sinais. Às vezes, porém, é muito sensível e, portanto, precisa de uma confirmação adicional.

  

Fig. 13

Quando são utilizados dois indicadores, é necessário determinar qual deles deve ser considerado líder, qual complementar, ou seja, a divergência de qual dos indicadores deve ser considerada obrigatória, enquanto a outra como opcional. 

Além disso, acho que outra desvantagem está relacionada à seleção de parâmetros do indicador. Se o período de cálculo do RSI afeta apenas a amplitude da linha, no MACD, OsMA, Stochastic, muda seriamente a aparência. Pode-se dizer que "as condições de mercado estão mudando e essa possibilidade é necessária, enquanto o indicador é criado para o mercado de ações e seus parâmetros foram escolhidos para o período de uma hora". Mas eu diria que essa possibilidade não é uma adaptação, mas está ajustada à realidade.

Obviamente, pode ser necessário um conjunto de parâmetros para o período específico do símbolo e gráfico num estado inicial, mas se o indicador posteriormente se tornar ineficiente, é melhor parar de usá-lo. Mas essa é apenas minha opinião pessoal. A falta da possibilidade de ajuste se tornou um dos motivos para o uso do indicador AC (Acelerador/Desacelerador) na primeira parte do material. Este não é o único indicador possível. Todos os indicadores têm suas vantagens específicas. Todas as regras descritas anteriormente para AC são verdadeiras para todos os outros indicadores. Analisamos o exposto no contexto da divergência clássica, mas também é aplicável às regras de divergência reversa/oculta. Como você pode ver, nem todas as ideias clássicas são inequívocas. Então, essa ferramenta em sua forma tradicional pode ser usada como um sinal de alta qualidade?

Antes de responder a essa pergunta, vamos considerar outros indicadores, que são tradicionalmente usados para resolver a tarefa mencionada acima.

Stoсhastiс

Stoсhastiс Oscillator é um indicador de análise técnica que mede o momento do preço como porcentagem. “De fato, o indicador mostra a divergência do preço de fechamento do período atual em relação aos preços dos períodos anteriores num determinado período”. O indicador foi criado por George Lane em março de 2007.

Consiste em duas linhas:

Onde:

A definição contém a palavra "divergência" novamente. Se a ideia é mais ou menos clara com o MACD, é um pouco mais difícil de entender com os osciladores normalizados. O próprio conceito de oscilador normalizado pode ser definido como aquele que altera suas leituras dentro de uma estrutura rígida. No nosso caso, a estrutura é de 0 a 100. Esta particularidade define condições específicas. Três zonas são destacadas na própria escala de leitura. Elas são a zona de sobrecompra (80%), a zona de sobrevenda (20%) e o movimento principal. As particularidades do cálculo criam condições sob as quais durante um longo período a linha do indicador não sai/entra nas zonas extremas.


Fig. 14

Pode parecer que a aplicação de duas séries de preço diferentes resolve a questão do MACD sobre qual usar. Aqui surge outro problema. Pode ser visto na figura 14, que o estocástico baseado em Close toma as posições extremas "100 - 0" com mais frequência do que o baseado em High/Low. Isso tem a ver com a fórmula de cálculo do indicador em si. Também observamos muitos picos e fundos.


Fig. 15 

Não há uma regra clara para esses casos. Como resultado, as divergências entre os pontos 100-100 e 92,31-92, 22, são difíceis de automatizar. Na versão típica do cálculo, são usados dois fractais mais próximos. No nosso caso, estes são tudo menos fractais próximos. No entanto, sempre há uma exceção. Assim, podemos transformar a desvantagem em vantagem. Alterando as configurações de acordo com o período de cálculo, podemos refletir as alterações do gráfico M15 no gráfico M5.


Fig. 16

A vantagem desta variante é que podemos automatizar facilmente a detecção de divergências nos segmentos de mercado globais (estendidos) e receber um sinal de entrada antecipado sem demora, graças à necessidade de aguardar o fechamento do período gráfico maior. Nas figuras 16-17, esses segmentos são identificados por linhas vermelhas. Em alguns casos, isso pode ser crucial.


Fig. 17

Na figura acima, podemos ver claramente que, se entrássemos com base nos sinais do indicador MTF, nosso trade teria sido mal-sucedido, enquanto a alternativa nos permitiu ganhar dinheiro. Uma abordagem semelhante é válida para o MACD.


Fig. 18

Além de uma aparente redução do número de sinais, esta solução permite aumentar significativamente a probabilidade de um trade lucrativo e, assim, aumentar a rentabilidade geral. Vimos um exemplo de М5-М15. E se usarmos o M5-H1?


Fig. 19

O uso do estocástico rápido e lento resolve apenas parte dos problemas. Ao criar Expert Advisors com base nesses princípios, temos os mesmos problemas que quando usamos MACD rápido e lento (MACD + OsMA). Como priorizar? Isso não resolve o principal problema, quer dizer, solucionar como filtrar a abundância de quebras na linha do estocástico ao criar o indicador de divergência. Não conseguimos verificar de todas as quebras de linha. Isso criaria muito ruído e, portanto, somos forçados a limitar a um máximo de duas, em casos raros, três sequências.

Voltaremos ao problema de filtragem de sinal posteriormente. Agora vamos nos concentrar nas regras que devem ser observadas ao procurar divergências. Mais tarde também ficará esclarecido por que não definimos um NÃO claro.

1) Logicamente, entendemos que antes de obter uma divergência (convergência), o preço deve atingir um valor crítico. Consequentemente, a linha do indicador também precisa atingir um nível crítico. No nosso caso, o indicador deve entrar na zona de sobrecompra/sobrevenda. Ter uma nova máxima/baixa alcançada pelo mercado é uma condição opcional neste caso. No nosso caso, o segundo ponto (à esquerda) da barra atual deve estar localizado nessa zona ao procurar uma divergência clássica. Para uma divergência oculta (reversa), pelo contrário, o primeiro ponto deve estar num nível crítico.


Fig. 20

2) Ao procurar um sinal (manualmente ou através de um algoritmo), procuramo-lo nos extremos mais próximos, usando as sequências, excluindo os casos da figura 20. O número máximo de sequências é três.

Fig. 21

Embora pareça que a figura 15 corresponde à regra 1 (pico esquerdo na zona de sobrecompra), a presença de mais de três pontos na linha do indicador cancela o sinal.

 

RSI 

Esse é outro indicador que pode ser atribuído aos clássicos do gênero. Como você deve ter notado, a tarefa se torna mais difícil a cada passo.

O RSI (Relative Strength Index) é o Índice de Força Relativa, um indicador introduzido por J. Welles Wilder Welles Wilder Jr. em junho de 1978.

RSI=100-100/(1+U/D)

Onde: 

Usamos a fórmula acima, que difere da original abaixo:

Ele também é normalizado no intervalo de 0 a 100. Mas, diferentemente do estocástico, ele não contém variantes usando suavização de linha. Isso complica a análise. Sua sensibilidade excessiva produz muitas quebras de linha. Como pode ser visto na figura abaixo, o indicador mantém um movimento mais ou menos retilíneo apenas quando o movimento de preços é sequencial-unidirecional. Em outros casos, a linha do indicador se assemelha a uma serra.

  

Fig. 22

Como resultado, a necessidade de filtrar os valores dos indicadores é ainda mais crucial neste caso. Agora, proponho considerar uma das soluções para esse problema.

Já tínhamos uma questão sobre se são séries de preços ou se são leituras de indicadores que são primárias. Nesse caso, precisamos encontrar uma resposta. Não existem muitas ferramentas que possam nos ajudar a analisar o comportamento do preço. Entre elas estão o MA em toda a sua diversidade, Fractals e ZigZag.

Fractals (de Bill Williams)

A variante padrão incorpora um algoritmo fractal de cinco barras. No entanto, esse fractal não resolve o problema de filtragem. Pelo contrário, às vezes adiciona mais ruído devido a discrepâncias de sinal com o indicador principal.


Fig. 23

Semelhante ao RSI, ele fornece muitos sinais em áreas planas, que precisam ser filtradas. Outra desvantagem é o atraso na formação de estruturas de cinco barras. Isso é pelo menos uma vela, o que no nosso caso é completamente indesejável.

O MA é um excelente modelo de suavização. Mas, como mencionado acima, tem muitas variações. Começando com as variações de SMA (média simples), EMA (média exponencial), SMMA (média suave), LWMA(média ponderada linear), preços Close, Open, High, low, Median (preço médio, (high+low)/2), Typical (preço típico, (high+low+close)/3), Weighted (preço médio ponderado, (high+low+close+close)/4), também há um período de cálculo que pode variar de "1" para "∞". Isso diz respeito ao MA clássico (média móvel). Além disso, há Double Exponential Moving. Estes são apenas aqueles que estão incluídos no pacote padrão do MetaTrader 5. Não definimos a tarefa de "analisar todas as opções possíveis para todos os algoritmos de pesquisa de divergências, a fim de encontrar uma versão ideal". 

O ZigZag é um "indicador para determinar preços extremos em flutuações de preços, com amplitude e período definidos de acordo com o desvio do filtro".

Com base na definição, é disso que precisamos. O mesmo problema ocorre aqui. O RSI é baseado em Close, enquanto o ZigZag, em High/Low.


Fig. 24

É possível compensar parcialmente essa falha construindo um RSI segundo Median (preço médio — (high+low)/2).


Fig. 25

Como pode ser visto na figura 24, o desvio na posição dos fractais dos indicadores e dos fractais de preços não excede duas barras e, portanto, pode ser facilmente compensado por meios de software. Observe que, no nosso caso, estamos interessados apenas na forma do sinal e não, em seus valores. Ou seja, o indicador básico é usado apenas para detectar divergências e não, para sinais de negociação individuais.

Sendo assim, podemos experimentar as configurações para nosso uso específico da divergência. Sabendo que o período de cálculo do RSI não afeta a forma do sinal, mas, sim, a amplitude, enquanto as configurações de ZigZag não alteram a posição dos extremos, podemos obter um resultado impressionante.

Se seguirmos a regra "antes de formar um padrão de divergência, o indicador deve atingir níveis críticos de sobrecompra/sobrevenda" que aplicamos ao estocástico: no nosso caso, são zonas abaixo de 30 e acima de 70. Aqui, alterando os parâmetros ZZ, podemos obter sinais de curto prazo e seus valores globais. Esses parâmetros são compensados mutuamente e, portanto, a combinação de 2 + 1 (dois filtros + um básico) permite rastrear toda a imagem. O número de filtros, é claro, não se limita a dois, pode haver três ou até mais. No futuro, quando considerarmos o tópico dos níveis-alvo, ficará claro que, ao dividir os sinais em grupos, é possível aproveitar a maior parte do movimento do mercado, seguindo sinais específicos.


Fig. 26

Na figura 26, o RSI no primeiro sinal não entra na zona de sobrevenda. Podemos simplesmente alterar o período de cálculo e, assim, aumentar a amplitude. Nesse caso, o RSI aparecerá na zona apropriada.

CCI

O Commodity Channel Index (Índice de Canais de Negociação) é um tipo de oscilador que foi desenvolvido em 1980 por Donald Lambert.  

CCIn=(1/0.015)*((TypicalPrise-SMA)/MedianDeviation)

Uma das vantagens desse indicador é sua naturaleza de momento. Ou seja, ele pode ser usado para determinar não apenas sobrecompra sobrevenda, mas também o momento inicial do mercado. No nosso caso, essa vantagem pode ser considerada uma desvantagem. Apesar de sua versão clássica ser calculada usando o preço típico, ela ainda possui uma forma de linha dente de serra, semelhante à do RSI. Portanto, tudo o que foi dito acima para o RSI também é adequado para ele. A série de preços precisa ser filtrada não apenas pelo tipo (High,Low,Close, etc.), mas também pela detecção de extremos de preço.


Fig. 27

Devido a esse comportamento, precisamos alterar o algoritmo no caso de usar várias quebras de linha ao procurar divergências.


Fig. 28

Se em outros indicadores essa situação ocorre muito raramente, com o CCI é bastante frequente.

O comportamento desse indicador o torna um dos melhores para trabalhar de acordo com o princípio descrito no primeiro artigo desta série: "As linhas estendidas a partir das últimas divergências reversas (último pico e fundo) e traçadas no gráfico de preços servem como linhas de suporte/resistência de preço(Fig. 29) ou, no caso de indicadores clássicos desenhados na janela do oscilador, suporte/resistência da linha do indicador (Fig. 30)”.


Fig. 29


Fig. 30

Momentum 

Momentum reflete a taxa de variação do preços. Também chamado de RoC (Rate of Change). A diferença entre eles é que a linha de saldo no RoC é 0, enquanto a do Momentum é 100. O indicador foi descrito por John Murphy em seu livro "Technical Analysis of Futures Markets".

Momentum=Pn-Pn-1

onde o Momentumn é o momento em n períodos como no momento t (período atual)

Essa variante não é muito conveniente, pois fornece dados do preço do ativo. Portanto, a fórmula foi complementada.

O Momentum padrão é, na verdade, o RoC, enquanto o RoC é o Momentum-100 comum. O princípio de cálculo do indicador consiste na avaliação dos movimentos do momento. Por esse motivo, ele tem os mesmos problemas que o CCI e o RSI: uma linha de dente de serra. Aqui esse movimento produz ainda mais sinais.


Fig. 31

Não está claro o que fazer com tal abundância de sinais. Além disso, a versão automatizada pode funcionar incorretamente, o que é mostrado na figura 31. De acordo com as informações disponíveis sobre esse indicador, ele em nenhum lugar era utilizado para identificar divergências. Há uma opinião de que, dependendo do período de cálculo, ele pode atender aos requisitos de negociação de curto prazo (período de 6 a 14), enquanto com um período acima de 20, ele serve como um indicador de tendência, que identifica o final da tendência claramente. Se assumirmos que a ideia de que uma tendência consiste em três momentos consecutivos é verdadeira (teoria do mercado de ondas), os princípios do Momentum podem realmente ajudar na identificação do final da tendência. Talvez seja necessária uma análise mais global de como funciona o indicador. 

ADX

A ideia do Índice de Movimento Direcional (DMI) foi proposta por Wells Wilder em 1978, em seu livro "New Concepts in Technical Trading Systems". Essa foi a ideia por trás do desenvolvimento desta ferramenta.

O ADX é calculado com base em dois índices diferentes com uma direção positiva (+ DI) e uma direção negativa (- DI), levando em consideração o Intervalo Verdadeiro Médio (ATR).

ADX=(MAn(+DI--DI)/(+DI+-DI))*100

Onde: 

A fórmula é apresentada de forma simplificada. Uma descrição detalhada está disponível aqui.

O indicador possui muitas linhas, e sua linha principal não indica a direção da tendência. Por isso, pode parecer que não nos convém.

  

Fig. 32

Esta é uma suposição errada. O indicador pode ser usado de várias maneiras. Por exemplo, ao definir a divergência entre a direção do preço e a atividade de mercado. Ou seja, se o preço continuar diminuindo (aumentando) e o índice ADX diminuir (aumentar), isso indica uma divergência.


Fig. 33

Anteriormente, já propusemos adicionar esse método ao nosso arsenal. A problema dessa opção é como entender a direção do movimento dos preços. Uma das soluções implica a avaliação inicial do movimento da série de preços. Quer dizer, analisamos a sequência de fundos descendentes ou de picos crescentes. Pode ocorrer um problema se o pico mais próximo estiver abaixo do anterior, enquanto o fundo mais próximo estiver acima do anterior ou vice-versa, ou seja, as chamadas barras internas e externas (termos relacionados à 'Price Action').

  

Fig. 34

A segunda maneira é usar as linhas +DI e -DI. Não se esqueça de que o pico -DI sempre corresponde a um fundo no gráfico de preços. Numa tendência de alta (+DI acima de -DI), usamos a linha +DI para examinar picos para encontrar divergências de baixa clássicas ou picos -DI para encontrar divergências de alta ocultas. Numa tendência de baixa (+DI abaixo de -DI), analisamos os picos de -DI para encontrar divergências clássicas de alta e os picos de + DI para encontrar divergências ocultas de baixa.


Fig. 35

O terceiro método, que na minha opinião é o mais eficaz, é aplicar os dois métodos mencionados acima. Esta opção resolve muitos problemas. Ele permite encontrar divergência na linha ADX sem demora relacionada à espera da reversão. Os sinais devem ser filtrados por tipo, dependendo da tendência geral, sem o uso de ferramentas adicionais.

Aqui eu gostaria de terminar a parte referente aos osciladores clássicos. Por que não consideramos AO, AC, TRIX, WPR e outros indicadores semelhantes?

As ferramentas de análise foram selecionadas com base na particularidade da fórmula de cálculo.

WPR(10) é o mesmo Stochastic(10.1.1 (Low/High)) apenas que com uma escala invertida. Stochastic trabalha na faixa de 0 a 100 e o WPR em 100 a 0.


Fig. 36

Awesome Oscillator (AO) é o MACD(5.35.1 Median) com a única diferença de que AO é suavizado pelo SMA (média simples), enquanto no MACD é usado EMA(média exponencial), por esse motivo, este último é um pouco mais rápido. Como pode ser visto na figura abaixo, isso não fornece mudanças significativas na forma do sinal.


Fig. 37

Accelerator é um OsMA (5.34.5 Median) com as mesmas diferenças que o MACD com o AO.


Fig. 38

O TRIX também consiste basicamente em médias móveis e, com os parâmetros do MACD, pode-se obter o mesmo resultado.

  

Fig. 39

 

Volumes 

Vemos uma enorme variedade de estratégias que implementam análise técnica. Separadamente, pode-se selecionar um grupo com uso de volumes. É um grupo pequeno. Na minha opinião, os volumes no mercado Forex não são usados tanto quanto deveriam. Mesmo que não haja volumes reais no mercado Forex (apenas volumes de ticks). A esse tópico será dedicado material separado. Agora vamos considerá-los no contexto de divergência.

Existem muito poucos indicadores que usam volume em seu algoritmo e estão disponíveis no pacote padrão do terminal MetaTrader 5, incluindo Accumulation/Distribution (Mark Chaikin), Money Flow Index (pode ser chamado de Volume RSI porque as fórmulas são semelhantes), Balance Volume (Joseph Granville), Market Facilitation Index (Bill Williams) e Volume. O Índice Forex de Alexander Elder também pertence a este grupo, embora esteja incluído na seção Osciladores. Existem muito poucos instrumentos desse tipo, por isso, geralmente encontramos a seguinte imagem ao analisar as divergências de volume:

  

Fig. 40

Na figura pode ser visto que um método semelhante para determinar a discrepância é bom ao analisar o mercado com base em dados históricos e complicado ao criar ferramentas de automação. Ele tem muitas falhas. Trata-se de uma diferença nos volumes de negociação, dependendo da sessão e das distorções introduzidas por isso. Entendemos que eles serão menores na Ásia do que na Europa e América. Além disso, um aumento é acompanhado não apenas pelo início da tendência, mas também pelo fechamento de trades, e esse volume pode ser maior do que no início.

  

Fig. 41

Picos de volume podem acompanhar os movimentos causados por notícias.

  

Fig. 42

Em parte, esse problema pode ser resolvido usando, em vez do Volume padrão, outros indicadores contendo linha de saldo. Pode ser SMA de volumes durante um determinado período. Isso permite filtrar valores menores. Um indicador desse tipo é o BetterVolume.


Fig. 43

Outra maneira de resolver o problema é combinar a série de preço e o indicador Volume. Vamos definir o volume nas velas em que formado um novo High (Low) e comparar os volumes. Vamos editar a variante clássica de acordo com nosso algoritmo.

O histograma terá cinco cores em vez de duas.

#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  Green,Red,Blue,Magenta,Gray

  1. Green - se low[i]>low[i-1] e high[i]>high[i-1].
  2. Red     - se low[i]<low[i-1] e high[i]<high[i-1].
  3. Blue   - barra externa up bar
  4. Magenta - barra externa dn bar
  5. Gray - nada do acima 

O bloco de cálculo principal não difere do indicador Volumes padrão. Além disso, a função CalculateVolume contém cores das barras do histograma

void CalculateVolume(const int nPosition,
                     const int nRatesCount,
                     const long &SrcBuffer[],
                     const double &h[],
                     const double &l[],
                     const double &o[],
                     const double &c[])
  {
   ExtVolumesBuffer[0]=(double)SrcBuffer[0];
   ExtColorsBuffer[0]=0.0;
//---
   for(int i=nPosition;i<nRatesCount && !IsStopped();i++)
     {
      //--- calculate indicator color
      ExtVolumesBuffer[i]=(double)SrcBuffer[i];
      ExtColorsBuffer[i]=4.0;
      //--- тренд вверх UP бар----
      if(h[i]>h[i-1] && l[i]>l[i-1]&& o[i]<c[i])ExtColorsBuffer[i]=0.0;
      //--- тренд вверх DN бар ----
      if(h[i]>h[i-1] && l[i]>l[i-1]&& o[i]>c[i])ExtColorsBuffer[i]=3.0;
      //--- тренд вниз DN бар ----
      if(h[i]<h[i-1] && l[i]<l[i-1]&& o[i]>c[i])ExtColorsBuffer[i]=1.0;
      //--- тренд вниз UP бар ----
      if(h[i]<h[i-1] && l[i]<l[i-1]&& o[i]<c[i])ExtColorsBuffer[i]=2.0;
      //--- внешний UP бар ----
      if(h[i]>h[i-1] && l[i]<l[i-1] && o[i]<c[i])ExtColorsBuffer[i]=2.0;
      //--- внешний DN бар ----
      if(h[i]>h[i-1] && l[i]<l[i-1] && o[i]>c[i])ExtColorsBuffer[i]=3.0;
      //--- внутренний бар ----
      if(h[i]<h[i-1] && l[i]>l[i-1])ExtColorsBuffer[i]=4.0;
     }
//---
  }
//+------------------------------------------------------------------+


Fig. 44 

Essa variante simplifica a análise, embora não seja perfeita. Mais podem ser propostas outras, até envolvendo a mudança global do princípio de cálculo. Mas não esqueça que, às vezes, é como se fosse à moda antiga, mas de uma forma nova. Se as ideias anteriores não se tornarem gerais, não as consideraremos. Duvido que algo possa nos ajudar a automatizar a detecção de divergências usando esse indicador. Vamos nos concentrar em ideias populares.

Money Flow Index 

Como mencionado acima, sua fórmula de cálculo é muito semelhante à do RSI.

Prise=(high+low+close)/3

MF=Prise*Volume

MR=positiveMF/negativeMF

MFI=100-100/(1+MR)

Na minha opinião, é melhor para identificar zonas de sobrecompra/sobrevenda do que o RSI, porque a própria ideia de estado de sobrecompra/sobrecompra não significa o tamanho da mudança de preço durante o período de cálculo, mas, sim, o número de participantes envolvidos nesse processo. É exatamente isso que o IMF faz. Como resultado, reflete melhor uma relação causal. No entanto, também tem as mesmas desvantagens.


Fig. 45

  On Balance Volume

(Joseph Granville)

Se o preço de fechamento atual for superior ao preço anterior:

OBVn=OBVn-1-Volumen

Se o preço de fechamento atual for menor que o preço anterior:

OBVn=OBVn-1-Volumen

Se o preço de fechamento atual for igual ao preço anterior:

OBVn=OBVn-1

Onde:

As referências fornecem muito pouca informação sobre esse indicador. No entanto, eles mostram a ideia principal “as mudanças no OBV precedem as mudanças nos preços”. Assim, podemos usar a divergência entre o movimento dos preços e os volumes.


Fig. 46

Na figura acima, uma das divergências é marcada com um ponto de interrogação. O movimento do mercado foi insignificante e o principal fator é a transição de um dia, enquanto nenhuma volatilidade significativa era esperada no mercado asiático. Mais tarde, os níveis-alvo mostrarão que essa volatilidade era bastante aceitável.

Force Index

(Alexander Elder).

Force Index=Volume*(CLOSEn-CLOSEn-1)

A fórmula do original é diferente da implementada no terminal.

Force Index=Volume*(MAn-MAn-1)

Embora a razão por trás disso não seja muito clara para mim, não fornece uma mudança significativa na forma do sinal, o que é bastante aceitável para nossos propósitos.


Fig. 47 

Aspectos de outros sinais gerados por esse indicador e suas diferenças estão além do escopo deste artigo.

Como já mencionado, esse indicador foi atribuído à classe de osciladores, embora Alexander Elder escreva em seu livro: "Considero que ele é a melhor ferramenta para medir volume nos mercados"

Além disso, o Elder usa essa ferramenta para procurar divergências.


Fig. 48

Entrada e Metas

A regra de entrada clássica é a seguinte:

Após identificada a divergência, posicionamos um uma ordem de compra STOP no ponto mais alto da vela, na qual concluído a formação do padrão para a divergência de alta; definimos uma ordem de venda STOP no ponto mais baixo do última vela para a divergência de baixa.


Fig. 49

Essa opção pode ser considerada ótima em termos de obtenção do máximo lucro possível. Nesse método, é possível entrar um acordo na borda superior dó "Envelopes (26)" (o desvio é selecionado de acordo com a volatilidade do mercado).


Fig. 50

Opcionalmente, entrar na borda de um canal equidistante construído com base em pontos de formação de divergência, no qual o terceiro ponto é High (Low) entre o primeiro e o segundo ponto.


Fig. 51

O Stop Loss é definido abaixo do Low para compra ou acima do High para venda. No entanto, essa abordagem, apesar de sua aparente "idealidade", é adequada apenas para um padrão ideal atendendo a todas as regras e requisitos adicionais de confirmação. Também é adequada para grandes períodos gráficos, nos quais é possível analisar adicionalmente o estado do mercado e sair em tempo útil.


Fig. 52

É difícil determinar esse Take Profit flutuante antes da abertura do trade. Ele também pode mudar com o tempo. Uma das deficiências é que é muito difícil calcular o possível resultado do trade. Nesses casos, pode ser usada uma variante mais confiável. Vamos criar uma linha de tendência. Entraremos após o rompimento da linha de tendência, que serve como sinal de mudança de tendência e como confirmação adicional. Na maioria dos casos, será quase igual ao nível da variante clássica, mas proporcionará mais confiança.


Fig. 53

Podemos usar as regras da primeira parte modificadas para um desenho adequado de linhas. Às vezes, as linhas criadas pelo indicador precisam ser ajustadas.

Nesses acordos, as metas são definidas em níveis de suporte/resistência.


Fig. 54

Quanto às divergências duplas e triplas, seu alvo pode ser definido no final da primeira formação de sinal (geralmente o caso). Mais raramente, é possível usar um fractal entre os primeiros pontos de formação de divergência ou no início.


Fig. 55

É sempre necessário definir níveis de stop? Obviamente, todo mundo escolhe seu próprio estilo de negociação e regras de gerenciamento de dinheiro. Negociação sem/com níveis de stop estabelecidos muito longe pode ser recomendada apenas para traders altamente experientes. Esse profissional deve estar confiante nas análises e indicadores técnicos envolvidos e ser capaz de ajustar suas ações em tempo real, como modificar trades ou fechar trades maus manualmente até que a situação fique fora de controle.

Criando uma ferramenta de negociação

Nosso objetivo não é criticar as regras existentes. Precisamos reanalisar as informações disponíveis e tirar conclusões aplicáveis. Todo autor criando uma ferramenta de negociação tem como objetivo alcançar um determinado resultado. O indicador geralmente é criado para um mercado específico. Às vezes, sua ideia não é muito clara. Frequentemente, apenas o autor entende os detalhes das instruções vindas com o sinal.

Traders podem tentar aplicar esse indicador sob outras condições, mas, com isso, perder a ideia geral e lucros potenciais. É por isso que os eles encontram robôs de negociação perdendo de maneira estável. E se mudarmos a direção do trade? Isso se tornará lucro estável?

Nosso objetivo é semelhante: propor cenários. Alguns dos resultados relacionados a essa abordagem foram publicados na primeira parte. Agora precisaremos implementá-la num aspecto diferente. Vamos usar uma ferramenta com desvantagens, mas que fornece um bom resultado sob certas condições, resultado esse que não pode ser alcançado por outras ferramentas. Estou falando do indicador ADX. Todos conhecemos suas desvantagens. Está atrasado devido à dupla suavização. A direção de sua linha principal, assim como suas outras linhas, não coincide com a direção do movimento do mercado. Devido a isso, surgem dificuldades na interpretação do indicador. O autor queria mostrar a força, mas não a direção.


Fig. 56


Fig. 57

Devido a isso, o DI+ parece estar bem, enquanto DI- está de cabeça para baixo. Aqui os picos de linha coincidem com os mínimos de preço.


Fig. 58

Não sei as razões para J. Wells Wilder criar esse indicador dentro da estrutura do Sistema Parabólico. Posso supor que ele foi criado para o mercado de ações, pois lá a negociação difere da do mercado Forex. As ações são frequentemente compradas por um período mais longo para receber dividendos ou para fins de capitalização.

Vamos trabalhar com esse recurso específico. Precisamos tirar dele o melhor e usá-lo da maneira mais eficiente possível. Sua melhor vantagem é que ele pode detectar picos e fundos de acordo com a tendência do mercado (força do mercado) através da separação dos componentes positivos e negativos. Essa solução também permite que saber o que está acontecendo no mercado: compradores pressionando sobre os vendedores num mercado em queda ou vendedores pressionando num mercado em expansão, diminuição na atividade geral devido a uma diminuição nos participantes ou traders hesitantes analisando o que está acontecendo. Nós remos ainda mais longe. Podemos facilmente transformá-lo num oscilador familiar com uma linha de equilíbrio zero com base no movimento parabólico da linha principal do indicador. Para isso, basta excluir a redução ao valor absoluto da linha principal (ADX), excluindo na linha

         dTmp=100.0*MathAbs((ExtPDIBuffer[i]-ExtNDIBuffer[i])/dTmp);

a função MathAbs.

Como resultado, obtemos o seguinte indicador.


Fig. 59


Fig. 60

Como pode ser visto na figura acima, nosso ADX (vamos chamá-lo de ADX_Osc) é bom em mostrar a direção do mercado, assim, podemos procurar divergências em escala global. Ainda há algum atraso na linha principal. Essa desvantagem pode ser compensada por sinais preliminares de reversão do mercado. Eles são determinados com base em "DI-" e "DI +".


Fig. 61

Para entender melhor por que a diferença entre DI- (linha vermelha) e o preço é determinada assim, leia novamente a parte relacionada ao ADX. Podemos ver pela figura: começa uma pressão dos compradores numa tendência de baixa, o que leva a uma consolidação adicional e há confirmação pela linha principal do indicador. Mas precisamos de um motivo mais sério para entrar em BUY. Pode ser visto na Fig. 60 que o mercado continua seu movimento descendente.

O que pode ser usado para a tomada de decisão é a linha "unidirecional" de DI- e DI+. Por que "unidirecional" se o preço parece estar subindo e descendo ao mesmo tempo. Entendemos que isso não pode ser. Essa é a própria divergência. Tais momentos surgem quando aparece a chamada "barra interna".

Vamos verificar. Capítulo Price Action: "A barra interna (IB) é um conjunto de candles localizados dentro do intervalo do candle anterior, que tem a mais alta mais baixa e a mais alta mais alta do que a do anterior. Em timeframes grandes, a configuração geralmente se parece com um triângulo. A barra interna indica incerteza e consolidação do mercado. Geralmente é encontrada no mercado de tendências, onde indica a continuação da tendência após a quebra do candle mãe. Isso geralmente ocorre no topo/na base do mercado, nos principais níveis de suporte/resistência e nos canais laterais."

Nosso caso não bate totalmente com essa definição. Como você provavelmente se lembra, determinamos a força, mas não a direção. Por isso, nossa definição deve ser assim: "A potência dos touros na barra atual é menor que a anterior, enquanto a potência dos ursos é maior do que na barra anterior. A forma da barra é irrelevante.


Fig. 62

Aqui ainda preservamos a ideia principal: a barra sinaliza paragem ou reversão do mercado. Ao avaliar sua qualidade, levaremos em consideração a principal direção da tendência (força) representada pela linha ADX_Osc. Se a tendência se desenvolver, o valor da linha ADX será maior que o anterior para a tendência de alta e menor para a tendência de baixa. Isso indica consolidação (Stop Price). Se a tendência enfraquecer, a linha principal diminuirá durante a tendência de alta e subirá durante a tendência de baixa (divergência), assim podemos esperar uma reversão do mercado. É tudo o que precisamos para a criação do nosso indicador.

Obviamente, o ADX pode fazer muito mais. Mas nossa tarefa não é utilizar todas as suas possibilidades.

Aí vem uma pequena digressão, antes de continuarmos. Há algum tempo, minha primeira tentativa de escrever um artigo não deu. Fui aconselhado a iniciar um blog. Mas eu já havia trabalhado muito antes para fazer sua publicação. O artigo continha apenas trechos que me pareciam essenciais. Ninguém explicou naquele momento que o artigo devia conter o código do programa. No entanto, fiquei desanimado. Mais tarde, voltei à ideia e queria compartilhar meus resultados de pesquisa. Eu falhei mais uma vez. Uma simples apresentação da ideia não satisfez os moderadores. Desta vez, decidi escrever tudo o que precedeu o resultado. Obviamente, este material não fornece 100% dos detalhes. Antes de prosseguir para a etapa final de nossa revisão do tópico, mencionarei brevemente por que o resultado obtido pode parecer inútil.

No artigo anterior, abordamos brevemente as questões que surgem com os indicadores baseados em construções gráficas. Essas ferramentas são difíceis de analisar mais, porque isso não pode ser feito no modo de adaptação. Eles só podem ser analisados visualmente, o que consome muito tempo. Os sinais do indicador são muito difíceis de passar, portanto, seu código precisa ser adicionado ao código do Expert Advisor. Também há problemas com o suas correto desenho de linhas, podendo resultar em falsos sinais de entrada no mercado. Esse problema pode ser resolvido, mas isso está além do escopo deste artigo.

Provavelmente, devemos resolver esse problema para os desenvolvedores de linguagem MQL: por que não é possível criar objetos gráficos como uma biblioteca de códigos de máquina? Por que um buffer, cujos dados precisamos passar (como plot ou dados), não pode pertencer separadamente à janela principal do gráfico e à sua sub-janela? Talvez alguém escreva um artigo relacionado a este tópico ou talvez seja eu quem faça isso sozinho. Com base no exposto, vamos resumir o resultado preliminar. Na minha opinião, selecionamos o indicador mais adequado para uma abordagem não padrão, capaz de lidar com a nossa tarefa principal. Com base na análise, determinei seus momentos comportamentais ideais para implementar e não sobrecarregar a tela. Não evitaremos todas as construções gráficas no indicador, pois a principal tarefa não é a automação da negociação, mas, sim, a oportunidade de aplicar o indicador na negociação. 

Observe que não estamos criando um conceito completo específico. Este é um "campo de teste" para trabalhos futuros. Todos podem usar essa ferramenta como base para implementar recursos específicos. Por esse motivo, implementamos a "abordagem não padronizada" apenas para tendência de curto prazo, enquanto usamos a solução clássica para sinais globais.  

O código principal do ADX permanece sem alterações significativas. Fazemos algumas alterações para implementá-lo como um oscilador. Por isso, o ADX não pode ser simplesmente chamado via Handle. 

#property indicator_separate_window
#property indicator_buffers 8
#property indicator_plots   3
#property indicator_type1   DRAW_LINE
#property indicator_color1  LightSeaGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_DOT
#property indicator_width2  1
#property indicator_type3   DRAW_LINE
#property indicator_color3  Red
#property indicator_style3  STYLE_DOT
#property indicator_width3  1
#property indicator_label1  "ADX"
#property indicator_label2  "+DI"
#property indicator_label3  "-DI"
//--- input parameters
input int InpPeriodADX=14; // Period
input int extremum=100; // Extremum (<1 Div= OFF)
input int Gep=4; // Point to Gep
input int Bars_Calculated=300;
//--- global variables
input bool   allLine=false;// All Line
int    ExtADXPeriod;
double PDI,NDI,pDI,nDI;
string short_name="";
int    wid=-1;
//---- buffers
double    ExtADXBuffer[];
double    ExtPDIBuffer[];
double    ExtNDIBuffer[];
double    ExtPDBuffer[];
double    ExtNDBuffer[];
double    ExtTmpBuffer[];
double    ExtUpBuffer[];
double    ExtDnBuffer[];

Algumas das entradas precisam de explicação.

input int extremum=100; // Extremum (<1 Div= OFF)

Este é o número de extremos da linha do indicador, que serão verificados para encontrar divergências. O número mínimo é "1". Se menor, não será realizado nenhum cálculo. Mais tarde, após determinar o número ideal, é melhor torná-lo um parâmetro global.

input bool   allLine=false;// All Line

Este parâmetro permite mostrar na tela as linhas de todas as divergências encontradas durante a operação do indicador e definidas pelo parâmetro 'extremum'. Configurado especificamente para simplificar a análise do indicador e determinar o valor do parâmetro acima.


Fig. 63


Fig. 64

input int Gep=4; // Point to Gep

É utilizado para fins estéticos. Os pontos com uma dispersão de valores, determinados por este parâmetro, serão organizados como uma linha. Eu determinei esse valor como um e meio a dois spreads. Não afeta o recuo. Se você precisar do deslocamento, defina adicionalmente esse valor. Os pontos serão explicados mais adiante. Para reduzir a função OnDeinit, usaremos um comando para excluir todos os dados com um prefixo, que é igual ao nome do indicador. O terminal MetaTrader 5 pode ter alguma lentidão ao excluir um grande número de objetos da tela principal. Para evitar isso, vamos adicionar um redesenho forçado da tela.

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectsDeleteAll(0,short_name);
   ChartRedraw(0);
  }
//+------------------------------------------------------------------+

Observa-se que, se o terminal não estivesse conectado por um longo tempo, os objetos gráficos na sub-janela não reteriam sua ligação segundo as coordenadas preço/hora, mas, sim, segundo pixels de sua última posição. Por isso, no bloco que determina o número de barras para o primeiro cálculo, vamos adicionar um comando para excluí-las. Pode haver uma solução melhor para isso, mas resolvi esse problema da seguinte maneira.

   if(prev_calculated>1) start=prev_calculated-1;
   else
     {
      OnDeinit(9);
      start=1;
      ExtPDIBuffer[0]=0.0;
      ExtNDIBuffer[0]=0.0;
      ExtADXBuffer[0]=0.0;
     }

Um bloco que determina o movimento unidirecional das linhas DI + e DI- foi adicionado à principal função de cálculo do indicador.

//+------------------------------------------------------------------+
//|           Fast divergence calculation                            |
//+------------------------------------------------------------------+
   int bar=start;
   if(prev_calculated<2) bar=start+2;
   if(Bars_Calculated>0)bar=fmax(rates_total-Bars_Calculated,start);
//---
   for(int i=bar;i<rates_total-1 && !IsStopped();i++)
     {
      ExtUpBuffer[i-1]=EMPTY_VALUE;
      ExtDnBuffer[i-1]=EMPTY_VALUE;
      //---
      color clrUp=clrLime;
      color clrDn=clrDarkViolet;
      //---
      if((ExtPDIBuffer[i-1]<ExtPDIBuffer[i-2] && ExtNDIBuffer[i-1]<ExtNDIBuffer[i-2]) || 
         (ExtPDIBuffer[i-1]>ExtPDIBuffer[i-2] && ExtNDIBuffer[i-1]>ExtNDIBuffer[i-2]))
        {
         if(ExtPDIBuffer[i-1]>ExtNDIBuffer[i-1])
           {
            if(ExtADXBuffer[i-1]>ExtADXBuffer[i-2])
               ExtUpBuffer[i-1]=high[i-1];
            else
              {
               ExtUpBuffer[i-1]=EMPTY_VALUE;
               ExtDnBuffer[i-1]=low[i-1];
               clrDn=clrGold;
              }

            //---
            if(MathAbs(ExtUpBuffer[i-1]-ExtUpBuffer[i-2])<Gep*_Point)
               ExtUpBuffer[i-1]=ExtUpBuffer[i-2];
            if(MathAbs(ExtDnBuffer[i-1]-ExtDnBuffer[i-2])<Gep*_Point)
               ExtDnBuffer[i-1]=ExtDnBuffer[i-2];
            //---
           }
         if(ExtPDIBuffer[i-1]<ExtNDIBuffer[i-1])
           {
            if(ExtADXBuffer[i-1]<ExtADXBuffer[i-2])
               ExtDnBuffer[i-1]=low[i-1];
            else
              {
               ExtDnBuffer[i-1]=EMPTY_VALUE;
               ExtUpBuffer[i-1]=high[i-1];
               clrUp=clrBlue;
              }

            //---
            if(MathAbs(ExtDnBuffer[i-1]-ExtDnBuffer[i-2])<Gep*_Point)
               ExtDnBuffer[i-1]=ExtDnBuffer[i-2];
            if(MathAbs(ExtUpBuffer[i-1]-ExtUpBuffer[i-2])<Gep*_Point)
               ExtUpBuffer[i-1]=ExtUpBuffer[i-2];
            //---
           }
        }
      //---
      if(ExtUpBuffer[i-1]==EMPTY_VALUE)
         ExtUpBuffer[i-1]=ExtUpBuffer[i-2];
      if(ExtDnBuffer[i-1]==EMPTY_VALUE)
         ExtDnBuffer[i-1]=ExtDnBuffer[i-2];
      //---
      if(ExtUpBuffer[i-1]!=EMPTY_VALUE)
        {
         ArrowCreate(short_name+(string)time[i]+(string)Lime,time[i],ExtUpBuffer[i-1],ANCHOR_BOTTOM,clrUp);
         if(ExtUpBuffer[i-1]!=ExtUpBuffer[i-2])
            ArrowCreate(short_name+(string)time[i-1]+(string)Lime,time[i-1],ExtUpBuffer[i-1],ANCHOR_BOTTOM,clrUp);
        }
      else
         ArrowCreate(short_name+(string)time[i]+(string)Lime,time[i],ExtUpBuffer[i-2],ANCHOR_BOTTOM,clrUp);
      //---
      if(ExtDnBuffer[i-1]!=EMPTY_VALUE)
        {
         ArrowCreate(short_name+(string)time[i]+(string)Red,time[i],ExtDnBuffer[i-1],ANCHOR_TOP,clrDn);
         if(ExtDnBuffer[i-1]!=ExtDnBuffer[i-2])
            ArrowCreate(short_name+(string)time[i-1]+(string)Red,time[i-1],ExtDnBuffer[i-1],ANCHOR_TOP,clrDn);
        }
      else
         ArrowCreate(short_name+(string)time[i]+(string)Red,time[i],ExtDnBuffer[i-2],ANCHOR_TOP,clrDn);
     }

Além disso, aqui foi adicionado o módulo para iniciar as funções de cálculo de divergência global.

//+----------- Finding a discrepancy Выявляем расхождения ----------+
   bar=start;
   if(bar>rates_total-2)bar=rates_total-2;
   if(Bars_Calculated>0)bar=fmax(rates_total-Bars_Calculated,bar);
   for(int i=bar;i<rates_total-2 && !IsStopped() && extremum>0;i++)
     {
      UP(i,ExtADXBuffer,high,time);
      DN(i,ExtADXBuffer,low,time);
     }

O indicador da Parte 1 foi reescrito em MQL4. Esta versão foi originalmente escrita em MQL 5, por isso foi alterada a pesquisa de divergências.

Função de pesquisa de divergência de baixa.

//+----------- Выявляем UP расхождения -------------------------------+
void UP(int l,const double &buf[],const double &high[],const datetime &time[])
  {
   if(Extremum(buf[l+1],buf[l],buf[l-1])<0)
     {
      int i=l;
      for(int j=0;j<extremum;j++)
        {
         int counted=LastPeak(i,buf);
         if(counted!=-1)
           {
            if(buf[l]<buf[counted] && high[l]>high[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]>buf[l]+k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],high[l],high[counted],Red,STYLE_SOLID);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Red,STYLE_SOLID);
                  break;
                 }
              }

            if(buf[l]>buf[counted] && high[l]<high[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]>buf[l]-k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],high[l],high[counted],Red,STYLE_DOT);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Red,STYLE_DOT);
                  break;
                 }
              }
           }
         i=counted;
        }
      //---
     }
  }

Função de pesquisa de divergência de alta.

//+----------- Выявляем DN расхождения -------------------------------+
void DN(int l,const double &buf[],const double &low[],const datetime &time[])
  {
   if(Extremum(buf[l+1],buf[l],buf[l-1])>0)
     {
      int i=l;
      //---
      for(int j=0;j<extremum;j++)
        {
         int counted=LastTrough(i,buf);
         if(counted!=-1)
           {
            if(buf[l]>buf[counted] && low[l]<low[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]<buf[l]-k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],low[l],low[counted],Green,STYLE_SOLID);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Green,STYLE_SOLID);
                  break;
                 }
              }
            if(buf[l]<buf[counted] && low[l]>low[counted])
              {
               double k=fabs(buf[l]-buf[counted])/(l-counted);
               int z=1;
               bool yes=true;
               for(i=l-1;i>counted;z++,i--)
                     if(buf[i]<buf[l]+k*z){yes=false;break;}
               if(yes)
                 {
                  DrawPriceTrendLine(time[l],time[counted],low[l],low[counted],Green,STYLE_DOT);
                  DrawIndicatorTrendLine(time[l],time[counted],buf[l],buf[counted],Green,STYLE_DOT);
                  break;
                 }
              }
           }
         i=counted;
        }
      //---
     }
  }

A principal diferença está no filtro adicional. Descobri que, nos casos das figuras 20 e 28, o sinal tem uma tendência positiva de menos de 30%. É por isso que eles foram removidos. O código do filtro é destacado. A função de detecção extrema também foi alterada. A filtragem por valor positivo e negativo da posição da linha do indicador foi excluída. No nosso caso, isso é inútil e pode até ser prejudicial. Como a linha pode assumir valores iguais na barra atual e na anterior, fornecemos a possibilidade de a definição principal ser igual a zero. 

As regras de pesquisa podem ser facilmente alteradas posteriormente, se necessário.

//+-- поиск  экстремумов/search for extrema -------------------------+
int Extremum(double a,double b,double c)
  {
   if((a-b)*(b-c)<=0)
     {
      if(c>b) return(1); //DN экстремум 
      if(c<b) return(-1);//UP экстремум 
     }
   return(0);
  }

A busca pelo ombro esquerdo está praticamente inalterada.

//+--- поиск второго UP экстремума/search for the second UP extreme -+
int LastPeak(int l,const double &buf[])
  {
   for(int i=l-2; i>4; i--)
     {
      int ext=Extremum(buf[i+1],buf[i],buf[i-1]);
      if(ext < 0)return (i);
     }
   return (-1);
  }
//+--- поиск второго DN экстремума/search for the second DN extreme -+
int LastTrough(int l,const double &buf[])
  {
   for(int i=l-2; i>4; i--)
     {
      int ext=Extremum(buf[i+1],buf[i],buf[i-1]);
      if(ext > 0)return (i);

     }
   return (-1);
  }

Adicionada função para cria os pontos mencionados anteriormente. Os pontos marcam divergências de curto prazo.

//+------------ Создает стрелку   Creates an arrow -------------------+ 
bool ArrowCreate(string                  name,
                 datetime                time,
                 double                  price,
                 ENUM_ARROW_ANCHOR       anchor,
                 color                   clr)
  {
//--- сбросим значение ошибки 
   ResetLastError();
//--- создадим стрелку 
   if(!ObjectCreate(0,name,OBJ_ARROW,0,time,price))
     {
      Print(__FUNCTION__,
            ": не удалось создать стрелку! Код ошибки = ",GetLastError());
      return(false);
     }
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,167);
//--- установим способ привязки 
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,anchor);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
   ObjectSetInteger(0,name,OBJPROP_BACK,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
//--- успешное выполнение 
   return(true);
  }
//+------------------------------------------------------------------+ 

Os blocos de desenho principais também foram alterados para exibir todas as linhas de divergência ou apenas o último intervalo especificado pelo parâmetro "extremum".

Para a janela principal do gráfico

//+------ создаем объекты на графике цены ---------------------------+
void DrawPriceTrendLine(datetime T_0,datetime T_1,double P_0,double P_1,color color_0,int style)
  {
   string name_0=short_name+"Line_Sn"+ColorToString(color_0);
   string name_1="";
   if(allLine)
      name_1=short_name+DoubleToString(T_0,0);
   else
      name_1=short_name+DoubleToString(T_1,0);
//--- 
   ObjectDelete(0,name_1);
   drawLineS(name_1,T_0,T_1,P_0,P_1,color_0,style,0,true,false,0);
//+-----------+
   if(style==STYLE_DOT)
     {
      ObjectDelete(0,name_0);
      drawLineS(name_0,T_1,T_0,P_1,P_0,clrAqua,0,3,true,true,0);
     }
  }

e na janela do indicador

//+------ создаем объекты в окне индикатора -------------------------+
void DrawIndicatorTrendLine(datetime T_0,datetime T_1,double P_0,double P_1,color color_0,int style)
  {

   int window=wid;
   string name_0=short_name+"Line_Pn"+ColorToString(color_0);
   string name_1="";
   if(allLine)
      name_1=short_name+DoubleToString(T_0+wid,0);
   else
      name_1=short_name+DoubleToString(T_1+wid,0);
//---
   ObjectDelete(0,name_1);
   drawLineS(name_1,T_0,T_1,P_0,P_1,color_0,style,0,false,false,window);
//---
   if(style==STYLE_SOLID)
     {
      ObjectDelete(0,name_0);
      drawLineS(name_0,T_1,T_0,P_1,P_0,clrMagenta,style,2,true,true,window);
     }
  }

Pelo mesmo motivo, o comando de exclusão foi movido pela função de construção da linha de tendência para o bloco principal.

//+------------------------------------------------------------------+
void drawLineS(string name,datetime T_0,datetime T_1,double P_0,double P_1,color clr,
               int style,int width,bool back,bool ray,int window)
  {
   ObjectCreate(0,name,OBJ_TREND,window,T_0,P_0,T_1,P_1,0,0);
   ObjectSetInteger(0,name,OBJPROP_RAY_RIGHT,ray);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(0,name,OBJPROP_STYLE,style);
   ObjectSetInteger(0,name,OBJPROP_WIDTH,width);
   ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,name,OBJPROP_BACK,back);
  }

O indicador agora tem a seguinte aparência.


Fig. 65

Além das linhas de divergência usuais, vemos MUITOS pontos que marcam zonas de consolidação e servem como pontos de entrada para Sell e Buy da transação. Esses sinais são definidos pelas regras que encontramos (movimento unidirecional de DI+ e DI-). Os pontos verdes mostram pontos de entrada em Buy, os pontos roxos mostram entradas em Sell. A exibição de pontos azuis contra um fundo de pontos verdes ou pontos amarelos contra roxo indica uma tendência e uma possível mudança. Após a abertura do trade, os pontos podem servir como níveis para rastrear os níveis de stop. Observe que não é bom entrar usando ordens pendentes com base nos pontos. Em primeiro lugar, os pontos identificam tendências de mercado de curto prazo e podem causar erros graves. Um sinal de negociação ocorre quando o candle fecha acima (abaixo) deste nível. A variável Gap é usada para desenhar. O algoritmo é o seguinte: após o surgimento de um sinal de venda, um ponto aparece abaixo do mínimo da barra na qual o sinal é formado. Para sinais de compra, um ponto é desenhado acima do alto. O retorno de High\low é implementado pelas funções que determinam os pontos de ancoragem ANCHOR_BOTTOM e ANCHOR_TOP. Depois disso, todos os sinais a uma distância de "+\- Gep" são criados com base no primeiro ponto.

Esta versão pode ser alterada ainda mais. Por exemplo, você pode tentar reduzir o atraso da linha principal. A solução mais fácil é reduzir o segundo período de suavização e mover-se para variações. Também podemos excluir a parte referente à detecção de sinal clássico e adicionar o algoritmo mencionado anteriormente em relação ao MACD. Somente os níveis de entrada serão desenhados no gráfico. Assim, eliminamos desenhos desnecessários.

Podemos verificar essas ideias, criando um pequeno robô. Não estamos interessados na variante clássica e na direção da linha principal. Isso nos permite usar o ADX padrão do terminal. O filtro será aplicado apenas quando o candle de interrupção for muito grande. Para casos em que não há uma linha de canal condicional oposto a em que as interrupções podem ser reduzidas, introduzimos uma distância Stop Loss. Além disso, no EA, precisamos definir uma distância entre High/Low. Abaixo estão os resultados dos testes para os principais pares de moedas: EUR/USD,GBP/USD,USD/JPY no período de 01.01.2016 a 01.06.2019, H1 e H4.

EURUSD Н1


EURUSD Н4


GBPUSD H1


GBPUSD H4


JPYUSD H1


JPYUSD H4


Obviamente, os resultados não são muito bons. Mas esse não é o objetivo. O mais importante é que haja uma tendência positiva.

Fim do artigo

Então, qual é uma nova abordagem para as ideias identificadas? É uma perda de tempo ou um progresso? Você é um trader de sucesso. Você tem uma ótima estratégia de trabalho. Você deve revisar sua estratégia para obter um resultado melhor? Ou deixa assim? Você deve decidir por si mesmo. Talvez os resultados da minha pesquisa inspirem alguém a mostrar uma diferença diferente em sua estratégia ou até criar ferramentas de análise técnica completamente novas.

Sou autodidata, por isso sou sempre crítico os materiais publicamente disponíveis. Não me apego a ideias específicas de escritores populares. Em fóruns diferentes, há descrições detalhadas das nuances de estratégia mencionadas pelos seus autores. Sempre tente encontrar as soluções mais eficientes dentro da estrutura do conceito de maximização de lucro. Espero que este material ajude os leitores e incentive a usar novas abordagens para melhorar suas estratégias. Este material inclui apenas uma pequena parte do que foi feita durante o estudo de divergências. Alguns dos problemas e perguntas que surgiram durante a minha pesquisa exigem soluções não padronizadas. É difícil descrever tudo num artigo. Então, possivelmente publicarei mais materiais descrevendo outras soluções não padronizadas.

Não entre em contato pedindo melhorar as coisas publicadas, especialmente a criação conjunta de robôs de negociação. Para fazer isso, existe o serviço Freelance. Programar é uma necessidade para mim. Comecei a desenvolver apenas para aprender as possibilidades de linguagem e verificar minhas ideias.

     Nome         Tipo                           Descrição                      
1 ADX_Osc.mq5 Indicators  Indicador de análise de divergência. 
2 TestADX.mql5 Experts  Expert Advisor para testar as ideias mostradas.