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 - close[1]
5>大于close[2] > high[1]
<小于ta.ema(close, 10) < ta.ema(close, 10)[1]
>=大于等于close >= ta.sma(close, 10)
<=小于等于high <= 20
4==等于high == ta.highest(high, 20)
!=不等于close != close[3]
3and逻辑“与”high > 9 and close != 8
2or逻辑“或”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中,多个运算符的顺序取决于两个因素:运算符的优先级和它们的顺序。优先级较高的运算符先计算,优先级较低的运算符后计算;如果具有相同的优先级则按照从左到右的顺序计算。括号具有最高的优先级,在某些情况下我们可以使用它们来覆盖运算符的优先级。

发表回复 0

Index