MetaTrader5
Cycle Period : Un Indicateur Clé pour MetaTrader 5
Auteur :
Witold Wozniak
L'indicateur Cycle Period a été conçu pour mesurer la périodicité des variations de prix d'un actif financier. Il stocke dans son tampon d'indicateur les valeurs actuelles des cycles du marché, qui, comme vous le savez, ne peuvent jamais être stables pour des raisons évidentes. Cet indicateur est destiné à être utilisé avec des oscillateurs, permettant ainsi leur adaptation aux cycles de marché en constante évolution.
L'inspiration de cet indicateur provient d'un article de John Ehlers intitulé "Using The Fisher Transform", publié en novembre 2002 dans le magazine "Technical Analysis Of Stock & Commodities".
Pour utiliser l'indicateur Cycle Period dans le code d'un autre indicateur (par exemple, l'oscillateur RVI), vous devez déclarer la variable d'handle de l'indicateur au niveau global :
//---- déclaration des variables entières pour les handles des indicateurs
int CP_Handle;
Ensuite, il faut récupérer l'handle de l'indicateur Cycle Period dans le bloc d'initialisation de l'indicateur RVI :
//---- obtention de l'handle de l'indicateur Cycle Period
CP_Handle=iCustom(NULL,0,"CyclePeriod",Alpha);
if(CP_Handle==INVALID_HANDLE)
{
Print(" Échec de l'obtention de l'handle de l'indicateur Cycle Period");
return(1);
}
Nous avons maintenant la nouvelle variable Alpha, qui est le paramètre d'entrée de l'indicateur utilisé et le ratio d'average. Cette variable doit être transformée en variable d'entrée pour l'indicateur développé.
//+----------------------------------------------+
//| Paramètres d'entrée de l'indicateur |
//+----------------------------------------------+
input double Alpha=0.07; // Ratio de lissage de l'indicateur
Il faut retirer la variable d'entrée précédente Length de la liste des paramètres d'entrée et la transformer en variable locale dans la fonction OnCalculate().
La taille des tableaux utilisés pour le lissage de l'indicateur est déterminée par la valeur du paramètre Length :
//---- Distribution de la mémoire pour les tableaux de variables
ArrayResize(Count,Length);
ArrayResize(Value1,Length);
ArrayResize(Value2,Length);
La valeur de ce paramètre change maintenant. Il est donc préférable de définir la taille de ces tableaux pour qu'elle ne soit pas inférieure à la valeur maximale supposée de cette variable.
En analysant les graphiques de l'indicateur, nous constatons que cette valeur n'excède pas 100. Par conséquent, les tailles des tableaux auront la même valeur :
//---- Distribution de la mémoire pour les tableaux de variables
ArrayResize(Count,MAXPERIOD);
ArrayResize(Value1,MAXPERIOD);
ArrayResize(Value2,MAXPERIOD);
De plus, les valeurs de période pour la barre actuelle dans le bloc OnCalculate() doivent être extraites du tampon de l'indicateur personnalisé CyclePeriod afin de les utiliser à la place de la valeur de l'ancien paramètre d'entrée Length.
//---- boucle principale de calcul de l'indicateur
for(bar=first; bar<rates_total && !IsStopped(); bar++)
{
//---- copier les nouvelles données dans le tableau
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; // ajustement du lissage au nombre réel de barres
Dans ce cas, quatre dernières valeurs sont extraites du tampon de l'indicateur CyclePeriod, et un lissage pondéré est effectué. Ensuite, cette valeur est utilisée comme période de lissage pour Length. Enfin, la ligne à la fin du code de l'indicateur doit être modifiée :
if(bar<rates_total-1) Recount_ArrayZeroPos(Count,MAXPERIOD);
En résultat, nous avons obtenu l'oscillateur Adaptive RVI :
2011.11.23