25 本移動平均線の MaxBarsBack の値
例えば、終値の 25 本分の移動平均線を引くには、過去 25 本分の情報が必要です。そのため、チャートの最初の 25 本分の終値が確定するまでは計算できません。

上記のチャートは、25 本の移動平均線インジケーターを適用し、データの最初の部分を表示したものです。 最初のバーは計算ができないため、25 本目までは移動平均線が表示されないことがわかります。
25 本の移動平均線を引くインジケーターのプログラムは、例えば下記のように記述できます。
SetPlotColor(1, Green); // 色: グリーン
SetPlotWidth(1, 3); // 太さ: 3
Plot1(Average(Close, 25));
このようなインジケーターをチャートに適用すると、トレードステーションは内部で自動的に過去何本分のバーが計算に必要かを判断し、MaxBarsBack というプロパティに格納します。
この例では、MaxBarsBack の値は 25 になります。
Print("MaxBarsBack=", MaxBarsBack:0:0); // 25 と表示される
インジケーターの計算処理は基本的にバー 1 本ごとに実行されますが、MaxBarsBack が 25 であれば、最初の 25 本のバーでは計算できないことが事前にわかっています。
このような場合、トレードステーションは処理を最適化するために 25 本分のバーの計算をスキップし、26 本目のバーからインジケーターの計算処理を開始します。
現在処理中のバーの番号を取得するキーワードとして CurrentBar や BarNumber がありますが、これらの値が 1 になるのはチャートの一番最初のバーではなく、MaxBarsBack の次のバー(すなわち計算処理が始まる最初のバー)を指します。
なお、自動売買ストラテジーを作成するときは、MaxBarsBack の値を明示的に固定値で指定する必要があります(ストラテジーのプロパティダイアログで設定できます)。
ストラテジーの MaxBarsBack のデフォルト値は 50 に設定されています。
コラム: 最初だけ MaxBarsBack = 1 になる?
MaxBarsBack が 25 であれば、過去 25 本分のバーの情報を使って 26 本目のバーから計算が行われるはずです(26 本目のバーが CurrentBar==BarNumber[0]==1 となる)。
しかし実際には、インジケータープログラムはそれとは別に、あらかじめ無条件で 1 回実行されるようです。
その 1 回目の実行中に MaxBarsBack を参照すると、1 という想定外の値が得られます。
試しに、下記のようなインジケータープログラムを実行すると、
Once begin
Print("MaxBarsBack=", MaxBarsBack:0:0,
", CurrentBar=", CurrentBar:0:0,
", Date=", Date+19000000:8:0);
end;
印刷ログに次のように表示されます。
MaxBarsBack=1, CurrentBar=1, Date=20161108
MaxBarsBack=25, CurrentBar=1, Date=20161213
Once begin ~ end で囲まれたブロックは分析テクニックを適用した最初の 1 回しか実行されないはずですが、2 回実行されています。
さらに、1 回目の実行時には MaxBarsBack の値が 1 という想定外の値になっています。
どうやら、移動平均を計算するケースなどでは、MaxBarsBack などの値を自動計算するために初期化処理として 1 度だけ無条件でインジケーターが実行されるようです(計算の必要がない場合はこの初期化処理は実行されません)。
その処理によって MaxBarsBack の値が 25 であることが判明し、25 本分のバーをスキップして、改めて Once ブロックから処理が再実行されるというメカニズムのようです。