Kelas Menggambar OsCD Menggunakan Ring Buffer - Indikator untuk MetaTrader 5

Mike 2013.01.08 00:45 15 0 0
Lampiran

Deskripsi

Kelas COsMAOnRingBuffer direka untuk mengira indikator teknikal Moving Average of Oscillator (OsMA) menggunakan algoritma ring buffer.

Deklarasi

class COsMAOnRingBuffer : public CArrayRing

Tajuk

#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>

Fail kelas COsMAOnRingBuffer.mqh perlu diletakkan dalam folder IncOnRingBuffer yang perlu dibangunkan dalam MQL5\Include\. Dua fail yang mengandungi contoh yang digunakan oleh kelas dari folder ini juga dilampirkan dalam deskripsi. Fail dengan ring buffer, MACD, dan Moving Average juga perlu berada dalam folder ini.

Kaedah Kelas

//--- kaedah inisialisasi:
bool Init(                                  // jika ada ralat, ia mengembalikan false, jika berjaya - true
   int            fast_period   = 12,       // tempoh penghalusan Moving Average pantas
   int            slow_period   = 26,       // tempoh penghalusan Moving Average perlahan
   int            signal_period = 9,        // tempoh penghalusan Moving Average isyarat
   ENUM_MA_METHOD fast_method   = MODE_EMA, // kaedah penghalusan Moving Average pantas
   ENUM_MA_METHOD slow_method   = MODE_EMA, // kaedah penghalusan Moving Average perlahan
   ENUM_MA_METHOD signal_method = MODE_SMA, // kaedah penghalusan Moving Average isyarat
   int            size_buffer   = 256,      // saiz buffer ring, 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  
   const int     rates_total,     // saiz array array[]
   const int     prev_calculated, // elemen yang diproses pada panggilan sebelumnya
   const double &array[]          // array nilai input
   );
//--- kaedah pengiraan berdasarkan elemen siri berasingan dari array           
double MainOnValue(              // mengembalikan nilai OsMA untuk elemen yang ditetapkan
   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 value,           // elemen penting dari array
   const int     index            // indeks elemen
   );
//--- kaedah untuk akses data:
int     BarsRequired();   // Mengembalikan bilangan bar yang diperlukan untuk menggambar indikator
string Name()            // Mengembalikan nama indikator
string FastMethod()      // Mengembalikan kaedah penghalusan garis pantas dalam bentuk teks
string SlowMethod()      // Mengembalikan kaedah penghalusan garis perlahan dalam bentuk teks
string SignalMethod()      // Mengembalikan kaedah penghalusan garis isyarat dalam bentuk teks
int     FastPeriod()      // Mengembalikan tempoh penghalusan garis pantas
int     SlowPeriod()      // Mengembalikan tempoh penghalusan garis perlahan
int     SignalPeriod()      // Mengembalikan tempoh penghalusan garis isyarat
int     Size();           // Mengembalikan saiz buffer ring

Untuk mendapatkan data yang dikira dari indikator daripada ring buffer, ia boleh dilakukan seperti dari array biasa. Contohnya:

//--- kelas dengan kaedah pengiraan indikator OsMA:
#include <IncOnRingBuffer\COsMAOnRingBuffer.mqh>
COsMAOnRingBuffer osma;

...

//+------------------------------------------------------------------+
//| Fungsi iterasi indikator khusus                              |
//+------------------------------------------------------------------+
int OnCalculate(const int    rates_total, 
                const int    prev_calculated, 
                const int    begin, 
                const double &price[]) 
  {
//--- pengiraan indikator berdasarkan siri masa harga:
   osma.MainOnArray(rates_total,prev_calculated,price);

...
//--- gunakan data daripada buffer ring "osma",
//    salin data ke dalam buffer indikator:
   for(int i=start;i<rates_total;i++)
      OsMABuffer[i]=osma[rates_total-1-i];          // histogram indikator
//--- mengembalikan nilai prev_calculated untuk panggilan seterusnya:
   return(rates_total);
  }

Harap maklum bahawa pengindeksan dalam buffer ring adalah sama seperti dalam siri masa.

Contoh

  1. Fail Test_OsMA_OnArrayRB.mq5 mengira indikator berdasarkan siri masa harga. Aplikasi kaedah MainOnArray() ditunjukkan.
  2. Fail Test_OsMA_OnValueRB.mq5 menunjukkan penggunaan kaedah MainOnValue(). Pada mulanya indikator OsMA dikira dan dilukis. Kemudian berdasarkan ring buffer indikator ini, satu lagi indikator OsMA dilukis.


Hasil kerja Test_OsMA_OnArrayRB.mq5 dengan saiz buffer ring 256 elemen.



Hasil kerja Test_OsMA_OnValueRB.mq5 dengan saiz buffer ring 256 elemen.

 

Dalam penulisan kod, pembangunan daripada MetaQuotes Software Corp., Integer  dan GODZILLA telah digunakan.

Senarai
Komen 0