转至 Pine Script™ 版本3

本文档有助于将 Pine Script™ 代码从 迁移@version=2@version=3

安全功能的默认行为已改变

让我们看一下简单的security函数用例。在日内图表上添加此指标:

// Add this indicator on an intraday (e.g., 30 minutes) chart
//@version=2
study("My Script", overlay=true)
s = security(tickerid, 'D', high, false)
plot(s)

该指标是根据历史数据计算得出的,并在一定程度上展望 未来。在每个交易时段的第一根柱线处,指标都会标出全天的最高价。在某些情况下,这可能有助于分析,但不适用于回测策略。

我们对此进行了研究,并在 Pine Script™ 版本 3 中做出了更改。如果使用指令编译此指标//@version=3,我们将得到完全不同的画面:

不过旧的行为仍然可用。我们向 security函数(第五个函数)添加了一个名为的参数lookahead

它可以采用两种不同值的形式:( barmerge.lookahead_off这是 Pine Script™ 版本 3 的默认值)或barmerge.lookahead_on(这是 Pine Script™ 版本 2 的默认值)。

自引用变量被删除

Pine Script™ 版本 2 代码片段,包含一个自引用变量:

//@version=2
//...
s = nz(s[1]) + close

使用 Pine Script™ 版本 3 编译这段代码将会出现错误Undeclared identifier 's'。它应该重写为:

//@version=3
//...
s = 0.0
s := nz(s[1]) + close

s现在是一个可变变量,在第 3 行初始化。在第 3 行,初始值为 Pine Script™ 编译器提供了有关变量类型的信息。在此示例中,它是一个浮点数。

在某些情况下,你可以用一个值初始化该可变变量(如sna。但在复杂情况下,这样做行不通。

删除前向引用变量

//@version=2
//...
d = nz(f[1])
e = d + 1
f = e + close

在此示例中f,是一个前向引用变量,因为它在声明和初始化之前在第 3 行被引用。在 Pine Script™ 版本 3 中,这将导致错误 Undeclared identifier 'f'。此示例应在 Pine Script™ 版本 3 中重写如下:

//@version=3
//...
f = 0.0
d = nz(f[1])
e = d + 1
f := e + close

解决安全表达式中可变变量的问题

当您将脚本迁移到版本 3 时,在删除自引用和前向引用变量后,Pine Script™ 编译器可能会出现错误:

//@version=3
//...
s = 0.0
s := nz(s[1]) + close
t = security(tickerid, period, s)

Cannot use mutable variable as an argument for security function!

自从在 Pine Script™(即版本 2)中引入可变变量以来,就存在此限制。它可以像以前一样解决:在函数中使用可变变量包装代码:

//@version=3
//...
calcS() =>
    s = 0.0
    s := nz(s[1]) + close
t = security(tickerid, period, calcS())

禁止使用布尔值进行数学运算

在 Pine Script™ v2 中,有将布尔值隐式转换为数字类型的规则。在 v3 中,这是被禁止的。相反,数字类型可以转换为布尔值(0 和 的na值为false,所有其他数字均为true)。示例(在 v2 中,此代码可以正常编译):

//@version=2
study("My Script")
s = close >= open
s1 = close[1] >= open[1]
s2 = close[2] >= open[2]
sum = s + s1 + s2
col = sum == 1 ? white : sum == 2 ? blue : sum == 3 ? red : na
bgcolor(col)

变量ss1s2属于bool类型。但在第 6 行,我们将其中三个相加,并将结果存储在变量 中sumsum是一个数字,因为我们不能将布尔值相加。布尔值被隐式转换为数字(true值 为1.0false0.0),然后将它们相加。

这种方法会导致更复杂的脚本中出现意外错误。这就是我们不再允许将布尔值隐式转换为数字的原因。

如果您尝试将此示例编译为 Pine Script™ v3 代码,则会收到错误: Cannot call `operator +` with arguments (series__bool, series__bool); <...> 这意味着您不能将加法运算符与布尔值一起使用。要使此示例在 Pine Script™ v3 中工作,您可以执行以下操作:

//@version=3
study("My Script")
bton(b) =>
    b ? 1 : 0
s = close >= open
s1 = close[1] >= open[1]
s2 = close[2] >= open[2]
sum = bton(s) + bton(s1) + bton(s2)
col = sum == 1 ? white : sum == 2 ? blue : sum == 3 ? red : na
bgcolor(col)

如果您确实需要,函数bton(boolean-to-number 的缩写)会明确将任何布尔值转换为数字。

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