Beranda Indikator Teknis Postingan

Cara Menghitung Indikator TEMA Menggunakan Ring Buffer di MetaTrader 5

Lampiran
1417.zip (11.22 KB, Unduh 0 kali)

Deskripsi

Kelas CTEMAOnRingBuffer dirancang untuk menghitung indikator teknikal Triple Exponential Moving Average (TEMA) menggunakan algoritma ring buffer. Hal ini memungkinkan trader untuk mendapatkan hasil yang lebih cepat dan efisien saat menganalisis data harga.

Deklarasi

class CTEMAOnRingBuffer : public CArrayRing

Judul

#include <IncOnRingBuffer\CTEMAnRingBuffer.mqh>

File CTEMAOnRingBuffer.mqh harus diletakkan di folder IncOnRingBuffer yang harus dibuat di MQL5\Include\. Dua file contoh yang digunakan oleh kelas ini terdapat di folder tersebut. File dengan kelas ring buffer, DEMA, dan Moving Average juga harus ada di folder ini.

Metode Kelas

//--- metode inisialisasi:
bool Init(                                // jika ada kesalahan, mengembalikan false, jika berhasil - true
   int            period      = 12,       // periode TEMA
   ENUM_MA_METHOD method      = MODE_EMA, // metode smoothing
   int            size_buffer = 256,      // ukuran ring buffer
   bool           as_series   = false     // true, jika merupakan time series, jika tidak - false
   );
//--- metode perhitungan berdasarkan time series 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 array yang terpisah:
double MainOnValue(              // mengembalikan nilai TEMA untuk elemen yang ditentukan (bar)
   const int    rates_total,     // ukuran array
   const int    prev_calculated, // elemen yang diproses dari array
   const int    begin,           // dari mana data signifikan 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 ring buffer
double              MA(int index);   // Mengembalikan nilai Moving Average, pengindeksan seperti dalam time series
double              DEMA(int index); // Mengembalikan nilai DEMA, pengindeksan seperti dalam time series

Untuk mendapatkan data yang dihitung dari indikator dari ring buffer, bisa dilakukan seperti dari array biasa. Misalnya:

//--- kelas dengan metode perhitungan indikator TEMA:
#include <IncOnRingBuffer\CTEMAOnRingBuffer.mqh>
CTEMAOnRingBuffer tema;

...
//+------------------------------------------------------------------+
//| 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 time series:
    tema.MainOnArray(rates_total,prev_calculated,price);

...
//--- gunakan data dari ring buffer "tema",
//    misalnya, salin data ke buffer indikator:
   for(int i=start;i<rates_total && !IsStopped();i++)
      TEMA_Buffer[i] = tema[rates_total-1-i]; // garis indikator TEMA

...
//--- kembalikan nilai prev_calculated untuk panggilan selanjutnya:
   return(rates_total);
  }

Saat menghitung TEMA, juga dilakukan perhitungan Moving Average dan DEMA dengan parameter yang sama. Kita dapat mengambil data dari ring buffer MA dan DEMA menggunakan metode MA(int index) dan DEMA(int index), masing-masing:

//--- gunakan data dari ring buffer Moving Average dan DEMA,
//    misalnya, salin mereka 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
      DEMA_Buffer[i] = dema.DEMA(rates_total-1-i); // garis indikator DEMA
     }

Perhatikan bahwa pengindeksan di ring buffer sama seperti dalam time series.

Contoh

  1. Indikator menghitung file Test_TEMA_OnArrayRB.mq5 berdasarkan time series harga. Aplikasi metode MainOnArray() ditunjukkan.
  2. File Test_TEMA_OnValueRB.mq5 menunjukkan penggunaan metode MainOnValue(). Pertama indikator TEMA dihitung dan digambar. Kemudian berdasarkan ring buffer indikator ini, TEMA lainnya digambar.


Hasil kerja dari Test_TEMA_OnArrayRB.mq5 dengan ukuran ring buffer 256 elemen



Hasil kerja dari Test_TEMA_OnValueRB.mq5 dengan ukuran ring buffer 256 elemen

 

Dalam penulisan kode ini, pengembangan dari MetaQuotes Software Corp., Integer  dan GODZILLA telah digunakan.

Postingan terkait

Komentar (0)