Laman utama Indikator Teknikal Siaran

Periode Kitaran: Indikator Berguna untuk MetaTrader 5

Lampiran
562.zip (8.65 KB, Muat turun 0 kali)

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".  

Periode Kitaran

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:

Indikator RVI dan RVI Adaptif

Siaran berkaitan

Komen (0)