Laman utama Indikator Teknikal Siaran

Kelas Pengiraan DEMA Menggunakan Ring Buffer untuk MetaTrader 5

Lampiran
1416.zip (9.14 KB, Muat turun 0 kali)

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

  1. Indikator mengira fail Test_DEMA_OnArrayRB.mq5 berdasarkan siri masa harga. Penggunaan kaedah MainOnArray() diperlihatkan.
  2. 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

Komen (0)