Startseite Technischer Indikator Beitrag

Einfache Implementierung des TEMA mit Ringpuffern für MetaTrader 5

Anhang
1417.zip (11.22 KB, Herunterladen 0 mal)

Beschreibung

Die Klasse CTEMAOnRingBuffer wurde entwickelt, um den technischen Indikator des Dreifachen Exponentialgleitdurchschnitts (Triple Exponential Moving Average, TEMA) mithilfe des Algorithmus des Ringpuffers zu berechnen.

Deklaration

class CTEMAOnRingBuffer : public CArrayRing

Titel

#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>

Die Datei der CTEMAOnRingBuffer.mqh-Klasse muss im Ordner IncOnRingBuffer abgelegt werden, der im Verzeichnis MQL5\Include\ erstellt werden muss. Zwei Dateien mit Beispielen, die von dieser Klasse verwendet werden, sind der Beschreibung angehängt. Dateien mit den Klassen des Ringpuffers, DEMA und Gleitenden Durchschnitten müssen ebenfalls in diesem Ordner vorhanden sein.

Methoden der Klasse

//--- Initialisierungsmethode:
bool Init(                                // Bei Fehler gibt es false zurück, bei Erfolg - true
   int            period      = 12,       // Die TEMA-Periode
   ENUM_MA_METHOD method      = MODE_EMA, // Die Glättungsmethode
   int            size_buffer = 256,      // Die Größe des Ringpuffers
   bool           as_series   = false     // true, wenn es sich um eine Zeitreihe handelt, ansonsten - false
   );
//--- Berechnungsmethode basierend auf einer Zeitreihe oder den Indikatorpuffern:          
int MainOnArray(                  // Gibt die Anzahl der verarbeiteten Elemente zurück  
   const int     rates_total,     // Die Größe des Arrays
   const int     prev_calculated, // Verarbeitete Elemente beim vorherigen Aufruf
   const double& price[],         // Das Array zur Berechnung
   );
//--- Berechnungsmethode basierend auf einem bestimmten Element des Arrays           
double MainOnValue(              // Gibt den TEMA-Wert für das festgelegte Element (Bar) zurück
   const int    rates_total,     // Die Größe des Arrays
   const int    prev_calculated, // Verarbeitete Elemente des Arrays
   const int    begin,           // Von wo die signifikanten Daten des Arrays starten
const double value,           // Der Wert des Elements (Bar)
const int    index            // Der Index des Elements (Bar)
   );
//--- Methoden zum Zugriff auf die Daten:
int                 BarsRequired();  // Gibt die notwendige Anzahl an Bars zurück, um den Indikator zu zeichnen
string              Name();          // Gibt den Namen des Indikators zurück
int                 Period();        // Gibt die Periode zurück
int                 Size();          // Gibt die Größe des Ringpuffers zurück
double              MA(int index);   // Gibt den Wert des Gleitenden Durchschnitts zurück, Indizierung ist wie in einer Zeitreihe
double              DEMA(int index); // Gibt den DEMA-Wert zurück, Indizierung ist wie in einer Zeitreihe

Um die berechneten Daten des Indikators aus dem Ringpuffer zu erhalten, ist dies wie aus einem normalen Array möglich. Zum Beispiel:

//--- Die Klasse mit den Methoden zur Berechnung des TEMA-Indikators:
#include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh>
CTEMAOnRingBuffer tema;

...

//+------------------------------------------------------------------+
//| Benutzerdefinierte Indikator-Iterationsfunktion                              |
//+------------------------------------------------------------------+
int OnCalculate (const int rates_total,      // Die Größe des Preis[]-Arrays
                 const int prev_calculated,  // Verarbeitete Bars beim vorherigen Aufruf
                 const int begin,            // Von wo die signifikanten Daten starten
                 const double& price[])      // Das Array zur Berechnung
  {
//--- Berechnung des Indikators basierend auf einer Zeitreihe:
    tema.MainOnArray(rates_total,prev_calculated,price);

...

//--- Nutzung der Daten aus dem "tema" Ringpuffer,
//    zum Beispiel, Kopieren der Daten in den Indikatorpuffer:
   for(int i=start;i<rates_total && !IsStopped();i++)
      TEMA_Buffer[i] = tema[rates_total-1-i]; // Die TEMA-Indikatorlinie

...

//--- Rückgabewert von prev_calculated für den nächsten Aufruf:
   return(rates_total);
  }

Bei der Berechnung der TEMA erfolgt auch die Berechnung des Gleitenden Durchschnitts und DEMA mit den gleichen Parametern. Wir können die Daten aus dem MA-Ringpuffer und DEMA mit den Methoden MA(int index) und DEMA(int index) abrufen:

//--- Nutzung der Daten aus den Ringpuffern des Gleitenden Durchschnitts und DEMA,
//    zum Beispiel, Kopieren in die Indikatorpuffer:
   for(int i=start;i<rates_total && !IsStopped();i++)
     {
      MA_Buffer[i]   = dema.MA(rates_total-1-i);   // Die Gleitende Durchschnitts-Indikatorlinie
      DEMA_Buffer[i] = dema.DEMA(rates_total-1-i); // Die DEMA-Indikatorlinie
     }

Bitte beachten Sie, dass die Indizierung in den Ringpuffern der gleichen wie in der Zeitreihe entspricht.

Beispiele

  1. Der Indikator berechnet die Datei Test_TEMA_OnArrayRB.mq5 auf der Grundlage der Preis-Zeitreihe. Die Anwendung der Methode MainOnArray() wird demonstriert.
  2. Die Datei Test_TEMA_OnValueRB.mq5 demonstriert die Verwendung der Methode MainOnValue(). Zunächst wird der TEMA-Indikator berechnet und gezeichnet. Dann wird auf der Grundlage dieses Indikators ein weiterer TEMA gezeichnet.


Das Ergebnis der Berechnung des Test_TEMA_OnArrayRB.mq5 mit einer Ringpuffergröße von 256 Elementen



Das Ergebnis der Berechnung des Test_TEMA_OnValueRB.mq5 mit einer Ringpuffergröße von 256 Elementen

 

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

Verwandte Beiträge

Kommentar (0)