English Русский 中文 Español Deutsch 日本語 Português 한국어 Italiano Türkçe
Indicateurs et Systèmes de Trading de William Blau en MQL5. partie 1: Indicateurs

Indicateurs et Systèmes de Trading de William Blau en MQL5. partie 1: Indicateurs

MetaTrader 5Systèmes de trading | 17 novembre 2021, 16:53
954 0
Andrey F. Zelinsky
Andrey F. Zelinsky

Le trading technique ne peut être exploité que si de bons outils sont disponibles.
Les outils d'un bon trader sont l'expérience, le jugement et une hiérarchie mathématique fournie par un bon programme informatique de trading.
William Blau

Introduction

La première partie de l'article "Indicateurs et Systèmes de Trading en MQL5 par William Blau. partie 1: Indicateurs " est une description des indicateurs et des oscillateurs, décrits par William Blau dans le livre"Momentum, Direction, and Divergence".

Les indicateurs et oscillateurs, décrits dans cet article, sont présentés sous forme de codes source en langage MQL5 et joints dans le fichier archive "Blau_Indicators_MQL5_en.zip".

L'idée principale de l'analyse par William Blau

L'analyse technique de William Blau comprend quatre phases :

  1. En utilisant les données en série de prix (barres q), l'indicateur est calculé et tracé au graphique. L'indicateur ne reflète pas la tendance générale du mouvement des prix, et ne permet pas de déterminer les points d'inversion de tendance.
  2. L'indicateur est lissé plusieurs fois selon la méthode EMA : la première fois (avec période r), la deuxième fois (avec période s), et la troisième fois (avec période u) ; un indicateur lissé est tracé. Un indicateur lissé assez fidèlement et qui reproduit les fluctuations de prix avec un minimum de décalage. Il permet de déterminer la tendance du mouvement des prix et les points d’inversion et élimine le bruit des prix.
  3. L'indicateur lissé est normalisé, un indicateur lissé normalisé est tracé. La normalisation permet à la valeur de l'indicateur d'être interprétée comme les états de surachat ou de survente du marché.
  4. Un indicateur lissé normalisé est lissé une fois par la méthode EMA (période ul) ; un oscillateur est construit - l'histogramme de l'indicateur et la ligne de signal, les niveaux de surachat et de survente du marché sont ajoutés. Oscillateur nous permet de distinguer les états de surachat/survente du marché, les points de retournement et la fin d'une tendance.

Indicateurs

L'article décrit les groupes d'indicateurs suivants :

  1. Indicateurs, basés sur la Dynamique :
  2. Indicateurs, basés sur le Stochastique :
  3. Indicateurs, basés sur la Dynamique Stochastique :
  4. Indicateurs, basés sur un Écart Moyen par rapport aux tendances du marché 
  5. Indicateurs basés sur la Moyenne Mobile de convergence/divergence :
  6. Indicateurs, basés sur la Dynamique Chandelier:
  7. Indicateurs, basés sur un Dynamique Haut-Bas Composite :

Pour chaque groupe d'indicateurs, les éléments suivants sont présentés :

  • Indice indicateur lissé ;
  • L'indice de l'indicateur lissé normalisé ;
  • L'oscillateur, basé sur l'indice de l'indice lissé normalisé.

La section Indice de Force Véritable comporte :

  • Une analyse détaillée de l'approche de William Blau dans l'aspect de l'analyse technique du graphique des prix ;
  • Une description détaillée de l'algorithme et du code de chaque indicateur des groupes d'indicateurs axés sur la Dynamique.

Comme méthode de lissage, William Blau utilise le exponentially smoothedMovings (EMA). La Moyenne Mobile Exponentielle est calculée en ajoutant à la valeur précédente de la Moyenne Mobile, une certaine proportion du prix actuel.

Lors de l'utilisation de l' EMA, les derniers prix ont un poids plus important.

La fonction de calcul de l' EMA :

EMA(k,n) = EMA(k-1,n) + 2/(n+1) * (price(k) - EMA(k-1,n))
         = price(k) * 2/(n+1) + EMA(k-1,n) * (1 - 2/(n+1))

Où :

  • EMA(k,n) - moyenne mobile exponentiellement lissée de la période n pour le moment de la période k ;
  • price(k) - le prix au moment de la période k.

La description des quatre types de moyennes mobiles et les méthodes de leur utilisation dans l'analyse technique (voir aussi iMA) se trouvent dans l'Aide MetaTrader 5 "Analytics/Technical Indicators/Trend Indicators/Moving Average").

La Bibliothèque de Fonctions

La bibliothèque de fonctions de calcul des moyennes mobiles se trouve dans le fichier "MovingAverages.mqh". Nous nous intéressons à ExponentialMAOnBuffer(), qui remplit le tampon du tableau de sortie[] avec les valeurs EMA du prix du tableau d'entrée[]. Cependant, l'implémentation de ExponentialMAOnBuffer() présentée dans le "MovingAverages.mqh" a l'inconvénient de ne pas fonctionner avec la période n=1.

Voir dans le code source :

if(period<=1 || rates_total-begin<period) return(0);

Cependant, William Blau dans son livre utilise la période de lissage n = 1 comme l'absence de lissage.

Par conséquent, le code de la fonction ExponentialMAOnBuffer() a subi quelques modifications :

if(period<1 || rates_total-begin<period) return(0);

et nous obtenons le ExponentialMAOnBufferWB(). Le code de cette fonction se trouve dans le fichier "WilliamBlau.mqh".

Le fichier "WilliamBlau.mqh" présente également les fonctions suivantes :

  • La fonction PriceName() renvoie le type de prix sous forme de chaîne :
string PriceName(
                 const int applied_price // price type
                )
  • La fonction CalculatePriceBuffer() calcule le tableau des prix de ce type de prix :
int CalculatePriceBuffer(
                         const int applied_price,   // price type
                         const int rates_total,     // rates total
                         const int prev_calculated, // bars, processed at the last call
                         const double &Open[],      // Open[]
                         const double &High[],      // High[]
                         const double &Low[],       // Low[]
                         const double &Close[],     // Close[]
                         double &Price[]           // calculated prices array
                        )

Le type de prix appliqué et la période de temps du tableau des prix

William Blau considère les cours de clôture de la période quotidienne. Les indicateurs, développés dans cet article, permettent de choisir le type de prix (voir constantes de prix) l'horizon temporel du graphique des prix dépend de l'horizon temporel de l'indicateur (voir les délais du graphique).

 

1. L'Indice de Force Véritable

Les indicateurs pris en compte (voir pièce jointe) :

  1. Blau_Mtm.mq5 - Indicateur du taux (Dynamique q-période; Dynamique q-période lissée);
  2. Blau_TSI.mq5 - Indice des forces réelles (Dynamique de période-q lissée normalisée) ;
  3. Blau_Ergodic.mq5 - Oscillateur ergodique (basé sur l'Indice de Force Réelle).

1.1. Dynamique

La description de l'indicateur technique intégré Momentum, et son utilisation est dans l'analyse technique peut être trouvée dans la section "Analytics/Technical Indicators/Oscillators/Momentum" (voir aussi iMomentum). Contrairement à la Dynamique standard (iMomentum), la Dynamique de William Blau calcule la Dynamique comme la variation absoluedu prix.

Un exemple de l'implémentation MQL5 du True Strength Indicator (TSI) par William Blau est présenté dans l'article "MQL5 : Créez votre propre indicateur".


1.1.1. Analyse technique à l'aide de l'indicateur Dynamique

L'objet de l'analyse technique est le tableau des prix de l'instrument financier. Chaque élément du graphique est une barre de prix. La barre de prix présente les caractéristiques suivantes : heure d'ouverture, cours d'ouverture, cours maximum, cours minimum, cours de clôture, volumes de trading et autres. La barre de prix est formée et reflète l’attitude des prix au cours d'une période de temps discrète spécifique (période du graphique).

La tâche de l'analyse technique du graphique des prix est de déterminer la tendance actuelle du mouvement des prix, de révéler les pics et les bas des prix et de prédire le sens de changement de prix dans la période à venir. La complexité de ceci, c'est que le prix, tout en se déplaçant dans les limites de sa tendance de base, fait des fluctuations multidirectionnelles entraînant un soi-disant prix-bruit.

Ce que William Blau a suggéré Première différence : la Dynamique. William Blau a calculé la Dynamique par rapport au changement de prix [de clôture] pour chaque période de [jour] ; et a créé l'indicateur Dynamique. D'un point de vue mathématique, la fonction Dynamique est la première dérivée du prix.

1.1. Indicateur de Dynamique (Dynamique de période-q)

Fig. 1.1. Indicateur de Dynamique (Dynamique de période-q)

La Dynamique affiche les fluctuations de prix sur une période d'un jour, montre la vitesse (l'amplitude) et la direction des changements de prix au cours de cette période, mais il ne reflète pas la tendance générale du mouvement des prix et ne détermine pas les points d'inversion de tendance.

La deuxième différence est le lissage. La moyenne mobile de la Dynamique (la somme cumulée des fluctuations quotidiennes des prix) reproduit presque exactement à la fois les variations majeures et locales des prix de la courbe La figure 1.2 (a) dans les sous-fenêtres I, II présente la Dynamique lissée (moyennes mobiles avec les périodes 20 et 300, respectivement).

Plus la période de la moyenne mobile est élevée,plus précisément la Dynamique lissée se rapproche (reproduit) des fluctuations de la courbe des prix D'un point de vue mathématique, la fonction de lissage de la Dynamique est la fonction intégrale de la Dynamique, ou la fonction restaurée du prix.

1.2 (a). Indicateur de Dynamique (Dynamique de période-q lissée)

Fig 1.2 (a). Indicateur de Dynamique (Dynamique de période-q lissée)


1.2 (b). Indicateur de la Dynamique (Dynamique de période-q lissée)

Fig 1.2 (b). Indicateur de Dynamique (Dynamique de période-q lissée)


Dans la figure 1.2 (a), dans la fenêtre principale, les indicateurs lissés EMA (avec des périodes de 5, 20, 100) sont présentés. Une légère augmentation de la période de la moyenne mobile entraîne un décalage et la moyenne mobile devient pratiquement incapable de reproduire les fluctuations de la courbe des prix.

La troisième différence est le re-lissage. Le premier lissage de la Dynamique définit la tendance principale du mouvement des prix, ainsi que les points de retournement, mais n'élimine pas le bruit. Pour éliminer le bruit des prix, un re-lissage est nécessaire avec une petite période de la moyenne mobile.

Fig. 1.2 (b), dans la sous-fenêtre I présente l'indicateur Dynamique lissé (moyenne mobile avec période 20), les sous-fenêtres II et III présentent le Dynamique double et triple lissé (périodes de moyenne mobile de 5, 3) . Un lissage à répétition élimine le bruit de prix, mais ajoute un léger décalage de la courbe (un décalage).

La quatrième différence : la différence dans un signal de tendances changeantes. Le lissage de la Dynamique avec une petite période de moyenne peut conduire à une divergence de la Dynamique lissée avec l’évolution de la courbe des prix.

Sur la figure 1.2 (a), l’écart est observé dans la sous-fenêtre I, et sur la figure 1.2 (b) - dans les sous-fenêtres I, II, III (la direction des changements de prix diverge de la direction de la variation de la Dynamique lissée). De telles différences indiquent souvent un changement de tendance. D'un point de vue mathématique, la divergence est une fonction de la période de lissage.

La fiabilité de l'interprétation de ces différences en tant que signal de changement de tendance peut être améliorée si l'on considère la divergence uniquement pour les zones de surachat ou de survente (voir п. 1.2.1).


1.1.2. Définition du Dynamique

Le Dynamique est un changement de prix relatif.

Le signe du Dynamique montre la direction du changement de prix : un Dynamique positif - le prix a augmenté sur la période, un négatif - le prix a baissé sur la période. L'ampleur du Dynamique - est la vitesse relative du changement de prix (première dérivée du prix).

1.3. Définition de la  Dynamique

Fig. 1.3. Définition de la Dynamique

Formule de la Dynamique :

mtm(price) = price - price[1]

Où :

  • prix - prix [clôture] de la période en cours;
  • prix [1] - prix de [clôture] de la période précédente.

William Blau examine le Dynamique comme la différence entre le prix de [clôture] de la période en cours et le prix de [clôture] de la période précédente. William Blau, dans son calcul d'un Dynamique à une seule période, utilise les prix de deux périodes (la période actuelle et la période précédente).

Nous introduisons dans la formule de calcul de la dynamique de la période d’indicateur de période, q - est le nombre de périodes de temps impliquées dans le calcul (par William Blau q = 2).

Formule de Q-période Dynamique :

mtm(price,q) = price - price[q-1]

Où :

  • q - nombre de barres, utilisé dans le calcul de la dynamique ;
  • prix - prix [clôture] de la période en cours;
  • prix [q-1] - prix de [clôture] (q-1) périodes antérieures.

Dans la formule résultante, notre Dynamique à deux périodes correspond à une Dynamique relative de une période de William Blau.

Formule d'une Q-période Dynamique lissée :

Mtm(price,q,r,s,u) = EMA(EMA(EMA( mtm(price,q) ,r),s),u)

Où :

  • prix - prix de [clôture] - la base de prix du graphique des prix ;
  • q - nombre de barres, utilisé dans le calcul du Dynamique ;
  • mtm(prix,q)=prix-prix[q-1] - Dynamique de période-q ;
  • EMA (mtm (prix, q), r) - le premier lissage - l'EMA(r), appliqué au Dynamique de la q-période ;
  • EMA (EMA(..., r),s) - le deuxième lissage - le(s) EMA(s), appliqué(s) au résultat du 1er lissage ;
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - l'EMA(u), appliqué au résultat du 2ème lissage.

1.1.3. Mtm(price,q,r,s,u) - indicateur de taux (Dynamique). Spécifications
  • Nom de fichier: Blau_Mtm.mq5
  • Le nom : Dynamique (Dynamique de période-q; Dynamique de période-q lissé) par William Blau.
  • Paramètres d’entrée:
    • q - la période pour laquelle la Dynamique est calculée (par défaut q = 2);
    • r -période du 1er EMA, appliqué à la Dynamique (par défaut r = 20);
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3e EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifications du rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, le lissage EMA n'est pas utilisé. Par exemple, si vous définissez Mtm (prix, 2,20,5,1), nous obtenons une dynamique doublement lissée, mais si vous définissez Mtm (prix, 2,1,1,1), nous obtenons une dynamique non lissée ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

1.2. L'indice des vraies forces

1.2.1. Analyse technique utilisant le True Strength Indice

Suite Voir le début dans la section 1.1.1.

Le cinquième : la normalisation. Faire passer la normalisation des valeurs du Dynamique lissé à une seule échelle (mise en correspondance avec l'intervalle [-1, +1]), permet de déterminer les états de surachat ou de survente du marché. Multiplication répétée des valeurs ​​de la dynamique lissée et normalisée, un facteur de 100 convertit la série numérique dans la plage de pourcentage (correspondance à l'intervalle [-100, 100]).

1.4. Dynamique lissée normalisée

Fig. 1.4. Dynamique Lissée Normalisée


Un écart en tant que signal de tendances changeantes peut être considéré comme fiable si la Dynamique lissée normalisée est en état de surachat ou de survente.


1.2.2. La définition de l’Indice de Force Véritable

L’Indice de la Force Véritable (True Strength Indice, TSI) - est un indicateur de la Dynamique normalisée (Dynamique Q-période normalisée). Porter les valeurs de la ​Le Dynamique lissée à une seule échelle (correspondant à l'intervalle [-1, +1]) est fournie avec la normalisation de chaque valeur de Dynamique lissée (la somme cumulée des fluctuations de prix lissées sur la période-q) par la valeur de la Dynamique lissée, prise en valeur absolue.

La multiplication par un coefficient de 100 change l'intervalle de l'affichage en [-100, +100] (pourcentage). La normalisation permet d'interpréter la valeur TSI comme un niveau de marché suracheté (positif) ou survendu (négatif).

La formule d’ Indice de Force Véritable :

                     100 * EMA(EMA(EMA( mtm(price,q) ,r),s),u)         100 * Mtm(price,q,r,s,u)
TSI(price,q,r,s,u) = –––––––––––––––––––––––––------–––––––––– = ––––––––––––––––------–––––––––––––––
                       EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)     EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)
if EMA(EMA(EMA(|mtm(price,q)|,r),s),u)=0, then TSI(price,q,r,s,u)=0

Où :

  • prix - prix de [clôture] - la base de prix du graphique des prix ;
  • q - période de la Dynamique ;
  • mtm(price,q)=price-price[q-1] - Dynamique q-période ;
  • | Mtm (prix, q) | - la valeur absolue de la Q-période de Dynamique ;
  • Mtm (prix, q, r, s, u) - Dynamique de période-q lissé trois fois ;
  • EMA (..., r) - le premier lissage - l'EMA de la période r, appliqué à :
    1) Dynamique de la période-q ;
    2) valeur absolue du Dynamique de la période-q ;
  • EMA (EMA(..., r),s) - le deuxième lissage - le(s) EMA(s), appliqué(s) au résultat du 1er lissage ;
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - EMA(u), appliqué au résultat du 2ème lissage.

1.2.3. TSI (prix, q, r, s, u) - l'Indice de Force Véritable. Spécifications
  • Nom de fichier: Blau_TSI.mq5
  • Le nom : Le True Strength Indice (Dynamique relative de période-q lissée normalisée) par William Blau.
  • Paramètres d’entrée:
    • q - la période pour laquelle la dynamique est calculée (par défaut q = 2);
    • r -période du 1er EMA, appliqué à la Dynamique (par défaut r = 20);
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • (facultatif) deux niveaux (la valeur par défaut est -25 et +25) - ajoute/supprime un niveau ; changer la valeur, la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, alors dans la période EMA correspondante, le lissage ne sera pas effectué ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

1.3. Oscillateur ergodique

1.3.1. Analyse technique à l'aide de l'oscillateur ergodique

Suite Voir le début dans les Secs. 1.1.1, 1.2.1.

Sixièmement : les zones d'un marché suracheté et survendu. Intervalle unitaire [-1, +1] ou un intervalle de pourcentage [-100.100], au sein duquel des changements se produisent dans les valeurs ​​de la Dynamique lissée et normalisée, vous permet de définir les zones de surachat ou de survente du marché.

La classe d'indices d'analyse technique, qui caractérise l'état de marché suracheté ou survendu, est appelée l'oscillateur. Pour chaque oscillateur, des niveaux sont déterminés, à l'approche desquels, les signaux d'un marché de surachat ou de survente sont reçus. Les oscillateurs sont inefficaces sur les marchés en tendance, car le marché peut être dans des conditions de surachat/survente pendant une période arbitrairement longue.

Septième: Ligne de Signal Pour obtenir un signal sur la fin d'une tendance et une tendance d'inversion d'un mouvement de prix, une ligne de signal est utilisée. Le signal d'achat est reçu lorsque la ligne principale croise la ligne de signal de bas en haut. Le signal de vente est reçu lorsque la ligne principale croise la ligne de signal de haut en bas. Dans le cas où il y a une ligne principale - il s'agit d'un ergodique (indice de force véritable), alors un re-lissage de l'ergodique forme une ligne de signal. La procédure de re-lissage est égale au dernier processus de lissage ergodique.

Huitièmement : la tendance du mouvement des prix. La tendance du mouvement des prix est à la hausse (tendance à la hausse), lorsque la ligne principale (ergodique) passe au-dessus de la ligne de signal. La tendance du mouvement des prix est à la baisse (tendance à la baisse), lorsque la ligne principale (ergodique) passe sous la ligne de signal.

1.5. Oscillateur ergodique

Fig. 1.5. Oscillateur ergodique


1.3.2. Définition de l'oscillateur ergodique

Ergodic(price,q,r,s,u) = TSI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( Ergodic(price,q,r,s,u) ,ul)

Où :

  • Ergodic() - ergodique - Indice de Force véritable TSI(price,q,r,s,u);
  • Le SignalLine() - une ligne de signal - le EMA(ul), appliquée à l'ergodique ;
  • ul - une période EMA d'une ligne de signal - selon William Blau, la valeur ul doit être égale à la période du dernier significatif (>1) de l'EMA ergodique. Par exemple, si vous utilisez un double lissage Ergodic (prix, q, r, s, u) = Ergodic (prix, 2,20,5,1), alors par William Blau ul = s = 5.

1.3.3. Ergodic (prix, q,r,s,u,ul) - oscillateur ergodique. Spécifications
  • Nom de fichier: Blau_Ergodic.mq5
  • Nom: Oscillateur ergodique (basé sur un véritable indice de force) par William Blau.
  • Paramètres d’entrée:
    • tracé graphique #0 - Ergodic (un véritable indice de force) :
      • q - la période pour laquelle la dynamique est calculée (par défaut q = 2);
      • r -période du 1er EMA, appliqué à la Dynamique (par défaut r = 20);
      • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
      • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • tracé graphique n°1 - la ligne de signal :
      • ul - période de ligne de signal EMA, est appliquée à l'ergodique (par défaut ul = 3);
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu de chaque tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • deux niveaux (par défaut -25 et +25) - ajouter/supprimer un niveau, changer la valeur, la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les bornes inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, le lissage EMA n'est pas utilisé ;
    • ul>0. Si ul = 1, alors la ligne de signal et les lignes ergodiques sont les mêmes ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u + ul-4 +1).

1.4. Le Code (description détaillée)

1.4.1. "Blau_Mtm.mq5" - indicateur Mtm(price,q,r,s,u) - Dynamique

Le code de l'indicateur Mtm (prix,q,r,s,u) :

//+------------------------------------------------------------------+
//|                                                     Blau_Mtm.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window     // indicator in a separate window
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots
//--- main graphic plot #0
#property indicator_label1  "Mtm"       // graphic plot label #0
#property indicator_type1   DRAW_LINE   // draw as a line
#property indicator_color1  Blue        // color
#property indicator_style1  STYLE_SOLID // line style - solid line
#property indicator_width1  1           // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA
//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes
int    rates_total_min; // total rates min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // plot buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
   // buffers for intermediate calculations
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");             // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // applied price
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[] arrays
                        PriceBuffer          // price buffer
                       );
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Examinons le code en détail.


1.4.1.1. Paramètres de l'indicateur Mtm (prix, q, r, s, u)

Littérature

Que lire sur les paramètres de l'indicateur dans la référence MQL5 :

  1. Section "Indicateurs personnalisés".
  2. La rapport entre les propriétés de l'indicateur et les fonctions correspondantes (Voir « Indicateurs personnalisés »).
  3. Propriétés des programmes (propriété #) (Voir « Bases du langage/Préprocesseur »).
  4. Styles de rendu (propriétés du tracé graphique) (Voir la section "Constantes standard, énumérations et structures / Constantes d'indicateur").
  5. Propriétés des indicateurs personnalisés (Voir la section "Constantes, énumérations et structures standard / Constantes d'indicateur").
Droits d’auteur Description de l'indicateur
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // url
#property description "q-period Momentum (William Blau)"        // description

Paramètres uniquement via l’ instruction de préprocesseur #property. Le droit d'auteur (paramètres copyright et lien), la version (la version du paramètre) et une description du programme mql5 (description du paramètre) sont affichés dans les "Propriétés" de la fenêtre d'indicateur (l'onglet "Propriétés", case "Supplémentaire") .

Inclure le fichier
#include <WilliamBlau.mqh>              // include file (terminal_data_folder\MQL5\Include)

Le préprocesseur remplace la ligne #Include <WilliamBlau.mqh> par le contenu du fichier "WilliamBlau.mqh". Les crochets angulaires indiquent que le fichier "WilliamBlau.mqh" sera extrait du dossier de données du terminal. Pour plus d'informations, voir Inclusion de fichiers.

Sur le contenu du fichier "WilliamBlau.mqh" voir l'introduction.

Paramètres des indicateurs (en général)

L'indicateur personnalisé - est quelques parcelles graphiques. Le tracé graphique de l'indicateur peut être affiché soit dans la fenêtre principale du graphique des prix, soit dans une fenêtre séparée. Chaque tracé graphique dispose d’ une certaine méthode de dessin, une couleur, un style et une épaisseur.

Les données pour le rendu du tracé graphique sont extraites des tampons indicateurs (chaque tracé graphique correspond à un à cinq tampons indicateurs). Nous utilisons un tableau d'indicateurs comme tampon d'indicateurs.

Pour configurer l'indicateur, il faut (voir Fig. 1.6):

  1. indiquer la fenêtre d'affichage des indicateurs.
  2. indiquer nombre de tracés graphiques.
  3. Indiquer le nombre de tampons d'indicateur.
  4. Déclaration des tableaux d'indicateurs.
  5. Définir un lien : tableau d'indicateurs -> tampon d'indicateurs -> tracé graphique.
  6. Décrire les propriétés de chaque tracé graphique.
  7. indiquer la précision d'affichage des valeurs de l'indicateur.
  8. Préciser pour chaque construction graphique, le nombre de barres initiales sans le rendu du tracé graphique.
  9. Configurer les niveaux horizontaux et décrire les propriétés de chaque niveau horizontal (non présent).
  10. Définir les restrictions d'échelle pour la fenêtre d'indicateur séparée (non présente.)
  11. Indiquer le nom abrégé de l'indicateur.

1.6. Indicateur de Dynamique Mtm (prix, q, r, s, u)

Fig. 1.6. Indicateur Dynamique Mtm (prix, q, r, s, u)


Les réglages des indicateurs sont effectués :

Pour plus d'informations, voir Connexion entre les propriétés de l'indicateur et les fonctions correspondantes.

La différence dans les méthodes de configuration de l'indicateur est que les paramètres via l’instruction #property sont disponibles avant que l'indicateur ne soit attaché au tableau des prix, tandis que les paramètres via des fonctions spéciales sont disponibles après que l'indicateur est attaché au tableau des prix. La configuration des paramètres s'effectue à partir de la fenêtre "Propriétés" de l'indicateur.

Les réglages : une fenêtre d'affichage de l'indicateur (1)
#property indicator_separate_window     // indicator in a separate window

La configuration est obligatoire et n'est possible que via l’instruction de préprocesseur #property. Il existe deux options d'affichage de l'indicateur :

  1. Dans la fenêtre principale du graphique des prix - indicateur_chart_window;
  2. Dans une fenêtre séparée - indicateur_separate_window.
Paramètres Le nombre de tampons (3) et de tracés graphiques (2)
#property indicator_buffers 5           // number of buffers used
#property indicator_plots   1           // number of plots

La configuration est obligatoire et n'est possible que via l’instruction de préprocesseur #property. Le nombre de tampons d'indicateurs (paramètre indicateur_buffers) et le nombre de tracés graphiques (paramètre indicateur_plots) n'est pas limité.

Paramètres Tableaux d'indicateurs (4)
//--- dynamic arrays
double MainBuffer[];     // u-period 3rd EMA (for graphic plot #0)
double PriceBuffer[];    // price array
double MtmBuffer[];      // q-period Momentum
double EMA_MtmBuffer[];  // r-period 1st EMA
double DEMA_MtmBuffer[]; // s-period 2nd EMA

Les tableaux d'indicateurs sont déclarés au niveau global comme des tableaux dynamiques unidimensionnels de type double.

Paramètres Définir un lien (5) entre les tableaux d'indicateurs, les tampons d'indicateurs et les tracés graphiques.
// graphic plot #0
SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-period 3rd EMA
// buffers for intermediate calculations
SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // price buffer
SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-period Momentum
SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA
SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA

Le code est écrit dans la fonction OnInit() du gestionnaire d'événements Init().

Le lien du tampon indicateur avec le tableau unidimensionnel correspondant est établi avec la fonction SetIndexBuffer() :

bool SetIndexBuffer(
   int                 index,    // index of the indicator buffer (starts from 0)
   double              buffer[], // dynamic array
   ENUM_INDEXBUFFER_TYPE data_type // type of data, stored in the indicator array
   );

Le tampon indicateur est un tableau dynamique unidimensionnel de type double, dont la taille est contrôlée par le terminal client, de sorte qu'il corresponde toujours au nombre de barres à base desquelles l'indicateur est calculé. L'Indexation des tampons d’indicateur commence à partir de 0.

Un tampon indicateur peut stocker trois types de données : INDICATOR_DATA, INDICATOR_COLOR_INDEX, INDICATOR_CALCULATIONS. Chaque tracé graphique, dépendamment de la méthode de son affichage, peut correspondre à un à cinq tampons d'indicateur : une à quatre valeurs de tampon d'indicateur (type de données INDICATOR_DATA) et un tampon de couleur (type de données INDICATOR_COLOR_INDEX.)

Les tampons d'indicateurs avec les données de type INDICATOR_CALCULS sont conçus pour des calculs intermédiaires. Après la liaison, le tableau indicateur affichera une Indexation comme dans les tableaux conventionnels (voir ci-dessous dans la section 1.4.1.2).

Paramètres Propriétés des tracés graphiques (6)

Pour la configuration de chaque ensemble de tracés graphiques, les éléments suivants sont indiqués :

  1. Etiquette
  2. Type de dessin (voir les 18 types dans l'énumération ENUM_DRAW_TYPE) ;
  3. Couleur de Ligne
  4. Style de ligne (voir les styles possibles énumérés dans ENUM_LINE_STYLE) ;
  5. Largeur de Ligne

Il y a deux manières possibles de configurer :

1) Par le biais de l’ instruction de préprocesseur #property (implémentée de cette façon) :

//--- graphic plot #0 (Main)
#property indicator_label1  "Mtm"       // label of graphic plot #0
#property indicator_type1   DRAW_LINE   // Drawing type: DRAW_LINE - line
#property indicator_color1  Blue        // Line color - Blue
#property indicator_style1  STYLE_SOLID // Line style: STYLE_SOLID - solid line
#property indicator_width1  1           // Line width

2) Utilisation d'un groupe de fonctions des paramètres de propriétés du tracé graphique PlotIndexSetDouble(), PlotIndexSetInteger(), PlotIndiexSetString() :

//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");            // label
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // drawing type as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);       // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);          // line width

Le code est rédigé dans la fonction OnInit() du gestionnaire d'événements Init. Spécification de la fonction PlotIndexeSet *() :

bool PlotIndexSetDouble|Integer|String(
   int                             plot_index, // index of the graphic plot
   int                             prop_id,    // identifier of the property of the graphic plot
   double|int,char,bool,color|string  prop_value  // new value of the property
   );

Pour affiner l'affichage du type de tracé graphique sélectionné, nous utilisons les ID de propriété du tracé graphique, répertoriés dans l'énumération ENUM_PLOT_PROPERTY.

L'Indexation des tracés graphiques commence à partir de 0. En ce qui concerne la préférence de configuration via une instruction #property, voir ci-dessus dans la section "Indicator Preferences". Certaines propriétés des tracés graphiques (la couleur, le style, la largeur du trait) sont disposées pour la modification depuis la fenêtre "Propriétés" (l'onglet "Couleurs") de l'indicateur.

Paramètres La précision de l'affichage des valeurs de l'indicateur ​​(7)
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

Le code est écrit dans la fonction OnInit() du gestionnaire d'événements Init. La spécification de la fonction de configuration des paramètres de l'indicateur IndicatorSet * ():

bool IndicatorSetDouble|Integer|String(
   int                    prop_id,   // ID of indicator property
   double|int,color|string  prop_value // new value of a property
   );

Les identifiants des propriétés de l'indicateur sont listés dans l'énumération ENUM_CUSTOMIND_PROPERTY.

La précision de l'affichage des valeurs de l'indicateur n'est donnée que par la fonction IndicatorSetInteger(), l 'ID des propriétés de l'indicateur INDICATOR_DIGITS, l'énumération ENUM_CUSTOMIND_PROPERTY_INTEGER.

Dans un exemple où les valeurs ​​des tampons d'indicateur, qui sont destinés à afficher, sous affichage : à côté du nom abrégé de l'indicateur, dans un message contextuel, lorsque le pointeur de la souris est placé sur la ligne de l'indicateur - sera arrondi à _Digits - nombre de chiffres après la virgule dans le prix de l'instrument auquel est rattaché l'indicateur.

Paramètres Nombre de barres initiales sans rendu (8)

Les données pour le rendu de la période-q Dynamique de William Blau sont formées en quatre étapes :

Étape 1. Sur la base des données du tableau des prix PriceBuffer[], la Dynamique (la période q) est calculée. Les valeurs ​​de Dynamique de période-q sont placées dans le tableau MtmBuffer[]. Étant donné que l'Indexation du tableau des prix commence à partir de 0, les données importantes du tableau des prix commencent également à l'Indice 0, puis les données significatives du tableau MtmBuffer[] commencent par l'Indice (q-1).

Étape 2. Les données importantes du tableau MtmBuffer[] sont lissées (période de lissage r). Les valeurs ​​de la Dynamique lissée à la période-q sont placées dans le tableau EMA_MtmBuffer[]. Puisque l'Indexation du tableau MtmBuffer[] commence à partir de 0, les données importantes du tableau MtmBuffer[] commencent par l'Indice (q-1), puis les données importantes du tableau EMA_MtmBuffer[] commencent par l'Indice (q-1 ) + (r-1).

Les 3ème et 4ème étapes. Des considérations similaires sont accordées pour déterminer à partir de quelle barre commencent les données importantes dans le tableau DEMA_MtmBuffer[] (période de lissage s) et dans le tableau MainBuffer[] (période de lissage u). Voir la figure 1.7.

1.7. Les données significatives de l'indicateur Mtm (prix,q,r,s,u)Mtm (price,q,r,s,u)

Fig. 1.7. Les données importantes de l'indicateur Mtm (price,q,r,s,u)


Sur une échelle globale les variables sont déclarées :

//--- global variables
int    begin1, begin2, begin3, begin4; // data starting indexes

Les valeurs ​​des variables - est l'Indice de la barre, à partir de laquelle commencent les données importantes, dans le tableau correspondant à l'indicateur de variable. Valeurs variables ​sont calculées dans la fonction OnInit du gestionnaire d'événements Init() et seront utilisées dans la fonction OnCalculate() du gestionnaire d'événements Calculate.

//---
   begin1=q-1;        //                             - MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - MainBuffer[]
   //
   rates_total_min=begin4+1; // minimal size
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);

Le nombre de barres initiales sans affichage au niveau du tracé graphique est indiqué à l'aide de la fonction PlotIndexSetInteger(), l'identifiant de la propriété d'indicateur PLOT_DRAW_BEGIN énumérations ENUM_PLOT_PROPERTY_INTEGER.

Configuration: Le nom abrégé de l'indicateur (11)
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");

Le code est rédigé dans la fonction OnInit() du gestionnaire d'événements Init. Le nom court de l'indicateur est spécifié uniquement à l'aide de la fonction IndicatorSetString(), identifiant des propriétés de l'indicateur INDICATOR_SHORTNAME (énumération ENUM_CUSTOMIND_PROPERTY_STRING). La fonction PriceName () renvoie le nom du type de prix, selon la valeur du paramètre d'entrée AppliedPrice. Le code de la fonction PriceName() se trouve dans le fichier "WilliamBlau.mqh" (voir Introduction).

Paramètres d’entrée
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st EMA
input int    u=3;  // u - 3rd EMA, applied to the 2nd EMA
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type

Pour plus d'informations, voir variables d'entrée. Les paramètres d'entrée sont disposées pour modification depuis la fenêtre « Propriétés » (l'onglet « Inputs ») de l'indicateur.


1.4.1.2. Le calcul de l'indicateur Mtm (prix,q,r,s,u)

Calcul : L'algorithme

L'algorithme de calcul de l'indicateur Mtm(price,q,r,s,u) :

  1. Vérifiez s'il y a suffisamment de données pour calculer l'indicateur.
  2. Le calcul du tableau des prix en fonction du type de prix indiqué - formation du tableau PriceBuffer[]
  3. La détermination de la barre d'Indice, à partir de laquelle commencer/continuer le calcul du Dynamique de la période-q.
  4. Le calcul de la dynamique de la période-q - le remplissage du tableau MtmBuffer[].
  5. Le premier lissage par la méthode EMA (période r) - le remplissage du tableau EMA_MtmBuffer[].
  6. Le deuxième lissage par la méthode EMA (période s) - le remplissage du tableau DEMA_MtmBuffer[].
  7. Le troisième lissage par la méthode EMA (période u) - le remplissage du tableau MainBuffer[] - le calcul des valeurs ​​pour le rendu du tracé graphique #0.
Calcul : La fonction OnCalculer()

Le calcul des valeurs de l'indicateurest effectuée dans la fonction OnCalculate() du gestionnaire d'événements Calculate. Nous utilisons la deuxième forme d'appel de fonction OnCalculate().

int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at the previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
//---
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }

L'argument rates_total est le nombre de barres du graphique des prix, qui sont rendues et sont disponibles pour l'indicateur pour traitement. Le prev_calculated - est le nombre de barres du graphique des prix qui ont été traitées par l'indicateur au moment du démarrage de l'appel de la fonction OnCalculate() en cours.

La fonction OnCalculate() renvoie le nombre de barres du graphique des prix qui ont été traitées par l'indicateur au moment de la fin de l'appel en cours. Cette fonction renvoie le paramètre rates_total et doit être construite de sorte qu'au tout premier appel, toutes les barres non traitées du tableau des prix soient traitées.

C'est-à-dire que si au premier appel de la fonction OnCalculate(), le paramètre prev_calculated est égal à 0, et puis au deuxième appel, le paramètre prev_calculated est soit égal à rates_total soit rates_total +1, et à partir du deuxième appel, La fonction OnCalculate() gère (compte) uniquement la dernière barre. Pour plus de précisions avec un exemple, voir ici.

Les indicateurs de tampon et temps [], Open[], High[], Low[], Close[], TickVolume[], Volume[] et Spread[] ont un sens d'Indexation par défaut de gauche à droite, depuis le début à la fin du tableau, du plus ancien au plus récent. L'indice du premier élément est égal à 0. La taille de la mémoire tampon de l'indicateur est contrôlée par le terminal client, de sorte qu'elle corresponde toujours au nombre de barres à base desquelles l'indicateur est calculé.

Calcul : Vérifiez s'il y a suffisamment de données pour calculer l'indicateur (1)
//--- check rates
   if(rates_total<rates_total_min) return(0);

La variable globale rates_total_min est la taille minimale des séries chronologiques d'entrée de l'indicateur, calculée dans la fonction OnInit() du gestionnaire d'événements Init

   rates_total_min=begin4+1; // minimum size of the input timeseries of the indicator
Calcul : Les tableaux de prix PriceBuffer[] (2)
//--- calculation of the prices array PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // size of the input timeseries
                        prev_calculated,     // bars, processed on the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // calculate the prices array
                       );

Pour remplir le tableau des prix PriceBuffer[], la fonction CalculatePriceBuffer() est utilisée. Le code de la fonction CalculatePriceBuffer() se trouve dans le fichier "WilliamBlau.mqh" (voir introduction). Le type de prix est indiqué dans le paramètre d'entrée AppliedPrice.

Calcul : La définition de l'Indice barre, à partir duquel commencer/continuer le calcul de la Q-période Dynamique (3)

La variable locale pos est l'indice de la barre, à partir duquel l'indicateur sera calculé sur l'appel en cours de la fonction OnCalculate(). Combinons le calcul de la variable pos avec l'étape de préparation du tableau MtmBuffer[] au calcul (l'étape de remise à zéro des éléments non significatifs du tableau MtmBuffer[]).

Calcul : Dynamique de période-q (4)
//--- calculation of q-period Momentum
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos values
         MtmBuffer[i]=0.0;     // zero values
     }
   else pos=prev_calculated-1; // overwise recalc only last value
   // calculate MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];

Le Dynamique de la période-q est calculé comme une différence entre le PriceBuffer[i] de la période actuelle et le prix (q-1) des périodes précédentes PriceBuffer[i-(q-1)].

Calcul : lissage par la méthode EMA (5-7)

//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-period 3rd EMA (for plot #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);

La fonction ExponentialMAOnBuffer() est décrite dans l'introduction. Sur l'exemple du calcul de la 1ère EMA mobile de période r : la fonction ExponentialMAOnBuffer() remplit le tableau de sortie EMA_MtmBuffer[] avec les valeurs de ​​EMA (r) du tableau d'entrée MtmBuffer[] ; avec des données négligeables jusqu'à l'Indice (begin1-1) inclus, sont remplis de valeurs nulles.

 

1.4.2. "Blau_TSI.mq5" - indicateur TSI(price,q,r,s,u) - l’ indice de force véritable

Le code de l'indicateur STI (price,q,r,s,u) (est construit sur la base de modifications et d'ajouts au code "Blau_Mtm.mq5") :

//+------------------------------------------------------------------+
//|                                                     Blau_TSI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "True Strength Index (William Blau)"      // description
#include <WilliamBlau.mqh>               // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window      // indicator in a separate window
#property indicator_buffers 10           // number of buffers used
#property indicator_plots   1            // graphic plots
//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width
//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "TSI"        // label for graphic plot #0
#property indicator_type1   DRAW_LINE    // draw as a line
#property indicator_color1  Blue         // line color
#property indicator_style1  STYLE_SOLID  // line style
#property indicator_width1  1            // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // TSI (graphic plot #0)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period 1st EMA
double DEMA_MtmBuffer[];    // s-period 2nd EMA
double TEMA_MtmBuffer[];    // u-period 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4; // starting index
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"TSI");             // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // draw as a line
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"
//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum
*/
//---
   begin1=q-1;        //                             - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - EMA_...[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - DEMA_...[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - TEMA_...[], MainBuffer[]
   //
   rates_total_min=begin4+1; // rates total min
//--- starting index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- check rates
   if(rates_total<rates_total_min) return(0);
//--- calc PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at previous tick
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price buffer
                       );
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Examinons en détail les modifications et ajouts au code "Blau_Mtm.mq5".

1.4.2.1. Les configurations de l'indicateur STI (price,q,rs,u) (modifications et ajouts au code "Blau_Mtm.mq5")

Paramètres de l’ indicateur (en général)

Les configurations de l'indicateur STI(price,q,r,s,u) diffèrent des configurations de l'indicateur Mtm(price,q,r,s,u) (voir Fig. 1.8):

  1. Indiquer la fenêtre d'affichage des indicateurs (pas de changement)
  2. Indiquez le nombre de structures graphiques (pas de changement)
  3. Indiquez le nombre de tampons d'indicateur (le nombre de tampons a augmenté.)
  4. Déclaration des tableaux d'indicateurs (ajoutés aux tableaux.)
  5. Attribuez les tableaux/tampon/parcelles : le tableau d'indicateurs -> Tampon d’indicateur -> plot graphique (restructuration.)
  6. Décrivez les propriétés de chaque tracé graphique (le libellé a été modifié)
  7. Indiquez la précision de l'affichage des valeurs de l'indicateur ​(précision modifiée)
  8. Indiquez, pour chaque tracé graphique, le nombre de barres initiales sans afficher sur le tracé graphique (pas de changement)
  9. Définissez les niveaux horizontaux et décrivez les propriétés de chaque niveau horizontal (nouveau)
  10. Définissez des limites pour l'échelle de la fenêtre d'indicateur séparée (nouveau)
  11. Indiquez le nom abrégé de l'indicateur (nom modifié.)

1.8. Indicateur de l’Indice de Force véritable TSI (prix, q, r, s, u)

Fig. 1.8. Indicateur True Strength Indice TSI (prix, q, r, s, u)


Configurations (Modifications)

Dans le code "Blau_Mtm.mq5", les modifications mineures suivantes sont apportées.

1. La brève description du programme mql5 est modifiée :

#property description "True Strength Index (William Blau)"      // description

2. (dans la configuration 6) Le nombre de tracés graphiques n'a pas augmenté, la méthode de dessin (DRAW_LINE - ligne), la couleur de ligne (Bleu), le style de ligne (STYLE_SOLID - ligne pleine) et la largeur de ligne (1) sont restés inchangés, mais l'étiquette du tracé graphique #0 a changé :

#property indicator_label1  "TSI"        // label for graphic plot #0

3. (en configuration 7) La précision de l'affichage des valeurs de l'indicateur est modifiée :

   IndicatorSetInteger(INDICATOR_DIGITS,2);

4. (dans la configuration 11) le nom abrégé de l'indicateur est modifié :

   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
Configurations : niveaux horizontaux (9)

Pour configurer les niveaux horizontaux, les éléments suivants doivent être indiqués pour chaque niveau :

  1. La valeur sur l'axe vertical ;
  2. La description du niveau (facultatif). Les couches horizontales disposent d’un style unique de rendu :
    1. Couleur pour l'affichage de la ligne ; 
    2. Style de ligne (voir les styles possibles énumérés dans ENUM_LINE_STYLE);
    3. Epaisseur de la ligne.

Il y a deux manières possibles de configurer :

1) Utilisation de l’ instruction de préprocesseur #property (implémentée de cette façon).

//--- horizontal levels
#property indicator_level1 -25           // level #0 (vertical)
#property indicator_level2 25            // level #1 (vertical)
#property indicator_levelcolor Silver    // level color
#property indicator_levelstyle STYLE_DOT // level style
#property indicator_levelwidth 1         // level width

2) En utilisant le groupe de fonctions IndicatorSet *() :

//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level 0 description "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level 1 description "Overbought"

Le code est rédigé dans la fonction OnInit() du gestionnaire d'événements Init. L'Indexation des niveaux horizontaux commence à partir de 0. Pour affiner l'affichage du niveau horizontal, nous utilisons les identificateurs de propriétés de l'Indice INDICATOR_LEVEL *, qui sont répertoriés dans l'énumération ENUM_CUSTOMIND_PROPERTY.

La description de chaque niveau est uniquement définie à l'aide de la fonction IndicatorSetString(), l'identificateur de la propriété d'indicateur INDICATOR_LEVELTEXT (énumération ENUM_CUSTOMIND_PROPERTY_STRING). La description du niveau est placée directement au-dessus du niveau, à gauche. 

Vous pouvez ajouter/supprimer des niveaux horizontaux, modifier les valeurs, la description de chaque niveau et le style de rendu des niveaux depuis la fenêtre "Propriétés" (onglet "Niveaux") de l'indicateur.

Configurations: Limites de l'échelle de la fenêtre d'indication séparée (10)

Il y a deux manières possibles de configurer :

1) Utilisation de l’ instruction de préprocesseur #property (implémentée de cette façon).

//--- indicator min/max
#property indicator_minimum -100         // minimum
#property indicator_maximum 100          // maximum

2) A l'aide de la fonction IndicatorSetDouble(), les identificateurs de propriétés des indicateurs INDICATOR_MINIMUM et INDICATOR_MAXIMUM (énumération ENUM_CUSTOMIND_PROPERTY_DOUBLE).

//--- indicator scale
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // minimum
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // maximum

Le code est rédigé dans la fonction OnInit() du gestionnaire d'événements Init. Les limites inférieure et supérieure de l'échelle d'une fenêtre d'indicateur distincte sont disposées à être modifiées à partir de la fenêtre « Propriétés » (l'onglet « Échelle ») de l'indicateur.

Configurations (modifications) : Les tampons d’indicateur (3-5)

Les modifications dans la configuration "tableau d'indicateurs -> tampon d'indicateurs -> tracé graphique":

1. (en configuration 3) Le nombre de tampons a augmenté :

#property indicator_buffers 10           // the number of buffers for the calculation of the indicator

2. (dans la configuration 4) Ajout de tableaux d'indicateurs nécessaires pour calculer la valeur absolue du Dynamique de période-q :

double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period 3rd EMA (absolute value)

le but du tableau MainBuffer[] est modifié :

double MainBuffer[];        // TSI (graphic plot #0)
double TEMA_MtmBuffer[];    // u-period 3rd EMA

3. (dans la configuration 5) La connexion de "tableau d'indicateurs -> tampon d'indicateurs -> tracé graphique" est modifiée :

   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // intermediate buffers; (not used for plot)
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // price array
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-period Momentum
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-period 1st EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-period 2nd EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-period 3rd EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-period моментум (absolute value)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (absolute value)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)


1.4.2.2. Le calcul de l'indicateur STI (price,q,r,s,u) (altérations et ajouts au code "Blau_Mtm.mq5")

Calcul : L'algorithme

L'algorithme de calcul de l'indicateur STI (price,q,r,s,u) :

  1. Vérifiez s'il y a suffisamment de données pour calculer l'indicateur.
  2. Le calcul du tableau des prix en fonction du type de prix indiqué - formation du tableau PriceBuffer[].
  3. La détermination de la barre d'Indice, à partir de laquelle commencer/continuer le calcul du Dynamique de la période-q.
  4. Le calcul de Dynamique de la période-q et sa valeur absolue - le remplissage des tableaux MtmBuffer[] et AbsMtmBuffer[].
  5. Le premier lissage par la méthode EMA (période r) - le remplissage des tableaux EMA_MtmBuffer[] et EMA_AbsMtmBuffer[].
  6. Le deuxième lissage par la méthode EMA (période s) - le remplissage des tableaux DEMA_MtmBuffer[] et DEMA_AbsMtmBuffer[].
  7. La troisième méthode de lissage par la méthode EMA (période u) - le remplissage des tableaux TEMA_MtmBuffer[] et TEMA_AbsMtmBuffer[].
  8. La détermination de la barre d'indice, à partir de laquelle commencer/poursuivre le calcul de l’Indice de force véritable
  9. Le calcul du véritable indice de force - le remplissage du tableau MainBuffer[] - le calcul des valeurs ​pour le tracé graphique #0.

L'essence des modifications dans l'algorithme (brièvement):

  • a) (voir paragraphe 4-7) parallèlement au calcul du Dynamique de la période-q (groupe de tableaux * MtmtBuffer[]) le calcul de la valeur absolue du Dynamique de la q période (groupe de tableaux *AbsMtmBuffer[]) est effectué ;
  • b) (voir Section 8-9) le calcul de la STI est ajouté.
Calcul : la Q-période Dynamique sa valeur absolue (3-7)
//--- calculation of  mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // calc all values starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);

Calcul: L'indice de Force Véritable (8-9)

//--- TSI calculation (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // calc all values starting from begin4
      for(i=0;i<pos;i++)       // 
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }

1.4.3. "Blau_Ergodic.mq5" - Ergodic(price,q,r,s,u,ul) - Ergodic Oscillator

Le code de l'indicateur Ergodique (prix,q,r,s,u,ul) est basé sur les modifications du code de "Blau_TSI.mq5":

//+------------------------------------------------------------------+
//|                                                 Blau_Ergodic.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // copyright
#property link      "https://www.mql5.com"                       // URL
#property description "Ergodic Oscillator (William Blau)"       // description
#include <WilliamBlau.mqh>                 // include file (terminal_data_folder\MQL5\Include)
//--- indicator settings
#property indicator_separate_window        // indicator in a separate window
#property indicator_buffers 11             // number of buffers
#property indicator_plots   2              // indicator plots
//--- horizontal levels
#property indicator_level1 -25             // level #0
#property indicator_level2 25              // level #1
#property indicator_levelcolor Silver      // level color
#property indicator_levelstyle STYLE_DOT   // level style
#property indicator_levelwidth 1           // level width
//--- min/max
#property indicator_minimum -100           // minimum
#property indicator_maximum 100            // maximum
//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width
//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
//--- input parameters
input int    q=2;  // q - period of Momentum
input int    r=20; // r - 1st EMA, applied to Momentum
input int    s=5;  // s - 2nd EMA, applied to the 1st smoothing
input int    u=3;  // u - 3rd EMA, applied to the 2nd smoothing
input int    ul=3; // ul- period of a Signal Line
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - price type
//--- dynamic arrays
double MainBuffer[];        // Ergodic (graphic plot #0)
double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)
double PriceBuffer[];       // price array
double MtmBuffer[];         // q-period Momentum
double EMA_MtmBuffer[];     // r-period of the 1st EMA
double DEMA_MtmBuffer[];    // s-period of the 2nd EMA
double TEMA_MtmBuffer[];    // u-period of the 3rd EMA
double AbsMtmBuffer[];      // q-period Momentum (absolute value)
double EMA_AbsMtmBuffer[];  // r-period of the 1st EMA (absolute value)
double DEMA_AbsMtmBuffer[]; // s-period of the 2nd EMA (absolute value)
double TEMA_AbsMtmBuffer[]; // u-period of the 3rd EMA (absolute value)
//--- global variables
int    begin1, begin2, begin3, begin4, begin5; // starting indexes
int    rates_total_min; // rates total min
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
/*
//--- graphic plot #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Ergodic");           // label of graphic plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); // draw as a histogram
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Silver);        // line color
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);             // line width
//--- graphic plot #1 (Signal Line)
   PlotIndexSetString(1,PLOT_LABEL,"Signal");            // label of graphic plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);      // draw as a line
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Red);           // line color
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);   // line style
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);             // line width
*/
//--- precision
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- horizontal levels
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // number of indicator levels
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // level #0
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // level #1
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // level color
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // level style
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // level width
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // level #0 "Oversold"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // level #1 "Overbought"
//--- min/max values
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // min
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // max
*/
//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);
//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // rates total
                const int prev_calculated, // bars, calculated at previous call
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- rates total
   if(rates_total<rates_total_min) return(0);
//--- calculation of PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // price type
                        rates_total,         // rates total
                        prev_calculated,     // bars, calculated at the previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        PriceBuffer          // price array
                       );
//--- calculation of mtm and |mtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // starting from begin1
      for(i=0;i<pos;i++)       // pos
        {
         MtmBuffer[i]=0.0;     // zero values
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // overwise calc only last bar
   // calculate MtmBuffer[] and AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- EMA smoothing
   // r-period of the 1st EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // rates total
                           prev_calculated, // bars, calculated at previous call
                           begin1,          // starting index
                           r,               // smoothing period
                           MtmBuffer,       // input array
                           EMA_MtmBuffer    // output array
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-period of 2nd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-period 3rd EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- calculation of Ergodic (graphic plot #0)
   if(prev_calculated==0)      // at first call
     {
      pos=begin4;              // starting from begin4
      for(i=0;i<pos;i++)       // pos
         MainBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // calculation of MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Examinons seulement en détail les modifications et ajouts au code "Blau_TSI.mq5".

1.4.3.1. Configurations de l'indicateur Ergodique (price,q,r,s,u,ul) (modifications et ajouts au code "Blau_TSI.mq5")

Paramètres de l’ indicateur (en général)

Les configurations de l'indicateur Ergodic (prix,q,r,s,u,ul) diffèrent des configurations de l'indicateur TSI (prix,q,r,s,u) (Voir Fig. 1.9) :

  1. Indiquer la fenêtre d'affichage des indicateurs (pas de modification )
  2. Indiquez le nombre de tracés graphiques (un tracé graphique est ajouté)
  3. Indiquez le nombre de tampons indicateurs (le nombre de tampons a augmenté)
  4. Déclaration des tableaux d’indicateurs (ajoutés au tableau)
  5. Définir un rapport : le tableau d'indicateurs -> indicateur de tampon -> tracé graphique (restructuration.)
  6. Décrivez les propriétés de chaque tracé graphique (propriétés modifiées, un tracé graphique est ajouté.)
  7. Indiquez la précision d'affichage des valeurs de l'indicateur ​(pas de modification)
  8. Indiquez pour chaque structure graphique le nombre de barres initiales sans l'afficher sur le tracé graphique (ajout d'un tracé graphique.)
  9. Définissez les niveaux horizontaux et décrivez les propriétés de chaque niveau horizontal (pas de modification.)
  10. Définissez la limite de l'échelle séparée de la fenêtre d'indicateur (pas de modification.)
  11. Indiquez le nom abrégé de l'indicateur (nom modifié.)

1.9. Indicateur ergodique (prix,q,r,s,u,ul)

Fig. 1.9. Indicateur ergodique (prix,q,r,s,u,ul)


Configurations (Modifications)

Le code "Blau_TSI.mq5" a été modifié des manières suivantes.

1. La brève description du programme mql5 est modifiée :

#property description "Ergodic Oscillator (William Blau)"       // description

2. Un paramètre d'entrée a été ajouté :

input int    ul=3; // ul- period of a Signal Line

3. (dans la configuration 11) une modification est apportée au nom abrégé de l'indicateur :

//--- short indicator name
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
Configurations (modifications) : Tracés graphiques (2, 6)

1. (dans la configuration 2) Ajout d'un autre tracé graphique (Signal Line) :

#property indicator_plots   2              // indicator plots

2. (dans la configuration 6) a) Modification des propriétés du premier tracé graphique #0 "Ergodic".

Auparavant, comme moyen d'afficher la ligne, nous utilisions l’ (identificateur DRAW_LINE), maintenant nous utilisons un histogramme à partir de la ligne zéro (DRAW_HISTOGRAM de l'énumération ENUM_DRAW_TYPE)

Modification de la couleur d'affichage des lignes et de la largeur des lignes :

//--- graphic plot #0 (Main)
#property indicator_label1  "Ergodic"      // graphic plot #0
#property indicator_type1   DRAW_HISTOGRAM // draw as a histogram
#property indicator_color1  Silver         // histogram color
#property indicator_style1  STYLE_SOLID    // line style
#property indicator_width1  2              // line width

b) Ajout d'un tracé graphique #1 "Signal" (Signal Line) :

//--- graphic plot #1 (Signal Line)
#property indicator_label2  "Signal"       // graphic plot #1
#property indicator_type2   DRAW_LINE      // draw as a line
#property indicator_color2  Red            // line color
#property indicator_style2  STYLE_SOLID    // line style
#property indicator_width2  1              // line width
Configurations (modifications) : Les tampons d’indicateur (3-5)

Les modifications dans la configuration "tableau d'indicateurs -> tampon d'indicateurs -> structure graphique":

1. (dans la configuration 3) Le nombre de tampons a augmenté :

#property indicator_buffers 11             // number of buffers

2. (dans la configuration 4) Ajout d'un tableau d'indicateurs, qui est nécessaire pour calculer et restituer les valeurs de la ligne de signal :

double SignalBuffer[];      // Signal line: ul-period EMA of Ergodic (graphic plot #1)

3. (en configuration 5) Le rapport "tableau d'indicateurs -> tampon d’indicateur -> structure graphique" est modifié :

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // price array
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-period моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-period of the 1st EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-period of the 2nd EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-period of the 3rd EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Momentum (absolute value)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-period of the 1st EMA (absolute value)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-period of the 2nd EMA (absolute value)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (absolute value)
Paramètres Nombre de barres initiales sans rendu (8)
  • Le nombre de mesures initiales sans le rendu du tracé graphique #0 "Ergodic" n'a pas changé. La méthode de calcul est exposée au paragraphe 1.4.1.1.
  • Les méthodes de calcul du nombre de barres initiales sans le rendu du tracé graphique #1 "Signal" sont les mêmes. Le tableau SignalBuffer[] est le résultat du lissage des données importantes du tableau MainBuffer[] (la période de lissage ul).

Étant donné que l'Indexation du tableau MainBuffer[] commence à partir de 0 et que les données importantes du tableau MainBuffer[] commencent par l'Indice (q-1)+(r-1)+(s-1)+(u-1), les données importantes du tableau SignalBuffer[] commencent par l'Indice (q-1)+(r-1)+(s-1)+(u-1)+(ul-1).

La variable globale begin5 est déclarée :

int    begin1, begin2, begin3, begin4, begin5; // starting indexes

Calcul (complet, voir également la section 1.4.1.1) :

//---
   begin1=q-1;         //                                    - MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - SignalBuffer[]
   //
   rates_total_min=begin5+1; // rates total min
//--- starting bar index for plot #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- starting bar index for plot #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);


1.4.3.2. Le calcul de l'indicateur Ergodique (prix,q,r,s,u,ul) (altérations et ajouts au code "Blau_TSI.mq5")

Calcul : L'algorithme

L'algorithme de calcul de l'indicateur Ergodique (price,q,r,s,ul) :

  1. Vérifiez s'il y a suffisamment de données pour calculer l'indicateur.
  2. Le calcul du tableau des prix en fonction du type de prix indiqué - remplissage du tableau PriceBuffer[].
  3. La détermination de la barre d'Indice, à partir de laquelle commencer/continuer le calcul du Dynamique de la période-q.
  4. Le calcul de la dynamique de la période-q et sa valeur absolue - le remplissage des tableaux MtmBuffer[] et AbsMtmBuffer[].
  5. Le premier lissage par la méthode EMA (période r) - le remplissage des tableaux EMA_MtmBuffer[] et EMA_AbsMtmBuffer[].
  6. Le deuxième lissage par la méthode EMA (période s) - le remplissage des tableaux DEMA_MtmBuffer[] et DEMA_AbsMtmBuffer[].
  7. La troisième méthode de lissage par la méthode EMA (période u) - le remplissage des tableaux TEMA_MtmBuffer[] et TEMA_AbsMtmBuffer[].
  8. La détermination de la barre d'Indice, à partir de laquelle commencer/poursuivre le calcul de l'Indice de Force Véritable.
  9. Le calcul de l'Ergodic (True Strength Index) - le remplissage du tableau MainBuffer[] - le calcul des valeurs ​pour le rendu du tracé graphique #0.
  10. Le calcul de la ligne de signal - le lissage de l'Ergodique par la méthode EMA (période ul) - le remplissage du tableau SignalBuffer[] - le calcul des valeurs pour le rendu du tracé graphique #1.

L'essence des modifications dans l'algorithme (brièvement) a) (voir Section 1) l'exigence de la taille minimale des séries chronologiques d'entrée de l'indicateur a changé ; b) (voir paragraphe 10) le calcul de la ligne de signal a changé.

Calcul (modification) : Vérifiez s'il y a suffisamment de données pour calculer l'indicateur (1)

Il n'y a pas de modifications dans l'algorithme :

//--- rates total
   if(rates_total<rates_total_min) return(0);

Les valeurs de la variable globale rates_total_min ont changé (la taille minimale des séries chronologiques d'entrée de l'indicateur ; calculée dans la fonction OnInit() lors de l'événement d'Initialisation) :

   rates_total_min=begin5+1; // the minimum size of the input timeseries of the indicator
Calcul : ligne de signal (10)
//--- calculation of Signal Line (graphic plot #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);

2. Dynamique Stochastique

Les indicateurs pris en compte (voir la pièce jointe) sont divisés en deux groupes.

I. Indicateurs, axés sur le Stochastique :

  1. Blau_TStoch.mq5 - Stochastique (stochastique à période-q ; stochastique à période-q lissée);
  2. Blau_TStochI.mq5 - indice stochastique (stochastique à période-q lissée normalisée) ;
  3. Blau_TS_Stochastic.mq5 - Oscillateur stochastique TS (basé sur l'indice de stochastique).

II. Indicateurs, basés sur la Dynamique Stochastique :

  1. Blau_SM.mq5 - Dynamique Stochastique (dynamique stochastique à période-q ; Dynamique Stochastique à période-q lissé);
  2. Blau_SMI.mq5 - indice de Dynamique Stochastique (Dynamique de période-q lissée normalisée);
  3. Blau_SM_Stochastic.mq5 - Stochastique SM-Oscillateur (basé sur l'indice Stochastique de Dynamique).


2.1. Indicateurs basés sur la Stochastique

Le "Guide de l'utilisateur du terminal client MetaTrader", dans la section "Analysis/Technical Indicators/Oscillators/Stochastic Oscillator" fournit une description du terminal client intégré MetaTrader 5 des indicateurs techniques de l'oscillateur stochastique et les moyens de son utilisation dans l'analyse technique (voir aussi iStochastique.)

 

2.1.1. L'oscillateur stochastique de George Lane

Oscillateur stochastique et stochastique (Stochastique, Oscillateur stochastique) - est un indicateur qui indique le prix, par rapport à la fluctuation des prix pour les précédentes périodes q. L'auteur et vulgarisateur de l'indicateur est George Lane.

Distinguer:

  • Stochastique rapide, parfois appelée %K ;
  • Stochastique lente (ligne de signal), parfois appelée %D.

La formule de Stochastique de George Lane :

           price - LL(q)
%K = 100 * -------------
           HH(q) - LL(q)
%D = SMA(%k, ul)

Où :

  • % K - Stochastique rapide ;
  • % D - Stochastique lente (ligne de signal) ;
  • prix - prix [clôture] de la période en cours;
  • q - le nombre de périodes de temps du tableau des prix utilisé dans le calcul de la stochastique ;
  • HH (q) - la valeur maximale pour les précédentes périodes q des prix les plus élevés pour la période q;
  • LL (q) - la valeur minimale pour les précédentes périodes q du prix le plus bas pour la période q;
  • SMA (% K, ul) - la moyenne mobile simple d'ordre ul, appliquée à la stochastique rapide (% K).

Selon l'interprétation de George Lane, l'idée de base est que lors d'une tendance à la hausse des prix (tendance haussière), le prix a tendance à s'arrêter, en s’approchant des maximums précédents. Avec la tendance baissière des prix (tendance à la baisse), le prix a tendance à s'arrêter en s’approchant des minimums précédents.

 

2.1.2. L'oscillateur stochastique de William Blau


2.1. Les indicateurs de William Blau, basés sur la Stochastique

Fig. 2.1. Les indicateurs de William Blau, basés sur la Stochastique

 

2.1.2.1. Stochastique


Stochastique - est la distance entre le prix [de clôture] de la période en cours et le point le plus bas de la plage de fluctuations des prix, pour les précédentes périodes q La valeur de la stochastique de la période-q indique de combien le prix est déplacé, par rapport au point le plus bas de la plage des fluctuations de prix de la période-q. Les valeurs ​​de la période-q stochastique sont positives ou égales à zéro.

Fig 2.2. Définition de la Stochastique

Fig. 2.2. Définition de la stochastique

La formule de la -période-q Stochastique :

stoch(price,q) = price - LL(q)

Où :

  • prix - prix [clôture] de la période en cours;
  • q - le nombre de périodes de temps du graphique des prix, impliqué dans le calcul du stochastique ;
  • LL (q) - la valeur minimale, pour les précédentes périodes q, du prix le plus bas pour la période q.

La formule de la q-période stochastique lissée :

TStoch(price,q,r,s,u) = EMA(EMA(EMA( stoch(price,q) ,r),s),u)

Où :

  • prix - prix de [clôture] - la base de prix du graphique des prix ;
  • q - les barres numériques, utilisées dans le calcul de la stochastique ;
  • stoch(price,q)=price-LL(q) - q-period Stochastic;
  • EMA (stoch (prix,q),r) - premier lissage - EMA de la période r, appliqué au stochastique de la q-période ;
  • EMA (EMA(..., r),s) - le deuxième lissage - EMA de période s, appliqué au résultat du 1er lissage ;
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - EMA de période u, appliqué au résultat du 2ème lissage.

TStoch(price,q,r,s,u) - Stochastique. Spécifications

  • Nom de fichier: Blau_TStoch.mq5
  • Nom: Indicateur stochastique (stochastique à période-q; stochastique à période-q lissée), selon William Blau.
  • Paramètres d’entrée:
    • q - période, pour laquelle la stochastique est calculée (par défaut q = 5);
    • r -période de la 1ère EMA, appliquée à la Stochastique (par défaut r = 20) ;
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifications du rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, le lissage EMA n'est pas utilisé ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

2.1.2.2. L'indice stochastique

L'indicateur de l'indice stochastique est la Stochastique de la période-q normalisée et lissée.

Les valeurs ​​de la période-q lissée Stochastique sont cartographiées à un format de pourcentage (l'intervalle [0, 100]). Chaque valeur de stochastique lissée à période-q est normalisée par la valeur de la fourchette de prix à période-q. La normalisation permet d'interpréter la valeur de la période-q stochastique normalisée et lissée comme le degré des états de surachat/survente du marché.

La formule de l'indice stochastique :

                         100 * EMA(EMA(EMA( price-LL(q) ,r),s),u)       100 * TStoch(price,q,r,s,u)
TStochI(price,q,r,s,u) = ---------------------------------------- = ----------------------------------
                            EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)      EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then TStochI(price,q,r,s,u)=0

Où :

  • prix - prix de [clôture] - la base de prix du graphique des prix ;
  • q - les barres numériques, utilisées dans le calcul de la stochastique ;
  • LL (q) - la valeur minimale du prix le plus bas pour la période q;
  • HH (q) - la valeur maximale du prix le plus élevé pour la période q;
  • stoch(q)=price-LL(q) - q-period Stochastic;
  • TStoch(price,q,r,s,u) - stochastique à période-q lissée trois fois ;
  • HH(q)-LL(q) - Fourchette de prix de période-q ;
  • EMA (..., r) - le premier lissage - l'EMA(r), appliqué à :
    1. à la période-q stochastique ;
    2. à la fourchette de prix q-période ;
  • EMA (EMA(..., r),s) - le deuxième lissage - le(s) EMA(s), appliqué(s) au résultat du 1er lissage ;
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - EMA(u), appliqué au résultat du 2ème lissage.

TStochI(price,q,r,s,u) - Stochastic Index Spécifications

  • Nom de fichier: Blau_TStochI.mq5
  • Nom: Indice stochastique (stochastique à période-q lissée normalisée), selon William Blau.
  • Paramètres d’entrée:
    • q - période, pour laquelle la stochastique est calculée (par défaut q = 5);
    • r -période de la 1ère EMA, appliquée à la Stochastique (par défaut r = 20) ;
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifier le style de rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • (facultatif) Deux niveaux (par défaut 40 et 60) - ajouter/supprimer un niveau ; modifier la valeur et la description du niveau, modifier le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut 0) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur séparée (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, alors dans la période EMA correspondante, le lissage ne sera pas effectué ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

2.1.2.3. Oscillateur Stochastique

La définition de l'oscillateur stochastique :

TS_Stochastic(price,q,r,s,u) = TStochI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( TS_Stochastic(price,q,r,s,u) ,ul)

Où :

  • TS_Stochastic() - Stochastique rapide, %k - Index stochastique TStochI(price,q,r,s,u);
  • SignalLine() - Stochastique lente (ligne de signal),% d - EMA de la période ul, appliquée à la stochastique rapide (% k);
  • ul - période ligne de signal EMA - selon William Blau, la valeur ul doit être égale à la période de la dernière stochastique rapide EMA importante (> 1).

TS_Stochastique(prix,q,r,s,u,ul) - Oscillateur stochastique. Spécifications

  • Nom de fichier: Blau_TS_Stochastic.mq5
  • Nom: Oscillateur stochastique (basé sur l'indice stochastique), selon William Blau.
  • Paramètres d’entrée:
    • graphique #0 - Fast Stochastique (indice stochastique),% k :
      • q - période, pour laquelle la Stochastique est calculée (par défaut q = 5);
      • r -période de la 1ère EMA, appliquée à la Stochastique (par défaut r = 20) ;
      • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
      • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • graphique n° 1 – Stochastique lente (ligne de signal), % d :
      • ul - période EMA Signal Line, appliquée à la stochastique rapide (par défaut ul = 3);
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu de chaque tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • deux niveaux (par défaut 40 et 60) - ajouter/supprimer un niveau ; modifier la valeur et la description du niveau ; changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut 0) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur séparée (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, le lissage EMA n'est pas utilisé ;
    • ul>0. Si ul = 1, alors la stochastique lente (ligne de signal) et les lignes stochastiques rapides sont les mêmes ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u + ul-4 +1).

 

2.1.2.4. Continuité


L'oscillateur stochastique de William Blau comprend l'oscillateur stochastique de George Lane. Pour que le TS_Stochastic (William Blau) corresponde à l'oscillateur stochastique standard (George Lane), implémenté dans MetaTrader 5, les éléments suivants doivent être indiqués :

TS_Stochastic( price=Close, q=KPeriod, r=1, s=1, u=1, ul=DPeriod )
Stochastic( KPeriod=q, DPeriod=ul, Slowing=1, price="Low/High", method="Exponential" )

Fig 2.3. L'oscillateur stochastique de William Blau contient l'oscillateur stochastique de George Lane

Fig. 2.3. L'oscillateur stochastique de William Blau comprend l'oscillateur stochastique de George Lane

 

2.1.2.5. Le code de l'oscillateur stochastique


Sur l'exemple de l'indicateur TS_Stochastique (prix,q,r,s,u,ul) :

1) Le rapport entre les tableaux d'indicateur, les tampons d'indicateur et les tracés graphiques :

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // fast Stochastic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // slow Stochastic: ul-period EMA of the fast Stochastic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);         // min value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);         // max value (q bars)
   SetIndexBuffer(5,StochBuffer,INDICATOR_CALCULATIONS);      // q-period Stochastic
   SetIndexBuffer(6,EMA_StochBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_StochBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_StochBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA
   SetIndexBuffer(9,HHLLBuffer,INDICATOR_CALCULATIONS);       // q-period price range
   SetIndexBuffer(10,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (price range)
   SetIndexBuffer(11,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (price range)
   SetIndexBuffer(12,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (price range)

2) L'algorithme de calcul pour la stochastique de la période-q et la fourchette de prix période-q :

   // calculation of StochBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // LLBuffer[] - search for the minimal price (q bars)
      // HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // StochBuffer[] - q-period Stochastic
      StochBuffer[i]=PriceBuffer[i]-LLBuffer[i];
      // HHLLBuffer[] - q-period price range
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }


2.2. Indicateurs, basés sur la Dynamique Stochastique

Fig 2.4. Les indicateurs de William Blau, basés sur la Stochastique Dynamique

Fig. 2.4. Les indicateurs de William Blau, basés sur la Stochastique Dynamique

 

2.2.1. Dynamique Stochastique

La dynamique stochastique (dynamique stochastique, SM) - est la distance entre le prix de la période actuelle et le milieu de la fourchette de prix au cours de précédentes périodes-q La valeur de Dynamique Stochastique de la période-q indique la position du prix dans la fourchette de prix.

Le signe de Dynamique Stochastique de la période-q indique la position du prix, par rapport au milieu de la fourchette de prix de la période-q : une Dynamique Stochastique positive - le prix est au-dessus du point médian, un négatif - le prix est en dessous du point médian.

Fig 2.5. La définition de Dynamique Stochastique

Fig. 2.5. La définition de Dynamique Stochastique

La formule de la dynamique stochastique de la période-q :

sm(price,q) = price - 1/2 * [LL(q) + HH(q)]

Où :

  • prix - prix [clôture] de la période en cours;
  • q - le nombre de barres, utilisé dans le calcul de la dynamique stochastique ;
  • LL (q) - la valeur minimale du prix le plus bas pour la période q;
  • HH (q) - la valeur maximale des prix les plus élevés pour la période q;
  • 1/2* [LL(q)+HH (q)] - le milieu de la fourchette de prix de la période-q.

La formule de Dynamique stochastique à période-q lissée :

SM(price,q,r,s,u) = EMA(EMA(EMA( sm(price,q) ,r),s),u)

Où :

  • prix - prix de [clôture] - la base de prix du graphique des prix ;
  • q - le nombre de barres, utilisé dans le calcul de dynamique stochastique ;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - la dynamique stochastique de la q-période ;
  • EMA (sm(price,q),r) - le premier lissage - l'EMA(r), appliqué à la dynamique stochastique de la q-période ;
  • EMA (EMA(..., r),s) - le deuxième lissage - le(s) EMA(s), appliqué(s) au résultat du 1er lissage ;
  • EMA(EMA(EMA(sm(q),r),s),u) - le troisième lissage - l'EMA(u), appliqué au résultat du 2ème lissage.


2.2.1.2. SM(prix,q,r,s,u) - Dynamique stochastique. Spécifications

  • Nom de fichier: Blau_SM.mq5
  • Nom: Indicateur de dynamique stochastique (dynamique stochastique de période-q, dynamique stochastique de période-q lissé), selon William Blau.
  • Paramètres d’entrée:
    • q - la période sur laquelle la Dynamique Stochastique est calculée (par défaut q = 5) ;
    • r - période de la 1ère EMA, appliquée à la Dynamique Stochastique (par défaut r = 20);
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifications du rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, le lissage EMA n'est pas utilisé ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

2.2.2. L'indice de Dynamique Stochastique

L'indice de Dynamique Stochastique (SMI) - est un indicateur d'un taux stochastique normalisé (dynamique stochastique lissé normalisé à la période-q). Les valeurs ​​de la dynamique stochastique lissée sur la période-q est donnée sous forme de pourcentage (intervalle d'affichage [-100, 100]).

Chaque valeur du MDynamique stochastique lissée de période-q est normalisée par la valeur de la moitié de la plage de fluctuations de prix de période-q. La normalisation permet d'interpréter la valeur du SMI comme un degré de niveau de surachat (valeur positive) ou de niveau de survente (négatif) du marché.

La formule de l'Indice de Dynamique Stochastique :

                     100 * EMA(EMA(EMA( price-1/2*[LL(q)+HH(q)] ,r),s),u)           100 * SM(price,q,r,s,u)
SMI(price,q,r,s,u) = ---------------------------------------------------- = ----------------------------------------
                           EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)         EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)
if EMA(EMA(EMA(1/2*[HH(q)-LL(q)],r),s),u)=0, then SMI(price,q,r,s,u)=0

Où :

  • prix - prix de [clôture] - la base de prix du graphique des prix ;
  • LL (q) - la valeur minimale du prix le plus bas pour la période q;
  • HH (q) - la valeur maximale des prix les plus élevés pour la période q;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - la dynamique stochastique de la q-période ;
  • SM(price,q,r,s,u) - Dynamique stochastique à période-q lissée trois fois ;
  • HH(q)-LL(q) - fourchette de prix sur période-q ;
  • 1/2* [LL (q)+HH(q)] - le milieu de la fourchette de prix de la période-q ;
  • 1/2*[HH(q)-LL(q)] - la moitié de la période-q de la fourchette de prix ;
  • EMA (..., r) - le premier lissage - EMA(r), appliqué à :
    1) la dynamique stochastique de la période-q
    2) la moitié de la fourchette de prix de période-q ;
  • EMA (EMA(..., r),s) - le deuxième lissage - EMA(s), appliqué au résultat du 1er lissage ;
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - EMA(u), appliqué au résultat du 2ème lissage.


2.2.2.2. SMI(price,q,r,s,u) - Indice de Dynamique Stochastique. Spécifications

  • Nom de fichier: Blau_SMI.mq5
  • Nom: Indice de Dynamique Stochastique (Dynamique Stochastique de période-q lissé normalisé) selon William Blau.
  • Paramètres d’entrée:
    • q - la période sur laquelle la Dynamique Stochastique est calculé (par défaut q = 5);
    • r - période de 1-er EMA, appliquée au dynamique stochastique (par défaut r = 20);
    • s - période de la 2ème EMA, appliquée aux résultats du 1er lissage (par défaut s = 5) ;
    • u - période de la 3e EMA, appliquée aux résultats du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • (facultatif) Deux niveaux (par défaut -40 et +40) - ajouter/supprimer un niveau ; modifier la valeur et la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, alors dans la période EMA correspondante, le lissage ne sera pas effectué ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

2.2.3. Oscillateur Stochastique

La définition de l'oscillateur stochastique :
SM_Stochastic(price,q,r,s,u) = SMI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( SM_Stochastic(price,q,r,s,u) ,ul)

Où :

  • SM_Stochastique() - Indice de Dynamique Stochastique SMI(prix,q,r,s,u);
  • SignalLine() - Signal Line - EMA de période, ul, appliqué à l'indice de dynamique stochastique ;
  • ul - période ligne de signal EMA - selon William Blau, la valeur ul doit être égale à la période du dernier indice EMA important(> 1) du taux stochastique.


2.2.3.1. SM_Stochastique(prix,q,r,s,u,ul) - Oscillateur stochastique. Spécifications

  • Nom de fichier: Blau_SM_Stochastic.mq5
  • Le nom : Oscillateur stochastique (basé sur la Dynamique Stochastique), selon William Blau.
  • Paramètres d’entrée:
    • graphique n°0 - l'indice de Dynamique Stochastique :
      • q - la période sur laquelle la Dynamique Stochastique est calculée (par défaut q = 5) ;
      • r - période de la 1ère EMA, appliquée à la Dynamique Stochastique (par défaut r = 20) ;
      • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
      • u - période de la 3e EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • tracé graphique n°1 - la ligne de signal :
      • ul - période de ligne de signal EMA, par rapport à l'indice du taux stochastique (par défaut ul = 3) ;
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu de chaque tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • deux niveaux (par défaut -40 et +40) - ajouter/supprimer un niveau ; modifier la valeur et la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, alors dans la période EMA correspondante, le lissage ne sera pas effectué ;
    • ul>0. Si ul = 1, alors la ligne de signal coïncide avec l'indice du taux stochastique ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u + ul-4 +1).

 

2.2.4. Le code de l'oscillateur stochastique

Le SM_Stochastique (prix, q, r, s, u, ul) :

1) Le rapport entre les tableaux d'indicateur, les tampons d'indicateur et les tracés graphiques :

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                   // Stochastic Momentum Index
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                 // Signal Line: ul-period EMA of Stochastic Momentum Index
   // buffers for intermediate calculations (not used for plotting)
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);          // price array
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);             // minimal price value (q bars)
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);             // maximal price value (q bars)
   SetIndexBuffer(5,SMBuffer,INDICATOR_CALCULATIONS);             // q-period Stochastic Momentum
   SetIndexBuffer(6,EMA_SMBuffer,INDICATOR_CALCULATIONS);         // r-period of the 1st EMA
   SetIndexBuffer(7,DEMA_SMBuffer,INDICATOR_CALCULATIONS);        // s-period of the 2nd EMA
   SetIndexBuffer(8,TEMA_SMBuffer,INDICATOR_CALCULATIONS);        // u-period of the 3rd EMA
   SetIndexBuffer(9,HalfHHLLBuffer,INDICATOR_CALCULATIONS);       // half of price range (q bars)
   SetIndexBuffer(10,EMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS);  // r-period of the 1st EMA (half of price range)
   SetIndexBuffer(11,DEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // s-period of the 2nd EMA (half of price range)
   SetIndexBuffer(12,TEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // u-period of the 3rd EMA (half of price range)

2) L'algorithme de calcul de Dynamique Stochastique q-période et la moitié de la fourchette de prix q-période :

//--- calculation of q-period Stochastic Momentum and half of price range (q bars)
   if(prev_calculated==0)       // at first call
     {
      pos=begin1;               // starting from 0
      for(i=0;i<pos;i++)        // pos values
        {
         SMBuffer[i]=0.0;       // zero values
         HalfHHLLBuffer[i]=0.0; //
         LLBuffer[i]=0.0;       //
         HHBuffer[i]=0.0;       //
        }
     }
   else pos=prev_calculated-1;  // overwise calculate only last value
   // calculation of SMBuffer[], HalfHHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // calculation of LLBuffer[] - search for the minimal price (q bars)
      // calculation of HHBuffer[] - search for the maximal price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // calculation of SMBuffer[] - q-period Stochastic Momentum
      SMBuffer[i]=PriceBuffer[i]-0.5*(LLBuffer[i]+HHBuffer[i]);
      // calculation of HalfHHLLBuffer[] - half of price range (q bars)
      HalfHHLLBuffer[i]=0.5*(HHBuffer[i]-LLBuffer[i]);
     }

3. L'indicateur d'écart par rapport à la tendance

Les indicateurs pris en compte (voir la pièce jointe) sont divisés en deux groupes.

I. Indicateurs, basés sur un écart par rapport à la tendance du marché.

  1. Blau_MDI.mq5- Un indicateur d'un écart moyen par rapport à la tendance (écart moyen, écart moyenne mobile);
  2. Blau_Ergodic_MDI.mq5- Oscillateur ergodique MDI (basé sur l'écart moyen).

II. Indicateurs, basés sur les moyennes mobiles Convergence/Divergence.

  1. Blau_MACD.mq5- Convergence/Divergence des moyennes mobiles (MACD ; MACD lissé) ;
  2. Blau_Ergodic_MACD.mq5- Oscillateur MACD ergodique (basé sur l'indicateur MACD).


3.1. Indicateurs, basés sur l'écart par rapport aux tendances du marché

Fig3.1. Les indicateurs de William Blau sont basés sur un écart par rapport aux tendances du marché

Fig. 3.1. Les indicateurs de William Blau sont basés sur un écart par rapport aux tendances du marché

 

3.1.1. L'indicateur d'écart moyen

L'écart moyen par rapport à la tendance est la distance entre le prix et l'EMA (moyenne mobile exponentiellement lissée) de la période r, appliquée au prix.

La tendance de développement du marché : l'EMA(r), appliqué au prix est utilisé pour déterminer la tendance à la hausse (augmentation exponentielle) ou à la baisse (baisse exponentielle) des prix.

La moyenne mobile lisse la courbe des prix, mais une légère augmentation de la période de moyenne mobile entraîne un décalage, qui est clairement visible aux points de retournement des prix (voir en outre 1.1.1, Fig. 1.2). La valeur de l'écart moyen par rapport à la tendance indique la distance à l'EMA(r), appliquée au prix.

Le signe de l'écart moyen par rapport à la tendance indique la position du prix, par rapport à l'EMA(r) appliqué au prix : un écart positif par rapport à la tendance - le prix est supérieur à l'exponentiel, négatif - le prix est inférieur à l'exponentiel

La formule de l'écart moyen par rapport à la tendance :

md(price,r) = price - EMA(price,r)

Où :

  • prix - prix de la période en cours;
  • EMA (price,r) - la tendance du marché - EMA de la période r, appliquée au prix.

Voir dans le "Guide de l'utilisateur du terminal client MetaTrader", dans la section "Anatyics/Technical Indicators/Trend Indicators":

  1. Double moyenne mobile exponentielle, DEMA;
  2. Triple moyenne mobile exponentielle, TEMA.

Un indice similaire est utilisé par Alexander Elder dans ses indicateurs Bears Power et Bulls Power. Voir dans le "Guide de l'utilisateur du terminal client MetaTrader" dans la section"Analyse/Indicateurs techniques/Oscillateurs" :

  1. Bears Power;
  2. Bulls Power.

L'indicateur de l'écart moyen par rapport à la tendance (Mean Deviation Index, MDI) - est un écart moyen lissé par rapport à la tendance du marché.

La formule de l'indicateur de l'écart moyen par rapport à la tendance :

MDI(price,r,s,u) = EMA(EMA( md(price,r) ,s),u) = EMA(EMA( price-EMA(price,r) ,s),u)

Où :

  • prix - prix de [clôture] - la base de prix du graphique des prix ;
  • EMA (prix, r) - la tendance du marché - le premier lissage de l'EMA(r), appliqué au prix ;
  • md (prix,r) = prix-EMA (prix,r) - l'écart moyen par rapport à la tendance - l'écart du prix par rapport à l'EMA(r), appliqué au prix ;
  • EMA (md (price, r), s) - le deuxième lissage - le(s) EMA, appliqué(s) à l'écart moyen par rapport à la tendance ;
  • EMA (EMA (md(price,r),s),u) - le troisième lissage - l'EMA(u), appliqué au résultat du deuxième lissage.


3.1.1.3. MDI(price,r,s,u) - Indice d'écart moyen. Spécifications

  • Nom de fichier: Blau_MDI.mq5
  • Nom: L'indicateur de l'écart moyen par rapport au marché (écart moyen ; un écart moyen lissé), selon William Blau.
  • Paramètres d’entrée:
    • r - période de la 1ère EMA, appliquée au prix (par défaut r=20) ;
    • s - période de la 2e EMA, appliquée à l'écart moyen (par défaut, s = 5);
    • u - période de la 3e EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifications du rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs").
  • Limitations:
    • r>1;
    • s>0, u>0. Si s ou u sont égaux à 1, le lissage EMA n'est pas utilisé ;
    • la taille minimale du tableau des prix = (r+s+u-3+1).

 

3.1.2. Oscillateur MDI ergodique

Définition de l'oscillateur Ergodique MDI :
Ergodic_MDI(price,r,s,u) = MDI(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MDI(price,r,s,u) ,ul)

Où :

  • Ergodic_MDI() - Ergodic - Indice d'écart moyen MDI(prix,r,s,u);
  • Le SignalLine() -a Signal line - EMA de période ul, appliqué à l'Ergodic ;
  • ul - une période EMA d'une ligne Signal - selon William Blau, la valeur ul doit être égale à la période du dernier significatif (>1) de l'EMA ergodique.


3.1.2.2. Ergodic_MDI(price,r,s,u,ul) - Oscillateur Ergodique MDI. Spécifications

  • Nom de fichier: Blau_Ergodic_MDI.mq5
  • Nom: L'oscillateur ergodique MDI (basé sur l'indice de déviation moyenne), selon William Blau.
  • Paramètres d’entrée:
    • graphique n°0 - Ergodic (l'indicateur de l'écart moyen par rapport à la tendance) :
      • r - période de la 1ère EMA, appliquée au prix (par défaut r=20) ;
      • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut, s = 5) ;
      • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • tracé graphique n°1 - Ligne de signal :
      • ul - période de ligne de signal EMA, appliquée à l'ergodique (par défaut ul = 3);
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifier le style de rendu de chaque structure graphique - la couleur, la largeur, le style de ligne (l'onglet "Couleurs").
  • Limitations:
    • r>1;
    • s>0, u>0. Si s ou u sont égaux à 1, le lissage EMA n'est pas utilisé ;
    • ul>0. Si ul = 1, alors la ligne Signal et les lignes Ergodiques sont les mêmes ;
    • la taille minimale du tableau des prix = (r+s+u+ul-4+1).

 

3.1.3. Le code de l'oscillateur Ergodique

A titre d'exemple, examinons l'indicateur Ergodique_MDI (price,r,s,u,ul) :

1) Le rapport entre les tableaux d'indicateur, les tampons d'indicateur et les tracés graphiques :

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);              // ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);            // signal line: ul-period EMA of Ergodic
   // buffers for intermediate calculations; not used for plotting
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);     // price array
   SetIndexBuffer(3,EMA_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (price)
   SetIndexBuffer(4,MDBuffer,INDICATOR_CALCULATIONS);        // среднее отклонение
   SetIndexBuffer(5,DEMA_MDBuffer,INDICATOR_CALCULATIONS);   // s-period 2nd EMA

2) L'algorithme de calcul de l'écart moyen :

//--- calculation of the mean deviation
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // starting from 0
      for(i=0;i<pos;i++)       // pos data
         MDBuffer[i]=0.0;      // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last bar
   // r-period 1st EMA: calculation of EMA_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA_PriceBuffer);
   // calculation of MDBuffer[]
   for(i=pos;i<rates_total;i++)
      MDBuffer[i]=PriceBuffer[i]-EMA_PriceBuffer[i];


3.2. Indicateurs, basés sur la moyenne mobile de convergence/divergence

Fig 3.2. Les indicateurs de William Blau sont basés sur les moyennes mobiles Convergence/Divergence

Fig. 3.2. Les indicateurs de William Blau sont basés sur les moyennes mobiles Convergence/Divergence

 

3.2.1. L'indicateur de Convergence/Divergence des Moyennes Mobiles

La moyenne mobile de convergence/divergence (Moving Average Convergence/Divergence, MACD) - est la différence entre deux moyennes mobiles lissées de manière exponentielle : la MME rapide ( s) l'EMA(r) lente, appliquée au prix.

Le signe MACD indique la position du ou des Fast EMA, par rapport au lent EMA(r) : un MACD positif - EMA(s) est au-dessus de l'EMA(r), un MACD négatif - EMA(s) est en dessous de l'EMA (r). Modification du MACD par la valeur absolue : une augmentation|MACD| indique l'écart entre les moyennes mobiles, une diminution|MACD| indique une convergence des moyennes mobiles.

La formule de la Moyenne Mobile Convergence/Divergence :

macd(price,r,s) = EMA(price,s) - EMA(price,r)
s < r

Où :

  • prix - prix [clôture] de la période en cours;
  • EMA(price,r) - EMA lente(r), appliquée au prix ;
  • EMA(price,s) - EMA(s) rapide(s), appliquée au prix.

L'indicateur MACD indique le rapport entre les moyennes exponentielles rapides et lentes (convergence/divergence lissée des moyennes mobiles).

La formule de l'indicateur MACD :

MACD(price,r,s,u) = EMA( macd(price,r,s) ,u) = EMA( EMA(price,s)-EMA(price,r) ,u)
s < r

Où :

  • prix - prix de [clôture] - le prix du tableau des prix ;
  • EMA(price,r) - le premier lissage - la lente exponentielle de l'EMA(r), appliquée au prix ;
  • EMA(price,s) - le deuxième lissage - les EMA rapides, s, appliqués au prix ;
  • macd(r,s)=EMA(price,s)-EMA (price,r) - le MACD ;
  • EMA(macd (r,s),u) - le troisième lissage - l'EMA(u), appliqué au MACD : une EMA rapide (price,s) et une EMA lente (price,r).

3.2.1.1. MACD(price,r,s,u) - l'indicateur de convergence/divergence de la moyenne mobile. Spécifications

  • Nom de fichier: Blau_MACD.mq5
  • Nom: L'indicateur MACD (MACD; MACD lissé), selon William Blau.
  • Paramètres d’entrée:
    • r - période de la 1ère EMA (lente), appliquée au prix (par défaut r = 20) ;
    • s - période de la 2ème EMA (rapide), appliquée au prix (par défaut s = 5)
    • u - période de la 3ème EMA, appliquée aux moyennes mobiles convergence/divergence (par défaut u = 3) ;
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifications du rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs").
  • Limitations:
    • r>1, s>1;
    • s <r (limité par les exigences de la théorie, n'est pas vérifié au niveau du programme) ;
    • u>0. Si u = 1, le lissage n'est pas effectué ;
    • la taille minimale du tableau des prix = ([max(r,s)]+u-2+1).

 

3.2.2. Oscillateur MACD ergodique

La définition de l'oscillateur ergodique MACD :
Ergodic_MACD(price,r,s,u) = MACD(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MACD(price,r,s,u) ,ul)

Où :

  • Ergodic_MACD () - Ergodic - est un indicateur de convergence/divergence des moyennes mobiles MACD(price,r,s,u);
  • Le SignalLine() -une ligne de signal - un EMA(ul), appliqué à l'ergodique;
  • ul - une période EMA d'une ligne de signal - selon William Blau, la valeur ul doit être égale à la période du dernier significatif (>1) de l'EMA ergodique.

Le "Guide de l'utilisateur du terminal client MetaTrader", dans la section "Analytics/Technical Indicators/Oscillators/MACD", section décrit l'indicateur technique Convergence/Divergence des moyennes mobiles (MACD), intégré dans le terminal client MetaTrader 5, et comment l'utiliser dans l'analyse technique (voir aussi iMACD).

Contrairement au MACD standard, William Blau utilise la moyenne mobile lissée de façon exponentielle (dans le MACD standard, la moyenne mobile simple est utilisée).

3.2.2.1. Ergodic_MACD(price,r,s,u,ul) - Oscillateur ergodique MACD. Spécifications

  • Nom de fichier: Blau_Ergodic_MACD.mq5
  • Nom: Oscillateur MACD ergodique (basé sur l'indicateur de convergence/divergence des moyennes mobiles), selon William Blau.
  • Paramètres d’entrée:
    • graphique #0 - Ergodique (la convergence/divergence des moyennes mobiles) :
      • r - période de la 1ère EMA (lente), appliquée au prix (par défaut r = 20) ;
      • s - période de la 2ème EMA (rapide) appliquée au prix (par défaut s = 5)
      • u - période de la 3ème EMA, appliquée aux moyennes mobiles convergence/divergence (par défaut u = 3) ;
    • tracé graphique n°1 - la ligne de signal :
      • ul - période de ligne de signal EMA, est appliquée à l'ergodique (par défaut ul = 3);
    • AppliedPrice - type de prix (par défaut AppliedPrice=PRICE_CLOSE).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifier le style de rendu de chaque structure graphique - la couleur, la largeur, le style de ligne (l'onglet "Couleurs").
  • Limitations:
    • r>1, s>1;
    • s <r (limité par les exigences de la théorie, n'est pas vérifié au niveau du programme) ;
    • u>0. Si u = 1, le lissage n'est pas effectué ;
    • ul>0. Si ul = 1, alors la ligne de signal coïncide avec l'ergodique ;
    • la taille minimale du tableau des prix =([max(r,s)]+u+ul-3+1).

 

3.2.3. Le code de l'oscillateur MACD Ergodic

A titre d'exemple, examinons l'indicateur Ergodique_MACD (price,r,s,u,ul) :

1) Le lien entre les tableaux d'indicateurs, les tampons d'indicateurs et les tracés graphiques :

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic: u-period 3rd EMA
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: ul-period EMA, applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // price array
   SetIndexBuffer(3,EMA1_PriceBuffer,INDICATOR_CALCULATIONS); // r-period 1st EMA (slow), applied to price
   SetIndexBuffer(4,EMA2_PriceBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (fast), applied to price
   SetIndexBuffer(5,MACDBuffer,INDICATOR_CALCULATIONS);       // moving averages convergence/divergence

2) L'algorithme de convergence/divergence des moyennes mobiles :

//--- calculation of moving average convergence/divergence
   if(prev_calculated==0)      // at first call
     {
      pos=begin2;              // 
      for(i=0;i<pos;i++)       // pos
         MACDBuffer[i]=0.0;    // zero values
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // r-period 1st EMA: calculation of EMA1_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA1_PriceBuffer);
   // s-period 2nd EMA: calculation of EMA2_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,s,PriceBuffer,EMA2_PriceBuffer);
   // calculation of MACDBuffer[]
   for(i=pos;i<rates_total;i++)
      MACDBuffer[i]=EMA2_PriceBuffer[i]-EMA1_PriceBuffer[i];

3.3. Addition

Dans le calcul de l'oscillateur Ergodic MDI et de l'oscillateur MACD, selon William Blau, la normalisation n'est pas utilisée (pour référence, voir pp. 1.2.1, 1.3.1). Par conséquent, l'Oscillateur Ergodique MDI et l'Oscillateur MACD ne peuvent pas être utilisés pour interpréter le degré de surachat ou de survente du marché.

Par exemple, les recommandations d'utilisation des signaux de l'indicateur MACD du "Guide de l'utilisateur du terminal client MetaTrader" des "Analytics/Technical Indicators Rubrique /Oscillateurs/MACD" :

Le MACD est également utilisé comme un indicateur de surachat/survente. Lorsque la moyenne mobile courte s'éloigne spectaculairement de la moyenne mobile longue (à savoir que le MACD augmente), il est probable que le prix du symbole se dispersera et reviendra à des niveaux plus réalistes.

dans ce cas, du point de vue de l'analyse technique.


4. Dynamique Chandelier

Les indicateurs pris en compte (voir la pièce jointe) sont divisés en deux groupes.

  1. Blau_CMtm.mq5- est l'indicateur Candlestick Dynamique (Dynamique du chandelier à période-q ; Dynamique du chandelier à période-q lissé);
  2. Les indices (Dynamique chandelier lissé normalisé à période-q) :
    • Blau_CMI.mq5- l'indice Candlestick Dynamique (normalisation par la valeur absolue du Chandelier Dynamique q-période);
    • Blau_CSI.mq5- l'indice de chandelier (le chandelier normalisé par la longueur q-période du chandelier);
  3. L'oscillateur ergodique du chandelier
    • Blau_Ergodic_CMI.mq5- l'oscillateur ergodique CMI (basé sur l'indice Dynamique Chandelier);
    • Blau_Ergodic_CSI.mq5- l'oscillateur ergodique CSI (basé sur l'indice Chandelier).

Fig.4.1. Indicateurs de William Blau, basés sur la Dynamique Chandelier (normalisé par la valeur absolue du Chandelier Dynamique à période-q)

Fig. 4.1. Indicateurs de William Blau, basés sur le Candlestick Dynamique (normalisé par la valeur absolue du Candlestick Dynamique à la période-q)

 

Fig 4.2. Indicateurs de William Blau, basés sur le Chandelier Dynamique (normalisé par la longueur du chandelier de période-q)

Fig. 4.2. Indicateurs de William Blau, basés sur le Chandelier Dynamique (normalisé par la longueur du chandelier de période-q)

 

4.1. La Dynamique du chandelier

4.1.1. La définition de la Dynamique du Chandelier

La Dynamique (voir p. 1.1) - est la différence entre le prix actuel (généralement, le prix de clôture d'aujourd'hui) et le prix précédent (généralement le prix de clôture d'hier). La Dynamique peut refléter le changement de prix à n'importe quelle période du graphique des prix.

La Dynamique du chandelier (selon William Blau) - est la différence entre le prix de clôture et le prix d'ouverture, dans la même période (dans un chandelier). Le signe du Candlestick Dynamique montre la direction du changement de prix : un Candlestick Dynamique positif - le prix a augmenté sur la période, un négatif - le prix a diminué sur la période.

La formule de la Dynamique du Chandelier :

cmtm = close - open

Où :

  • clôture - le cours de clôture de la période [en cours] du (chandelier) ;
  • open - le prix d'ouverture de la période [en cours] du (chandelier).

Du point de vue de l'universalité, étendons la définition de la Dynamique du chandelier :

  1. La Dynamique du Chandelier peut refléter le changement de prix pour n'importe quelle période du tableau des prix ;
  2. La base de prix (le cours de clôture, le cours d'ouverture) peut être arbitraire.

Fig4.3. La définition du chandelier à période-q

Fig. 4.3. La définition du chandelier de période-q


La formule du Candlestick Dynamique Q-period :

cmtm(price1,price2,q) = price1 - price2[q-1]

Où :

  • q - est le nombre de barres du graphique des prix, utilisé dans le calcul du Candlestick Dynamique ;
  • prix1 - prix [clôture] à la fin de la période q;
  • prix2[q-1] - prix[ouverture] au début de la période q.

La formule de la Dynamique du Chandelier à période-q lissée :

CMtm(price1,price2,q,r,s,u) = EMA(EMA(EMA( cmtm(price1,price2,q) ,r),s),u)

Où :

  • q - le nombre de barres du graphique des prix, utilisé dans le calcul de la période-q de la Dynamique du Chandelier ;
  • prix1 - prix [clôture] à la fin de la période q;
  • prix2 - prix[ouverture] au début de la période q ;
  • cmtm(price1,price2,q)=price1-price2[q-1] - Dynamique du chandelier à période-q ;
  • EMA (cmtm (price1, price2, q), r) - le premier lissage - EMA(r), appliqué au Candlestick Dynamique de la période-q ;
  • EMA (EMA(..., r),s) - le deuxième lissage - EMA(s), appliqué au résultat du 1er lissage ;
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - EMA(u), appliqué au résultat du 2ème lissage.


4.1.2. CMtm(price1,price2,q,r,s,u) - Indicateur de la Dynamique du chandelier. Spécifications
  • Nom de fichier: Blau_CMtm.mq5
  • Nom: L'indicateur Candlestick Dynamique (Dynamique chandelier lissé à période-q), selon William Blau.
  • Paramètres d’entrée:
    • q - la période de Candlestick Dynamique (par défaut q = 1);
    • r - période de la 1ère EMA, appliquée à la Q-période Candlestick Dynamique (par défaut r = 20);
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice1 - type de prix [fermeture] (par défaut AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - type de prix [ouverture] (par défaut AppliedPrice=PRICE_OPEN).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifications du rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, le lissage EMA n'est pas utilisé ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).


4.2. Dynamique du Chandelier Normalisée

4.2.1. Indice de Dynamique du Chandelier

Le Candlestick Dynamique Index (CMI) - est la Dynamique du Chandelier normalisée à la période-q.

Les valeurs de la dynamique lissée du chandelier de période-q sont données en pourcentage (intervalle de mappage [-100, 100]). Chaque valeur de la dynamique lissée du Chandelier à période-q est normalisée par la valeur du Dynamique du Chandelier à période-q lissé, prise en valeur absolue. La normalisation permet à la valeur CMI d'être interprétée comme un degré de niveau de marché de surachat (valeur positive) ou de survente (valeur négative).

La formule de l'indice de Dynamique de Chandelier:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)          100 * CMtm(price1,pric2,q,r,s,u)
CMI(price1,price2,q,r,s,u) = –––––––––––-------------––––––––-–––––––––––––––– = –––––––––––––––-------------–––-–––––––––––––
                               EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)     EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)
if EMA(EMA(EMA(|cmtm(price1,pric2,q)|,r),s),u)=0, then CMI(price1,price2,q,r,s,u)=0

Où :

  • q - le nombre de périodes de temps du graphique des prix, impliquées dans le calcul de la Dynamique de la période-q du chandelier ;
  • prix1 - prix [clôture] à la fin de la période q;
  • prix2 - prix[ouverture] au début de la période q ;
  • cmtm(prix1,prix2,q)=prix1-prix2[q-1], - Dynamique du chandelier à période-q ;
  • |cmtm(prix1,prix2,q)| - valeur absolue du Candlestick Dynamique q-période ;
  • CMtm (prix, q, r, s, u) - Dynamique du chandelier à période-q lissée trois fois ;
  • EMA (..., r) - premier lissage - l'EMA(r), appliqué à :
    1) le Dynamique du chandelier à période-q
    2) la valeur absolue du Candlestick Dynamique de la période-q ;
  • EMA (EMA(..., r),s) - le deuxième lissage - le(s) EMA(s), appliqué(s) au résultat du 1er lissage ;
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - l'EMA(u), appliqué au résultat du 2ème lissage.


4.2.1.1. CMI(price1,price2,q,r,s,u) - Indice de Dynamique Candlestick. Spécifications

  • Nom de fichier: Blau_CMI.mq5
  • Nom : Indice de Dynamique de Chandelier de période-q (Dynamique de Chandelier de période-q lissé normalisé ; normalisation par la valeur absolue de la Dynamique de Chandelier de période-q), selon William Blau.
  • Paramètres d’entrée:
    • q - la période du Candlestick Dynamique (par défaut q = 1);
    • r - période de la 1ère EMA, appliquée au Candlestick Dynamique q-période (par défaut r = 20);
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice1 - type de prix [fermeture] (par défaut AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - type de prix [ouverture] (par défaut AppliedPrice=PRICE_OPEN).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • (facultatif) deux niveaux (la valeur par défaut est -25 et +25) - ajoute/supprime un niveau ; changer la valeur, la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, alors dans la période EMA correspondante, le lissage ne sera pas effectué ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

4.2.2. L'indice des Chandeliers

L'indice Candlestick (CSI) - est un indicateur de la Dynamique du chandelier normalisé à période-q (Dynamique chandelier lissé normalisé à période-q). Les valeurs du Candlestick Dynamique à période-q lissée sont données en pourcentage de l'échelle (intervalle de mappage [-100, 100]).

Chaque valeur du Dynamique du chandelier de période-q lissé est normalisée par la valeur de la fourchette de prix de période-q (ou par la longueur du chandelier de période-q). La normalisation permet d'interpréter la valeur de CSI comme un degré de niveau de marché de surachat (valeur positive) ou de survente (valeur négative).

La formule de l'Indice Chandelier :

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)    100 * CMtm(price1,pric2,q,r,s,u)
CSI(price1,price2,q,r,s,u) = –––––––––––––––––––-–––-------------––––––––––––– = ––––––––––––––––--––-–––––––––––––
                                    EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)           EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
if EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, then CSI(price1,price2,q,r,s,u)=0

Où :

  • q - le nombre de barres du graphique des prix, utilisé dans le calcul du Dynamique du chandelier à la période-q ;
  • prix1 - prix [clôture] à la fin de la période q;
  • prix2 - prix[ouverture] au début de la période q ;
  • cmtm(price1,pric2,q)=price1-price2[q-1] - Dynamique du chandelier à période-q ;
  • LL (q) - la valeur minimale du prix le plus bas pour la période q;
  • HH(q) - la valeur maximale du prix le plus élevé pour la période q
  • HH(q)-LL(q) - fourchette de prix de la période-q (la longueur du chandelier de la période-q);
  • CMtm(price1,pric2,q,r,s,u) - Dynamique du chandelier à période-q lissé trois fois ;
  • EMA (..., r) - le premier lissage - l'EMA(r), appliqué à :
    1) le Candlestick Dynamique de période-q, 
    2) la fourchette de prix de la période-q (ou la longueur du chandelier période-q) ;
  • EMA (EMA(..., r),s) - le deuxième lissage - le(s) EMA(s), appliqué(s) au résultat du 1er lissage ;
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - l'EMA(u), appliqué au résultat du 2ème lissage.

4.2.2.1. CSI(price1,price2,q,r,s,u) - Indice Chandelier. Spécifications

  • Nom de fichier: Blau_CSI.mq5
  • Nom : indice de Chandelier de période-q (la Dynamique du Chandelier de période de q lissé normalisée ; normalisation par la longueur du Chandelier de période-q), selon William Blau.
  • Paramètres d’entrée:
    • q - la période pour laquelle le Candlestick Dynamique de q-période est calculé (par défaut q = 1);
    • r - période de la 1ère EMA, appliquée au Dynamique du chandelier q-période (par défaut r = 20) ;
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • AppliedPrice1 - type de prix [fermeture] (par défaut AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - type de prix [ouverture] (par défaut AppliedPrice=PRICE_OPEN).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • (facultatif) deux niveaux (la valeur par défaut est -25 et +25) - ajoute/supprime un niveau ; changer la valeur, la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, le lissage EMA n'est pas utilisé ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

4.3. Les oscillateurs ergodiques du chandelier

4.3.1. L'oscillateur ergodique CMI

La définition de l'oscillateur Ergodic CMI :
Ergodic_CMI(price1,pric2,q,r,s,u) = CMI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CMI(price1,pric2,q,r,s,u) ,ul)

Où :

  • Ergodic_CMI() - Ergodic - Indice de Dynamique de Chandelier CMI(price1,price2,q,r,s,u);
  • Le SignalLine() -a Signal Line - EMA(ul), appliqué à l'Ergodique ;
  • ul - une période EMA d'une ligne de signal - selon William Blau, la valeur ul doit être égale à la période du dernier significatif (>1) de l'EMA ergodique.

Ergodic_CMI(price1,pric2,q,r,s,u,ul) - ergodic CMI-oscillator. Spécifications

  • Nom de fichier: Blau_Ergodic_CMI.mq5
  • Nom: Ergodic CMI-Oscillator (basé sur le Candlestick Dynamique Index), selon William Blau.
  • Paramètres d’entrée:
    • graphique n°0 - Ergodic (Indice de Dynamique Chandelier) :
      • q - la période de Candlestick Dynamique (par défaut q = 1);
      • r - période de la 1ère EMA, appliquée au Candlestick Dynamique q-période (par défaut r = 20);
      • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
      • u - période de la 3e EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • tracé graphique n°1 - la ligne de signal :
      • ul - période de Ligne de Signal, appliquée à l'ergodique (par défaut ul = 3) ;
    • AppliedPrice1 - type de prix [fermeture] (par défaut AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - type de prix [ouverture] (par défaut AppliedPrice=PRICE_OPEN).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu de chaque tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • deux niveaux (par défaut -25 et +25) - ajouter/supprimer un niveau, changer la valeur, la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, alors dans la période EMA correspondante, le lissage ne sera pas effectué ;
    • ul>0. Si ul = 1, alors la ligne de signal coïncide avec l'ergodique ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u + ul-4 +1).


Le code de l'oscillateur Ergodic CMI


A titre d'exemple, Examinons l'indicateur Ergodic_CMI (prix1,prix2,r,s,u,ul) :

1) Le rapport entre les tableaux d'indicateur, les tampons d'indicateur et les tracés graphiques :

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                  // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                // Signal Line: EMA(ul), applied to Ergodic
   // buffers for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);        // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);        // price array [open]
   SetIndexBuffer(4,CMtmBuffer,INDICATOR_CALCULATIONS);          // q-period Candlestick Momentum
   SetIndexBuffer(5,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsCMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum (absolute value)
   SetIndexBuffer(9,EMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute value)
   SetIndexBuffer(10,DEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute value)
   SetIndexBuffer(11,TEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute value)

2) Algorithme de calcul cmtm et |cmtm| :

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // applied price [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and |cmtm|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         AbsCMtmBuffer[i]=0.0; //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[] and AbsCMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      AbsCMtmBuffer[i]=MathAbs(CMtmBuffer[i]);
     }


4.3.2. L'oscillateur Ergodic CSI

L'oscillateur Ergodique CSI est défini comme suit :

Ergodic_CSI(price1,pric2,q,r,s,u) = CSI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CSI(price1,pric2,q,r,s,u) ,ul)

Où :

  • Ergodic_CSI() - Ergodic - Indice chandelier CSI(prix1,prix2,q,r,s,u);
  • Le SignalLine() -a Signal Line - le EMA(u)l, appliqué à l'Ergodique ;
  • ul - une période EMA d'une ligne de signal - selon William Blau, la valeur ul doit être égale à la période du dernier significatif (> 1) de l' EMA ergodique.


4.3.2.1. Ergodic_CSI(price1,pric2,q,r,s,u,ul) - oscillateur ergodique CSI. Spécifications

  • Nom de fichier: Blau_Ergodic_CSI.mq5
  • Nom: Ergodic CSI-Oscillator (basé sur le Candlestick Index), selon William Blau.
  • Paramètres d’entrée:
    • tracé graphique #0 - Ergodic (Indice Chandelier):
      • q - la période pour laquelle le Candlestick Dynamique de q-période est calculé (par défaut q = 1);
      • r - période de la 1ère EMA, appliquée à la Q-période Candlestick Dynamique (par défaut r = 20);
      • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
      • u - période de la 3ème EMA, appliquée au résultat du 2e lissage (par défaut, u = 3) ;
    • tracé graphique n°1 - la ligne de signal :
      • ul - période de ligne de signal EMA, est appliquée à l'ergodique (par défaut ul = 3) ;
    • AppliedPrice1 - type de prix [fermeture] (par défaut AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - type de prix [ouverture] (par défaut AppliedPrice=PRICE_OPEN).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu de chaque tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • deux niveaux (par défaut -25 et +25) - ajouter/supprimer un niveau, changer la valeur, la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, alors dans la période EMA correspondante, le lissage ne sera pas effectué ;
    • ul>0. Si ul = 1, alors la ligne de signal coïncide avec l'ergodique ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u + ul-4 +1).


4.3.2.2. Le code de l'oscillateur Ergodic CSI


Sur l'exemple de l'indicateur Ergodic_CSI (prix1, prix2,r,s,u,ul) :

1) Le rapport entre les tableaux d'indicateur, les tampons d'indicateur et les tracés graphiques :

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // Ergodic
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);     // price array [close]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);     // price arrya [open]
   SetIndexBuffer(4,LLBuffer,INDICATOR_CALCULATIONS);         // lowest prices (q bars)
   SetIndexBuffer(5,HHBuffer,INDICATOR_CALCULATIONS);         // highest prices (q bars)
   SetIndexBuffer(6,CMtmBuffer,INDICATOR_CALCULATIONS);       // q-period Candlestick Momentum
   SetIndexBuffer(7,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA
   SetIndexBuffer(8,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // s-period 2nd EMA
   SetIndexBuffer(9,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // u-period 3rd EMA
   SetIndexBuffer(10,HHLLBuffer,INDICATOR_CALCULATIONS);      // price range (q bars)
   SetIndexBuffer(11,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-period 1st EMA (price range)
   SetIndexBuffer(12,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (price range)
   SetIndexBuffer(13,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (price range)

2) L'algorithme de calcul pour le cmtm et la fourchette de prix de période-q : 

//--- calculation of Price1Buffer[] and Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // price type [close]
                        rates_total,         // rates total
                        prev_calculated,     // number of bars, calculated at previous call
                        Open,High,Low,Close, // Open[], High[], Low[], Close[]
                        Price1Buffer         // target array
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- calculation of cmtm and price range (q bars)
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         CMtmBuffer[i]=0.0;    // zero values
         HHLLBuffer[i]=0.0;    //
         LLBuffer[i]=0.0;      //
         HHBuffer[i]=0.0;      //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of CMtmBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // CMtmBuffer[] - q-period Candlestick Momentum
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      // LLBuffer[] - search for the lowest price (q bars)
      // HHBuffer[] - search for the highest price (q bars)
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // HHLLBuffer[] - Price Range (q bars)
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }

5. Tendance Directionnelle

Les indicateurs pris en compte (voir pièce jointe) :

  1. Blau_HLM.mq5- est un indicateur de la clôture virtuelle (Dynamique haut-bas composite à période-q ; Dynamique haut-bas composite à période-q lissé);
  2. Blau_DTI.mq5- l'indice de tendance directionnelle (Dynamique haut-bas composite lissé normalisé à période-q);
  3. Blau_Ergodic_DTI.mq5- l'oscillateur ergodique DTI (basé sur l'indice de tendance directionnelle).

Fig 5.1. Indicateurs d'indice de tendance directionnelle

Fig. 5.1. Indicateurs d'Indice de Tendance Directionnelle

 

5.1. Le Composite High-Low Momentum

5.1.1. Définir la dynamique de la tendance haussière et baissière

Une des définitions de la tendance. Si les valeurs ​​de l'augmentation maximale des prix, alors il y a une tendance à la hausse. Si les valeurs ​​des prix minimaux diminuent, alors il y a une tendance à la baisse.

Un groupe d'indicateurs Dynamique, discuté dans la section 1, peut être utilisé pour calculer le Dynamique pour les maximums des prix :

Mtm( price=High, q, r, s, u )
TSI( price=High, q, r, s, u )
Ergodic( price=High, q, r, s, u )

et pour les prix minimaux :

Mtm( price=Low, q, r, s, u )
TSI( price=Low, q, r, s, u )
Ergodic( price=Low, q, r, s, u )

Le Dynamique de tendance haussière ou la Dynamique haussière (HMU) est la différence positive entre le prix maximum de la période en cours et le prix maximum au début de la fourchette de prix de la période-q. La valeur du Dynamique de la période-q de la tendance haussière montre une vitesse relative de la croissance du prix maximum pour la période actuelle, par rapport au prix maximum au début de la plage des fluctuations de prix de la période-q.

La formule de la Dynamique de la période-q de la tendance haussière :

HMU(q) = High - High[q-1], if High - High[q-1] > 0
HMU(q) = 0, if High - High[q-1] <= 0

Où :

  • q - est le nombre de périodes de temps du graphique des prix, impliqué dans le calcul de la dynamique de tendance haussière ;
  • Élevé - le prix maximum pour la période en cours ;
  • High[q–1] - prix maximum (q-1) périodes passées.

La Dynamique de la tendance baissière ou la Dynamique baissière (LMD) - il s'agit d'une différence positive entre le prix minimum de la période actuelle et le prix le plus bas pour le début de la plage de fluctuations de prix de la période-q. La valeur de la dynamique de la période-q de la tendance baissière indique la vitesse relative de la baisse du prix minimum de la période actuelle, par rapport au prix le plus bas pour le début de la fourchette de prix de la période-q.

La formule du Dynamique de tendance baissière de la période-q :

LMD(q) = -(Low - Low[q-1]), if Low - Low[q-1] < 0
LMD(q) = 0, if Low - Low[q-1] >= 0

Où :

  • q - est le nombre de périodes du graphique des prix, utilisé dans le calcul de la dynamique de la tendance baissière ;
  • Bas - le prix minimum pour la période en cours;
  • Low[q-1] - le prix minimum (q-1) des périodes passées.

Une Dynamique haut-bas composite (Dynamique haut-bas, HLM) - est la différence entre la dynamique de la période-q de la tendance haussière et la dynamique de la période-q de la tendance baissière. Le signe du composite High-Low Dynamique indique la tendance des changements de prix: un HLM positif - une tendance à la hausse des prix (tendance à la hausse) et un négatif - la tendance à la baisse des prix (tendance à la baisse).

Formule:

HLM(q) = HMU(q) - LMD(q)

Où :

  • q - le nombre de périodes de temps du graphique des prix, impliquées dans le calcul des impulsions de la tendance haussière et baissière ;
  • HMU(q) - la dynamique de la tendance haussière pour la période q ;
  • LMD(q) - la dynamique de la tendance baissière pour la période q.

La formule de la période-q lissée Composite High-Low Dynamique (Virtual Close) :

HLM(q,r,s,u) = EMA(EMA(EMA( HLM(q) ,r),s),u) = EMA(EMA(EMA( HMU(q)-HMD(q) ,r),s),u)

Où :

  • q - le nombre de périodes de temps du graphique des prix, impliquées dans le calcul des impulsions de la tendance haussière et baissière ;
  • HMU(q) - la dynamique de la tendance haussière pour la période q ;
  • LMD(q) - la dynamique de la tendance baissière pour la période q ;
  • HLM(q) = HMU(q)-LMD(q) - le moment composite haut-bas à période-q ;
  • EMA (HLM (q), r) - le premier lissage - l'EMA(r), appliqué à la Q-période Composite High-Low Dynamique ;
  • EMA (EMA(..., r),s) - le deuxième lissage - le(s) EMA(s), appliqué(s) au résultat du 1er lissage
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - l'EMA(u), appliqué au résultat du 2nd lissage.

La courbe du graphique de la somme cumulée des impulsions complexes pour les maximums et les minimums est appelée clôture virtuelle.


5.1.2. HLM(q,r,s,u) - Indicateur de clôture virtuelle. Spécifications
  • Nom de fichier: Blau_HLM.mq5
  • Nom: Indicateur de la clôture virtuelle (q-period Composite High-Low Dynamique ; une q-période Composite High-Low Dynamique lissée), selon William Blau.
  • Paramètres d’entrée:
    • q - la période pour laquelle le HLM (par défaut q = 2) est calculé ;
    • r - période de la 1ère EMA, appliquée au HLM (par défaut r = 20) ;
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3e EMA, appliquée au résultat du 2e lissage (par défaut, u = 3).
  • En outre:
    • affiché dans une fenêtre séparée;
    • modifications du rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, alors dans la période EMA correspondante, le lissage ne sera pas effectué ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

5.2. Indice de Tendance Directionnelle

5.2.1. La définition de l'Indice de Tendance Directionnelle

L'Indice de Tendance Directionnelle (indice de tendance directionnelle, DTI) - est un indicateur d'une Dynamique composite haut-bas à période-q normalisée (HLM lissé normalisé). Les valeurs du HLM lissé sont données en pourcentage de l'échelle (intervalle d'affichage [-100, 100]).

Chaque valeur du HLM lissé est normalisée par la valeur d'un HLM lissé, prise en valeur absolue. La normalisation permet à la valeur DTI d'être interprétée comme un degré de niveau de marché de surachat (valeur positive) ou de survente (valeur négative).

La formule de l'indice de tendance directionnelle :

               100 * EMA(EMA(EMA( HLM(q) ,r),s),u)          100 * HLM(q,r,s,u)
DTI(q,r,s,u) = –––––––––––––––––––––––––---––––––– = ––––––––––––––--–––––––––––––––
                 EMA(EMA(EMA( |HLM(q)| ,r),s),u)     EMA(EMA(EMA( |HLM(q)| ,r),s),u)
if EMA(EMA(EMA(|HLM(q)|,r),s),u)=0, then DTI(price,q,r,s,u)=0

Où :

  • q - le nombre de périodes de temps du graphique des prix, impliquées dans le calcul des impulsions de la tendance haussière et baissière ;
  • HLM(q) = HMU(q)-LMD(q) - un Dynamique complexe de période-q pour les maximums et les minimums ;
  • |HLM(q)| - valeur absolue HLM(q) ;
  • HLM(q,r,s,u) - HLM(q) lissé trois fois ;
  • EMA(..., r) - le premier lissage - l'EMA(r), appliqué à :
    1) au HLM (q)
    2) à la valeur absolue du HLM (q) ;
  • EMA (EMA(..., r),s) - le deuxième lissage - le(s) EMA(s), appliqué(s) au résultat du 1er lissage ;
  • EMA (EMA (EMA (..., r), s), u) - le troisième lissage - l'EMA(u), appliqué au résultat du 2ème lissage.
5.2.2. DTI(q,r,s,u) - Indice de Tendance Directionnelle. Spécifications
  • Nom de fichier: Blau_DTI.mq5
  • Nom: Indice de tendance directionnelle (normalisé lissé Q-période Composite High-Low Dynamique), selon William Blau.
  • Paramètres d’entrée:
    • q - la période pour laquelle le HLM (par défaut q = 2) est calculé ;
    • r - période de la 1ère EMA, appliquée au HLM (par défaut r = 20) ;
    • s - période de la 2ème EMA, appliquée au résultat du 1er lissage (par défaut s = 5) ;
    • u - période de la 3e EMA, appliquée au résultat du 2e lissage (par défaut, u = 3).
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu du tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • (facultatif) deux niveaux (la valeur par défaut est -25 et +25) - ajoute/supprime un niveau ; changer la valeur, la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, alors dans la période EMA correspondante, le lissage ne sera pas effectué ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u-3 +1).

 

5.3. L'oscillateur Ergodic DTI

5.3.1. La définition de l'oscillateur Ergodic DTI

Ergodic_DTI(q,r,s,u) = DTI(q,r,s,u)
SignalLine(q,r,s,u,ul) = EMA( Ergodic_DTI(q,r,s,u) ,ul)

Où :

  • Ergodic_DTI() - Ergodic - Indice de tendance directionnelle DTI(q,r,s,u);
  • La SignalLine() - une Ligne de Signal - une moyenne mobile exponentielle de la période ul, appliquée à l'Ergodique ;
  • ul - une période EMA d'une ligne de signal - selon William Blau, la valeur ul doit être égale à la période du dernier significatif (> 1) de l' EMA ergodique.
5.3.2. Ergodic_DTI(q,r,s,u,ul) - Ergodic DTI-oscillator. Spécifications
  • Nom de fichier: Blau_Ergodic_DTI.mq5
  • Nom: Ergodic DTI-Oscillator (basé sur l'Indice de Tendance Directionnelle) par William Blau.
  • Paramètres d’entrée:
    • tracé graphique #0 - ergodique (indice de la tendance directionnelle) :
      • q - la période pour laquelle le HLM (par défaut q = 2) est calculé ;
      • r - période de la 1ère EMA, par rapport au HLM (par défaut r = 20) ;
      • s - période de la 2ème EMA, par rapport aux résultats du premier lissage (par défaut s = 5) ;
      • u - période de la 3e EMA, par rapport au résultat du deuxième lissage (par défaut, u = 3) ;
    • construction graphique n°1 - la ligne de signal :
      • ul - période de ligne de signal EMA, est appliquée à l'ergodique (par défaut ul = 3);
  • En outre:
    • affiché dans une fenêtre séparée;
    • changer le style de rendu de chaque tracé graphique - la couleur, l'épaisseur, le style de ligne (l'onglet "Couleurs");
    • deux niveaux (par défaut -25 et +25) - ajouter/supprimer un niveau, changer la valeur, la description du niveau, changer le style de rendu des niveaux (l'onglet "Niveaux");
    • modifier les limites inférieure (par défaut -100) et supérieure (par défaut 100) de l'échelle de la fenêtre d'indicateur unique (l'onglet "Echelle").
  • Limitations:
    • q>0;
    • r>0, s>0, u>0. Si r, s ou u sont égaux à 1, le lissage EMA n'est pas utilisé ;
    • ul>0. Si ul = 1, alors la ligne de signal coïncide avec l'ergodique ;
    • la taille minimale du tableau des prix = (q-1 + r + s + u + ul-4 +1).


5.4. Le code de l'oscillateur Ergodic DTI

L'indicateur Ergodic_DTI (q,r,s,u,ul) :

1) Le lien entre les tableaux d'indicateurs, les tampons d'indicateurs et les tracés graphiques :

//--- indicator buffers
   // graphic plot #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // Ergodic Line
   // graphic plot #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // Signal Line: EMA(ul), applied to Ergodic
   // buffers, used for intermediate calculations
   SetIndexBuffer(2,HMUBuffer,INDICATOR_CALCULATIONS);          // q-period Up Trend Momentum
   SetIndexBuffer(3,LMDBuffer,INDICATOR_CALCULATIONS);          // q-period Down Trend Momentum
   SetIndexBuffer(4,HLMBuffer,INDICATOR_CALCULATIONS);          // Composite q-period High/Low Momentum
   SetIndexBuffer(5,EMA_HLMBuffer,INDICATOR_CALCULATIONS);      // r-period 1st EMA
   SetIndexBuffer(6,DEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // s-period 2nd EMA
   SetIndexBuffer(7,TEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // u-period 3rd EMA
   SetIndexBuffer(8,AbsHLMBuffer,INDICATOR_CALCULATIONS);       // Composite q-period High/Low Momentum (absolute values)
   SetIndexBuffer(9,EMA_AbsHLMBuffer,INDICATOR_CALCULATIONS);   // r-period 1st EMA (absolute values)
   SetIndexBuffer(10,DEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // s-period 2nd EMA (absolute values)
   SetIndexBuffer(11,TEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // u-period 3rd EMA (absolute values)

2) Algorithme de calcul de HLM et |HML| :

//--- calculation of HLM and |HLM|
   if(prev_calculated==0)      // at first call
     {
      pos=begin1;              // 
      for(i=0;i<pos;i++)       // 
        {
         HLMBuffer[i]=0.0;     // zero values
         AbsHLMBuffer[i]=0.0;  //
         HMUBuffer[i]=0.0;     //
         LMDBuffer[i]=0.0;     //
        }
     }
   else pos=prev_calculated-1; // overwise calculate only last value
   // calculation of HLMBuffer[], AbsHLMBuffer[], HMUBuffer[], LMDBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      HMUBuffer[i]=High[i]-High[i-(q-1)];    HMUBuffer[i]=(HMUBuffer[i]>0)?HMUBuffer[i]:0;
      LMDBuffer[i]=-1*(Low[i]-Low[i-(q-1)]); LMDBuffer[i]=(LMDBuffer[i]>0)?LMDBuffer[i]:0;
      HLMBuffer[i]=HMUBuffer[i]-LMDBuffer[i];
      AbsHLMBuffer[i]=MathAbs(HLMBuffer[i]);
     }

Conclusion

La première partie de l'article  "Indicateurs et Systèmes de Trading de William Blau sur MQL5. Partie 1: Indicators" fournit une description des indicateurs et oscillateurs développés dans MQL5, du livre "Dynamique, Direction, and Divergence" par William Blau.

L'utilisation de ces indicateurs et oscillateurs lors de la prise de décisions de trading sera décrite dans la seconde partie de l'article "William Blau's Indicators and Trading Systems in MQL5. Partie 2: systèmes de Trading

 

Le contenu de l'archive des pièces jointes de cet article ("Blau_Indicators_MQL5_en.zip") :

File Description
Le fichier inclus. Emplacement: "terminal_data_folder\MQL5\Include"
 WilliamBlau.mqh  
Indicateurs Emplacement: "terminal_data_folder\MQL5\Indicators"
   Indicateurs, basés sur la Dynamique
 Blau_Mtm.mq5  L'indicateur de la Dynamique (Dynamique de la période-q, dynamique de la période-q lissée)
 Blau_TSI.mq5  L'Indice de Force Véritable (moment de la période-q lissé normalisé)
 Blau_Ergodic.mq5  Oscillateur ergodique (basé sur le véritable indice de force)
   Indicateurs, basés sur la Stochastique
 Blau_TStoch.mq5  Stochastique (stochastique à période-q, stochastique à période-q lissée)
 Blau_TStochI.mq5  Indice stochastique (stochastique à période-q lissée normalisée)
 Blau_TS_Stochastic.mq5  Oscillateur stochastique TS (basé sur l'indice stochastique)
   Indicateurs, basés sur la Dynamique Stochastique
 Blau_SM.mq5  dynamique stochastique (dynamique stochastique à période-q, dynamique stochastique à période-q lissé)
 Blau_SMI.mq5  Indice de dynamique stochastique (RSI de moment q-stochastique normalisé lissé)
 Blau_SM_Stochastic.mq5  Stochastique SM-Oscillateur (basé sur l'indice Stochastique Dynamique)
   Indicateurs, basés sur un écart par rapport à la tendance du marché
 Blau_MDI.mq5  Indicateur d'écart moyen (écart moyen, écart moyen lissé)
 Blau_Ergodic_MDI.mq5  Oscillateur MDI ergodique (basé sur l'indicateur d'écart moyen)
   Indicateurs, basés sur la moyenne mobile de convergence/divergence
 Blau_MACD.mq5  Indicateur de convergence/divergence des moyennes mobiles (MACD ; MACD lissé)
 Blau_Ergodic_MACD.mq5  Oscillateur MACD ergodique (basé sur l'indicateur MACD)
   Indicateurs, basés sur la Dynamique du Chandelier
 Blau_CMtm.mq5  Indicateur de la Dynamique du Chandelier (Dynamique du chandelier à période-q, Dynamique chandelier à période-q lissé)
 Blau_CMI.mq5  Indice de Dynamique du Chandelier (Dynamique Candlestick lissé normalisé à période-q ; normalisé par la valeur absolue de Dynamique du Chandelier de période-q)
 Blau_CSI.mq5  L'indice de chandelier (Dynamique de chandelier de période-q lissé normalisé ; normalisation par la longueur du chandelier de période-q)
 Blau_Ergodic_CMI.mq5  Oscillateur ergodique CMI (basé sur le Candlestick Dynamique Index)
 Blau_Ergodic_CSI.mq5  Oscillateur ergodique CSI (basé sur l'indice Chandelier)
   Indicateurs, basés sur le Composite de Dynamique
 Blau_HLM.mq5  Indicateur de Clôture Virtuelle (Dynamique haut-bas composite à période-q ; Dynamique haut-bas composite à période-q lissé)
 Blau_DTI.mq5  Indice d'une tendance directionnelle (normalisé lissé Q-période Composite High-Low Dynamique)
 Blau_Ergodic_DTI.mq5  Oscillateur DTI ergodique (basé sur l'Indice de Tendance Directionnelle)

Traduit du russe par MetaQuotes Ltd.
Article original : https://www.mql5.com/ru/articles/190

Utilisez les canaux MQL5.community et les discussions de groupe Utilisez les canaux MQL5.community et les discussions de groupe
Le site MQL5.com rassemble des traders du monde entier. Les utilisateurs publient des articles, partagent des codes gratuits, vendent des produits sur le Market, effectuent des commandes auprès des Freelance et copient des signaux de trading. Vous pouvez communiquer avec eux sur le Forum, dans les chats des traders et dans les canaux MetaTrader.
Construire un Analyseur de Spectre Construire un Analyseur de Spectre
Cet article est destiné à familiariser ses lecteurs avec une variante possible d'utilisation des objets graphiques du langage MQL5. Il analyse un indicateur, qui met implémente un panel de gestion d'un analyseur de spectre simple utilisant les objets graphiques. L'article est destiné aux lecteurs familiarisés avec les bases de MQL5.
Voici les nouveaux MetaTrader 5 et MQL5 Voici les nouveaux MetaTrader 5 et MQL5
Ceci n'est qu'un bref aperçu de MetaTrader 5. Je ne peux pas décrire toutes les nouvelles fonctionnalités du système sur une période aussi courte - les tests ont commencé le 09.09.2009. C'est une date symbolique, et je suis sûr que ce sera un chiffre porte-bonheur. Quelques jours se sont écoulés depuis que j'ai obtenu la version bêta du terminal MetaTrader 5 et MQL5. Je n'ai pas réussi à essayer toutes ses fonctionnalités, mais je suis déjà impressionné.
calcul de moyenne des Séries de Prix pour les Calculs Intermédiaires Sans Utiliser de Tampons Supplémentaires calcul de moyenne des Séries de Prix pour les Calculs Intermédiaires Sans Utiliser de Tampons Supplémentaires
Cet article concerne les algorithmes traditionnels et inhabituels de calcul de moyenne regroupés dans les classes les plus simples et à type unique. Ils sont destinés à une utilisation universelle dans presque toutes les élaborations d'indicateurs. J'espère que les classes proposées seront une bonne alternative aux appels « encombrants » d'indicateurs personnalisés et techniques.