指標バッファに関連付けた配列は、その添え字がチャート上の各バーの位置に対応しています。本サイトで紹介するカスタム指標プログラムでは、配列を時系列配列として処理しているので、Buf[0]
がチャートの右端、Buf[rates_total-1]
がチャートの左端に対応しています。
指標をチャート全体に表示させたい場合、
int limit = rates_total - prev_calculated; //プロットするバーの数
for(int i=0; i<limit; i++)
{
Buf[i] = (open[i]+high[i]+low[i]+close[i])/4;
}
のようにlimit
を算出することで、rates_total-1
から0
の範囲で指標値が代入されます。
しかし、過去の一定期間のデータを計算に利用するテクニカル指標では、最初の指標値が算出されるまでの期間では、指標値の意味はありません。なので、指標値を表示させる範囲もrates_total-1
からではなく、最初の指標値が算出された時点からでよいことになります。
例えば、指標に使う期間がBandPeroid
の場合、
int limit = rates_total - prev_calculated;
limit = MathMin(limit, rates_total-BandPeriod);
のように書いておきます。ここで、MathMin()
は、二つの引数のうち小さい方を返す関数です。
limit
の値はチャートの書き始めのときだけrates_total
となり、その後は1
となります。ここでrates_total-BandPeriod
は1
より大きく、rates_total
より小さい値なので、チャートの書き始めのときだけlimit
をrates_total-BandPeriod
とし、それ以降は1
とすることができます。
上記の処理では、チャートの左端からBandPeriod
経過してから指標の計算を始めますが、指標自体は表示されます。カスタム指標をチャートに挿入した直後では、値を代入してない配列は正しく初期化されてないことがあるので、以下のように指標の開始位置自体をずらして設定しておきます。
int OnInit()
{
//配列を指標バッファに関連付ける
SetIndexBuffer(0, Buf);
//時系列配列に設定
ArraySetAsSeries(Buf, true);
//プロット開始位置の設定
SetIndexDrawBegin(0, BandPeriod);
return(INIT_SUCCEEDED);
}
SetIndexDrawBegin()
は、カスタム指標のプロット開始位置を設定する関数です。最初の引数に指標の番号を代入し、2番目の引数にチャートの開始位置を指します。
ただし、ここでの開始位置は、チャートの左端を0として右に行くに従って大きくなります。時系列配列の添え字とは逆なので注意してください。
この値をBandPeriod
とすることで、チャートの開始位置を左端からBandPeriod
だけずらすことができます。