指標バッファに関連付けた配列は、その添え字がチャート上の各バーの位置に対応しています。本サイトで紹介するカスタム指標プログラムでは、配列を時系列配列として処理しているので、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()](<https://www.mql5.com/ja/docs/math/mathmin>)は、二つの引数のうち小さい方を返す関数です。

limitの値はチャートの書き始めのときだけrates_totalとなり、その後は1となります。ここでrates_total-BandPeriod1より大きく、rates_totalより小さい値なので、チャートの書き始めのときだけlimitrates_total-BandPeriodとし、それ以降は1とすることができます。

初期化関数での処理

上記の処理では、チャートの左端からBandPeriod経過してから指標の計算を始めますが、指標自体は表示されます。カスタム指標をチャートに挿入した直後では、値を代入してない配列は正しく初期化されてないことがあるので、以下のように指標の開始位置自体をずらして設定しておきます。

int OnInit()
{
   //配列を指標バッファに関連付ける
   SetIndexBuffer(0, Buf);
   //時系列配列に設定
   ArraySetAsSeries(Buf, true);
   //プロット開始位置の設定
   SetIndexDrawBegin(0, BandPeriod);
   return(INIT_SUCCEEDED);
}

[SetIndexDrawBegin()](<https://docs.mql4.com/customind/setindexdrawbegin>)は、カスタム指標のプロット開始位置を設定する関数です。最初の引数に指標の番号を代入し、2番目の引数にチャートの開始位置を指します。

ただし、ここでの開始位置は、チャートの左端を0として右に行くに従って大きくなります。時系列配列の添え字とは逆なので注意してください。

この値をBandPeriodとすることで、チャートの開始位置を左端からBandPeriodだけずらすことができます。