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

Mike 2013.01.08 00:45 43 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
   constint     rates_total,     // Größe des Arrays array[]
   constint     prev_calculated, // verarbeitete Elemente bei vorherigem Aufruf
   constdouble &array[]          // Array der Eingabewerte
   );
//--- Berechnungsmethode basierend auf den separaten Serien-Elementen des Arraysdouble MainOnValue(              // gibt den OsMA-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 relevanten Daten des Arrays beginnen
   constdouble value,           // relevante Elemente des Arrays
   constint    index            // Element-Index
   );
//--- Methoden zum Zugriff auf Daten:int    BarsRequired();   // Gibt die notwendige Anzahl an Balken für die Anzeige des Indikators zurückstring Name()            // Gibt den Namen 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 Signallinie 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 Signallinie zurückint    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                              |//+------------------------------------------------------------------+intOnCalculate(constint    rates_total, 
                constint    prev_calculated, 
                constint    begin, 
                constdouble &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