ホーム テクニカル指標 投稿

MetaTrader 5用Cycle Periodインジケーターの活用法

添付ファイル
562.zip (8.65 KB, ダウンロード 0回)

著者:

ウィトルド・ウォジニアク

Cycle Periodインジケーターは、金融資産の価格変動の周期性を測定するために設計されています。

このインジケーターは、現在の市場サイクルの値をインジケーターバッファに保存します。市場の状況は常に変化するため、これらの値は安定することはありません。このインジケーターは、オシレーターと組み合わせて使用することで、変化し続ける市場サイクルに適応し、適応型に変換することを目的としています。

このインジケーターのアイデアは、ジョン・エイラーズの2002年11月に発表された記事「Using The Fisher Transform」からインスパイアを受けています。この論文は、「Technical Analysis Of Stock & Commodities」誌に掲載されました。

Cycle Period

CyclePeriodインジケーターのハンドルは、他のインジケーターのコードで使用できるように、グローバルレベルで宣言する必要があります(例えば、RVIオシレーター内で)。以下のようにします:

//---- インジケーターのハンドル用整数変数の宣言
int CP_Handle;

次に、CyclePeriodインジケーターのハンドルをRVIインジケーターの初期化ブロックで取得する必要があります:

//---- CyclePeriodインジケーターのハンドルを取得
   CP_Handle=iCustom(NULL,0,"CyclePeriod",Alpha);
   if(CP_Handle==INVALID_HANDLE)
     {
      Print(" CyclePeriodインジケーターのハンドル取得に失敗しました");
      return(1);
     }

これで、新しいAlpha変数が作成され、使用するインジケーターの入力パラメーターおよび期間の平均化比率となります。この変数は、開発したインジケーターの入力変数に変換する必要があります。

//+----------------------------------------------+
//| インジケーターの入力パラメーター                  |
//+----------------------------------------------+
input double Alpha=0.07; // インジケーターの平滑化比率 

以前のLength入力変数は、入力パラメーターのリストから削除し、OnCalculate()関数内のローカル変数に変換する必要があります。

インジケーターの平滑化に使用される配列のサイズは、Lengthパラメーターの値によって固定されます:

//---- 変数配列のメモリ割り当て  
   ArrayResize(Count,Length);
   ArrayResize(Value1,Length);
   ArrayResize(Value2,Length);

このパラメーターの値は変化するため、これらの配列のサイズは、この変数の予想される最大値以上に設定することが望ましいです。

インジケーターのチャートを分析すると、この値は100を超えないことがわかります。したがって、配列のサイズは同じ値に設定できます:

//---- 変数配列のメモリ割り当て  
   ArrayResize(Count,MAXPERIOD);
   ArrayResize(Value1,MAXPERIOD);
   ArrayResize(Value2,MAXPERIOD);

次に、現在のバーの期間値は、OnCalculate()ブロック内でCyclePeriodカスタムインジケーターバッファから取得し、かつてのLength入力パラメーターの値の代わりに使用する必要があります。

//---- メインインジケーター計算ループ
   for(bar=first; bar<rates_total && !IsStopped(); bar++)
     {
      //---- 新たに現れたデータを配列にコピー
      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; // 実際のバー数に応じて平滑化を切り詰める

この場合、CyclePeriodインジケーターバッファから最後の4つの値を取得し、線形加重平滑化を行います。その後、得られた値をLength平滑化期間として使用します。最後に、インジケーターコードの最後の行を変更する必要があります:

      if(bar<rates_total-1) Recount_ArrayZeroPos(Count,MAXPERIOD);

結果として、Adaptive RVIオシレーターが完成しました:

RVIとAdaptive RVIインジケーター

関連記事

コメント (0)