MetaTrader5
Ciclo de Periodos: Indicador Esencial para MetaTrader 5
Autor original:
Witold Wozniak
El indicador Ciclo de Periodos está diseñado para medir la periodicidad del cambio en el precio de un activo financiero. Este indicador almacena en su buffer los valores actuales del ciclo del mercado, que lógicamente nunca son estables. Su propósito es ser utilizado junto a osciladores para adaptar su funcionamiento a los ciclos del mercado que están en constante cambio.
La creación de este indicador se inspira en el artículo de John Ehlers titulado "Usando la Transformación de Fisher", publicado en noviembre de 2002 en la revista "Análisis Técnico de Acciones y Commodities".
El handle del indicador Ciclo de Periodos debe ser declarado a nivel global para que pueda ser utilizado en el código de otro indicador (por ejemplo, en el oscilador RVI):
//---- declaración de variables enteras para los handles de los indicadores
int CP_Handle;
Luego, el handle del indicador Ciclo de Periodos debe obtenerse en el bloque de inicialización del indicador RVI:
//---- obteniendo el handle del indicador Ciclo de Periodos
CP_Handle=iCustom(NULL,0,"Ciclo de Periodos",Alpha);
if(CP_Handle==INVALID_HANDLE)
{
Print(" Error al obtener el handle del indicador Ciclo de Periodos");
return(1);
}
Ahora, tenemos la nueva variable Alpha, que es el parámetro de entrada del indicador utilizado y el ratio de promediado del periodo. Esta variable debe ser transformada en la variable de entrada del indicador desarrollado.
//+----------------------------------------------+
//| Parámetros de entrada del indicador |
//+----------------------------------------------+
input double Alpha=0.07; // Ratio de suavizado del indicador
La anterior variable de entrada Length debe eliminarse de la lista de parámetros de entrada y transformarse en una variable local dentro de la función OnCalculate().
El tamaño de los arreglos utilizados para el suavizado del indicador se fija mediante el valor del parámetro Length:
//---- Distribución de memoria para los arreglos de variables
ArrayResize(Count,Length);
ArrayResize(Value1,Length);
ArrayResize(Value2,Length);
El valor de este parámetro está cambiando. Por lo tanto, es mejor establecer los tamaños de estos arreglos en no menos que el valor máximo asumido de esta variable.
Al analizar los gráficos del indicador, podemos observar que este valor no excede los 100. Por lo tanto, los tamaños de los arreglos tendrán el mismo valor:
//---- Distribución de memoria para los arreglos de variables
ArrayResize(Count,MAXPERIOD);
ArrayResize(Value1,MAXPERIOD);
ArrayResize(Value2,MAXPERIOD);
A partir de aquí, los valores de periodo para la barra actual en el bloque OnCalculate() deben tomarse del buffer del indicador personalizado Ciclo de Periodos para poder ser utilizados en lugar del valor del anterior parámetro de entrada Length.
//---- bucle principal de cálculo del indicador
for(bar=first; bar<rates_total && !IsStopped(); bar++)
{
//---- copia de los nuevos datos en el arreglo
if(CopyBuffer(CP_Handle,0,rates_total-1-bar,4,period)<=0) return(RESET);
Length=int(MathFloor((4.0*period[0]+3.0*period[1]+2.0*period[2]+period[3])/20.0));
if(bar<Length) Length=bar; // limitando el suavizado al número real de barras
En este caso, se toman los cuatro últimos valores del buffer del indicador Ciclo de Periodos y se realiza un suavizado ponderado lineal, después del cual el valor obtenido se utiliza como periodo de suavizado Length. Y, finalmente, la línea al final del código del indicador debe ser modificada:
if(bar<rates_total-1) Recount_ArrayZeroPos(Count,MAXPERIOD);
Como resultado, hemos obtenido el oscilador RVI Adaptativo:
2011.11.23