OsCD Teken met Ringbuffer: Indicator voor MetaTrader 5

Mike 2013.01.08 00:45 32 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  
   constint     rates_total,     // de grootte van de array array[]
   constint     prev_calculated, // verwerkte elementen bij de vorige aanroep
   constdouble &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   constint    rates_total,     // de grootte van de array
   constint    prev_calculated, // verwerkte elementen van de array
   constint    begin,           // vanaf waar de significante gegevens van de array beginnen
   constdouble value,           // significante elementen van de array
   constint    index            // het elementindex
   );
//--- de methoden om toegang te krijgen tot gegevens:int    BarsRequired();   // Retourneert het benodigde aantal bars voor het tekenen van de indicatorstring Name()            // Retourneert de naam van de indicatorstring FastMethod()      // Retourneert de methode van smoothing van de snelle lijn in de vorm van de tekstlijnstring SlowMethod()      // Retourneert de methode van smoothing van de langzame lijn in de vorm van de tekstlijnstring SignalMethod()      // Retourneert de methode van smoothing van de signaallijn in de vorm van de tekstlijnint    FastPeriod()      // Retourneert de periode van smoothing van de snelle lijnint    SlowPeriod()      // Retourneert de periode van smoothing van de langzame lijnint    SignalPeriod()      // Retourneert de periode van smoothing van de signaallijnint    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                              |//+------------------------------------------------------------------+intOnCalculate(constint    rates_total, 
                constint    prev_calculated, 
                constint    begin, 
                constdouble &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