Calculer l'OsMA avec la classe COsMAOnRingBuffer pour MetaTrader 5

Mike 2013.01.08 00:45 19 0 0
Pièce jointe

Description

La classe COsMAOnRingBuffer est conçue pour calculer l'indicateur technique Moyenne Mobile de l'Oscillateur (OsMA) en utilisant l'algorithme du buffer circulaire.

Déclaration

class COsMAOnRingBuffer : public CArrayRing

Titre

#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>

Le fichier de la classe COsMAOnRingBuffer.mqh doit être placé dans le dossier IncOnRingBuffer qui doit être créé dans MQL5\Include\. Deux fichiers avec des exemples utilisés par la classe de ce dossier sont joints à la description. Les fichiers contenant le buffer circulaire, le MACD et les classes de Moyenne Mobile doivent également être dans ce dossier.

Méthodes de la classe

//--- méthode d'initialisation :
bool Init(// retourne false en cas d'erreur, true en cas de succès
  int fast_period = 12, // période de lissage de la Moyenne Mobile rapide
  int slow_period = 26, // période de lissage de la Moyenne Mobile lente
  int signal_period = 9, // période de lissage de la Moyenne Mobile de signal
  ENUM_MA_METHOD fast_method = MODE_EMA, // méthode de lissage de la Moyenne Mobile rapide
  ENUM_MA_METHOD slow_method = MODE_EMA, // méthode de lissage de la Moyenne Mobile lente
  ENUM_MA_METHOD signal_method = MODE_SMA, // méthode de lissage de la Moyenne Mobile de signal
  int size_buffer = 256, // taille du buffer circulaire, nombre de données stockées
  bool as_series = false // true si c'est une série temporelle, false si c'est un index habituel des données d'entrée
  );
//--- méthode de calcul basée sur une série temporelle ou un buffer d'indicateur :
int MainOnArray(// retourne le nombre d'éléments traités
  const int rates_total, // taille du tableau array[]
  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 de la série du tableau :
double MainOnValue(// retourne la valeur OsMA 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, // à partir de là, les données significatives du tableau commencent
  const double value, // éléments significatifs du tableau
  const int index // index de l'élément
  );
//--- méthodes d'accès aux données :
int BarsRequired(); // Retourne le nombre nécessaire de bars pour dessiner l'indicateur
string Name(); // Retourne le nom de l'indicateur
string FastMethod(); // Retourne la méthode de lissage de la ligne rapide sous forme de texte
string SlowMethod(); // Retourne la méthode de lissage de la ligne lente sous forme de texte
string SignalMethod(); // Retourne la méthode de lissage de la ligne de signal sous forme de texte
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 de signal
int Size(); // Retourne la taille du buffer circulaire

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

//--- la classe avec les méthodes de calcul de l'indicateur OsMA :
#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>
COsMAOnRingBuffer osma;

...

//+------------------------------------------------------------------+
//| 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 une série temporelle de prix :
     osma.MainOnArray(rates_total, prev_calculated, price);

...

//--- utiliser les données des buffers circulaires "osma",
//    copier les données dans le buffer de l'indicateur :
    for(int i=start; i<rates_total; i++)
      OsMABuffer[i]=osma[rates_total-1-i];          // histogramme de l'indicateur
//--- valeur de retour 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 la série temporelle.

Exemples

  1. Le fichier Test_OsMA_OnArrayRB.mq5 calcule l'indicateur basé sur la série temporelle des prix. L'application de la méthode MainOnArray() est démontrée.
  2. Le fichier Test_OsMA_OnValueRB.mq5 démontre l'utilisation de la méthode MainOnValue(). Au départ, l'indicateur OsMA est calculé et dessiné. Ensuite, sur la base de ce buffer circulaire de cet indicateur, un autre indicateur OsMA est dessiné.


Le résultat du travail du Test_OsMA_OnArrayRB.mq5 avec la taille du buffer circulaire de 256 éléments.



Le résultat du travail du Test_OsMA_OnValueRB.mq5 avec la taille du buffer circulaire de 256 éléments.

 

Lors de la rédaction du code, les développements de MetaQuotes Software Corp., Integer et GODZILLA ont été utilisés.

Liste
Commentaire 0