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

Mike 2012.12.28 17:51 50 0 0
Anhang

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
   constint     rates_total,     // Größe des Arrays array[]
   constint     prev_calculated, // verarbeitete Elemente beim vorherigen Aufruf
   constdouble &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
   constint    rates_total,     // Größe des Arrays
   constint    prev_calculated, // verarbeitete Elemente des Arrays
   constint    begin,           // von wo die signifikanten Daten des Arrays beginnen
   constdouble value,           // das Wertelement des Arrays
   constint    index            // der Elementeindex
   );
//--- Methoden zum Zugriff auf die Daten:int    BarsRequired();   // Gibt die erforderliche Anzahl an Bars zurück, um den Indikator zu zeichnenstring Name()            // Gibt den Namen des Indikators zurückstring NameMain()            // Gibt den Namen der Hauptlinie des Indikators zurückstring NameSignal()          // Gibt den Namen der Signal-Linie des Indikators zurückstring FastMethod()      // Gibt die Methode der Glättung der schnellen Linie als Text zurückstring SlowMethod()      // Gibt die Methode der Glättung der langsamen Linie als Text zurückstring SignalMethod()      // Gibt die Methode der Glättung der Signal-Linie als Text zurückint    FastPeriod()      // Gibt den Zeitraum der Glättung der schnellen Linie zurückint    SlowPeriod()      // Gibt den Zeitraum der Glättung der langsamen Linie zurückint    SignalPeriod()      // Gibt den Zeitraum der Glättung der Signal-Linie zurückint    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                              |//+------------------------------------------------------------------+intOnCalculate(constint    rates_total, 
                constint    prev_calculated, 
                constint    begin, 
                constdouble &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.

Liste
Kommentar 0