English Русский 中文 Español Deutsch 日本語
Indicador CCI. Três etapas de transformação

Indicador CCI. Três etapas de transformação

MetaTrader 5Indicadores | 7 novembro 2022, 09:59
333 0
Aleksej Poljakov
Aleksej Poljakov

No artigo anterior, eu considerei algumas possíveis mudanças no indicador convencional Commodity Channel Index. Eles diziam respeito aos métodos de cálculo, mas não afetavam a essência desse indicador. Neste artigo, eu considerarei alterar o indicador de um ponto de vista ligeiramente diferente, alterando sua lógica de cálculo. Vamos ver como essas mudanças afetarão os resultados do indicador. Claro, eu tentarei avaliar a validade das mudanças implementadas.


Passo um

O CCI é baseado em cálculos simples e intuitivos. Primeiro, calcula-se a diferença entre o preço atual e o valor médio. Essa diferença é então dividida pelo desvio padrão. Em outras palavras, nós avaliamos em quantas vezes (para mais ou menos) é a diferença entre o preço e a média amostral em relação ao desvio padrão amostral.

Tudo é simples e claro. Mas há também uma desvantagem que pode levar a decisões erradas. Vamos tomar duas sequências como exemplo: 2, 1, 1 e 21, 11, 1. Se traduzirmos essas sequências para a linguagem de negociação, a primeira é uma tendência lateralizada e a segunda é uma tendência clara e forte.

Qual dessas duas sequências dará um maior valor de CCI? Tente responder com base em sua intuição e justifique sua resposta. Enquanto isso, eu farei os cálculos necessários.

Primeira sequência

Segunda sequência

Como nós podemos ver, ambas as sequências produziram o mesmo resultado. A principal razão é que nós usamos o desvio padrão. Para a primeira sequência, a diferença entre o valor atual e a média é pequena. Mas o desvio padrão também é pequeno. Para a segunda sequência, a diferença aumentou, mas o desvio padrão também aumentou. É por isso que duas sequências diferentes levaram ao mesmo resultado.

Se nós perguntarmos a qualquer trader sobre os seus requisitos para um indicador técnico, ele provavelmente dirá: uma situação única deve levar a um valor único do indicador. Será que é possível realizar tal desejo quando se trata do CCI? A resposta é sim. Mas para conseguir isso, nós precisamos abandonar a divisão e substituí-la pela multiplicação. Então a fórmula do indicador ficará assim:

Com essa mudança, o indicador deve destacar os movimentos de tendências dos preços bem o suficiente quando a diferença e o desvio padrão forem grandes. Mas esta abordagem tem suas próprias peculiaridades. Nós não podemos (nem aproximadamente) estimar a faixa de valores dos indicadores e seus níveis. Essa deficiência pode ser facilmente superada, no entanto. Deixe o próprio indicador calcular quais valores ele leva e com que frequência. Tendo coletado esses dados, nós podemos definir o nível do indicador. As leituras do indicador que se desviam ligeiramente de zero ocorrerão com mais frequência. Valores maiores ocorrerão com menos frequência. Ao delimitar os valores dos indicadores pela frequência de sua ocorrência, nós poderemos definir os níveis dos indicadores. Vamos levar em conta que as estatísticas para os valores positivos e negativos do indicador podem diferir umas das outras. Portanto, vamos coletar os dados para os níveis positivo e negativo de forma separada.

O próprio valor dos níveis é definido de forma mais convenientemente como uma porcentagem. Por exemplo, se o nível for igual a 70, essa é exatamente a proporção dos valores do indicador que ficará entre o nível e a linha zero. Apenas 30% dos valores ultrapassarão os níveis.

Para calcular os níveis, nós procederemos da seguinte forma. Vamos criar dois arrays para armazenar os valores do indicador (valores positivos e negativos são separados um do outro).

int array_dn[],         // array for storing positive values
    array_up[],         // array for storing negative values
    size_dn=0,size_up=0;// array sizes

Vamos definir os tamanhos dos arrays.

ArrayResize(array_up,size_up,rates_total);
ArrayResize(array_dn,size_dn,rates_total);

À medida que os dados históricos se tornam disponíveis, nós definimos os resultados obtidos. Observe que nós definimos números positivos para o array para valores negativos. Isso é feito para a conveniência do manuseio subsequente.

if(cci>0)
  {
   ArrayResize(array_up,size_up+1);
   array_up[size_up]=(int)MathRound(cci/_Point);
   size_up++;
  }
if(cci<0)
  {
   ArrayResize(array_dn,size_dn+1);
   array_dn[size_dn]=(int)MathRound(-cci/_Point);
   size_dn++;
  }

Antes de abrir uma barra zero, primeiro você precisa classificar esses arrays. Em seguida, encontramos os índices dos elementos do array. Essas células conterão os valores do nível. Não se esqueça de retornar o sinal de menos para um valor negativo.

ArraySort(array_up);
IndicatorSetDouble(INDICATOR_LEVELVALUE,0,array_up[size_up*level/100]*_Point);
ArraySort(array_dn);
IndicatorSetDouble(INDICATOR_LEVELVALUE,1,-array_dn[size_dn*level/100]*_Point);

 

Agora vamos dar uma olhada no nosso novo indicador.


Como nós podemos ver, todas as opções de cálculo produziram uma imagem semelhante. A principal diferença são os valores numéricos dos níveis. Curiosamente, os níveis para os valores positivos e negativos de todas as opções diferem entre si. Isso significa que os movimentos ascendentes e descendentes dos preços não são simétricos do ponto de vista do indicador, e nossa suposição sobre uma coleção separada de estatísticas acabou sendo justificada.

No entanto, é ainda mais interessante comparar o nosso novo indicador com o CCI convencional. Aqui nós podemos conhecer as áreas onde os indicadores são bem semelhantes

 

bem como as seções onde os indicadores apresentam um comportamento diferenciado. Essa diferença torna-se especialmente perceptível se prestarmos atenção aos cruzamentos da linha do indicador e os seus níveis.


Agora vamos testar nosso novo indicador em ação. Desenvolveremos um EA para negociar por seus sinais. Como os níveis dos indicadores podem mudar, nós definiremos as regras para abertura de posições da seguinte forma. Uma posição de compra será aberta se o valor atual do indicador estiver abaixo do nível negativo e o valor anterior do indicador estiver abaixo do atual. Uma posição de venda será aberta se o valor atual do indicador estiver acima do nível positivo e o valor anterior estiver acima do atual. A abertura de uma posição de um tipo leva ao fechamento de todas as posições opostas.

Parâmetros de teste: EURUSD H1, 01.01.2021 - 31.12.2021.

Os principais resultados de cada teste são exibidos na tabela

TypeInd
Lucro Líquido Total
Lucro bruto
Perda Bruta
Total de Negociações
Clássico 248.21
1 361.74
-1 113.53
823
Quadrado -304.83
2 993.08
-3 297.91
3581
Moderno -567.15
2 540.88
-3 108.03
3251

Curiosamente, o método clássico de cálculo do desvio padrão produziu imediatamente um resultado positivo. Nas duas últimas opções, o número de negócios aumentou significativamente. Isso pode indicar a necessidade de aumentar os níveis de acionamento do indicador. Então o número de negociações diminuirá e, possivelmente, sua eficiência melhorará. O exemplo de uma curva de equilíbrio para a versão clássica é exibida abaixo.



Passo dois

Até agora, eu usei o desvio padrão para calcular o indicador. A utilização do desvio padrão para normalizar os valores só se justifica se a distribuição dos valores ocorrer de acordo com a lei normal. No caso do CCI, os dados iniciais são as diferenças entre o preço e a média. Vamos ver como eles são realmente distribuídos.

Para enfatizar as características do resultado obtido, eu reduzi o tamanho da amostra e retirei os valores iguais a zero dele. Como você pode ver, o gráfico acabou sendo bastante peculiar e nem se parece com um gráfico de distribuição normal.

Se as diferenças forem distribuídas de acordo com alguma lei empírica, nós podemos abandonar o desvio padrão. Então o nosso indicador se transformará em metade do CCI.

Vamos pensar nas consequências de tal passo. Obviamente, sem a suavização, o spread dos valores do indicador será bastante grande e parecerá um pouco incomum. Além disso, grandes movimentos de preços podem afetar a percepção visual do indicador. Mas essas deficiências não podem superar uma grande vantagem.

Ao calcular os valores do indicador CCI, nós usamos uma média simples. Esta é uma equação bem conhecida, mas eu ainda vou mostrá-la aqui:

Mas o que está por trás dessa fórmula? Esta pode ser a média aritmética, a expectativa matemática de uma variável aleatória e uma janela retangular. Vamos nos concentrar na última opção. Por que uma janela retangular? Afinal, nós temos outras funções de janela que podem ser aplicadas.

Conheço cerca de cinquenta funções de janela com seus próprios nomes. O número das funções de janela sem nomes próprios é muito maior.

Para o experimento, nós tomaremos uma janela retangular, uma janela triangular e uma janela de topo plana. A função da última janela é bastante incomum, pois alguns de seus pesos assumem valores negativos. Vamos também pegar três janelas assimétricas - com pesos lineares, de potência e exponenciais. As médias com pesos lineares e exponenciais estão disponíveis na MetaTrader no menu da Média Móvel.
A visão geral de todas as opções é mostrada na figura (o indicador mais baixo é o CCI clássico).

Todas as opções são bastante semelhantes, mas os seus níveis podem diferir bastante. Depende da função da janela usada - algumas delas ficam para trás e os valores dos indicadores relativamente grandes podem ocorrer com mais frequência. Outras funções da janela seguem o preço, e pequenos desvios são mais comuns como o resultado.

Além disso, adicionamos duas opções de suavização ao indicador apenas por precaução. Eles não mudarão a essência dos cálculos, mas podem tornar o indicador visualmente mais atraente.

 

Vamos desenvolver outro EA para testar o indicador hCCI. Os sinais para abertura e fechamento de posições serão exatamente os mesmos do EA anterior. Os parâmetros de teste e seu intervalo também são os mesmos do caso anterior.

Os principais resultados do teste são mostrados na tabela.

Janela
Lucro Líquido Total
Lucro bruto
Perda Bruta
Total de Negociações
Retangular
224.57
1 745.03
-1 520.46
726
Triangular
94.17
1 532.10
-1 437.93
696
FlatTop
236.54
1 354.67
-1 118.13
643
LWMA
243.62
1 444.48
-1 200.86
639
Potência
44.57
1 175.79
-1 131.22
561
Exponencial
-317.41
725.11
-1 042.52
359

    De todas as funções da janela, apenas a janela exponencial apresentou um resultado negativo. Isso não significa que ela não seja adequada para negociação. Isso significa que os seus parâmetros precisam ser ajustados. As regras de fechamento de posições também devem ser aprimoradas. (Isso se aplica a todas as versões do EA). A figura mostra a curva de equilíbrio do EA com a função da janela LWMA.



    Passo três

    Até agora, nós consideramos o indicador CCI como um oscilador. Mas seria interessante movê-lo para o gráfico principal e ver como ele será exibido nele. Vejamos como nós podemos conseguir isso.

    A maioria dos osciladores é baseada em um princípio simples — a supressão do sinal principal, enquanto destacamos os movimentos sutis de preços. Assim, para transferir o indicador para o gráfico principal, nós precisamos adicionar um sinal de referência ao seu valor. No caso do CCI, o preço atual ou a média podem ser usados como sinal. Então as equações para calcular o valor do indicador serão as seguintes:

     

    Ambas as opções são instáveis. Seus valores podem se desviar fortemente da linha de preço. Mas essa desvantagem é compensada pelo fato de que ambos os indicadores podem destacar bem os movimentos de preços da tendência.


     


    Conclusão

    Os indicadores apresentados desenvolvem os princípios estabelecidos no indicador CCI clássico. A vantagem indiscutível dos novos indicadores é a capacidade de personalizá-los à escolha do trader.

    Parâmetros do indicador:

    Indicador pCCI

     

    • TypeInd – define o método para calcular os valores dos indicadores;
    • iPeriod – período do indicador, valor mínimo 2;
    • iLevel – valor dos níveis do indicador, valor válido 1 – 99.

       Indicador hCCI

    • Window – tipo da função de janela utilizada;
    • Smoothing – suavização aplicada;
    • iPeriod – período do indicador, valor mínimo 2;
    • iLevel – valor dos níveis do indicador, valor válido 1 – 99.

      Indicador lCCI

    • Window – tipo da função de janela utilizada;
    • Direct – tipo do sinal de referência;
    • iPeriod – período do indicador, valor mínimo 2.

      Script Difference Distribution

    • Length – período da média móvel;
    • Level – valor máximo da amostra;
    • ViewDuration – duração da exibição;
    • ScreenShot– se o parâmetro estiver habilitado, o gráfico será salvo na pasta Files.

    EA pCCI

    Todos os seus parâmetros são os mesmos do indicador pCCI. Os sinais para a abertura e fechamento de posições ocorrem quando uma nova barra é aberta.

      EA hCCI

      Suas configurações principais correspondem às do indicador hCCI. 

      Traduzido do russo pela MetaQuotes Ltd.
      Artigo original: https://www.mql5.com/ru/articles/8860

      Arquivos anexados |
      pCCI.mq5 (5.11 KB)
      hCCI.mq5 (4.68 KB)
      lCCI.mq5 (6.77 KB)
      EA_pCCI.mq5 (8.8 KB)
      EA_hCCI.mq5 (8.6 KB)
      pCCI.mq4 (6.51 KB)
      hCCI.mq4 (5.69 KB)
      lCCI.mq4 (4.39 KB)
      EA_pCCI.mq4 (7.64 KB)
      EA_hCCI.mq4 (7.44 KB)
      Criação de Indicadores complexos de maneira fácil usando objetos Criação de Indicadores complexos de maneira fácil usando objetos
      Este artigo fornece um método para criar os indicadores complexos e, ao mesmo tempo, evitar os problemas que surgem ao lidar com vários gráficos, buffers e/ou combinar dados de várias fontes.
      Ciência de Dados e Aprendizado de Máquina (Parte 06): Gradiente Descendente Ciência de Dados e Aprendizado de Máquina (Parte 06): Gradiente Descendente
      O gradiente descendente desempenha um papel significativo no treinamento das redes neurais e muitos algoritmos de aprendizado de máquina. Ele é um algoritmo rápido e inteligente, apesar do seu trabalho impressionante, ele ainda é mal interpretado por muitos cientistas de dados, vamos ver do que ele se trata.
      Aprendendo a construindo um EA que opera de forma automática (Parte 05): Gatilhos manuais (II) Aprendendo a construindo um EA que opera de forma automática (Parte 05): Gatilhos manuais (II)
      Aprenda como criar um EA que opera de forma automática, isto de forma simples e o mais seguro possível. No final daquele artigo, pensei que seria adequado permitir o uso do EA, de uma maneira manual, pelo menos por um tempo.
      Aprendendo a construindo um EA que opera de forma automática (Parte 04): Gatilhos manuais (I) Aprendendo a construindo um EA que opera de forma automática (Parte 04): Gatilhos manuais (I)
      Aprenda como criar um EA que opera de forma automática, isto de forma simples e o mais seguro possível ...