MetaTrader5
Cycle Period: Indikator Penting untuk MetaTrader 5
Penulis Asli:
Witold Wozniak
Indikator ini dirancang untuk mengukur periodisitas perubahan harga aset keuangan.
Indikator ini menyimpan nilai siklus pasar saat ini dalam buffer indikatornya, yang jelas tidak akan stabil. Indikator ini dibuat untuk digunakan bersama osilator agar dapat beradaptasi dengan siklus pasar yang selalu berubah dan mengubahnya menjadi lebih adaptif.
Inspirasi untuk indikator ini berasal dari artikel John Ehlers yang berjudul "Using The Fisher Transform" yang diterbitkan pada November 2002 di majalah "Technical Analysis Of Stock & Commodities".
Handle CyclePeriod harus dideklarasikan pada level global agar indikator ini dapat digunakan dalam kode indikator lainnya (misalnya, dalam osilator RVI):
//---- deklarasi variabel integer untuk handle indikator
int CP_Handle;
Selanjutnya, handle indikator CyclePeriod harus diterima dalam blok inisialisasi indikator RVI:
//---- mendapatkan handle indikator CyclePeriod
CP_Handle=iCustom(NULL,0,"CyclePeriod",Alpha);
if(CP_Handle==INVALID_HANDLE)
{
Print(" Gagal mendapatkan handle indikator CyclePeriod");
return(1);
}
Sekarang, kita memiliki variabel baru Alpha yang merupakan parameter input dari indikator yang digunakan dan rasio rata-rata periode. Variabel ini harus diubah menjadi variabel input dari indikator yang dikembangkan.
//+----------------------------------------------+
//| Parameter input indikator |
//+----------------------------------------------+
input double Alpha=0.07; // Rasio smoothing indikator
Variabel input Length sebelumnya harus dihapus dari daftar parameter input dan diubah menjadi variabel lokal di dalam fungsi OnCalculate().
Ukuran array yang digunakan untuk smoothing indikator ditentukan oleh nilai parameter Length:
//---- Distribusi memori untuk array variabel
ArrayResize(Count,Length);
ArrayResize(Value1,Length);
ArrayResize(Value2,Length);
Nilai parameter ini sekarang berubah. Oleh karena itu, sebaiknya ukuran array ini tidak kurang dari nilai maksimum yang diasumsikan dari variabel ini.
Saat menganalisis grafik indikator, kita dapat melihat bahwa nilai ini tidak melebihi 100. Oleh karena itu, ukuran array akan memiliki nilai yang sama:
//---- Distribusi memori untuk array variabel
ArrayResize(Count,MAXPERIOD);
ArrayResize(Value1,MAXPERIOD);
ArrayResize(Value2,MAXPERIOD);
Selanjutnya, nilai periode untuk bar saat ini dalam blok OnCalculate() harus diambil dari buffer indikator kustom CyclePeriod agar dapat digunakan sebagai pengganti nilai parameter input Length yang sebelumnya.
//---- loop perhitungan indikator utama
for(bar=first; bar<rates_total && !IsStopped(); bar++)
{
//---- salin data baru yang muncul ke dalam array
if(CopyBuffer(CP_Handle,0,rates_total-1-bar,4,period)<=0) return(RESET);
Length=int(MathFloor((4.0*period[0]+3.0*period[1]+2.0*period[2]+period[3])/20.0));
if(bar<Length) Length=bar; // memotong smoothing menjadi jumlah bar yang sebenarnya
Dalam hal ini, empat nilai terakhir diambil dari buffer indikator CyclePeriod dan dilakukan smoothing berbobot linier, setelah itu nilai yang didapat digunakan sebagai periode smoothing Length. Terakhir, baris di akhir kode indikator harus diubah:
if(bar<rates_total-1) Recount_ArrayZeroPos(Count,MAXPERIOD);
Hasilnya, kita mendapatkan osilator Adaptive RVI:
2011.11.23