MetaTrader5
Periode Kitaran: Indikator Berguna untuk MetaTrader 5
Penulis sebenar:
Witold Wozniak
Indikator ini direka untuk mengukur perubahan harga aset kewangan dalam satu kitaran.
Indikator ini menyimpan nilai kitaran pasaran semasa dalam buffer indikatornya yang tidak akan stabil atas sebab yang jelas. Ia dicipta untuk digunakan bersama osilator bagi menyesuaikan diri dengan kitaran pasaran yang sentiasa berubah dan mengubahnya menjadi kitaran yang lebih adaptif.
Indikator ini diinspirasikan oleh artikel John Ehlers "Menggunakan Transformasi Fisher" yang diterbitkan pada November 2002 dalam majalah "Analisis Teknikal Saham & Komoditi".
Pengendali CyclePeriod perlu diisytiharkan pada tahap global untuk membolehkan indikator ini digunakan dalam kod indikator lain (contohnya, dalam osilator RVI):
//---- pengisytiharan pembolehubah integer untuk pengendali indikator
int CP_Handle;
Seterusnya, pengendali CyclePeriod mesti diterima dalam blok penginisialisasian indikator RVI:
//---- mendapatkan pengendali indikator CyclePeriod
CP_Handle=iCustom(NULL,0,"CyclePeriod",Alpha);
if(CP_Handle==INVALID_HANDLE)
{
Print(" Gagal mendapatkan pengendali indikator CyclePeriod");
return(1);
}
Sekarang, kita mempunyai pembolehubah Alpha yang merupakan parameter input dari indikator yang digunakan dan nisbah purata tempoh. Pembolehubah ini perlu ditransformasikan kepada pembolehubah input indikator yang dibangunkan.
//+----------------------------------------------+
//| Parameter input indikator |
//+----------------------------------------------+
input double Alpha=0.07; // Nisbah pelicinan indikator
Pembolehubah input Length sebelum ini perlu dikeluarkan dari senarai parameter input dan ditransformasikan kepada pembolehubah tempatan dalam fungsi OnCalculate().
Saiz array yang digunakan untuk pelicinan indikator ditetapkan oleh nilai parameter Length:
//---- Pengagihan memori untuk array pembolehubah
ArrayResize(Count,Length);
ArrayResize(Value1,Length);
ArrayResize(Value2,Length);
Nilai parameter ini kini berubah. Oleh itu, adalah lebih baik untuk menetapkan saiz array ini tidak kurang daripada nilai tinggi yang diandaikan untuk pembolehubah ini.
Semasa menganalisis carta indikator, kita dapat melihat bahawa nilai ini tidak melebihi 100. Oleh itu, saiz array akan mempunyai nilai yang sama:
//---- Pengagihan memori untuk array pembolehubah
ArrayResize(Count,MAXPERIOD);
ArrayResize(Value1,MAXPERIOD);
ArrayResize(Value2,MAXPERIOD);
Seterusnya, nilai tempoh untuk bar semasa dalam blok OnCalculate() mesti diambil dari buffer indikator CyclePeriod untuk digunakan sebagai ganti nilai parameter input Length yang dahulu.
//---- gelung pengiraan 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 pelicinan kepada bilangan bar yang sebenar
Dalam kes ini, empat nilai terakhir diambil dari buffer indikator CyclePeriod dan pelicinan berat secara linear dilakukan, selepas itu nilai yang diperoleh digunakan sebagai tempoh pelicinan Length. Akhirnya, baris di akhir kod indikator perlu diubah:
if(bar<rates_total-1) Recount_ArrayZeroPos(Count,MAXPERIOD);
Hasilnya, kita telah memperoleh osilator RVI Adaptif:
2011.11.23