TradeStationメモ: インジケーターの計算が何本目のバーから始まるか (MaxBarsBack)

25 本移動平均線の MaxBarsBack の値

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

/p/xvbs8ua/img-001.png

上記のチャートは、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 本目のバーからインジケーターの計算処理を開始します。

現在処理中のバーの番号を取得するキーワードとして CurrentBarBarNumber がありますが、これらの値が 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 beginend で囲まれたブロックは分析テクニックを適用した最初の 1 回しか実行されないはずですが、2 回実行されています。 さらに、1 回目の実行時には MaxBarsBack の値が 1 という想定外の値になっています。

どうやら、移動平均を計算するケースなどでは、MaxBarsBack などの値を自動計算するために初期化処理として 1 度だけ無条件でインジケーターが実行されるようです(計算の必要がない場合はこの初期化処理は実行されません)。 その処理によって MaxBarsBack の値が 25 であることが判明し、25 本分のバーをスキップして、改めて Once ブロックから処理が再実行されるというメカニズムのようです。