Apprenez à dessiner le MACD avec le buffer circulaire sur MetaTrader 5

Mike 2012.12.28 17:51 15 0 0
Pièce jointe

Description

La classe CMACDOnRingBuffer est conçue pour le calcul de l'indicateur technique Moyenne Mobile de Convergence/Divergence (MACD) en utilisant l'algorithme du buffer circulaire.

Déclaration

class CMACDOnRingBuffer

Titre

#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>

Le fichier de la classe CMACDOnRingBuffer.mqh doit être placé dans le dossier IncOnRingBuffer, qui doit être établi dans MQL5\Include\. Deux fichiers avec les exemples utilisés par la classe depuis ce dossier sont joints à la description. Le fichier avec la classe du buffer circulaire et la classe de la Moyenne Mobile doivent également se trouver dans ce dossier.

Méthodes de la classe

//--- méthode d'initialisation :
bool Init(            // si erreur, retourne false, si succès - true
   int            fast_period   = 12,       // période de la Moyenne Mobile rapide
   int            slow_period   = 26,       // période de la Moyenne Mobile lente
   int            signal_period = 9,        // période de la Moyenne Mobile du signal
   ENUM_MA_METHOD fast_method   = MODE_EMA, // méthode de la Moyenne Mobile rapide
   ENUM_MA_METHOD slow_method   = MODE_EMA, // méthode de la Moyenne Mobile lente
   ENUM_MA_METHOD signal_method = MODE_SMA, // méthode de la Moyenne Mobile du signal
   int            size_buffer   = 256,      // taille du buffer circulaire
   bool           as_series     = false     // true si série temporelle, false sinon
   );
//--- méthode de calcul basée sur une série temporelle :
int MainOnArray(                  // retourne le nombre d'éléments traités
   const int     rates_total,     // taille du tableau
   const int     prev_calculated, // éléments traités lors de l'appel précédent
   const double &array[]          // tableau des valeurs d'entrée
   );
//--- méthode de calcul basée sur des éléments séparés :
double MainOnValue(              // retourne la valeur MACD pour l'élément défini
   const int    rates_total,     // taille du tableau
   const int    prev_calculated, // éléments traités du tableau
   const int    begin,           // début des données significatives
   const double value,           // valeur de l'élément du tableau
   const int    index            // index de l'élément
   );
//--- méthodes d'accès aux données :
int    BarsRequired();   // Retourne le nombre de barres nécessaires pour dessiner l'indicateur
string Name()            // Retourne le nom de l'indicateur
string NameMain()            // Retourne le nom de la ligne principale de l'indicateur
string NameSignal()            // Retourne le nom de la ligne signal de l'indicateur
string FastMethod()            // Retourne la méthode de lissage de la ligne rapide
string SlowMethod()            // Retourne la méthode de lissage de la ligne lente
string SignalMethod()            // Retourne la méthode de lissage de la ligne du signal
int    FastPeriod()      // Retourne la période de lissage de la ligne rapide
int    SlowPeriod()      // Retourne la période de lissage de la ligne lente
int    SignalPeriod()      // Retourne la période de lissage de la ligne du signal
int    Size();           // Retourne la taille du buffer circulaire

Pour obtenir les données calculées de l'indicateur à partir du buffer circulaire, on peut procéder comme avec un tableau habituel. Par exemple :

//--- classe avec les méthodes de calcul du MACD :
#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>
CMACDOnRingBuffer macd;

...

//+------------------------------------------------------------------+
//| Fonction d'itération de l'indicateur personnalisé                              |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &price[]) 
  {
//--- calcul de l'indicateur basé sur les séries temporelles :
   macd.MainOnArray(rates_total,prev_calculated,price);

...

//--- utiliser les données des buffers circulaires "macd",
//    copier les données dans les buffers de l'indicateur :
   for(int i=start;i<rates_total;i++)
     {
      MainBuffer[i]   = macd[rates_total-1-i];          // histogramme de l'indicateur
      SignalBuffer[i] = macd.signal[rates_total-1-i];   // ligne du signal de l'indicateur
     }
//--- valeur de prev_calculated pour l'appel suivant :
   return(rates_total);
  }

Veuillez noter que l'indexation dans le buffer circulaire est la même que dans les séries temporelles.

Exemples

  1. Le fichier Test_MACD_OnArrayRB.mq5 calcule l'indicateur basé sur les séries temporelles des prix. L'application de la méthode MainOnArray() est démontrée.
  2. Le fichier Test_MACD_OnValueRB.mq5 montre l'utilisation de la méthode MainOnValue(). D'abord, l'indicateur MACD est calculé et tracé. Ensuite, sur la base du buffer circulaire de cet indicateur, un autre indicateur MACD est tracé.


Le résultat du fichier Test_MACD_OnArrayRB.mq5 avec une taille de buffer circulaire de 256 éléments



Résultat du fichier Test_MACD_OnValueRB.mq5 avec une taille de buffer circulaire de 256 éléments

 

Lors de l'écriture du code, les développements de MetaQuotes Software Corp., Integer et GODZILLA ont été utilisés.

Liste
Commentaire 0