iBarShift関数について

だいぶ昔に作成したPivotを利用するインディケーターを見直していて自分が書いたのに、意図が分からない部分があったので。しかも、基礎的な部分w。

Pivotを計算するコードで常套的な書き方だけど下記のような部分。

for(int i=limit-1 ; 0<=i; i--){
 int shiftBar = iBarShift(NULL, PERIOD_D1, Time[i]) + 1;

 double pivot_H = iHigh(NULL, PERIOD_D1, shift);
 double pivot_L = iLow(NULL, PERIOD_D1, shift);
 double pivot_C = iClose(NULL, PERIOD_D1, shift);
}

久しぶりに眺めたら、shiftBarとiは同義なんじゃないかと思ってしまった。

でも、それは間違い。なぜなら、Pivotは日足の高値、安値、終値で計算するもので、表示している時間足で計算できないから。

Pivotの定義はこれ。

ある日のPivot=(前日高値+前日安値+前日終値)÷3

表示しているチャートの時間枠が4時間足の場合、上記プログラムで任意のiの位置は、同じプログラムを日足に適用した場合のiとは異なる。
例えば、4時間足で、i=12番目の時間は4×12=48時間前の時間でこれは日に直すと48/24=2日前ということになる。つまり、4時間足で12番目のローソク足は、日足では2番目のローソク足である。
これを、自分で計算するのが大変なので、iBarShift関数を日足の時間枠に適用して使用するのである。

まず、現在のチャートの時間枠でi番目のローソク足が、日足では(PERIOD_D1を指定)何番目なのかを下記のようにして計算する(iBarShift関数ではiに対応する時間Time[i]を指定する仕様)。

iBarShift(NULL, PERIOD_D1, Time[i]) 

これで、表示されている時間枠のチャートにおいて、i番目のローソク足が日足では何番目のローソク足に対応するのかが分かるが、Pivotは前日の日足の値を使用するので1日後ろにずらすために、1を加える。
したがって、日足を計算するためのローソク足のずれ(shift)は下記のように計算される。

int shiftBar = iBarShift(NULL, PERIOD_D1, Time[i]) + 1;