OsCD Teken met Ringbuffer: Indicator voor MetaTrader 5

Mike 2013.01.08 00:45 17 0 0
Bijlage

Beschrijving

De COsMAOnRingBuffer klasse is ontworpen om de technische indicator Moving Average of Oscillator (OsMA) te berekenen met behulp van het algoritme van de ringbuffer.

Declaratie

class COsMAOnRingBuffer : public CArrayRing

Titel

#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>

Het bestand van de COsMAOnRingBuffer.mqh klasse moet in de map IncOnRingBuffer worden geplaatst, die moet worden aangemaakt in MQL5\Include\. Twee bestanden met voorbeelden die door de klasse uit deze map worden gebruikt, zijn aan de beschrijving toegevoegd. Bestanden met de ringbuffer, de MACD en Moving Average klassen 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            fast_period   = 12,       // de periode van snelle Moving Average smoothing
   int            slow_period   = 26,       // de periode van langzame Moving Average smoothing 
   int            signal_period = 9,        // de periode van signal Moving Average smoothing 
   ENUM_MA_METHOD fast_method   = MODE_EMA, // de methode van snelle Moving Average smoothing
   ENUM_MA_METHOD slow_method   = MODE_EMA, // de methode van langzame Moving Average smoothing
   ENUM_MA_METHOD signal_method = MODE_SMA, // de methode van signal Moving Average smoothing
   int            size_buffer   = 256,      // de grootte van de ringbuffer, het aantal opgeslagen gegevens
   bool           as_series     = false     // true, als het een tijdserie is, false als het een gebruikelijke indexering van de invoergegevens is
   );
//--- de methode van berekening gebaseerd op een tijdserie of indicatorbuffer:          
int MainOnArray(                  // retourneert het aantal verwerkte elementen  
   const int     rates_total,     // de grootte van de array array[]
   const int     prev_calculated, // verwerkte elementen bij de vorige aanroep
   const double &array[]          // de array van de invoerwaarden
   );
//--- de methode van berekening gebaseerd op de afzonderlijke serie-elementen van de array           
double MainOnValue(              // retourneert de OsMA  waarde voor het set element   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 gegevens van de array beginnen
   const double value,           // significante elementen van de array
   const int    index            // het elementindex
   );
//--- de methoden om toegang te krijgen tot gegevens:
int    BarsRequired();   // Retourneert het benodigde aantal bars voor het tekenen van de indicator
string Name()            // Retourneert de naam van de indicator
string FastMethod()      // Retourneert de methode van smoothing van de snelle lijn in de vorm van de tekstlijn
string SlowMethod()      // Retourneert de methode van smoothing van de langzame lijn in de vorm van de tekstlijn
string SignalMethod()      // Retourneert de methode van smoothing van de signaallijn in de vorm van de tekstlijn
int    FastPeriod()      // Retourneert de periode van smoothing van de snelle lijn
int    SlowPeriod()      // Retourneert de periode van smoothing van de langzame lijn
int    SignalPeriod()      // Retourneert de periode van smoothing van de signaallijn
int    Size();           // Retourneert de grootte van de ringbuffer

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

//--- de klasse met de methoden van de indicatorberekening OsMA:
#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>
COsMAOnRingBuffer osma;

...

//+------------------------------------------------------------------+
//| Aangepaste indicator iteratiefunctie                              |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &price[]) 
  {
//--- de berekening van de indicator op basis van een prijs tijdserie:
   osma.MainOnArray(rates_total,prev_calculated,price);

...

//--- gebruik de gegevens uit de "osma" ringbuffers,
//    kopieer de gegevens in de indicatorbuffer:
   for(int i=start;i<rates_total;i++)
      OsMABuffer[i]=osma[rates_total-1-i];          // indicator histogram
//--- retourneer waarde van prev_calculated voor de volgende aanroep:
   return(rates_total);
  }

Let op dat de indexering in de ringbuffer hetzelfde is als in de tijdserie.

Voorbeelden

  1. Het Test_OsMA_OnArrayRB.mq5 bestand berekent de indicator op basis van prijs tijdseries. De toepassing van de MainOnArray() methode wordt gedemonstreerd.
  2. Het Test_OsMA_OnValueRB.mq5 bestand demonstreert het gebruik van de MainOnValue() methode. Eerst wordt de OsMA indicator berekend en getekend. Daarna wordt op basis van deze ringbuffer van deze indicator nog een OsMA indicator getekend.


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



Het resultaat van het werk van de Test_OsMA_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.

Lijst
Reactie 0