Home Technische indicator Bericht

TEMA Indicator Berekenen met de Ringbuffer voor MetaTrader 5

Bijlage
1417.zip (11.22 KB, Downloaden 0 keer)

Beschrijving

De CTEMAOnRingBuffer klasse is ontwikkeld voor het berekenen van de technische indicator Triple Exponential Moving Average (TEMA) met behulp van het algoritme van de ringbuffer.

Declaratie

class CTEMAOnRingBuffer : public CArrayRing

Titel

#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>

Het bestand van de CTEMAOnRingBuffer.mqh klasse moet in de IncOnRingBuffer map worden geplaatst, die moet worden aangemaakt in MQL5\Include\. Twee bestanden met voorbeelden die door de klasse worden gebruikt, zijn bijgevoegd in de beschrijving. Bestanden met de klassen van de ringbuffer, DEMA en Moving Average moeten ook in deze map staan.

Klasse Methoden

//--- initialisatie methode:
bool Init(                                // als er een fout is, retourneert het false, als het succesvol is - true
   int            period      = 12,       // de TEMA periode
   ENUM_MA_METHOD method      = MODE_EMA, // de methode van gladstrijken
   int            size_buffer = 256,      // de grootte van de ringbuffer
   bool           as_series   = false     // true, als het een tijdreeks is, anders - false
   );
//--- de methode voor berekening gebaseerd op een tijdreeks of de indicatorbuffers:          
int MainOnArray(                  // retourneert het aantal verwerkte elementen  
   const int     rates_total,     // de grootte van de array
   const int     prev_calculated, // verwerkte elementen bij de vorige oproep
   const double& price[],         // de array voor berekening
   );
//--- de methode voor berekening op basis van afzonderlijke serie-elementen van de array           
double MainOnValue(              // retourneert de TEMA waarde voor het ingestelde element (bar)
   const int    rates_total,     // de grootte van de array
   const int    prev_calculated, // verwerkte elementen van de array
   const int    begin,           // vanaf waar de significante data van de array begint
const double value,           // de waarde van het element (bar) 
const int    index            // de index van het element (bar)
   );
//--- de methodes 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                 Period();        // Retourneert de periode
int                 Size();          // Retourneert de grootte van de ringbuffer
double              MA(int index);   // Retourneert de waarde van de Moving Average, indexering is zoals in een tijdreeks
double              DEMA(int index); // Retourneert de waarde van de DEMA, indexering is zoals in een tijdreeks

Om de berekende data van de indicator uit de ringbuffer te verkrijgen, is het mogelijk zoals uit een gewone array. Bijvoorbeeld:

//--- de klasse met de methodes voor de berekening van de TEMA indicator:
#include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh>
CTEMAOnRingBuffer tema;

...

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

...

//--- gebruik de data uit de "tema" ringbuffer,
//    bijvoorbeeld, kopieer de data in de indicatorbuffer:
   for(int i=start;i<rates_total && !IsStopped();i++)
      TEMA_Buffer[i] = tema[rates_total-1-i]; // de TEMA indicatorlijn

...

//--- retourneer waarde van prev_calculated voor de volgende oproep:
   return(rates_total);
  }

Bij het berekenen van de TEMA wordt ook de berekening van de Moving Average en DEMA met dezelfde parameters uitgevoerd. We kunnen de data uit de MA ringbuffer en DEMA verkrijgen met behulp van de MA methode(int index) en DEMA(int index), respectievelijk:

//--- gebruik de data uit de Moving Average en DEMA ringbuffers,
//    bijvoorbeeld, kopieer ze in de indicatorbuffers:
   for(int i=start;i<rates_total && !IsStopped();i++)
     {
      MA_Buffer[i]   = dema.MA(rates_total-1-i);   // de Moving Average indicatorlijn
      DEMA_Buffer[i] = dema.DEMA(rates_total-1-i); // de DEMA indicatorlijn
     }

Let op dat de indexering in de ringbuffers hetzelfde is als in de tijdreeks.

Voorbeelden

  1. De indicator berekent het Test_TEMA_OnArrayRB.mq5 bestand op basis van de prijs tijdreeks. Het gebruik van de MainOnArray() methode wordt gedemonstreerd.
  2. De Test_TEMA_OnValueRB.mq5 demonstreert het gebruik van de MainOnValue() methode. Eerst wordt de TEMA indicator berekend en getekend. Daarna wordt op basis van deze indicator ringbuffer nog een TEMA getekend.


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



Het resultaat van het werk van de Test_TEMA_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)