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
- Der Indikator berechnet die Datei
Test_TEMA_OnArrayRB.mq5auf der Grundlage der Preis-Zeitreihe. Die Anwendung der MethodeMainOnArray()wird demonstriert. - Die Datei
Test_TEMA_OnValueRB.mq5demonstriert die Verwendung der MethodeMainOnValue(). 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
- Tägliche prozentuale Veränderung in MT4 – Indikator für MetaTrader 4
- Uniformitätsfaktor-Indikator für MetaTrader 5: Analysiere deine Preisbewegungen
- Tägliche prozentuale Veränderung in MT5 – Indikator für MetaTrader 5
- Open Range Breakout Indikator für MetaTrader 5: Ein unverzichtbares Tool für Trader
- Marktfazilitätsindex (BW MFI) – Ein hilfreicher Indikator für MetaTrader 5