Cara Menghitung MACD Menggunakan Ring Buffer di MetaTrader 5

Mike 2012.12.28 17:51 11 0 0
Lampiran

Deskripsi

Kelas CMACDOnRingBuffer dirancang untuk menghitung indikator teknikal Moving Average Convergence/Divergence (MACD) menggunakan algoritma ring buffer.

Pernyataan Kelas

class CMACDOnRingBuffer

Judul

#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>

File dari kelas CMACDOnRingBuffer.mqh harus diletakkan di folder IncOnRingBuffer yang perlu dibuat dalam MQL5\Include\. Dua file dengan contoh yang digunakan oleh kelas ini dari folder tersebut dilampirkan dalam deskripsi. File dengan kelas ring buffer dan kelas Moving Average juga harus ada di folder ini.

Metode Kelas

//--- metode inisialisasi:
bool Init(                                  // jika error, mengembalikan false, jika sukses - true
   int            fast_period   = 12,       // periode smoothing Moving Average cepat
   int            slow_period   = 26,       // periode smoothing Moving Average lambat
   int            signal_period = 9,        // periode smoothing Moving Average sinyal
   ENUM_MA_METHOD fast_method   = MODE_EMA, // metode smoothing Moving Average cepat
   ENUM_MA_METHOD slow_method   = MODE_EMA, // metode smoothing Moving Average lambat
   ENUM_MA_METHOD signal_method = MODE_SMA, // metode smoothing Moving Average sinyal
   int            size_buffer   = 256,      // ukuran ring buffer, jumlah data yang disimpan
   bool           as_series     = false     // true, jika time series, false jika pengindeksan biasa dari data input
   );
//--- metode perhitungan berdasarkan time series atau buffer indikator:          
int MainOnArray(                  // mengembalikan jumlah elemen yang diproses  
   const int     rates_total,     // ukuran array array[]
   const int     prev_calculated, // elemen yang diproses pada panggilan sebelumnya
   const double &array[]          // array nilai input
   );
//--- metode perhitungan berdasarkan elemen terpisah dari array           
double MainOnValue(              // mengembalikan nilai MACD untuk elemen yang ditetapkan
   const int    rates_total,     // ukuran array
   const int    prev_calculated, // elemen yang diproses dari array
   const int    begin,           // dari mana data signifikan dari array dimulai
   const double value,           // nilai elemen dari array
   const int    index            // indeks elemen
   );
//--- metode akses data:
int    BarsRequired();   // Mengembalikan jumlah bar yang diperlukan untuk menggambar indikator
string Name()            // Mengembalikan nama indikator
string NameMain()            // Mengembalikan nama garis utama indikator
string NameSignal()          // Mengembalikan nama garis sinyal indikator
string FastMethod()      // Mengembalikan metode smoothing garis cepat dalam bentuk string
string SlowMethod()      // Mengembalikan metode smoothing garis lambat dalam bentuk string
string SignalMethod()      // Mengembalikan metode smoothing garis sinyal dalam bentuk string
int    FastPeriod()      // Mengembalikan periode smoothing garis cepat
int    SlowPeriod()      // Mengembalikan periode smoothing garis lambat
int    SignalPeriod()      // Mengembalikan periode smoothing garis sinyal
int    Size();           // Mengembalikan ukuran ring buffer

Untuk mendapatkan data yang dihitung dari indikator dari ring buffer bisa dilakukan seperti dari array biasa. Misalnya:

//--- kelas dengan metode perhitungan indikator MACD:
#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>
CMACDOnRingBuffer macd;

...

//+------------------------------------------------------------------+
//| Fungsi iterasi indikator kustom                              |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &price[]) 
  {
//--- perhitungan indikator berdasarkan time series harga:
   macd.MainOnArray(rates_total,prev_calculated,price);

...

//--- gunakan data dari buffer ring "macd",
//    salin data ke buffer indikator:
   for(int i=start;i<rates_total;i++)
     {
      MainBuffer[i]   = macd[rates_total-1-i];          // histogram indikator
      SignalBuffer[i] = macd.signal[rates_total-1-i];   // garis sinyal indikator
     }
//--- kembalikan nilai prev_calculated untuk panggilan berikutnya:
   return(rates_total);
  }

Harap dicatat bahwa pengindeksan di ring buffer sama seperti di time series.

Contoh

  1. File Test_MACD_OnArrayRB.mq5 menghitung indikator berdasarkan time series harga. Aplikasi metode MainOnArray() ditunjukkan.
  2. File Test_MACD_OnValueRB.mq5 mendemonstrasikan penggunaan metode MainOnValue(). Pertama, indikator MACD dihitung dan digambar. Kemudian berdasarkan ring buffer dari indikator ini, satu lagi indikator MACD digambar.


Hasil kerja dari Test_MACD_OnArrayRB.mq5 dengan ukuran ring buffer 256 elemen



Hasil kerja dari Test_MACD_OnValueRB.mq5 dengan ukuran ring buffer 256 elemen

 

Dalam penulisan kode ini, pengembangan dari MetaQuotes Software Corp., Integer dan GODZILLA digunakan.

Daftar
Komentar 0