Cara Menghitung Indikator TEMA Menggunakan Ring Buffer di MetaTrader 5

Mike 2013.01.17 00:39 83 0 0
Lampiran

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
   constint     rates_total,     // ukuran array
   constint     prev_calculated, // elemen yang diproses pada panggilan sebelumnya
   constdouble& price[],         // array untuk perhitungan
   );
//--- metode untuk perhitungan berdasarkan elemen array yang terpisah:double MainOnValue(              // mengembalikan nilai TEMA untuk elemen yang ditentukan (bar)
   constint    rates_total,     // ukuran array
   constint    prev_calculated, // elemen yang diproses dari array
   constint    begin,           // dari mana data signifikan array dimulaiconstdouble value,           // nilai elemen (bar)constint    index            // indeks elemen (bar)
   );
//--- metode akses data:int                 BarsRequired();  // Mengembalikan jumlah bar yang diperlukan untuk menggambar indikatorstring              Name();          // Mengembalikan nama indikatorint                 Period();        // Mengembalikan periodeint                 Size();          // Mengembalikan ukuran ring bufferdouble              MA(int index);   // Mengembalikan nilai Moving Average, pengindeksan seperti dalam time seriesdouble              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                              |//+------------------------------------------------------------------+intOnCalculate (constint rates_total,      // ukuran array price[]
                 constint prev_calculated,  // bar yang diproses pada panggilan sebelumnya
                 constint begin,            // dari mana data signifikan dimulai
                 constdouble& 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.

Daftar
Komentar 0