Indicador CCI. Modernización y nuevas posibilidades
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
- Encontramos la desviación absoluta promedio
- Calculamos el valor del indicador
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:
- Hallamos la suma de cuadrados:
- Calculamos el valor del indicador:
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
TypeInd = Square
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
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
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso