【PART 2】变量操作符:TradingView 中的赋值运算符 (=)
- UID
- 2
- 积分
- 2874604
- 威望
- 1387331 布
- 龙e币
- 1487273 刀
- 在线时间
- 13155 小时
- 注册时间
- 2009-12-3
- 最后登录
- 2024-11-24
|
【PART 2】变量操作符:TradingView 中的赋值运算符 (=)
TradingView 中的赋值运算符 (=)
赋值运算符的使用频率高于其他任何运算符。该运算符是如何工作的?
TradingView 中的赋值运算符
运算符是脚本 "工作 "的重要组成部分。运算符是对一个或多个值执行操作并返回结果的代码元素(Stephens,2014 年)。我们将操作符 "操作 "的值称为操作数(Sharp,2013 年)。
TradingView 中使用最多的运算符是赋值运算符 (=)。该运算符需要两个操作数,并将 = 右边的值赋值给左边的变量。我们在给函数参数赋值时也会用到这个运算符(Pine Script Language Tutorial,注释)。让我们来仔细看看这两种用法。
使用赋值操作符为变量赋值
我们使用赋值操作符为变量赋值,如下所示:- closingPrice = 100
- prevVolume = volume[1]
- emaValue = ta.ema(low, 20)
复制代码 这里首先为 closingPrice 变量赋值 100。然后使用历史引用运算符([ ])检索前一栏的成交量(volume[1]),并使用赋值运算符将该值放入 prevVolume 中。最后,我们将 ta.ema() 函数(用于计算指数移动平均线;TradingView, n.d.)返回的值存储到 emaValue 变量系列中。
使用带有函数参数的赋值操作符
赋值运算符也可在注释函数的参数列表中使用(参见《Pine 脚本语言教程》,注释)。注释函数是一种内置函数,它接受关键字参数,用于将特定参数设置为某个值(Pine Script Language Tutorial, n.d.)。这听起来很专业,我们来看一个例子来说明一下:- indicator(title="Example script", overlay=true)
复制代码 在这里,我们使用了每个脚本中都包含的注释函数:indicator()。我们设置了它的两个关键字参数:title 和 overlay。通过赋值运算符,我们将标题参数设置为 "示例脚本",同时使用等号将覆盖设置为 true。
为变量赋值:TradingView 的限制
TradingView Pine 中的赋值运算符有一个与其他编程和脚本语言不同的限制:一旦变量被赋值运算符赋值,它就不能再被赋予其他值(Pine 脚本语言教程,未注明日期)。具有讽刺意味的是,变量之所以被命名为 "变量",是因为它的值是变化的(Stellman & Greene,2010 年)。
举例来说,这是不允许的:- //@version=5
- indicator(title="Assignment operator - example 1", overlay=true)
- averageClose = (close + close[1]) / 2
- averageClose = ta.sma(close, 10)
- plot(averageClose, linewidth=3)
复制代码 在这里,我们首先将当前收盘价与前收盘价之和除以 2 赋值给 averageClose 变量。然而,这会引发 TradingView 错误:
我们通常可以通过创建多个变量来解决这一限制:- //@version=5
- indicator(title="Assignment operator - example 1", overlay=true)
- averageClose = (close + close[1]) / 2
- smaClose = ta.sma(close, 10)
- plot(smaClose, linewidth=3)
复制代码 我们没有两次为 averageClose 变量赋值,而是用一个新变量(smaClose)取代了第二次使用的 averageClose。现在脚本保存成功,可以在图表上绘制了:
提示:不要混淆赋值运算符 (=) 和等号运算符 (==)
赋值操作符 (=) 使用一个等号,而相等比较操作符 (==) 使用两个等号。两者的区别在于,赋值操作符将右边的值赋给左边的变量。而相等运算符则测试右边的值是否与左边的值相同(Pine Script Language Tutorial,n.d.)。即使是经验丰富的程序员也时常会犯的一个错误就是混淆这两者(Liberty & MacDonald, 2009)。
下面是一个使用赋值运算符(=)而本应使用相等运算符(==)的示例指标:- //@version=5
- indicator(title="Assignment operator - example 2", overlay=true)
- colour = high = ta.highest(high, 20) ? color.green : color.red
- barcolor(colour)
复制代码 在这里,colour 变量被分配了一个值,该值由条件三元运算符(?:)返回。该运算符评估一个条件,当条件为真时,返回其第二个操作数(此处为 color.green)。否则,返回第三个操作数(color.red)(TradingView,注)。
该运算符评估的条件是 high = ta.highest(high,20),当当前条形图的高点(high)是最近 20 个条形图的最高点(ta.highest(high,20))时,该条件通常为真。
但这里的问题是,我们使用了赋值运算符 (=),而它本应是相等运算符 (==)。毕竟,我们是在测试相等性,而不是赋值。因此 TradingView 生成了 "无可行替代方案 "错误:
同样,我们可能会错误地使用 ==(相等运算符),而我们的意思是 =(赋值运算符),就像这样:- //@version=5
- indicator(title="Assignment operator - example 2", overlay=true)
- colour == high == ta.highest(high, 20) ? color.green : color.red
- barcolor(colour)
复制代码 这里修正了之前的错误:条件 (high == ta.highest(high, 20)) 现在使用了相等运算符。
但我们没有使用 = 操作符将条件操作符 (?:) 返回的值赋值给颜色变量,而是使用了相等比较操作符 (==)。这也会在保存脚本时引发 "无可行替代方案 "错误:
正确的代码示例当然是使用赋值运算符 (=) 给颜色变量赋值,并使用相等运算符 (==) 检查高点是否是过去 20 个条形图中的最高点:- //@version=5
- indicator(title="Assignment operator - example 2", overlay=true)
- colour = high == ta.highest(high, 20) ? color.green : color.red
- barcolor(colour)
复制代码 该版本的脚本不会出现 TradingView 错误:
添加到图表中的脚本看起来是这样的:
除赋值运算符外,其他常用的运算符包括:进行数学运算的算术运算符、相互比较数值的比较运算符,以及组合多个真假表达式的逻辑运算符。
小结
赋值运算符 (=) 赋予变量一个值,并将关键字参数设置为一个值。它的左操作数被设置为等号右边的值。使用赋值运算符时,我们不能为现有变量赋值。 |
论坛官方微信、群(期货热点、量化探讨、开户与绑定实盘)
|
|
|
|
|
|