Home Technische indicator Bericht

DEMA Berekenen met de Ringbuffer: Een Handleiding voor MetaTrader 5

Bijlage
1416.zip (9.14 KB, Downloaden 0 keer)

Beschrijving

De CDEMAOnRingBuffer klasse is ontworpen voor het berekenen van de technische indicator Dubbele Exponentiële Beweeglijke Gemiddelde (Double Exponential Moving Average, DEMA) met behulp van het algoritme van de ringbuffer.

Declaratie

class CDEMAOnRingBuffer : public CArrayRing

Titel

#include <IncOnRingBuffer\CDEMAnRingBuffer.mqh>

Het bestand van de CDEMAOnRingBuffer.mqh klasse moet in de IncOnRingBuffer map worden geplaatst die je moet aanmaken in MQL5\Include\. Twee bestanden met voorbeelden die door de klasse worden gebruikt, zijn aan de beschrijving toegevoegd. Het bestand met de klassen van de ringbuffer en de Beweeglijke Gemiddelde moeten ook in deze map staan.

Klasse-methoden

//--- initialisatiemethode:
bool Init(                                // bij fout retourneert het false, bij succes - true
   int            periode      = 12,       // de DEMA periode 
   ENUM_MA_METHOD methode      = MODE_EMA, // de methode van gladstrijken
   int            grootte_buffer = 256,      // de grootte van de ringbuffer
   bool           als_reeks   = false     // true, als een tijdreeks, anders - false
   );
//--- de methode van berekening op basis van een tijdreeks of de indicatorbuffers:          
int MainOnArray(                  // retourneert het aantal verwerkte elementen  
   const int     totale_koersen,     // de grootte van de array
   const int     eerder_berekend,// verwerkte elementen bij de vorige oproep
   const double& prijs[],         // de array voor berekening
   );
//--- de methode voor berekening op basis van afzonderlijke serie-elementen van de array           
double MainOnValue(              // retourneert de DEMA waarde voor het opgegeven element (bar) 
   const int    totale_koersen,     // de grootte van de array
   const int    eerder_berekend,// verwerkte elementen van de array
   const int    begin,           // vanaf waar de significante data van de array begint
const double waarde,           // de waarde van het element (bar)
const int    index            // de index van het element (bar)
   );

//--- de methoden voor toegang tot de data:
int                 BarsRequired(); // Retourneert het benodigde aantal bars om de indicator te tekenen
string              Name();         // Retourneert de naam van de indicator
int                 Periode();       // Retourneert de periode
int                 Grootte();         // Retourneert de grootte van de ringbuffer
double              MA(int index);  // Retourneert de waarde van de Beweeglijke Gemiddelde, indexering is zoals in een tijdreeks

Om de berekende gegevens van de indicator uit de ringbuffer te krijgen, kan dat zoals van een gewone array. Bijvoorbeeld:

//--- de klasse met de methoden voor de berekening van de DEMA indicator:
#include <IncOnRingBuffer\CDEMAOnRingBuffer.mqh>
CDEMAOnRingBuffer dema;

...
//+------------------------------------------------------------------+
//| Aangepaste indicator iteratiefunctie                              |
//+------------------------------------------------------------------+
int OnCalculate (const int totale_koersen,      // de grootte van de array prijs[]
                 const int eerder_berekend,  // verwerkte bars bij de vorige oproep
                 const int begin,            // vanaf waar de significante data begint
                 const double& prijs[])      // de array voor de berekening
  {
//--- berekening van de indicator op basis van een tijdreeks:
    dema.MainOnArray(totale_koersen,eerder_berekend,prijs);

...
//--- gebruik de data uit de "dema" ringbuffer,
//    bijvoorbeeld, kopieer de data in de indicatorbuffer:
   for(int i=start;i<totale_koersen && !IsStopped();i++)
      DEMA_Buffer[i] = dema[totale_koersen-1-i]; // de DEMA indicatorlijn

...
//--- retourneer de waarde van eerder_berekend voor de volgende oproep:
   return(totale_koersen);
  }

Bij de berekening van de DEMA wordt ook de berekening van de Beweeglijke Gemiddelde met dezelfde parameters uitgevoerd. We kunnen de gegevens uit de MA ringbuffer halen met behulp van de MA methode(int index):

//--- gebruik de data uit de Beweeglijke Gemiddelde ringbuffer,
//    bijvoorbeeld, kopieer de data in de indicatorbuffer:
   for(int i=start;i<totale_koersen && !IsStopped();i++)
      MA_Buffer[i] = dema.MA(totale_koersen-1-i); // de Beweeglijke Gemiddelde indicatorlijn

Houd er rekening mee dat de indexering in de ringbuffers hetzelfde is als in de tijdreeks.

Voorbeelden

  1. De indicator berekent het Test_DEMA_OnArrayRB.mq5 bestand op basis van de prijs tijdreeks. De toepassing van de MainOnArray() methode wordt gedemonstreerd.
  2. Het Test_DEMA_OnValueRB.mq5 bestand toont het gebruik van de MainOnValue() methode. Eerst wordt de DEMA indicator berekend en getekend. Vervolgens wordt op basis van deze indicator ringbuffer nog een DEMA getekend.


Het resultaat van het werk van de Test_DEMA_OnArrayRB.mq5 met de grootte van de ringbuffer van 256 elementen



Het resultaat van het werk van de Test_DEMA_OnValueRB.mq5 met de grootte van de ringbuffer van 256 elementen

 

Bij het schrijven van de code zijn de ontwikkelingen van MetaQuotes Software Corp.Integer en GODZILLA gebruikt.

Gerelateerde berichten

Reactie (0)