我看到'Pine cannot determine the referencing length of a series. Try using max_bars_back'错误

计算Pine脚本时,它将为代码中的每个变量或函数建立一定大小的历史缓冲区。该缓冲区包含有关变数/函数的先前值的资讯,当代码使用 [] 历史引用运算符引用过去的值时,将使用该缓冲区。缓冲区的大小指定可以请求该值到历史记录的距离。

Pine通过分析在前244根K线上计算脚本时过去所做的引用来自动确定所有变数和函数所需的缓冲区大小。如果未检测到任何过去的引用,则将预设缓冲区大小分配给变数或函数。对于变数,预设缓冲区大小为300根K线,对于函数,预设缓冲区大小为1根K线。

在某些情况下,Pine无法为该函数分配适当的缓冲区大小,而是使用默认缓冲区大小。可能会发生:

  • 在条件语句的分支(if,iff或?)中,当第244根K线已经通过时,首先执行对条件语句中变量或函数的过去引用。
  • 在支持动态长度的函数中,当传递给第244根K线之后的函数的长度值大于传递给函数前的任何值时(计算缓冲区时)。

看以下代码。它将返回上述错误,因为:

  • 编译时未知var1变量值
  • 测试变量不要求图表的前244根K线显示任何过去的数据

因此,将为测试变数分配预设的300根K线缓冲区。当脚本过去请求变数的缓冲区之外的301根K线的值时,会发生错误。

//@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)
Java

存在 max_bars_back 参数和 max_bars_back() 函数可以解决此问题。它们允许您在预设缓冲区不足时为变数和函数指定正确的缓冲区大小。在上面的代码中取消对 max_bars_back() 函数调用的注释。将301缓冲区分配给测试变数,结果脚本将正确计算。

这是一个函数调用的示例,预设的单根K线(one-bar)缓冲区大小归因于该函数调用,因为在前244根K线中未调用它。尽管没有使用 [] 运算符明确引用过去的值,但是该函数仍然需要过去的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() 函数不能用于为函数分配特定的缓冲区大小。如果需要这样做,或者要为脚本中的所有变数和函数设定预设缓冲区大小,请在脚本的 studystrategy 声明语句中添加 max_bars_back 参数。请注意,使用参数会增加脚本的资源使用率,因此仅应在需要时使用此方法:

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

您也可以透过将有问题的表达式移出条件分支来解决问题,在这种情况下,不需要 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)
Java

当使用允许动态长度(即序列值)的函数时,也会出现错误。 以下脚本将引发max_bars_back错误,因为在前300根K线期间, sma() 的长度为50,因此仅请求了50根K线的历史数据,从而将其缓冲区限制为50。但是,在第300根K线之后, 长度更改为100,超出了已建立缓冲区的范围:

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

要变通解决此问题,您可以通过故意使用较大的长度值在指标计算的开头生成较大的缓冲区。在以下代码中,我们在指标计算的第一根K线上请求1000根K线历史数据。这为我们的 sma() 创建了一个永久的1000根K线缓冲区,因此我们永远不会超出范围:

//@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))
Java您可以在我们的用户手册中了解有关 max_bars_back 和相关错误的更多资讯。