'Pine cannot determine the referencing length of a series. Try using max_bars_back' のエラーが表示されます

Pineスクリプトが計算されると、コード内の各変数または関数ごとに特定のサイズのヒストリカルバッファが作成されます。そのバッファには、変数/関数の以前の値の情報が含まれており、コードが履歴参照演算子 [] を使用して過去の値を参照するときに使用されます。バッファサイズは、この値が要求可能な履歴の範囲を指定します。

Pineは、スクリプトの最初の244バーの計算中に行われた履歴の参照を分析することにより、すべての変数と関数に必要なバッファサイズを自動的に決定します。履歴の参照が検出されない場合には、変数や関数にデフォルトのバッファサイズが割り当てられます。変数の場合、デフォルトのバッファサイズは300バーで、関数の場合は1バーです。

いくつかのケースでは、Pineはその関数に適切なバッファサイズを割り当てることができない為、代わりにデフォルトのバッファサイズが使用されます。これは以下の場合に発生する可能性があります:

  • 条件付きステートメント (if, iff, or ?) の分岐で、244番目のバーが既に処理された後に、条件ステートメント内で変数や関数の履歴参照が最初に実行された場合。
  • 動的な期間をサポートする関数で、244番目のバーの後に関数に渡された期間の値が、それ以前(バッファが計算された時)に渡された値よりも大きい場合。

以下のコードをご覧ください。次の理由により前述のエラーが返されます:

  • var1 変数の値はコンパイル時には不明です。
  • test 変数は、チャートの最初の244バーで過去データをリクエストしません。

このため test 変数にはデフォルトで300バーのバッファが割り当てられます。スクリプトがこのバッファ外のその前の301バーの値を要求するとエラーが発生します。

//@version=4
study("max_bars_back var",overlay=true)
var1 = input(301)
test = 0.0
//max_bars_back(test, 301)
if bar_index > 244
    test := test[var1]
plot(test)

これを回避する為に、max_bars_back パラメーターと max_bars_back() 関数が存在します。デフォルトのバッファでは不十分な場合に、それらで正しいバッファサイズを指定できます。上記のコードの max_bars_back() 関数呼び出しのコメントを外すと301のバッファが test 変数に割り当てられ、その結果スクリプトは適切に計算されます。

以下は、デフォルトの1バーのバッファサイズが割り当てられている関数呼び出しの例です。最初の244バーでは呼び出されない為、デフォルトの1バッファサイズが割り当てられています。この場合、[] 演算子を使用した過去の値への明示的な参照は使用されていませんが、関数では過去20本の値を計算する必要があります。したがってスクリプトは max_bars_back のエラーを返します:

//@version=4
study("Requires max_bars_back")
test = 0.0
if bar_index > 1000
    test := vwma(close, 20)
plot(test)

max_bars_back() 関数を使用して、特定のバッファサイズを関数に割り当てる事はできません。それを行う必要がある場合には、またはスクリプトすべての変数と関数にデフォルトのバッファサイズを設定されたい場合には、スクリプトの study または strategy 宣言ステートメントに max_bars_back パラメーターを追加します。なおこのパラメーターを使用するとスクリプトのリソース使用量が増加する為、このメソッドは必要な時のみ使用するようにして下さい:

//@version=4
study("Requires max_bars_back", max_bars_back=20)
test = 0.0
if bar_index > 1000
    test := vwma(close, 20)
plot(test)

条件分岐から問題のある式を取り除く事で問題を解決する事もできます。こうすると max_bars_back パラメーターを指定せずに問題を解決することができます:

//@version=4
study("Requires max_bars_back")
test = 0.0
vwma20 = vwma(close, 20)
if bar_index > 1000
    test := vwma20
plot(test)

このエラーは、動的な期間、つまり系列の値を許可する関数を使用している場合にも発生する可能性があります。以下のスクリプトは max_bars_back エラーをスローします。これは、最初の300バーの間は sma() は50期間で計算される為、50バーのみ過去データがリクエストされてバッファが50に制限されていましたが、300バー以降は期間が100に変更され、それは既存のバッファの範囲外である為です:


//@version=4
study("Out of bounds")
series_length = bar_index > 300 ? 100 : 50
plot(sma(close, series_length))

この問題を回避するには、意図的に長い期間の値を使用することで、インジケーターの計算の開始時にあらかじめ大きなバッファを生成する事です。次のコードでは、インジケーターの計算の最初のバーの段階で1000バーのヒストリカルデータを要求しています。これにより sma() 用の永続的な1000バーのバッファを作成し、結果範囲外となることはありません:


//@version=4
study("Not out of bounds")
series_length = bar_index > 300 ? 100 : 50
passed_length = bar_index == 0 ? 1000 : series_length
plot(sma(close, passed_length))


max_bars_back と関連のエラーについての詳細は ユーザーマニュアルをご覧ください。