Deskripsi
Kelas CDEMAOnRingBuffer dirancang untuk menghitung indikator teknikal Double Exponential Moving Average (DEMA) menggunakan algoritma ring buffer.
Deklarasi
class CDEMAOnRingBuffer : public CArrayRing
Judul
#include <IncOnRingBuffer\CDEMAnRingBuffer.mqh>File kelas CDEMAOnRingBuffer.mqh harus diletakkan di folder IncOnRingBuffer yang perlu dibuat di MQL5\Include\. Dua file contoh yang digunakan oleh kelas dari folder ini terlampir dalam deskripsi. File dengan kelas ring buffer dan Moving Average juga harus ada di folder ini.
Metode Kelas
//--- metode inisialisasi: bool Init( // jika ada kesalahan maka mengembalikan false, jika sukses - true int period = 12, // periode DEMA ENUM_MA_METHOD method = MODE_EMA, // metode smoothing int size_buffer = 256, // ukuran buffer ring bool as_series = false // true, jika rangkaian waktu, jika tidak - false );
//--- metode perhitungan berdasarkan rangkaian waktu atau buffer indikator: int MainOnArray( // mengembalikan jumlah elemen yang diproses const int rates_total, // ukuran array const int prev_calculated, // elemen yang diproses pada panggilan sebelumnya const double& price[], // array untuk perhitungan );
//--- metode untuk perhitungan berdasarkan elemen terpisah dari array double MainOnValue( // mengembalikan nilai DEMA untuk elemen set (bar) 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 (bar) const int index // indeks elemen (bar) );
//--- metode akses data: int BarsRequired(); // Mengembalikan jumlah bar yang diperlukan untuk menggambar indikator string Name(); // Mengembalikan nama indikator int Period(); // Mengembalikan periode int Size(); // Mengembalikan ukuran buffer ring double MA(int index); // Mengembalikan nilai Moving Average, pengindeksan seperti dalam rangkaian waktu
Untuk mendapatkan data yang dihitung dari indikator dari buffer ring, kita bisa melakukannya seperti dari array biasa. Misalnya:
//--- kelas dengan metode penghitungan indikator DEMA: #include <IncOnRingBuffer\CDEMAOnRingBuffer.mqh> CDEMAOnRingBuffer dema; ... //+------------------------------------------------------------------+ //| Fungsi iterasi indikator kustom | //+------------------------------------------------------------------+ int OnCalculate (const int rates_total, // ukuran array price[] const int prev_calculated, // bar yang diproses pada panggilan sebelumnya const int begin, // dari mana data signifikan dimulai const double& price[]) // array untuk perhitungan { //--- perhitungan indikator berdasarkan rangkaian waktu: dema.MainOnArray(rates_total,prev_calculated,price); ... //--- gunakan data dari buffer ring "dema", // misalnya, salin data ke buffer indikator: for(int i=start;i<rates_total && !IsStopped();i++) DEMA_Buffer[i] = dema[rates_total-1-i]; // garis indikator DEMA ... //--- kembalikan nilai prev_calculated untuk panggilan berikutnya: return(rates_total); }
Ketika menghitung DEMA, juga dilakukan penghitungan Moving Average dengan parameter yang sama. Kita dapat mengambil data dari buffer ring MA menggunakan metode MA(int index):
//--- gunakan data dari buffer ring Moving Average, // misalnya, salin data ke buffer indikator: for(int i=start;i<rates_total && !IsStopped();i++) MA_Buffer[i] = dema.MA(rates_total-1-i); // garis indikator Moving Average
Harap dicatat bahwa pengindeksan dalam buffer ring sama seperti dalam rangkaian waktu.
Contoh
- Indikator menghitung file Test_DEMA_OnArrayRB.mq5 berdasarkan rangkaian waktu harga. Aplikasi metode MainOnArray() ditunjukkan.
- File Test_DEMA_OnValueRB.mq5 menunjukkan penggunaan metode MainOnValue(). Pertama, indikator DEMA dihitung dan digambar. Kemudian berdasarkan buffer ring indikator ini, satu DEMA lagi digambar.

Hasil kerja Test_DEMA_OnArrayRB.mq5 dengan ukuran buffer ring 256 elemen

Hasil kerja Test_DEMA_OnValueRB.mq5 dengan ukuran buffer ring 256 elemen
Dalam penulisan kode, pengembangan dari MetaQuotes Software Corp., Integer dan GODZILLA digunakan.
Postingan terkait
- Menggunakan Buffer Jam dalam MetaTrader 5 untuk Pengumpulan Data Trading
- Indikator Open Range Breakout untuk MetaTrader 5: Strategi Trading yang Efektif
- Volume Profile + Range v6.0: Indikator Penting untuk MetaTrader 5
- iSpread: Indikator Spread untuk Pair Trading di MetaTrader 5
- Panduan Lengkap Volume Profile + Range v6.0 untuk MetaTrader 5