Deskripsi
Kelas CDEMAOnRingBuffer ini direka khusus untuk mengira indikator teknikal Double Exponential Moving Average (DEMA) menggunakan algoritma ring buffer.
Pernyataan Kelas
class CDEMAOnRingBuffer : public CArrayRing
Judul
#include <IncOnRingBuffer\CDEMAnRingBuffer.mqh>Fail kelas CDEMAOnRingBuffer.mqh perlu diletakkan dalam folder IncOnRingBuffer yang perlu ditubuhkan di MQL5\Include\. Dua fail dengan contoh yang digunakan oleh kelas dari folder ini juga disertakan dalam deskripsi. Fail dengan kelas ring buffer dan Moving Average juga perlu ada dalam folder ini.
Kaedah Kelas
//--- kaedah inisialisasi: bool Init( // jika berlaku ralat, ia mengembalikan false, jika berjaya - true int period = 12, // tempoh DEMA ENUM_MA_METHOD method = MODE_EMA, // kaedah pelicinan int size_buffer = 256, // saiz ring buffer bool as_series = false // true, jika siri masa, jika tidak - false );
//--- kaedah pengiraan berdasarkan siri masa atau buffer indikator: int MainOnArray( // mengembalikan bilangan elemen yang diproses const int rates_total, // saiz array const int prev_calculated, // elemen yang diproses pada panggilan sebelumnya const double& price[], // array untuk pengiraan );
//--- kaedah untuk pengiraan berdasarkan elemen array siri yang berasingan double MainOnValue( // mengembalikan nilai DEMA untuk elemen (bar) yang ditetapkan const int rates_total, // saiz array const int prev_calculated, // elemen array yang diproses const int begin, // dari mana data penting array bermula const double value, // nilai elemen (bar) const int index // indeks elemen (bar) );
//--- kaedah akses kepada data: int BarsRequired(); // Mengembalikan bilangan bar yang diperlukan untuk melukis indikator string Name(); // Mengembalikan nama indikator int Period(); // Mengembalikan tempoh int Size(); // Mengembalikan saiz ring buffer double MA(int index); // Mengembalikan nilai Moving Average, pengindeksan seperti dalam siri masa
Untuk mendapatkan data yang dikira daripada indikator dari ring buffer adalah sama seperti dari array biasa. Sebagai contoh:
//--- kelas dengan kaedah pengiraan indikator DEMA: #include <IncOnRingBuffer\CDEMAOnRingBuffer.mqh> CDEMAOnRingBuffer dema; ... //+------------------------------------------------------------------+ //| Fungsi Iterasi Indikator Kustom | //+------------------------------------------------------------------+ int OnCalculate (const int rates_total, // saiz array price[] const int prev_calculated, // bar yang diproses pada panggilan sebelumnya const int begin, // dari mana data penting bermula const double& price[]) // array untuk pengiraan { //--- pengiraan indikator berdasarkan siri masa: dema.MainOnArray(rates_total,prev_calculated,price); ... //--- gunakan data dari "dema" ring buffer, // contohnya, salin data ke dalam 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 seterusnya: return(rates_total); }
Ketika mengira DEMA, pengiraan Moving Average dengan parameter yang sama juga dilakukan. Kita boleh mendapatkan data dari ring buffer MA menggunakan kaedah MA(int index):
//--- gunakan data dari ring buffer Moving Average, // contohnya, salin data ke dalam buffer indikator: for(int i=start;i<rates_total && !IsStopped();i++) MA_Buffer[i] = dema.MA(rates_total-1-i); // garis indikator Moving Average
Sila ambil perhatian bahawa pengindeksan dalam ring buffer adalah sama seperti dalam siri masa.
Contoh
- Indikator mengira fail Test_DEMA_OnArrayRB.mq5 berdasarkan siri masa harga. Penggunaan kaedah MainOnArray() diperlihatkan.
- Fail Test_DEMA_OnValueRB.mq5 menunjukkan penggunaan kaedah MainOnValue(). Pada awalnya indikator DEMA dikira dan dilukis. Kemudian, berdasarkan ring buffer indikator ini, satu lagi DEMA dilukis.

Hasil kerja Test_DEMA_OnArrayRB.mq5 dengan saiz ring buffer 256 elemen

Hasil kerja Test_DEMA_OnValueRB.mq5 dengan saiz ring buffer 256 elemen
Penulisan kod ini menggunakan pembangunan daripada MetaQuotes Software Corp., Integer dan GODZILLA.
Siaran berkaitan
- Indikator Pembukaan Rentang Untuk MetaTrader 5: Panduan Lengkap
- Penggunaan Buffer Jam untuk Pengumpulan Data di MetaTrader 5
- Panduan Volume Profile + Range v6.0 untuk MetaTrader 5: Indikator Trading Utama
- iSpread: Indikator Spread untuk Perdagangan Pasangan di MetaTrader 5
- Panduan Volume Profile + Range v6.0 untuk MetaTrader 5: Memahami Indikator dengan Lebih Baik