龙听期货论坛's Archiver

龙听 发表于 2024-3-29 11:36

【PART 2】变量操作符:TradingView 中的赋值运算符 (=)

TradingView 中的赋值运算符 (=)

赋值运算符的使用频率高于其他任何运算符。该运算符是如何工作的?

TradingView 中的赋值运算符

运算符是脚本 "工作 "的重要组成部分。运算符是对一个或多个值执行操作并返回结果的代码元素(Stephens,2014 年)。我们将操作符 "操作 "的值称为操作数(Sharp,2013 年)。

TradingView 中使用最多的运算符是赋值运算符 (=)。该运算符需要两个操作数,并将 = 右边的值赋值给左边的变量。我们在给函数参数赋值时也会用到这个运算符(Pine Script Language Tutorial,注释)。让我们来仔细看看这两种用法。

使用赋值操作符为变量赋值

我们使用赋值操作符为变量赋值,如下所示:[code]closingPrice = 100
prevVolume   = volume[1]
emaValue     = ta.ema(low, 20)[/code]这里首先为 closingPrice 变量赋值 100。然后使用历史引用运算符([ ])检索前一栏的成交量(volume[1]),并使用赋值运算符将该值放入 prevVolume 中。最后,我们将 ta.ema() 函数(用于计算指数移动平均线;TradingView, n.d.)返回的值存储到 emaValue 变量系列中。

使用带有函数参数的赋值操作符

赋值运算符也可在注释函数的参数列表中使用(参见《Pine 脚本语言教程》,注释)。注释函数是一种内置函数,它接受关键字参数,用于将特定参数设置为某个值(Pine Script Language Tutorial, n.d.)。这听起来很专业,我们来看一个例子来说明一下:[code]indicator(title="Example script", overlay=true)[/code]在这里,我们使用了每个脚本中都包含的注释函数:indicator()。我们设置了它的两个关键字参数:title 和 overlay。通过赋值运算符,我们将标题参数设置为 "示例脚本",同时使用等号将覆盖设置为 true。

为变量赋值:TradingView 的限制

TradingView Pine 中的赋值运算符有一个与其他编程和脚本语言不同的限制:一旦变量被赋值运算符赋值,它就不能再被赋予其他值(Pine 脚本语言教程,未注明日期)。具有讽刺意味的是,变量之所以被命名为 "变量",是因为它的值是变化的(Stellman & Greene,2010 年)。

举例来说,这是不允许的:[code]//@version=5
indicator(title="Assignment operator - example 1", overlay=true)

averageClose = (close + close[1]) / 2
averageClose = ta.sma(close, 10)

plot(averageClose, linewidth=3)[/code]在这里,我们首先将当前收盘价与前收盘价之和除以 2 赋值给 averageClose 变量。然而,这会引发 TradingView 错误:

[img]http://p.algo2.net/2024/0329/b16e21320aeec.png[/img]

我们通常可以通过创建多个变量来解决这一限制:[code]//@version=5
indicator(title="Assignment operator - example 1", overlay=true)

averageClose = (close + close[1]) / 2

smaClose = ta.sma(close, 10)

plot(smaClose, linewidth=3)[/code]我们没有两次为 averageClose 变量赋值,而是用一个新变量(smaClose)取代了第二次使用的 averageClose。现在脚本保存成功,可以在图表上绘制了:

[img]http://p.algo2.net/2024/0329/0e6b046dbdd55.png[/img]

提示:不要混淆赋值运算符 (=) 和等号运算符 (==)

赋值操作符 (=) 使用一个等号,而相等比较操作符 (==) 使用两个等号。两者的区别在于,赋值操作符将右边的值赋给左边的变量。而相等运算符则测试右边的值是否与左边的值相同(Pine Script Language Tutorial,n.d.)。即使是经验丰富的程序员也时常会犯的一个错误就是混淆这两者(Liberty & MacDonald, 2009)。

下面是一个使用赋值运算符(=)而本应使用相等运算符(==)的示例指标:[code]//@version=5
indicator(title="Assignment operator - example 2", overlay=true)

colour = high = ta.highest(high, 20) ? color.green : color.red

barcolor(colour)[/code]在这里,colour 变量被分配了一个值,该值由条件三元运算符(?:)返回。该运算符评估一个条件,当条件为真时,返回其第二个操作数(此处为 color.green)。否则,返回第三个操作数(color.red)(TradingView,注)。

该运算符评估的条件是 high = ta.highest(high,20),当当前条形图的高点(high)是最近 20 个条形图的最高点(ta.highest(high,20))时,该条件通常为真。

但这里的问题是,我们使用了赋值运算符 (=),而它本应是相等运算符 (==)。毕竟,我们是在测试相等性,而不是赋值。因此 TradingView 生成了 "无可行替代方案 "错误:

[img]http://p.algo2.net/2024/0329/5197442c16fac.png[/img]

同样,我们可能会错误地使用 ==(相等运算符),而我们的意思是 =(赋值运算符),就像这样:[code]//@version=5
indicator(title="Assignment operator - example 2", overlay=true)

colour == high == ta.highest(high, 20) ? color.green : color.red

barcolor(colour)[/code]这里修正了之前的错误:条件 (high == ta.highest(high, 20)) 现在使用了相等运算符。

但我们没有使用 = 操作符将条件操作符 (?:) 返回的值赋值给颜色变量,而是使用了相等比较操作符 (==)。这也会在保存脚本时引发 "无可行替代方案 "错误:

[img]http://p.algo2.net/2024/0329/5197442c16fac.png[/img]

正确的代码示例当然是使用赋值运算符 (=) 给颜色变量赋值,并使用相等运算符 (==) 检查高点是否是过去 20 个条形图中的最高点:[code]//@version=5
indicator(title="Assignment operator - example 2", overlay=true)

colour = high == ta.highest(high, 20) ? color.green : color.red

barcolor(colour)[/code]该版本的脚本不会出现 TradingView 错误:
[img]http://p.algo2.net/2024/0329/413f5682a4f4b.png[/img]
添加到图表中的脚本看起来是这样的:
[img]http://p.algo2.net/2024/0329/98c676ddb880d.png[/img]

除赋值运算符外,其他常用的运算符包括:进行数学运算的算术运算符、相互比较数值的比较运算符,以及组合多个真假表达式的逻辑运算符。

小结

赋值运算符 (=) 赋予变量一个值,并将关键字参数设置为一个值。它的左操作数被设置为等号右边的值。使用赋值运算符时,我们不能为现有变量赋值。

页: [1]