TradingView中运算符的优先顺序
引言
TradingView的Pine脚本中,有多种运算符,包括算术运算符、比较运算符和条件三元运算符。假如在一条语句中同时出现多个运算符,它们之间的计算顺序是怎样的呢?搞清楚这一点非常重要,正确的理解不同运算符之间的优先级,有助于我们顺利的编写程序,减少Bug的出现几率。
TradingView 运算符及其优先级
在TradingView中,使用运算符可以对数据进行处理和转换,实现条件逻辑的判断、订单执行等功能。例如“close + open
”返回的是当前K线的收盘价和开盘价之和;close > close[1]
表示当收盘价高于前一个收盘价时返回true。这个表达式中使用到了历史引用运算符“[]”,“[1]”表示取晚于当前K线前一根K线的数据。
收上的例子都是只有一个运算符的情况,当一个表达式包含多个运算符时,运算符会按照一定的顺序进行评估。就算我们小时候学习四则运算一样,在程序中“1+2*3”的值等于7,乘法和除法的优先级要大于加法和减法。然而TradingView除了四则运算之外,还有其它的运算符。它有一套关于优先级计算顺序的规则,这些规则规定了首先计算哪个运算符,接下来计算哪个,依此类推,直到表达式中的所有操作都被执行完毕。这些规则和其它的编程语言一样,基本遵循一套通用的法则,如果你有编程的基础,应该很容易就上手。
TradingView运算优先级列表
在Trading View中,全部运算符的优先级如下表所示(优先级按照从高到低的顺序排列,优先级高的排在优先级低的前面)。
优先级 | 运算符 | 名称 | 例子 |
---|---|---|---|
10 | ( ) | 括号 | (3 + (2 - close[1])) / 2 |
9 | [ ] | 历史引用 | close[2] |
8 | + | 正号(一元运算) | +ta.sma(close, 10) |
- | 负号(一元运算) | -ta.sma(close, 10) | |
not | 逻辑“非” | not (high > high[1]) , not longSignal | |
7 | * | 乘法 | close[1] * 2 |
/ | 除法 | low / 2 | |
% | 取模(返回除法的余数) | 9 % 3 | |
6 | + | 加法 | (10 + close[1]) / 2 |
- | 减法 | high - | |
5 | > | 大于 | close[2] > high[1] |
< | 小于 | ta.ema(close, 10) < ta. | |
>= | 大于等于 | close >= ta.sma(close, 10) | |
<= | 小于等于 | high <= 20 | |
4 | == | 等于 | high == ta.highest(high, 20) |
!= | 不等于 | close != close[3] | |
3 | and | 逻辑“与” |
|
2 | or | 逻辑“或” | not (close < 500 or close > 1000) |
1 | ?: | 条件(三元运算) | close < open ? 1 : -1 |
注意“+”和“-”有两种形式,一种是一元运算,只作用于一个操作数,表示正号和符号,它们的优先级大于乘法和除法。还有一种是二元运算,作用于两个操作数,它们的优先级小于乘法和除法。
还有一个需要注意的地方是,当一行代码中同时出现多个优先级一样的运算符时,按照从左到右的顺序执行。表达式 “4 – 3 + 2 – 1” 返回2(4 – 3 等于 1,加上 2 等于 3,再减去 1 得到 2)。
括号的用法
- 覆盖运算符的优先级
如果你不确定运算符之间的顺序,可以粗暴的用“( )”覆盖运算符的优先级。例如:(not close < 500) or close > 1000)
。有时候,我们也需要使用括号来获得正确的计算结果,例如下面这个例子,假如我想画一条线,用来连接所有K线的中点。
//@version=5
indicator(title="K线中点", overlay=true)
plot(high + low / 2, color=color.blue, linewidth=2)
函数plot的输入值是high + low / 2,颜色是蓝色。结果是这样的,显然是输入值不准确。正确的代码应该是使用括号(high + low) / 2
,如下面所示
//@version=5
indicator(title="K线中点", overlay=true)
plot((high + low) / 2, color=color.blue, linewidth=2)
这是正确的效果。上面的这个例子随然简单,但是却是编写代码的过程中经常会遇到的情况,尤其是在复杂的逻辑判断语句中。所以记下运算符的优先级可以在今后帮我们节省大量的修Bug的时间。我建议大家将这个页面保存下来以备不时之需。
- 在Trading View中使用嵌套括号
有时我们会有复杂的表达式,需要多个括号嵌套在彼此内部,这在金融市场中十分常见。在这种情况下,TradingView会先计算最内层的括号。例如:
x = (close % 3) * (4 + (6 / 2))
程序会先计算最内层的(6 / 2)=3
,然后再计算外层的(close % 3)
和(4 + 3)
。
小结
在TradingView中,多个运算符的顺序取决于两个因素:运算符的优先级和它们的顺序。优先级较高的运算符先计算,优先级较低的运算符后计算;如果具有相同的优先级则按照从左到右的顺序计算。括号具有最高的优先级,在某些情况下我们可以使用它们来覆盖运算符的优先级。