Panduan Lengkap Menggunakan MACD dengan Ring Buffer di MetaTrader 5

Mike 2012.12.28 17:51 37 0 0
Lampiran

Deskripsi

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

Pengenalan

class CMACDOnRingBuffer

Penyertaan Fail

#include <IncOnRingBuffer\CMACDOnRingBuffer.mqh>

Fail kelas CMACDOnRingBuffer.mqh perlu diletakkan dalam folder IncOnRingBuffer yang perlu ditubuhkan di dalam MQL5\Include\. Dua fail contoh yang digunakan oleh kelas ini daripada folder ini disertakan dalam deskripsi. Fail dengan kelas ring buffer dan kelas Moving Average juga mesti ada dalam folder ini.

Kaedah Kelas

//--- kaedah inisialisasi:bool Init(                                  // jika error, kembalikan false, jika berjaya - true
   int            fast_period   = 12,       // tempoh rata-rata bergerak cepat
   int            slow_period   = 26,       // tempoh rata-rata bergerak lambat
   int            signal_period = 9,        // tempoh rata-rata bergerak isyarat
   ENUM_MA_METHOD fast_method   = MODE_EMA, // kaedah rata-rata bergerak cepat
   ENUM_MA_METHOD slow_method   = MODE_EMA, // kaedah rata-rata bergerak lambat
   ENUM_MA_METHOD signal_method = MODE_SMA, // kaedah rata-rata bergerak isyarat
   int            size_buffer   = 256,      // saiz ring buffer, jumlah data yang disimpan
   bool           as_series     = false     // true, jika siri masa, false jika pengindeksan biasa data input
   );
//--- kaedah pengiraan berdasarkan siri masa atau buffer indikator:int MainOnArray(                  // mengembalikan bilangan elemen yang diproses
   constint     rates_total,     // saiz array array[]
   constint     prev_calculated, // elemen yang diproses pada panggilan sebelumnya
   constdouble &array[]          // array nilai input
   );
//--- kaedah pengiraan berdasarkan elemen siri berasingan dari arraydouble MainOnValue(              // mengembalikan nilai MACD untuk elemen yang ditetapkan
   constint    rates_total,     // saiz array
   constint    prev_calculated, // elemen yang diproses dalam array
   constint    begin,           // dari mana data penting dalam array bermula
   constdouble value,           // nilai elemen dalam array
   constint    index            // indeks elemen
   );
//--- kaedah akses kepada data:int    BarsRequired();   // Mengembalikan bilangan bar yang diperlukan untuk melukis indikatorstring Name()            // Mengembalikan nama indikatorstring NameMain()            // Mengembalikan nama garis utama indikatorstring NameSignal()          // Mengembalikan nama garis isyarat indikatorstring FastMethod()      // Mengembalikan kaedah pemulus garis cepat dalam bentuk teksstring SlowMethod()      // Mengembalikan kaedah pemulus garis lambat dalam bentuk teksstring SignalMethod()      // Mengembalikan kaedah pemulus garis isyarat dalam bentuk teksint    FastPeriod()      // Mengembalikan tempoh pemulus garis cepatint    SlowPeriod()      // Mengembalikan tempoh pemulus garis lambatint    SignalPeriod()      // Mengembalikan tempoh pemulus garis isyaratint    Size();           // Mengembalikan saiz ring buffer

Untuk mendapatkan data yang dikira dari indikator daripada ring buffer adalah sama seperti daripada array biasa. Contohnya:

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

...

//+------------------------------------------------------------------+//| Fungsi iterasi indikator khusus                              |//+------------------------------------------------------------------+intOnCalculate(constint    rates_total, 
                constint    prev_calculated, 
                constint    begin, 
                constdouble &price[]) 
  {
//--- pengiraan indikator berdasarkan siri masa harga:
   macd.MainOnArray(rates_total,prev_calculated,price);

...

//--- gunakan data dari buffer "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 isyarat indikator
     }
//--- kembalikan nilai prev_calculated untuk panggilan seterusnya:
   return(rates_total);
  }

Sila ambil perhatian bahawa pengindeksan dalam ring buffer adalah sama dengan dalam siri masa.

Contoh

  1. Fail Test_MACD_OnArrayRB.mq5 mengira indikator berdasarkan siri masa harga. Penggunaan kaedah MainOnArray() ditunjukkan.
  2. Fail Test_MACD_OnValueRB.mq5 menunjukkan penggunaan kaedah MainOnValue(). Pertama, indikator MACD dikira dan dilukis. Kemudian berdasarkan ring buffer indikator ini, satu lagi indikator MACD dilukis.


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



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

 

Dalam penulisan kod, perkembangan dari MetaQuotes Software Corp.Integer  dan GODZILLA digunakan.

Senarai
Komen 0