Home Technische indicator Bericht

MFI Berekenen met de Ringbuffer in MetaTrader 5

Bijlage
1395.zip (10.22 KB, Downloaden 0 keer)

Beschrijving

De CMFIOnRingBuffer klasse is ontwikkeld om de technische indicator Money Flow Index (MFI) te berekenen met behulp van het algoritme van de ringbuffer.

Declaratie

class CMFIOnRingBuffer : public CArrayRing

Titel

#include <IncOnRingBuffer\CMFIOnRingBuffer.mqh>

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

Klasse-methoden

//--- initialisatie methode:
bool Init(// als er een fout is, retourneert het false,
                    // als succesvol - true
             int period = 14, // de periode van de MFI
             ENUM_MA_METHOD method = MODE_SMA, // de methode van smoothen
             ENUM_APPLIED_PRICE applied_price = PRICE_TYPICAL, // prijs gebruikt voor berekening
             ENUM_APPLIED_VOLUME applied_volume = VOLUME_TICK, // volume gebruikt voor berekening
             int size_buffer = 256, // de grootte van de ringbuffer
             bool as_series = false // true, als tijdreeks, anders - false
);
//--- de methode van berekening gebaseerd op de tijdreeks of indicatorbuffers:
int MainOnArray(// retourneert het aantal verwerkte elementen
   const int rates_total, // de grootte van de arrays
   const int prev_calculated, // verwerkte elementen bij de vorige oproep
   const double& open[], // open prijzen
   const double& high[], // de maximale prijzen
   const double& low[], // de minimale prijzen
   const double& close[], // sluitprijzen
   const long& tick_volume[], // tick volume
   const long& volume[]); // stock volume
);
//--- methode van berekening op basis van de afzonderlijke serie-elementen van de array
double MainOnValue(// retourneert de MFI-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, // van waar de significante data van de array begint
   const double open, // prijs van bar opening
   const double high, // de maximale prijs van de bar
   const double low, // de minimale prijs van de bar
   const double close, // prijs van bar sluiting
   const long tick_volume, // tick volume van de bar
   const long volume, // stock volume van de bar
   const int index // de element (bar) index
);
//--- de methoden van 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
string Method(); // Retourneert de methode in de vorm van de tekstlijn
ENUM_APPLIED_PRICE Price(); // Retourneert het type van de gebruikte prijs
ENUM_APPLIED_VOLUME Volume(); // Retourneert het type van het gebruikte volume
int Size(); // Retourneert de grootte van de ringbuffer

Om de berekende data van de indicator uit de ringbuffer te verkrijgen, kan dit op dezelfde manier als vanuit een gewone array. Bijvoorbeeld:

//--- de klasse met de methoden van berekening van de MFI indicator:
#include <IncOnRingBuffer\CMFIOnRingBuffer.mqh>
CMFIOnRingBuffer mfi;

...

//+------------------------------------------------------------------+
//| Aangepaste indicator iteratiefunctie |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
//--- berekening van de indicator op basis van tijdreeks:
   mfi.MainOnArray(rates_total,prev_calculated,open,high,low,close,tick_volume,volume);

...

//--- gebruik gegevens van de ringbuffers "mfi",
// bijvoorbeeld, kopieer gegevens in de indicatorbuffer:
   for(int i=start;i<rates_total && !IsStopped();i++)
      MFI_Buffer[i] = mfi[rates_total-1-i]; // indicatorlijn

...

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

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

Voorbeelden

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


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



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