聊完了赋值和判断,咱们来聊聊最基础的数学计算。任何指标,不管多复杂,其内核都离不开加减乘除。在PineScript里,这四个基础的算术运算符就是你的计算器:加法+
、减法-
、乘法*
和除法/
。这四个运算符在作为二元运算符(也就是需要两个数来运算)时,用法跟你想的完全一样,非常直观:
但这里有个小细节,加号+
和减号-
除了能连接两个数,还能单独用在单个数字前面。这时候它们就是“一元运算符”。减号-
的作用是取相反数,这个很常用。而加号+
基本就是个摆设,对数值没有任何影响。举个例子就明白了:
算术运算的两个“坑”
通常情况下,算术运算的结果都符合直觉,但在PineScript里,有两个特殊情况需要你格外注意,否则可能会导致计算结果与预期不符。
第一个“坑”,是整数除法。在PineScript里,如果你用一个整数去除另一个整数,结果的小数部分会被直接“砍掉”,只保留整数部分,并且是向零取整。比如23 / 7
的结果是3
,不是3.2857
。 怎么解决?非常简单,只要除数或者被除数里,有一个是小数(浮点数),计算就会保留小数位。比如23 / 7.0
或者23.0 / 7
,结果就是精确的3.2857
。这是个小细节,但在需要精确计算时,比如算价格比例,就非常关键。
第二个“坑”,是关于NaN
值的处理。NaN
是“Not a Number”的缩写,你可以把它理解成一个“无效值”。在PineScript里,NaN
有很强的“传染性”。任何数值跟NaN
进行算术运算,最终结果还是NaN
。当你使用的一些函数在特定条件下可能返回NaN
时(比如数据不足时的均线计算),了解这个规则能帮你更好地排查问题。
实战案例:用加减法实现OBV思路
下面我们通过一个实例,来演示如何使用+
和-
运算符,累计统计上涨和下跌周期的总成交量,这其实就是能量潮指标(OBV)的核心思路。
//@version=6
indicator(title="算术运算符 - 案例1")
// 使用var关键字声明“持久性”变量
var upVolume = 0.0
var downVolume = 0.0
// 根据K线是阳是阴,分别累加成交量
if close > open
// 如果是阳线,就在上一根K线的“阳线累计量”基础上,加上当前成交量
upVolume := nz(upVolume[1]) + volume
downVolume :=nz(downVolume[1])
else if close < open
// 如果是阴线,就在上一根K线的“阴线累计量”基础上,加上当前成交量
downVolume := nz(downVolume[1]) + volume
upVolume := nz(upVolume[1])
// 将两个累积量分别用绿线和红线画出来
plot(upVolume, color=color.green, title="Up Volume")
plot(downVolume, color=color.red, title="Down Volume")
在这段代码里,我们用var
声明了两个变量upVolume
和downVolume
,来分别追踪阳线和阴线的成交量累积值。var
关键字是这里的核心,它保证了变量的值可以在一根根K线之间传递下去。
接着通过一个if
语句判断K线类型。如果是阳线,就把当前K线的成交量volume
加到upVolume
上;如果是阴线,就加到downVolume
上。注意这里我们用的是upVolume[1]
,代表的是上一根K线计算结束时的值,这是实现“累加”效果的关键。
最后,用plot()
函数将这两条线画出来,你就可以直观地看到多空力量的累积过程了。添加到图表后的效果如下:
实战案例:用乘除法判断成交量是否“放量”
接下来我们看一个乘法*
和除法/
的综合应用。我们想知道当前成交量相对于一段时间的平均水平是高是低,并标记出“显著放量”的K线。
//@version=6
indicator(title="算术运算符 - 案例2")
// 1. 计算成交量的30周期EMA
volumeEMA = ta.ema(volume, 30)
// 2. 计算当前成交量是平均水平的多少倍
volumeRatio = volume / volumeEMA
// 3. 定义阈值
highVolume = 1.75 * volumeEMA
// 4. 判断成交量是否达到放量标准
plotColour = volume > highVolume ? color.orange : color.navy
// 5. 将成交量强度比率以柱状图形式画出,并应用动态颜色
plot(volumeRatio, style=plot.style_histogram, color=plotColour,
linewidth=4)
这个指标的逻辑很清晰: 首先,用ta.ema()
计算出成交量的30周期均线volumeEMA
,把它当作一个动态的“平均成交量”标准。 然后,用当前成交量volume
除以volumeEMA
,得到一个比率volumeRatio
。如果这个比率大于1,说明当前成交量高于平均水平,反之则低于平均水平。 接着,我们用乘法定义了一个“显著放量”的门槛highVolume
,这里我们主观设定为平均成交量的1.75倍。 最后,我们判断当前成交量volume
是否超过了这个门槛,并根据结果动态改变plotColour
变量的颜色,再把成交量比率volumeRatio
用柱状图画出来。
将此指标添加到图表后,效果如下:
算术运算符的应用远不止于此,比如我们后面会讲到,加法+
还可以用来连接两段文字,以及一个特殊的求模运算符%
用来计算除法的余数。
核心要点
- PineScript的四个基本算术运算符是加法
+
、减法-
、乘法*
和除法/
。 +
和-
既可以做二元运算(连接两个数),也可以做一元运算(放在单个数字前)。- 返回值有两个特殊规则,也是你需要避开的坑:第一,任何数和
NaN
(无效值)一起运算,结果都是NaN
。第二,两个整数相除,小数部分会被舍弃。如果想得到精确的小数结果,确保运算中至少有一个数是浮点数(比如7.0
)。