Startseite Technischer Indikator Beitrag

MACD Indikator mit Ringpuffer für MetaTrader 5: So funktioniert's

Anhang
1361.zip (9.66 KB, Herunterladen 0 mal)

Beschreibung

Die CMACDOnRingBuffer-Klasse wurde entwickelt, um den technischen Indikator Moving Average Convergence/Divergence (MACD) mithilfe des Ringpuffer-Algorithmus zu berechnen.

Deklaration

class CMACDOnRingBuffer

Titel

#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>

Die Datei CMACDOnRingBuffer.mqh sollte im Ordner IncOnRingBuffer abgelegt werden, den du im Verzeichnis MQL5\Include\ anlegen musst. Zwei Beispiel-Dateien, die von der Klasse verwendet werden, sind dieser Beschreibung angehängt. Auch die Datei der Ringpuffer-Klasse und die Klasse für den gleitenden Durchschnitt müssen in diesem Ordner vorhanden sein.

Methoden der Klasse

//--- Initialisierungsmethode:
bool Init(                                  // Gibt false zurück, wenn ein Fehler auftritt, true bei Erfolg
   int            fast_period   = 12,       // Zeitraum des schnellen gleitenden Durchschnitts
   int            slow_period   = 26,       // Zeitraum des langsamen gleitenden Durchschnitts
   int            signal_period = 9,        // Zeitraum des Signalgleitenden Durchschnitts
   ENUM_MA_METHOD fast_method   = MODE_EMA, // Methode für schnellen gleitenden Durchschnitt
   ENUM_MA_METHOD slow_method   = MODE_EMA, // Methode für langsamen gleitenden Durchschnitt
   ENUM_MA_METHOD signal_method = MODE_SMA, // Methode für Signalgleitenden Durchschnitt
   int            size_buffer   = 256,      // Größe des Ringpuffers, Anzahl der gespeicherten Daten
   bool           as_series     = false     // true, wenn eine Zeitreihe, false bei normalem Indexing der Eingabedaten
   );
//--- Berechnungsmethode basierend auf einer Zeitreihe oder dem Indikatorpuffer:
int MainOnArray(                  // Gibt die Anzahl der verarbeiteten Elemente zurück
   const int     rates_total,     // Größe des Arrays array[]
   const int     prev_calculated, // verarbeitete Elemente beim vorherigen Aufruf
   const double &array[]          // Array der Eingabewerte
   );
//--- Berechnungsmethode basierend auf den einzelnen Elementen der Array-Serie:
double MainOnValue(              // Gibt den MACD-Wert für das festgelegte Element zurück
   const int    rates_total,     // Größe des Arrays
   const int    prev_calculated, // verarbeitete Elemente des Arrays
   const int    begin,           // von wo die signifikanten Daten des Arrays beginnen
   const double value,           // das Wertelement des Arrays
   const int    index            // der Elementeindex
   );
//--- Methoden zum Zugriff auf die Daten:
int    BarsRequired();   // Gibt die erforderliche Anzahl an Bars zurück, um den Indikator zu zeichnen
string Name()            // Gibt den Namen des Indikators zurück
string NameMain()            // Gibt den Namen der Hauptlinie des Indikators zurück
string NameSignal()          // Gibt den Namen der Signal-Linie des Indikators zurück
string FastMethod()      // Gibt die Methode der Glättung der schnellen Linie als Text zurück
string SlowMethod()      // Gibt die Methode der Glättung der langsamen Linie als Text zurück
string SignalMethod()      // Gibt die Methode der Glättung der Signal-Linie als Text zurück
int    FastPeriod()      // Gibt den Zeitraum der Glättung der schnellen Linie zurück
int    SlowPeriod()      // Gibt den Zeitraum der Glättung der langsamen Linie zurück
int    SignalPeriod()      // Gibt den Zeitraum der Glättung der Signal-Linie zurück
int    Size();           // Gibt die Größe des Ringpuffers zurück

Die berechneten Daten des Indikators können aus dem Ringpuffer wie aus einem gewöhnlichen Array abgerufen werden. Zum Beispiel:

//--- Die Klasse mit den Methoden zur Berechnung des MACD-Indikators:
#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>
CMACDOnRingBuffer macd;

...

//+------------------------------------------------------------------+
//| Funktion zur Iteration des benutzerdefinierten Indikators                              |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &price[]) 
  {
//--- Berechnung des Indikators basierend auf der Preisdatenreihe:
   macd.MainOnArray(rates_total,prev_calculated,price);

...
   //--- Nutzung der Daten aus den "macd" Ringpuffern,
//    Daten in den Indikator-Puffern kopieren:
   for(int i=start;i<rates_total;i++)
     {
      MainBuffer[i]   = macd[rates_total-1-i];          // Indikator-Histogramm
      SignalBuffer[i] = macd.signal[rates_total-1-i];   // Signal-Linie des Indikators
     }
//--- Rückgabewert von prev_calculated für den nächsten Aufruf:
   return(rates_total);
  }

Bitte beachte, dass die Indizierung im Ringpuffer derjenigen in der Zeitreihe entspricht.

Beispiele

  • Die Datei Test_MACD_OnArrayRB.mq5 berechnet den Indikator basierend auf der Preisdatenreihe. Die Anwendung der MainOnArray()-Methode wird demonstriert.
  • Die Datei Test_MACD_OnValueRB.mq5 zeigt die Verwendung der MainOnValue()-Methode. Zuerst wird der MACD-Indikator berechnet und gezeichnet. Dann wird auf Basis des Ringpuffers dieses Indikators ein weiterer MACD-Indikator gezeichnet.


Das Ergebnis der Arbeit der Test_MACD_OnArrayRB.mq5 mit einer Ringpuffergröße von 256 Elementen



Das Ergebnis der Arbeit der Test_MACD_OnValueRB.mq5 mit einer Ringpuffergröße von 256 Elementen

 

Bei der Erstellung des Codes wurden Entwicklungen von MetaQuotes Software Corp., Integer und GODZILLA verwendet.

Verwandte Beiträge

Kommentar (0)