著者:
ウィトルド・ウォジニアク
Cycle Periodインジケーターは、金融資産の価格変動の周期性を測定するために設計されています。
このインジケーターは、現在の市場サイクルの値をインジケーターバッファに保存します。市場の状況は常に変化するため、これらの値は安定することはありません。このインジケーターは、オシレーターと組み合わせて使用することで、変化し続ける市場サイクルに適応し、適応型に変換することを目的としています。
このインジケーターのアイデアは、ジョン・エイラーズの2002年11月に発表された記事「Using The Fisher Transform」からインスパイアを受けています。この論文は、「Technical Analysis Of Stock & Commodities」誌に掲載されました。

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オシレーターが完成しました:
