OsCD mit Ringpuffer: Ein Leitfaden für MetaTrader 5 Trader

Mike 2013.01.08 00:45 20 0 0
Anhang

Beschreibung

Die Klasse COsMAOnRingBuffer wurde entwickelt, um den technischen Indikator Moving Average of Oscillator (OsMA) mithilfe des Ringpuffer-Algorithmus zu berechnen.

Deklaration

class COsMAOnRingBuffer : public CArrayRing

Titel

#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>

Die Datei COsMAOnRingBuffer.mqh sollte im Ordner IncOnRingBuffer abgelegt werden, den ihr im Verzeichnis MQL5\Include\ erstellen müsst. Zwei Beispiel-Dateien, die von dieser Klasse verwendet werden, sind ebenfalls angehängt. Dateien mit Ringpuffer, MACD und Moving Average Klassen sollten ebenfalls in diesem Ordner vorhanden sein.

Klassenmethoden

//--- Initialisierungs-Methode:
bool Init(                                  // gibt false bei Fehler zurück, true bei Erfolg
   int            fast_period   = 12,       // Zeitraum der schnellen Moving Average Glättung
   int            slow_period   = 26,       // Zeitraum der langsamen Moving Average Glättung
   int            signal_period = 9,        // Zeitraum der Signal Moving Average Glättung
   ENUM_MA_METHOD fast_method   = MODE_EMA, // Methode der schnellen Moving Average Glättung
   ENUM_MA_METHOD slow_method   = MODE_EMA, // Methode der langsamen Moving Average Glättung
   ENUM_MA_METHOD signal_method = MODE_SMA, // Methode der Signal Moving Average Glättung
   int            size_buffer   = 256,      // Größe des Ringpuffers, Anzahl der gespeicherten Daten
   bool           as_series     = false     // true, falls Zeitreihe, false bei normaler Indizierung der Eingabedaten
   );
//--- Berechnungsmethode basierend auf einer Zeitreihe oder 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 bei vorherigem Aufruf
   const double &array[]          // Array der Eingabewerte
   );
//--- Berechnungsmethode basierend auf den separaten Serien-Elementen des Arrays
double MainOnValue(              // gibt den OsMA-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 relevanten Daten des Arrays beginnen
   const double value,           // relevante Elemente des Arrays
   const int    index            // Element-Index
   );
//--- Methoden zum Zugriff auf Daten:
int    BarsRequired();   // Gibt die notwendige Anzahl an Balken für die Anzeige des Indikators zurück
string Name()            // Gibt den Namen 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 Signallinie 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 Signallinie zurück
int    Size();           // Gibt die Größe des Ringpuffers zurück

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

//--- Klasse mit den Methoden zur Berechnung des Indikators OsMA:
#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>
COsMAOnRingBuffer osma;

...

//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iteration Funktion                              |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &price[]) 
  {
//--- Berechnung des Indikators basierend auf einer Preis-Zeitreihe:
   osma.MainOnArray(rates_total,prev_calculated,price);

...

//--- Verwendung der Daten aus den "osma" Ringpuffern,
//    Kopieren der Daten in den Indikatorpuffer:
   for(int i=start;i<rates_total;i++)
      OsMABuffer[i]=osma[rates_total-1-i];          // Indikator-Histogramm
//--- Rückgabewert von prev_calculated für den nächsten Aufruf:
   return(rates_total);
  }

Bitte beachtet, dass die Indizierung im Ringpuffer der gleichen wie in der Zeitreihe entspricht.

Beispiele

  1. Die Datei Test_OsMA_OnArrayRB.mq5 berechnet den Indikator basierend auf der Preis-Zeitreihe. Die Anwendung der MainOnArray()-Methode wird demonstriert.
  2. Die Datei Test_OsMA_OnValueRB.mq5 zeigt die Verwendung der MainOnValue()-Methode. Zuerst wird der OsMA-Indikator berechnet und gezeichnet. Dann wird auf Basis dieses Ringpuffers ein weiterer OsMA-Indikator gezeichnet.


Das Ergebnis der Arbeit der Test_OsMA_OnArrayRB.mq5 mit einer Ringpuffer-Größe von 256 Elementen.



Das Ergebnis der Arbeit der Test_OsMA_OnValueRB.mq5 mit einer Ringpuffer-Größe von 256 Elementen.

 

Bei der Programmierung wurden Entwicklungen von MetaQuotes Software Corp., Integer und GODZILLA verwendet.

Liste
Kommentar 0