English Русский 中文 Deutsch 日本語 Português
Indicador CCI. Tres pasos para la transformación

Indicador CCI. Tres pasos para la transformación

MetaTrader 5Indicadores | 1 noviembre 2022, 16:51
549 0
Aleksej Poljakov
Aleksej Poljakov

En el artículo anterior, analizamos algunos posibles cambios en el indicador clásico Commodity Channel Index. Estos cambios se referían a la forma de realizar el cálculo, pero no influían en la esencia del indicador. En este artículo, analizaremos la transformación de este indicador desde un punto de visto ligeramente distinto. Vamos a intentar modificar la lógica de sus cálculos, y también ver cómo afectan estos cambios a las lecturas de los indicadores. Obviamente, trataremos de verificar la validez de los cambios realizados.


Primer paso

Como recordatorio, el indicador CCI se basa en cálculos simples e intuitivos. En primer lugar, se calcula la diferencia entre el precio actual y el valor medio. Dicha diferencia se divide por la desviación estándar. Es decir, comparamos cuántas veces es mayor (o menor) la diferencia entre el precio y la media de la muestra en comparación con la desviación estándar de la misma.

Es algo simple y sencillo, pero existe un inconveniente al acecho que puede desembocar en malas decisiones. Tomemos dos secuencias como ejemplo: 2, 1, 1 y 21, 11, 1. Si traducimos estas secuencias al lenguaje del trading, la primera es un flat y la segunda es una tendencia clara y fuerte.

Vamos a hacernos la siguiente pregunta: ¿cuál de estas dos secuencias dará un mayor valor de CCI? Intente dar una respuesta basada en su intuición. Intente justificar su respuesta. Mientras tanto, haremos los cálculos necesarios.

Primera secuencia

Segunda secuencia

Como podemos ver, ambas secuencias han dado el mismo resultado. La razón principal es que estamos usando la división por la desviación estándar. Para la primera secuencia, la diferencia entre el valor actual y la media es pequeña, pero la desviación estándar también es pequeña. En la segunda secuencia, la diferencia ha aumentado, pero también lo ha hecho la desviación estándar. Por este motivo, dos secuencias diferentes dieron el mismo resultado.

Si preguntamos a cualquier tráder por sus requisitos para un indicador técnico, él mismo (o nosotros tendremos que conducirlo hasta dicha respuesta) dirá: una situación única debe llevar a un valor único del indicador. ¿Es posible cumplir ese deseo cuando hablamos de CCI? La respuesta es sí, pero para ello debemos renunciar a la división y sustituirla por la multiplicación. La fórmula del indicador sería entonces la siguiente:

Con este cambio, el indicador debería resaltar bien los movimientos de precio de la tendencia cuando la diferencia y la desviación estándar sean grandes. Pero este enfoque tiene sus particularidades. No podemos estimar (ni siquiera de forma aproximada) la gama de valores y niveles de los indicadores. Podemos evitar esta desventaja con bastante facilidad. Vamos a dejar que el propio indicador considere qué valores tomará y con qué frecuencia. Tras recopilar estos datos, podremos fijar el nivel del indicador. Las lecturas del indicador que se desvíen ligeramente de cero se producirán con mayor frecuencia. Los valores más grandes se darán con menos frecuencia. Al diferenciar los valores de los indicadores según su frecuencia de aparición, podremos establecer los niveles del indicador. Tenga en cuenta que las estadísticas de los valores de los indicadores positivos y negativos pueden distinguirse entre sí. Por ello, recogeremos los datos de los niveles positivos y negativos por separado.

Lo mejor será establecer los propios niveles como porcentaje. Por ejemplo, si el nivel es 70, precisamente esa será la proporción de los valores del indicador que se situarán entre el nivel y la línea cero, y solo el 30% de los valores se encontrará fuera de los niveles por arriba o por abajo.

Para calcular los niveles, haremos lo siguiente. Crearemos dos arrays en los que almacenaremos los valores del indicador (valores positivos y negativos por separado).

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

Luego estableceremos el tamaño de estos arrays.

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

A medida que se dispongamos de datos históricos, registraremos los resultados obtenidos. Tenga en cuenta que escribiremos números positivos en el array para los valores negativos. Esto se hará para facilitar su procesamiento posterior.

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

Estos arrays deberán ordenarse primero antes de abrir la barra de cero. A continuación, encontraremos los índices de los elementos del array. Estas celdas contendrán los valores de los niveles. Para un nivel negativo, deberemos recordar devolver el signo menos.

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);

 

Ahora, echaremos un vistazo a nuestro nuevo indicador.


Como podemos ver, todos los cálculos han ofrecido una imagen similar. La principal diferencia son los valores numéricos de los niveles. Curiosamente, los niveles de los valores positivos y negativos de todas las opciones resultan diferentes entre sí. Esto significa que, desde el punto de vista de nuestro indicador, los movimientos de precios alcistas y bajistas son asimétricos y nuestra suposición sobre la recopilación de estadísticas separadas ha resultado válida.

Sin embargo, resulta más interesante comparar nuestro nuevo indicador con el CCI clásico. Aquí podremos encontrar zonas en las que los indicadores se parecen bastante,

 

y también secciones del gráfico en las que el comportamiento de los indicadores difiere entre sí. Esta distinción se agudiza especialmente si prestamos atención a la intersección entre la línea del indicador y sus niveles.


Ahora vamos a probar nuestro nuevo indicador en acción. Para ello, escribiremos un asesor comercial que operará según sus señales. Como los niveles de los indicadores están sujetos a cambios, las reglas para la apertura de posiciones serán las siguientes: abriremos una posición de compra si el valor actual del indicador está por debajo del nivel negativo y el valor anterior del indicador está por debajo del valor actual, y abriremos una posición de venta si el valor actual del indicador está por encima del nivel positivo y el valor anterior está por encima del valor actual. La apertura de una posición de un cierto tipo conllevará el cierre de todas las posiciones opuestas.

Parámetros de la simulación: símbolo EURUSD, marco temporal H1, intervalo de prueba 2021.01.01 - 2021.12.31.

Los principales resultados de cada prueba se muestran en la siguiente tabla:

TypeInd
Total Net Profit
Gross Profit
Gross Loss
Total Trades
Classical 248.21
1 361.74
-1 113.53
823
Square -304.83
2 993.08
-3 297.91
3581
Modern -567.15
2 540.88
-3 108.03
3251

Curiosamente, la forma clásica de cálculo de la desviación estándar ha dado un resultado positivo inmediato, mientras que en las dos últimas variantes, el número de transacciones ha aumentado considerablemente. Esto puede indicar la necesidad de aumentar los niveles de activación del indicador. Así, el número de transacciones disminuirá y posiblemente aumentará su eficacia. En la siguiente figura se muestra un ejemplo de la curva de balance para la versión clásica.


Segundo paso

Hasta ahora, hemos usamos la desviación estándar para calcular el indicador. El uso de la desviación estándar para normalizar los valores solo se justificará si la distribución de los valores se produce según una ley normal. En el caso del indicador CCI, los datos de entrada serán las diferencias entre el precio y la media. Veamos cómo se distribuyen realmente.

Para resaltar las características del resultado, hemos reducido el tamaño de la muestra y eliminado los valores cero de la misma. Como podemos ver, el gráfico resulta bastante peculiar, y no se parece ni siquiera aproximadamente a un gráfico de distribución normal.

Si las diferencias se distribuyen según alguna ley empírica propia, podremos permitirnos no usar la desviación estándar. Entonces nuestro indicador se convertirá en una mitad de CCI.

Pensemos en lo que puede provocar semejante paso. Obviamente, sin el suavizado, la dispersión de valores del indicador resultará bastante grande y se verá un poco fuera de lugar. Además, los grandes movimientos de precio pueden afectar a la percepción visual del indicador. Sin embargo, estas desventajas no pueden superar una gran tentación.

Para calcular los valores del indicador CCI se usa una media simple. Una fórmula que todo el mundo conoce, pero que recordaremos aquí:

Pero, ¿qué hay detrás de esta fórmula? Puede ser la media aritmética, la esperanza matemática de una variable aleatoria y una ventana rectangular. Nos quedaremos con esta última opción. ¿Por qué una ventana rectangular? Todavía hay funciones de ventana que se pueden aplicar, ¿verdad?

Conozco una cincuentena de funciones de ventana con nombre propio. El número de funciones de ventana sin nombre propio es todavía mayor.

Para el experimento tomaremos una ventana rectangular, una ventana triangular y una ventana plana. Esta última función de ventana resulta bastante inusual, ya que algunos de sus factores de ponderación toman valores negativos. Tomaremos también tres ventanas asimétricas: con pesos lineales, de potencia y exponenciales. Las medias con pesos lineales y exponenciales están disponibles en la plataforma comercial , en el menú general Moving Average.
En la figura se muestra una vista general de todas las variantes (el indicador de más bajo es el CCI clásico).

Las opciones resultan todas bastante similares, pero sus niveles pueden variar bastante. Esto dependerá de la función de ventana que utilicemos: algunas se retrasan y los valores del indicador relativamente grandes pueden ser más comunes. Las otras características de las ventanas siguen al precio, y luego resultan más comunes las pequeñas variaciones.

Por si acaso, vamos a añadir dos opciones de suavizado al indicador. No cambiarán la esencia del cálculo, pero podrían hacer que el indicador resulte más atractivo visualmente.

 

Para probar este indicador hCCI, vamos a escribir otro asesor comercial. Las señales de apertura y cierre de posiciones serán exactamente las mismas que las del robot anterior. Los parámetros de prueba y su intervalo también serán los mismos que en el caso anterior.

En la siguiente tabla se muestran los principales resultados de las pruebas.

Window
Total Net Profit
Gross Profit
Gross Loss
Total Trades
Rectangular
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
Power
44.57
1 175.79
-1 131.22
561
Exponential
-317.41
725.11
-1 042.52
359

    De todas las funciones de ventana, solo la ventana exponencial ha dado un resultado negativo. Esto no significa que no sea buena para el trading, sino que sus parámetros necesitan un mayor ajuste. También debemos mejorar las reglas de cierre (aunque esto se aplica a todas las variantes de este experto). La ilustración muestra la curva de balance de un asesor con la función de ventana LWMA.



    Tercer paso

    Hasta ahora hemos analizado el indicador CCI como un oscilador, pero sería interesante trasladarlo al gráfico principal y ver cómo se representaría en él. Veamos cómo podemos lograrlo.

    La mayoría de los osciladores se basan en el sencillo principio de suprimir la señal principal para destacar los movimientos sutiles del precio, por consiguiente, para transferir el indicador al gráfico principal, deberemos añadir una señal de apoyo a su valor. En el caso de CCI, podremos utilizar como señal el precio actual o la media. Las fórmulas para calcular el valor del indicador serán entonces las siguientes:

     

    Ambas opciones son insostenibles. Sus valores pueden desviarse mucho de la línea de precios, pero esta desventaja se compensa con el hecho de que ambos indicadores pueden resaltar bien los movimientos de tendencia de los precios.


     


    Conclusión

    Los indicadores presentados desarrollan los principios del indicador CCI clásico. Una ventaja indudable de los nuevos indicadores es que pueden configurarse según las necesidades del tráder.

    Parámetros del indicador:

    El indicador pCCI

     

    • TypeInd – establece la forma de cálculo de los valores de los indicadores;
    • iPeriod – periodo del indicador, valor mínimo 2;
    • iLevel – valor de los niveles del indicador, valor válido entre 1 y 99.

       Indicador hCCI

    • Window – tipo de la función de ventana utilizada;
    • Smoothing – suavizado utilizado;
    • iPeriod – periodo del indicador, valor mínimo 2;
    • iLevel – valor de los niveles del indicador, valor válido entre 1 y 99.

      Indicador lCCI

    • Window – tipo de la función de ventana utilizada;
    • Direct – tipo de señal de apoyo;
    • iPeriod – periodo del indicador, valor mínimo 2.

      Script Difference Distribution

    • Length – periodo de la media móvil;
    • Level – valor máximo de la muestra;
    • ViewDuration – duración de la representación;
    • ScreenShot – Si el parámetro está activado, el gráfico se guardará en la carpeta Files.

    Asesor comercial EA pCCI

    Todos sus parámetros son los mismos que los del indicador pCCI.  Las señales de apertura y cierre de posiciones tienen lugar en la apertura de una nueva barra.

      Asesor comercial EA hCCI

      Sus principales ajustes se corresponden con los del indicador hCCI. 

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

      Archivos adjuntos |
      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)
      DoEasy. Elementos de control (Parte 13): Optimizando la interacción de los objetos WinForms con el ratón. Comenzamos el desarrollo del objeto WinForms TabControl DoEasy. Elementos de control (Parte 13): Optimizando la interacción de los objetos WinForms con el ratón. Comenzamos el desarrollo del objeto WinForms TabControl
      En el presente artículo, corregiremos y optimizaremos el procesamiento de la apariencia de los objetos WinForms después de mover el cursor del ratón lejos del objeto y comenzaremos a desarrollar el objeto TabControl WinForms.
      DoEasy. Elementos de control (Parte 12): Objeto de lista básico, objetos WinForms ListBox y ButtonListBox DoEasy. Elementos de control (Parte 12): Objeto de lista básico, objetos WinForms ListBox y ButtonListBox
      En este artículo, crearemos un objeto de lista básico de objetos WinForms y dos nuevos objetos: ListBox y ButtonListBox.
      Creación simple de indicadores complejos usando objetos Creación simple de indicadores complejos usando objetos
      El artículo presenta un método para crear indicadores complejos que nos evitará problemas al trabajar con múltiples gráficos y búferes, así como al combinar datos de varias fuentes.
      Experimentos con redes neuronales (Parte 2): Optimización inteligente de una red neuronal Experimentos con redes neuronales (Parte 2): Optimización inteligente de una red neuronal
      Las redes neuronales lo son todo. Vamos a comprobar en la práctica si esto es así. MetaTrader 5 como herramienta autosuficiente para el uso de redes neuronales en el trading. Una explicación sencilla.