错误消息
if 语句太长
当if 语句中的缩进代码
对于编译器来说太大时,就会发生此错误。由于编译器的工作方式,您不会收到一条消息,告诉您超出限制的代码行数。现在唯一的解决方案是将if 语句分解
为较小的部分(函数或较小的if 语句)。下面的示例显示了一个相当长的if 语句;从理论上讲,这会抛出line 4: if statement is too long
:
//@version=5
indicator("My script")
var e = 0
if barstate.islast
a = 1
b = 2
c = 3
d = 4
e := a + b + c + d
plot(e)
要修复此代码,您可以将这些行移到它们自己的函数中:
//@version=5
indicator("My script")
var e = 0
doSomeWork() =>
a = 1
b = 2
c = 3
d = 4
result = a + b + c + d
if barstate.islast
e := doSomeWork()
plot(e)
脚本请求过多证券
脚本中证券的最大数量限制为 40。如果您将变量声明为request.security
函数调用,然后将该变量用作其他变量和计算的输入,则不会导致多次request.security
调用。但是,如果您声明一个调用的函数request.security
--- 每次调用此函数都将算作一次request.security
调用。
从源代码来看,很难说清楚有多少证券会被调用。以下示例
request.security
在编译后恰好有 3 次调用:
//@version=5
indicator("Securities count")
a = request.security(syminfo.tickerid, '42', close) // (1) first unique security call
b = request.security(syminfo.tickerid, '42', close) // same call as above, will not produce new security call after optimizations
plot(a)
plot(a + 2)
plot(b)
sym(p) => // no security call on this line
request.security(syminfo.tickerid, p, close)
plot(sym('D')) // (2) one indirect call to security
plot(sym('W')) // (3) another indirect call to security
request.security(syminfo.tickerid, timeframe.period, open) // result of this line is never used, and will be optimized out
脚本无法翻译自:null
study($)
通常,此错误发生在版本 1 Pine 脚本中,意味着代码不正确。版本 2(及更高版本)的 Pine Script™ 更善于解释此类错误。因此,您可以尝试通过在第一行添加特殊属性来切换到版本 2。
您将得到
line 2: no viable alternative at character '$'
:
// @version=2
study($)
第 2 行:字符'$'处没有可行的替代方案
此错误消息提示了错误所在。$
代替带有脚本标题的字符串。例如:
// @version=2
study("title")
输入不匹配 <…> 期望 <???>
与 相同no viable alternative
,但知道该位置应该是什么。例如:
//@version=5
indicator("My Script")
plot(1)
line 3: mismatched input 'plot' expecting 'end of line without line continuation'
要解决此问题,您应该plot
在新行上开始一行而不缩进:
//@version=5
indicator("My Script")
plot(1)
循环太长(> 500毫秒)
我们限制每个历史条和实时刻度上的循环计算时间,以保护我们的服务器免受无限或非常长的循环的影响。此限制还会使计算时间过长的指标快速失败。例如,如果您有 5000 个条,并且指标在每个条上计算需要 500 毫秒,则会导致超过 16 分钟的加载时间:
//@version=5
indicator("Loop is too long", max_bars_back = 101)
s = 0
for i = 1 to 1e3 // to make it longer
for j = 0 to 100
if timestamp(2017, 02, 23, 00, 00) <= time[j] and time[j] < timestamp(2017, 02, 23, 23, 59)
s := s + 1
plot(s)
也许可以通过优化算法来克服这个错误。在这种情况下,算法可以像这样优化:
//@version=5
indicator("Loop is too long", max_bars_back = 101)
bar_back_at(t) =>
i = 0
step = 51
for j = 1 to 100
if i < 0
i := 0
break
if step == 0
break
if time[i] >= t
i := i + step
i
else
i := i - step
i
step := step / 2
step
i
s = 0
for i = 1 to 1e3 // to make it longer
s := s - bar_back_at(timestamp(2017, 02, 23, 23, 59)) +
bar_back_at(timestamp(2017, 02, 23, 00, 00))
s
plot(s)
脚本有太多局部变量
如果脚本太大而无法编译,则会出现此错误。语句var=expression
为 创建一个局部变量var
。除此之外,值得注意的是,在脚本编译过程中可以隐式创建辅助变量。此限制适用于显式和隐式创建的变量。1000 个变量的限制分别适用于每个函数。事实上,放置在脚本全局范围内的代码也隐式包装到主函数中,并且 1000 个变量的限制也适用于它。您可以尝试一些重构来避免此问题:
var1 = expr1
var2 = expr2
var3 = var1 + var2
可以转换成:
var3 = expr1 + expr2
Pine Script™ 无法确定系列的引用长度。尝试在指标或策略函数中使用 max_bars_back
如果 Pine Script™ 错误地自动检测脚本中使用的系列所需的最大长度,则会出现此错误。当脚本的执行流程不允许 Pine Script™ 检查条件语句分支(if
、iff
或
?
)中系列的使用情况,并且 Pine Script™ 无法自动检测系列的引用距离有多远时,就会发生这种情况。以下是导致此问题的脚本示例:
//@version=5
indicator("Requires max_bars_back")
test = 0.0
if bar_index > 1000
test := ta.roc(close, 20)
plot(test)
为了帮助 Pine Script™ 进行检测,您应该将
max_bars_back
参数添加到脚本indicator
或strategy
函数中:
//@version=5
indicator("Requires max_bars_back", max_bars_back = 20)
test = 0.0
if bar_index > 1000
test := ta.roc(close, 20)
plot(test)
您还可以通过将有问题的表达式从条件分支中取出来解决该问题,在这种情况下max_bars_back
不需要该参数:
//@version=5
indicator("My Script")
test = 0.0
roc20 = ta.roc(close, 20)
if bar_index > 1000
test := roc20
plot(test)
如果问题是由变量而不是内置函数引起的(vwma
在我们的示例中),您可以使用该
max_bars_back
函数仅显式定义该变量的引用长度。 这样做的好处是需要较少的运行时资源,但需要您识别有问题的变量,例如s
以下示例中的变量:
//@version=5
indicator("My Script")
f(off) =>
t = 0.0
s = close
if bar_index > 242
t := s[off]
t
plot(f(301))
可以使用max_bars_back
函数仅定义变量的引用长度来解决这种情况s
,而不是定义所有脚本变量的引用长度:
//@version=5
indicator("My Script")
f(off) =>
t = 0.0
s = close
max_bars_back(s, 301)
if bar_index > 242
t := s[off]
t
plot(f(301))
bar_index[n]
当使用通过和引用先前条形图的绘图时xloc = xloc.bar_index
,从此条形图收到的时间序列将用于在时间轴上定位绘图。因此,如果无法确定缓冲区的正确大小,则可能会发生此错误。为避免这种情况,您需要使用。此行为在有关绘图max_bars_back(time, n)
的部分中有更详细的描述
。