Beschreibung
Die CEROnRingBuffer-Klasse wurde entwickelt, um den technischen Indikator Effizienzverhältnis (ER) zu berechnen. Dieser wird im Rahmen des adaptiven gleitenden Durchschnitts (AMA) unter Verwendung des Ringpuffer-Algorithmus genutzt.
Deklaration
class CEROnRingBuffer : public CArrayRing
Einbindung
#include <IncOnRingBuffer\CEROnRingBuffer.mqh>Die Datei CEROnRingBuffer.mqh muss im Ordner IncOnRingBuffer platziert werden, der im Verzeichnis MQL5\Include\ angelegt werden muss. Zwei Beispiel-Dateien, die die Nutzung dieser Klasse demonstrieren, sind dem Artikel beigefügt. Die Datei mit der Klasse des Ringpuffers sollte ebenfalls in diesem Ordner vorhanden sein.
Klassenmethoden
//--- Initialisierungsmethode: bool Init( // Bei Fehler wird false zurückgegeben, bei Erfolg - true int period = 34, // Berechnungsperiode des ER int size_buffer = 256, // Größe des Ringpuffers, Anzahl der gespeicherten Daten bool as_series = false // true, wenn eine Zeitreihe, false - wenn eine übliche Indizierung der Eingabedaten );
//--- Berechnungsmethode basierend auf einer Zeitreihe oder Indikator-Puffer: 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 beim vorherigen Aufruf const double &array[] // Array der Eingabewerte );
//--- Berechnungsmethode basierend auf einzelnen Elementen der Array-Serie: double MainOnValue( // Gibt den ER-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 signifikanten Daten des Arrays beginnen const double value, // Wert des Array-Elements const int index // Elementindex );
//--- Methoden zum Zugriff auf die Daten: int BarsRequired(); // Gibt die notwendige Anzahl an Bars zum Zeichnen des Indikators zurück string Name() // Gibt den Namen des Indikators zurück int Period() // Gibt die Periode der ER-Berechnung zurück int Size(); // Gibt die Größe des Ringpuffers zurück
Um die berechneten Daten des Indikators aus dem Ringpuffer zu erhalten, ist dies wie bei einem gewöhnlichen Array möglich. Zum Beispiel:
//--- Klasse mit Methoden zur Berechnung des ER-Indikators: #include <IncOnRingBuffer\CEROnRingBuffer.mqh> CEROnRingBuffer er; ... //+------------------------------------------------------------------+ //| Funktion zur Iteration des benutzerdefinierten Indikators | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[]) { //--- Berechnung des Indikators basierend auf den Preis-Zeitserien: er.MainOnArray(rates_total,prev_calculated,price); ... //--- Daten aus dem Ringpuffer "er" verwenden, // zum Beispiel, Daten in die Indikator-Puffer kopieren: for(int i=start;i<rates_total;i++) { ER_Buffer[i] = er[rates_total-1-i]; // Indikatorlinie } //--- Rückgabewert von prev_calculated für den nächsten Aufruf: return(rates_total); }
Bitte beachten Sie, dass die Indizierung im Ringpuffer der gleichen wie in der Zeitreihe entspricht.
Beispiele
- Die Datei Test_ER_OnArrayRB.mq5 berechnet den Indikator basierend auf Preis-Zeitserien. Die Anwendung der Methode MainOnArray() wird demonstriert.
- Die Datei Test_ER_OnValueRB.mq5 zeigt die Verwendung der Methode MainOnValue(). Zuerst wird der ER-Indikator berechnet und gezeichnet. Dann wird auf Basis des Ringpuffers dieses Indikators ein weiterer ER gezeichnet.

Das Ergebnis der Ausführung von Test_ER_OnArrayRB.mq5 mit einer Ringpuffergröße von 256 Elementen

Die Ergebnisse der Ausführung von Test_ER_OnValueRB.mq5 mit einer Ringpuffergröße von 256 Elementen
Bei der Code-Erstellung wurden die Entwicklungen von MetaQuotes Software Corp., Integer und GODZILLA verwendet.
Kommentar 0