错误消息

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™ 检查条件语句分支(ififf?)中系列的使用情况,并且 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参数添加到脚本indicatorstrategy 函数中:

//@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)的部分中有更详细的描述

Original text
Rate this translation
Your feedback will be used to help improve Google Translate