Deskripsi
Kelas COBVOnRingBuffer direka untuk mengira indikator teknikal On Balance Volume (OBV) menggunakan algoritma ring buffer.
Pengisytiharan
class COBVOnRingBuffer : public CArrayRing
Tajuk
#include <IncOnRingBuffer\COBVnRingBuffer.mqh>Fail kelas COBVOnRingBuffer.mqh perlu diletakkan dalam folder IncOnRingBuffer yang perlu ditubuhkan di MQL5\Include\. Dua fail contoh yang digunakan oleh kelas ini dari folder tersebut dilampirkan dalam deskripsi. Fail dengan kelas ring buffer juga mesti ada dalam folder ini.
Kaedah Kelas
//--- kaedah penginisialisasian: bool Init( // jika ada ralat, ia mengembalikan false, jika berjaya - true int period = 0, // tempoh OBV int size_buffer = 256, // saiz ring buffer bool as_series = false // true, jika siri masa, jika tidak - false );
Tempoh OBV digunakan seperti dalam kes Integer: jika nilainya 0 (default), indikator berfungsi seperti yang disertakan dalam terminal - ia akan dikira untuk semua bar pada carta. Dalam kes nilai positif lain yang ditentukan, bilangan bar yang digunakan (prinsip Purata Bergerak) untuk pengiraan nilai pada setiap bar carta.
//--- 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[], // harga const long& volume[]); // volum );
//--- kaedah pengiraan berdasarkan elemen berasingan dari array double MainOnValue( // mengembalikan nilai OBV untuk elemen yang ditetapkan (bar) const int rates_total, // saiz array const int prev_calculated, // elemen yang diproses dari array const int begin, // dari mana data penting array bermula const double price, // harga const long volume, // volum 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
Untuk mendapatkan data yang dikira dari indikator dari ring buffer, ia boleh dilakukan seperti dari array biasa. Sebagai contoh:
//--- kelas dengan kaedah pengiraan indikator OBV: #include <IncOnRingBuffer\COBVOnRingBuffer.mqh> COBVOnRingBuffer obv; ... //+------------------------------------------------------------------+ //| Fungsi iterasi indikator khusus | //+------------------------------------------------------------------+ 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[]) { //--- pengiraan indikator berdasarkan siri masa: obv.MainOnArray(rates_total,prev_calculated,close,tick_volume); ... //--- gunakan data dari ring buffer "obv", // contohnya, salin data ke buffer indikator: for(int i=start;i<rates_total && !IsStopped();i++) OBV_Buffer[i] = obv[rates_total-1-i]; // garis indikator ... //--- kembalikan nilai prev_calculated untuk panggilan seterusnya: return(rates_total); }
Harap maklum bahawa pengindeksan dalam ring buffer adalah sama seperti dalam siri masa.
Contoh
- Indikator mengira fail Test_OBV_OnArrayRB.mq5 berdasarkan siri masa harga. Aplikasi kaedah MainOnArray() ditunjukkan.
- Fail Test_OBV_OnValueRB.mq5 menunjukkan penggunaan kaedah MainOnValue(). Pada awalnya indikator OBV dikira dan dilukis. Kemudian berdasarkan indikator ini, satu lagi OBV dilukis dari ring buffer.

Hasil kerja fail Test_OBV_OnArrayRB.mq5 dengan saiz ring buffer sebanyak 256 elemen

Hasil kerja fail Test_OBV_OnValueRB.mq5 dengan saiz ring buffer sebanyak 256 elemen
Dalam penulisan kod, perkembangan dari MetaQuotes Software Corp., Integer dan GODZILLA telah digunakan.