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

Mike 2012.12.28 17:51 54 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
   constint     rates_total,     // taille du tableau
   constint     prev_calculated, // éléments traités lors de l'appel précédent
   constdouble &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
   constint    rates_total,     // taille du tableau
   constint    prev_calculated, // éléments traités du tableau
   constint    begin,           // début des données significatives
   constdouble value,           // valeur de l'élément du tableau
   constint    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'indicateurstring Name()            // Retourne le nom de l'indicateurstring NameMain()            // Retourne le nom de la ligne principale de l'indicateurstring NameSignal()            // Retourne le nom de la ligne signal de l'indicateurstring FastMethod()            // Retourne la méthode de lissage de la ligne rapidestring SlowMethod()            // Retourne la méthode de lissage de la ligne lentestring SignalMethod()            // Retourne la méthode de lissage de la ligne du signalint    FastPeriod()      // Retourne la période de lissage de la ligne rapideint    SlowPeriod()      // Retourne la période de lissage de la ligne lenteint    SignalPeriod()      // Retourne la période de lissage de la ligne du signalint    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é                              |//+------------------------------------------------------------------+intOnCalculate(constint    rates_total, 
                constint    prev_calculated, 
                constint    begin, 
                constdouble &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