转至 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™ 编译器提供了有关变量类型的信息。在此示例中,它是一个浮点数。
在某些情况下,你可以用一个值初始化该可变变量(如s
)
na
。但在复杂情况下,这样做行不通。
删除前向引用变量
//@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)
变量s
、s1
和s2
属于bool类型。但在第 6 行,我们将其中三个相加,并将结果存储在变量 中sum
。sum
是一个数字,因为我们不能将布尔值相加。布尔值被隐式转换为数字(true
值 为1.0
和false
为0.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 的缩写)会明确将任何布尔值转换为数字。