Effizienzverhältnis (ER) mit dem Ringpuffer in MetaTrader 5 berechnen

Mike 2013.01.08 23:46 23 0 0
Anhang

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

  1. Die Datei Test_ER_OnArrayRB.mq5 berechnet den Indikator basierend auf Preis-Zeitserien. Die Anwendung der Methode MainOnArray() wird demonstriert.
  2. 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.

Liste
Kommentar 0