![Indicador CCI. Atualizações e novos recursos](https://c.mql5.com/2/49/cci_indicator_new_features_600x314.jpg)
Indicador CCI. Atualizações e novos recursos
Uma breve história
O Commodity Channel Index (CCI) é familiar para todo trader. Ele foi desenvolvido por Donald Lambert e publicado pela primeira vez na revista Commodities (agora – Modern Trader) em 1980.Desde então, esse indicador ganhou fama merecida e se tornou muito popular entre os traders. Ele está presente no kit de ferramentas da plataforma de negociação MetaTrader e é usado tanto na negociação manual quanto como parte dos sistemas de negociação automatizados.
Algoritmo de cálculo
O cálculo do indicador é bastante simples e claro. O indicador mostra o quanto o preço se desviou do valor da média em relação ao desvio médio absoluto. O algoritmo de cálculo pode ser representado da seguinte forma. Seja o período do indicador N leituras de preço. Então:
- Calculamos a média
- Encontramos o desvio absoluto médio
- Calculamos o valor do indicador
No indicador original, o fator de correção é k = 0.015. Ele é selecionado de forma que o desvio de preço de 1.5*MAD seja igual a 100 unidades do indicador. Neste caso, o desvio de 3*MAD é de 200 unidades. (Curiosamente, se a divisão for substituída pela multiplicação, o valor do coeficiente de normalização k será 66.6)
Possíveis alterações do algoritmo
A característica notável do indicador é o uso do desvio médio absoluto. Esta abordagem foi completamente justificada no início da tecnologia computacional, uma vez que o cálculo do desvio absoluto exigia menos recursos computacionais em comparação com o cálculo do desvio padrão mais adequado. Os computadores modernos podem lidar com potências e raízes em um período de tempo razoável. Portanto, o algoritmo de cálculo do algoritmo pode ter a seguinte aparência.
- Encontramos a soma dos números:
- Encontramos a soma dos quadrados:
- Calculamos o valor do indicador:
Tal algoritmo é mais preciso, mas ainda não é perfeito. A questão principal é que estimar os valores médios e quadráticos médios requer um número suficientemente grande de leituras dos preços (não menos de trinta). No entanto, períodos curtos também podem ser usados para a negociação. Por exemplo, na versão clássica do CCI, é recomendado um período de 14 amostras.
Tais situações requerem métodos estatísticos robustos. Eles permitem obter estimativas dos parâmetros bem estáveis e confiáveis mesmo em situações muito extremas, tão abundantes nos mercados financeiros.
Vamos dar uma olhada em como os métodos robustos funcionam e compará-los com os clássicos. Por exemplo, vamos olhar para uma série temporal de três valores: p[0] = 1, p[1] = 3, p[2] = 8.
Então a abordagem clássica é reduzida aos seguintes cálculos:
- Média (1 + 3 + 8) / 3 = 4
- Desvio absoluto (abs(1 – 4) + abs(3 – 4) + abs(8 – 4)) /3 = 2,67
- Limites inferior e superior do canal 1,33 – 6,67
Agora, vamos calcular usando o desvio padrão:
- Média (1 + 3 + 8) / 3 = 4
- Desvio padrão sqrt(((1 – 4)^2 + (3 – 4)^2 + (8 – 4)^2) / 3) = 2,94
- Limites inferior e superior do canal 1,06 – 6,94
Estimativas robustas são mais caras nos cálculos. Vamos usar o método de Theil-Sen para estimar a média. Para fazer isso, nós devemos primeiro encontrar todas as meias somas dos valores das séries temporais tomadas em pares. O número desses pares pode ser obtido usando a equação: num=(N*(N-1)) / 2.
Nesse caso, a média estável é igual à mediana dessas meias somas. Para encontrar a mediana, nós devemos primeiro ordenar a matriz em ordem crescente. Então a mediana corresponderá ao valor no centro da matriz. Para encontrar o valor da mediana, nós precisamos do índice do elemento central se o tamanho da matriz for um número ímpar ou o índice dos dois elementos centrais caso o seu tamanho seja um número par. Então a mediana é igual à média desses dois elementos.
As equações para calcular os índices em ambos os casos (o tamanho (size) é o número de elementos na matriz):
- tamanho ímpar
Index = size / 2
- tamanho par
Index1 = size / 2 – 1; Index2 = size / 2
No caso do nosso exemplo, isso se parece com o seguinte:
hs1 = (1 + 3) / 2 = 2
hs2 = (1 + 8) / 2 = 4.5
hs3 = (3 + 8) / 2 = 5.5
ordenação 2, 4.5, 5.5
- Média = 4.5
Agora vamos para o desvio. Nós precisamos encontrar a mediana entre os valores absolutos da série temporal original e sua média.
d1 = abs(1 – 4,5) = 3.5
d2 = abs(3 – 4,5) = 1.5
d3 = abs(8 – 4,5) = 3.5
ordenação 3,5, 1,5, 3,5
- Desvio = 3.5
- Limites inferior e superior do canal 1 - 8
Comparando as versões do indicador clássico com o atualizado
Vamos comparar essas abordagens. Com os cálculos normais, os valores da mínima e máxima da série temporal ultrapassaram a média +/- desvio. No caso de uma estimativa robusta, todos os valores da série original se encaixam nesses limites. A diferença nas três abordagens é óbvia, mas apenas no nosso exemplo. Agora vamos ver como os diferentes métodos de cálculo se comportam com os dados reais. Vamos implementar todos os três algoritmos como um indicador separado. Isso também nos permitirá conhecer os recursos de cálculo de cada opção.
A aparência do indicador depende em grande parte das duas variáveis — constante do preço aplicada e seu período. Em MQL5, a constante do preço pode ser definida ao definir as propriedades do indicador.
#property indicator_applied_price PRICE_TYPICAL
Em MQL4, eu usarei uma função separada.
O período do indicador mostra o número de leituras de preço usadas nos cálculos.
input ushort iPeriod=14;//indicator period
O valor da variável deve ser no mínimo igual a três. Tenha em mente que no caso dos períodos pequenos, é possível obter valores incorretos (muito grandes).
Cálculo da versão CCI clássica em cada i-ésima barra é executada da seguinte forma. Primeiro, encontramos o valor da média amostral.
double mean=0; //sample mean for(int j=0; j<iPeriod; j++) { mean=mean+price[i+j]; //sum up price values } mean=mean/iPeriod; //sample mean for the period
Agora é hora de calcular o desvio absoluto médio.
double mad=0; //mean absolute deviation for(int j=0; j<iPeriod; j++) { mad=mad+MathAbs(price[i+j]-mean); //sum up absolute difference values }
Se o valor do desvio médio absoluto for maior que zero, então o indicador é igual a:
res=(price[i]-mean)*iPeriod/mad;
A versão do indicador usando o desvio padrão é calculada da seguinte forma. Primeiro, nós precisamos encontrar as somas dos preços e seus quadrados.
double sumS=0,//sum of prices sumQ=0;//sum of price squares for(int j=0; j<iPeriod; j++) { sumS=sumS+price[i+j]; sumQ=sumQ+price[i+j]*price[i+j]; }
Agora nós precisamos encontrar o denominador necessário para calcular o indicador.
double denom=MathSqrt(iPeriod*sumQ-sumS*sumS);
Se o denominador for maior que zero, o resultado é o seguinte:
res=(iPeriod*price[i]-sumS)/denom;
Finalmente, vamos considerar os cálculos usando os métodos robustos. Primeiro, nós precisamos preparar duas matrizes para armazenar os resultados intermediários. Uma matriz é para armazenar os valores das meias somas, enquanto outro é para armazenar diferenças absolutas.
double halfsums[],diff[];
Primeiro, preparamos a matriz halfsums para uso posterior. Para fazer isso, vamos definir o seu tamanho.
int size=iPeriod*(iPeriod-1)/2; //halfsums array size ArrayResize(halfsums,size); //set the array size
Agora vamos encontrar os índices dos elementos centrais da matriz. Por uma questão de versatilidade, eu usarei os dois índices. Se o tamanho for ímpar, então esses índices irão corresponder uns aos outros, permanecendo diferentes de outra forma.
indx10=size/2; indx11=indx10; if(MathMod(size,2)==0) indx11=indx10-1;
Depois disso, preparamos a matriz diff. Seu tamanho coincide com o período do indicador. Os índices dos elementos são os mesmos do caso anterior.
ArrayResize(diff,iPeriod); indx20=iPeriod/2; indx21=indx20; if(MathMod(iPeriod,2)==0) indx21=indx20-1;
Agora é hora de começar a calcular os valores do indicador. Nós precisamos de um contador adicional para preencher a matriz com as meias somas.
int cnt=0; //counter of array elements for(int j=iPeriod-2; j>=0; j--) { for(int k=iPeriod-1; k>j; k--) { halfsums[cnt]=(price[i+j]+price[i+k])/2; //half sum value cnt++; //increase the counter } }
Após preencher a matriz, ele deve ser ordenado. Os valores do centro da matriz devem ser usados como uma estimativa da média.
ArraySort(halfsums); //sort the array double mean=(halfsums[indx10]+halfsums[indx11])/2; //robust mean
Na próxima etapa, encontramos uma estimativa robusta do desvio padrão.
for(int j=0; j<iPeriod; j++) { diff[j]=MathAbs(price[i+j]-mean); } ArraySort(diff); double sd=(diff[indx20]+diff[indx21])/2; //robust standard deviation
Se o desvio padrão for maior que zero, o valor do indicador será:
res=(price[i]-mean)/sd;
Agora nós podemos comparar o comportamento de diferentes versões do indicador. Em alguns casos, os indicadores parecem muito semelhantes.
Mas também há áreas em que a diferença é bem perceptível.
Um pequeno Expert Advisor para comparar os indicadores
As comparações visuais são subjetivas e podem levar a conclusões incorretas. Nós precisamos de uma base mais confiável para as nossas conclusões. Para avaliar todas as versões do indicador, vamos escrever um Expert Advisor simples. Vamos atribuir as mesmas regras para abrir e fechar posições e comparar os resultados. Eu vou usar as seguintes regras — cruzamento de um determinado nível abre uma posição em uma direção e fecha posições na direção oposta (se houver).
Parâmetros do EA:
- TypeInd - tipo do indicador (Classical, Square, Modern)
- iPeriod - período do indicador
- iPrice - preço do indicador
- Level - nível cujo cruzamento deve ser rastreado. Seu valor igual a 150 corresponde ao nível de 100 no CCI clássico.
Para acelerar o teste, o algoritmo de cálculo do indicador foi movido para dentro do EA. Os valores do indicador são calculados na abertura de uma nova barra. Uma posição de compra é aberta se o valor do indicador cruzar para cima o valor do nível negativo. Ao mesmo tempo, as posições de venda são fechadas. As posições de venda são abertas (e as posições de compra são fechadas) se o valor do indicador cruzar para baixo o valor do nível positivo.
Parâmetros de teste:
par EURUSD
Tempo gráfico H1
intervalo de tempo – o ano de 2021
iPeriod = 14
iPrice = PRICE_TYPICAL
Level = 150
As curvas de saldo para os três casos são apresentadas abaixo.
TypeInd = Classical
TypeInd = Square
Como podemos ver, a aplicação do desvio padrão levou a uma diminuição no número de negócios seguido por uma diminuição nas grandes perdas.
TypeInd = Modern
O uso de estimativas robustas aumentou o número de negócios, enquanto o número de grandes perdas foi reduzido ainda mais. Esta é uma grande vantagem para essa versão do indicador.
Independentemente disso, as regras para abertura e fechamento das posições precisam de sérias melhorias em todos os casos.
Modificação do indicador para estimar uma tendência
Enquanto eu observava cuidadosamente o indicador CCI (em qualquer uma de suas versões), eu fiz uma descoberta incrível - ele pode receber valores positivos e negativos. Eu não sei se isso vale o Prêmio Nobel, mas a MetaQuotes Ltda deve estabelecer seu próprio prêmio. Eu definitivamente mereço. Mas chega de brincadeira.
Valores positivos do indicador estão associados a uma tendência de alta, enquanto valores negativos estão relacionados a uma tendência de baixa. Vamos nos debruçar sobre isso com mais detalhes. A ideia geral do novo indicador é a seguinte: nós somamos os valores do indicador CCI desde o início de uma tendência até o seu fim. Claro, vamos comparar esse movimento com os valores médios. Dessa forma, nós poderemos avaliar a duração dos movimentos de tendência e sua força.
A versão dos cálculos com as estimativas robustas deve ser usada como base. A única diferença é que nós acumularemos a soma dos valores do indicador CCI após ultrapassar o nível zero. O valor deste montante acumulado será utilizado como saída. Os valores médios para as tendências de alta e tendências de baixa serão calculados separadamente para comparação. A imagem geral deste indicador é a seguinte.
Com este indicador, nós podemos avaliar o início de uma tendência, seu fim e força. A estratégia mais simples para este indicador pode ser assim - após a conclusão da tendência, se a tendência estiver acima da média (o indicador cruzou o nível correspondente), podemos esperar que o preço se mova na direção oposta.
Conclusão
Como podemos ver, um novo olhar sobre os indicadores técnicos pode ser muito útil. Nem um único indicador é a versão final - sempre há a possibilidade de refinamento e modificação para as estratégias mais específicas. Arquivos anexados:
- mCCI — indicador com três versões do CCI
- EA CCI — EA de negociação para comparar as diferentes versões do CCI
- tCCI — indicador que calcula os valores acumulados da tendência.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/11126
![Redes neurais de maneira fácil (Parte 20): autocodificadores](https://c.mql5.com/2/48/Neural_networks_made_easy_020.png)
![Como desenvolver um sistema de negociação baseado no indicador Índice de Força](https://c.mql5.com/2/48/why-and-how__2.png)
![Redes neurais de maneira fácil (Parte 21): Autocodificadores variacionais (VAE)](https://c.mql5.com/2/48/Neural_networks_made_easy_021.png)
![Aprendendo a construindo um EA que opera de forma automática (Parte 03): Novas funções](https://c.mql5.com/2/50/aprendendo_construindo_003_avatar.png)
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso