English Русский 中文 Deutsch 日本語 Português 한국어 Français Italiano Türkçe
preview
Indicador CCI. Modernización y nuevas posibilidades

Indicador CCI. Modernización y nuevas posibilidades

MetaTrader 5Ejemplos | 22 septiembre 2022, 09:36
517 0
Aleksej Poljakov
Aleksej Poljakov

Una breve historia

El indicador Índice de Canal de Productos Básicoses familiar para todos los tráders. Su desarrollador, Donald Lambert, publicó por primera vez un artículo sobre este indicador en la revista Commodities (su nombre moderno es Modern Trader) en 1980. Desde entonces, este indicador ha ganado una merecida fama y se ha vuelto muy popular entre los tráders. Dicho indicador se incluye en el instrumental de la plataforma comercial MetaTrader y se usa en el comercio manual, además de como parte de los sistemas de comercio mecánico.


Algoritmo de cálculo

El cálculo de este indicador es bastante claro y sencillo. El indicador muestra cuánto se ha desviado el precio del valor promedio en relación con la desviación absoluta promedio. Podemos representar el algoritmo para calcular los valores de este indicador técnico de la siguiente manera. Supongamos que el periodo del indicador es N lecturas de precios. Entonces:

  • Calculamos el valor promedio 

mean

  • Encontramos la desviación absoluta promedio

MAD

  • Calculamos el valor del indicador

CCI

En el indicador original, el valor del coeficiente de corrección es k = 0,015. Se ha seleccionado de tal forma que la desviación del precio en 1,5*MAD sea igual a 100 unidades del indicador. Entonces la desviación en 3*MAD será de 200 unidades. (Una observación interesante: si reemplazamos la división por la multiplicación, entonces el valor del coeficiente de normalización k será igual a 66.6)


Posibles cambios del algoritmo

Tenga en cuenta una característica de este indicador: el uso de la desviación absoluta promedio. En los albores del desarrollo de la tecnología informática, este enfoque estaba plenamente justificado, porque el cálculo de la desviación absoluta requería menos recursos computacionales en comparación con el cálculo de la desviación estándar, más adecuada. Las computadoras modernas pueden gestionar operaciones de cuadratura y enraizamiento en una cantidad de tiempo razonable. Por lo tanto, el algoritmo encargado de calcular los valores de los indicadores puede tener el siguiente aspecto.

  • Hallamos la suma de números:

sumS

  • Hallamos la suma de cuadrados:

sumQ

  • Calculamos el valor del indicador:

CCI

Este algoritmo resulta más preciso en los cálculos, pero tampoco es perfecto. El problema principal es que la estimación del valor promedio y medio cuadrático requiere una cantidad suficientemente grande de lecturas de precios, al menos treinta. Sin embargo, los periodos cortos también se pueden usar para comerciar. Por ejemplo, en la versión clásica de CCI, se recomienda un periodo de 14 lecturas.

En estas situaciones, los métodos estadísticos robustos pueden servir de ayuda, pues permiten obtener estimaciones de parámetros bastante estables y fiables, incluso en situaciones muy extremas, tan abundantes en el mercado financiero.

 Vamos a echar un vistazo al funcionamiento de los métodos robustos y a compararlo con los clásicos. Por ejemplo, tomemos una serie temporal de tres valores: p[0] = 1, p[1] = 3, p[2] = 8.

El enfoque clásico se reduciría a los siguientes cálculos:

  • Promedio (1 + 3 + 8) / 3 = 4
  • Desviación absoluta (abs(1 - 4) + abs(3 - 4) + abs(8 - 4)) / 3 = 2,67
  • Límites inferior y superior del canal 1,33 – 6,67 

Ahora, vamos a realizar los cálculos usando la desviación estándar:

  • Promedio (1 + 3 + 8) / 3 = 4
  • Desviación estándar sqrt(((1 – 4)^2 + (3 – 4)^2 + (8 – 4)^2) / 3) = 2,94
  • Límites inferior y superior del canal 1.06 – 6.94

Las estimaciones robustas requieren más recursos en cuanto a los cálculos. Para estimar el promedio, usaremos el método de Theil-Sen. Para hacer esto, primero deberemos encontrar todas las semisumas de los valores tomados por pares de la serie temporal. El número de estos pares se podrá obtener mediante la fórmula: num=(N*(N-1)) / 2.

Entonces, el promedio estable será igual a la mediana de estas semisumas. Para encontrar la mediana, primero deberemos clasificar el array en orden ascendente. Entonces la mediana se corresponderá con el valor en el centro del array. Si el tamaño del array es un número impar, necesitaremos el índice del elemento central para encontrar el valor de la mediana, o bien de los dos elementos centrales, si el tamaño del array es un número par. Entonces la mediana será igual al valor promedio de estos dos elementos.

Fórmulas para calcular los índices en ambos casos (el tamaño será el número de elementos en el array):

  • size es un número impar

Index = size / 2

  • size es un número par

Index1 = size / 2 – 1; Index2 = size / 2

Para nuestro ejemplo, se verá así:

hs1 = (1 + 3) / 2 = 2

hs2 = (1 + 8) / 2 = 4.5

hs3 = (3 + 8) / 2 = 5.5

clasificación 2, 4.5, 5.5

  • Promedio = 4.5

Ahora, pasaremos a estimar la desviación. Para hacer esto, deberemos encontrar la mediana entre los valores absolutos de la serie temporal original y su promedio.

d1 = abs(1 – 4,5) = 3.5

d2 = abs(3 – 4,5) = 1.5

d3 = abs(8 – 4,5) = 3.5

clasificación 3.5, 1.5, 3.5

  • Desviación = 3,5
  • Límite inferior y superior del canal 1 - 8


Comparación de las versiones clásicas y modernizadas del indicador.

Es el momento perfecto para comparar todos estos enfoques. Con los cálculos normales, los valores mínimo y máximo de nuestra serie temporal se han salido del valor promedio +/- desviación. Y con una estimación robusta, todos los valores de la serie original se ajustarán a estos límites. La diferencia en los tres enfoques resulta obvia, pero solo en nuestro ejemplo ficticio. Ahora veamos cómo se comportan los diferentes métodos de cálculo con datos reales. Vamos a implementar los tres algoritmos como un indicador aparte. Al mismo tiempo, nos familiarizaremos con las peculiaridades del cálculo de cada opción.

El aspecto del indicador dependerá en gran medida de dos variables: la constante de precio utilizada y su periodo. En MQL5, podemos establecer la constante de precio al definir las propiedades del indicador.

#property indicator_applied_price PRICE_TYPICAL

Para la versión del lenguaje MQL4, usaremos una función aparte.

El periodo del indicador mostrará el número de lecturas de precios utilizadas en los cálculos.

input ushort iPeriod=14;//indicator period

El valor de esta variable no deberá ser inferior a tres. En general, deberemos recordar que con periodos pequeños del indicador, podremos obtener valores no del todo correctos, demasiado grandes.

El cálculo de la versión clásica de CCI en cada i-ésima barra se realiza de la forma siguiente. Primero, hallamos el valor del promedio de la muestra.

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

Ahora podemos comenzar a calcular la desviación absoluta promedio.

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
   }

Si el valor de la desviación absoluta promedio es superior a cero, el valor del indicador será igual a:

res=(price[i]-mean)*iPeriod/mad;

La variante del indicador que usa la desviación estándar se calcula de la siguiente manera. Primero, necesitaremos encontrar las sumas de los precios y sus cuadrados.

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];
   }

Ahora, necesitaremos encontrar el denominador necesario para calcular el valor del indicador.

double denom=MathSqrt(iPeriod*sumQ-sumS*sumS);

Si el valor del denominador es superior a cero, el resultado será:

res=(iPeriod*price[i]-sumS)/denom;

Finalmente, vamos a analizar los cálculos usando métodos robustos. Primero deberemos preparar dos arrays en los que almacenaremos los valores de los resultados intermedios. En un array, almacenaremos los valores de las semisumas, y en el otro, las diferencias absolutas.

double halfsums[],diff[];

Primero, prepararemos un arraypara su uso posterior, halfsums. Para hacer esto, estableceremos su tamaño.

int size=iPeriod*(iPeriod-1)/2; //halfsums array size
ArrayResize(halfsums,size);     //set the array size

Después, hallaremos los índices de los elementos centrales del array. Para generalizar, usaremos dos índices. Si el valor de sizees impar, estos índices serán iguales entre sí; en caso contrario, serán diferentes.

indx10=size/2;
indx11=indx10;
if(MathMod(size,2)==0)
   indx11=indx10-1;

Después de eso, deberemos preparar el array diff. Su tamaño coincidirá con el periodo del indicador. Los índices de los elementos permanecerán como en el caso anterior.

ArrayResize(diff,iPeriod);
indx20=iPeriod/2;
indx21=indx20;
if(MathMod(iPeriod,2)==0)
   indx21=indx20-1;

Ahora podemos comenzar a calcular los valores del indicador. Para rellenar el array con las semisumas, necesitaremos un contador adicional.

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
       }
   }

Después de rellenar el array, deberemos clasificarlo, y los valores del centro del array deberán usarse como una estimación del promedio.

ArraySort(halfsums);                               //sort the array
double mean=(halfsums[indx10]+halfsums[indx11])/2; //robust mean

En la siguiente etapa, hallaremos la estimación robusta de la desviación estándar.

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

Si la desviación estándar es superior a cero, el valor del indicador será:

res=(price[i]-mean)/sd;

Bien, ahora podemos comparar el comportamiento de diferentes versiones del indicador entre sí. En algunos casos, los indicadores se verán muy similares.


Pero también hay áreas donde la diferencia entre los indicadores será bastante notable.



Un pequeño asesor para comparar indicadores

Las comparaciones visuales son subjetivas y pueden desembocar en conclusiones incorrectas. Lo que necesitamos es una base más fiable para nuestras conclusiones. Para estimar todas las variantes del indicador, escribiremos un asesor simple. Le asignaremos las mismas reglas para abrir y cerrar posiciones, y compararemos los resultados. Usaremos las siguientes reglas: el cruce de un nivel dado abrirá una posición en una dirección y cerrará las posiciones en la dirección opuesta (si las hay).

Parámetros del asesor:

  • TypeInd - tipo de indicador (Classical, Square, Modern)
  • iPeriod - periodo del indicador
  • iPrice - precio del indicador
  • Nivel - nivel cuyo cruce se monitoreará. Su valor 150 se corresponde con el nivel 100 en el CCI clásico.

Para acelerar las pruebas, hemos desplazado el algoritmo de cálculo del indicador dentro del asesor. Los valores del indicador se calcularán en la apertura de una nueva barra. La apertura de una posición Buy tendrá lugar si el valor del indicador cruza el valor negativo del nivel de abajo hacia arriba. Al mismo tiempo, se cerrarán las posiciones Sell. La apertura de posiciones Sell tendrá lugar (de forma consecuente, se cerrarán las posiciones Buy) si el valor del indicador cruza el valor positivo del nivel de arriba hacia abajo.

Parámetros para la prueba:

pareja de divisas EURUSD

marco temporal H1

intervalo temporal - 2021

iPeriod = 14

iPrice = PRICE_TYPICAL

Level = 150

A continuación, le mostramos la curva de balance para los tres casos.

TypeInd = Classical

tester1

TypeInd = Square

tester2

Como podemos ver, la aplicación de la desviación estándar ha provocado una disminución en el número de transacciones, así como una reducción en las grandes pérdidas.

TypeInd = Modern

tester3

El uso de estimaciones robustas ha aumentado el número de transacciones; asimismo, se ha reducido aún más el número de grandes pérdidas. Esta es una gran ventaja para esta versión del indicador,

aunque en todos los casos, las reglas de cierre y apertura de posiciones necesitarán una mejora considerable.


    Modificación del indicador para evaluar la tendencia

    Al observar cuidadosamente el indicador CCI (en cualquiera de sus variantes), hemos hecho un descubrimiento sorprendente: podemos tomar valores tanto positivos como negativos. No sé si esto vale el premio Nobel, pero la empresa MetaQuotes Ltd simplemente está obligada a establecer su propio premio y recompensarme con él. Bueno, bromas aparte.

    Los valores positivos del indicador se asocian con una tendencia alcista, mientras que los negativos se asocian con el movimiento descendente del precio. Detengámonos en este momento con más detalle. La idea general del nuevo indicador es la siguiente: vamos a sumar los valores del indicador CCI desde el momento en que comienza una tendencia hasta su final. Y por supuesto, compararemos este movimiento con las lecturas promedio. De esta forma, podremos evaluar la duración de los movimientos de tendencia, así como su fuerza.

    Tomaremos como base la versión de los cálculos con estimaciones robustas. La única diferencia será que acumularemos la suma de los valores del indicador CCI después de que supere el nivel cero. El valor de esta suma acumulada se utilizará como datos de salida. Y a modo de comparación, calcularemos por separado las sumas promedio de las tendencias alcistas y bajistas. La imagen general de este indicador sería algo así.


    Con este indicador, podremos evaluar el inicio de una tendencia, su finalización y su fuerza. La estrategia más simple para este indicador puede verse así: al final de la tendencia, si la tendencia ha estado por encima del promedio (el indicador cruzó el nivel correspondiente), podemos esperar que el precio se mueva en la dirección opuesta.

    Conclusión

    Bien, hemos visto que un nuevo punto de vista sobre los indicadores técnicos puede resultar muy útil. Ni un solo indicador supone su versión final: siempre existe la posibilidad de mejorarlos y modificarlos para estrategias específicas. Archivos adjuntos:

    • mCCI — indicador con tres versiones de CCI
    • EA CCI — asesor comercial para comparar las diferentes versiones de CCI
    • tCCI — indicador que calcula las sumas de las tendencias acumuladas.

    Traducción del ruso hecha por MetaQuotes Ltd.
    Artículo original: https://www.mql5.com/ru/articles/11126

    Archivos adjuntos |
    mCCI.mq5 (3.84 KB)
    EA_CCI.mq5 (7.46 KB)
    tCCI.mq5 (4.55 KB)
    mCCI.mq4 (5.25 KB)
    EA_CCI.mq4 (6.26 KB)
    tCCI.mq4 (4.54 KB)
    Características del Wizard MQL5 que debe conocer (Parte 02): Mapas de Kohonen Características del Wizard MQL5 que debe conocer (Parte 02): Mapas de Kohonen
    Gracias al Wizard, el tráder podrá ahorrar tiempo a la hora de poner en práctica sus ideas. Asimismo, podrá reducir la probabilidad de que surjan errores por duplicación de código. En lugar de perder el tiempo con el código, los tráders tendrán la posibilidad de poner en práctica su filosofía comercial.
    Aprendiendo a diseñar un sistema de trading con Force Index Aprendiendo a diseñar un sistema de trading con Force Index
    Aquí tenemos un nuevo artículo de nuestra serie destinada a la creación de sistemas comerciales basados en indicadores técnicos populares. En esta ocasión, analizaremos el indicador Force Index y aprenderemos a crear sistemas comerciales basados en él.
    El modelo de movimiento de precios y sus principales disposiciones (Parte 2):  Ecuación de evolución del campo de probabilidad del precio y aparición del paseo aleatorio observado El modelo de movimiento de precios y sus principales disposiciones (Parte 2): Ecuación de evolución del campo de probabilidad del precio y aparición del paseo aleatorio observado
    En el presente artículo, hemos derivado una ecuación para la evolución del campo probabilístico de precio, hemos encontrado un criterio para acercarnos al salto de precio, y también hemos revelado la esencia de los valores de precio en los gráficos de cotización y el mecanismo para la aparición de un paseo aleatorio de dichos valores .
    Aprendiendo a diseñar un sistema de trading con el oscilador Chaikin Aprendiendo a diseñar un sistema de trading con el oscilador Chaikin
    Aquí tenemos un nuevo artículo de nuestra serie destinada al estudio de indicadores técnicos populares y la creación de sistemas comerciales basados en ellos. En este artículo, trabajaremos con el indicador Chaikin Oscillator, el oscilador de Chaikin.