保持敬畏之心
交易是一场持久战

Pine Script(4):算术运算符的使用

聊完了赋值和判断,咱们来聊聊最基础的数学计算。任何指标,不管多复杂,其内核都离不开加减乘除。在PineScript里,这四个基础的算术运算符就是你的计算器:加法+、减法-、乘法*和除法/。这四个运算符在作为二元运算符(也就是需要两个数来运算)时,用法跟你想的完全一样,非常直观:

运算符 说明 示例 结果
+ 加法 10 + 12.0 22.0
减法 22 – 9 13
* 乘法 12 * -0.5 -6.0
/ 除法 4 / 3.3 1.2121…

但这里有个小细节,加号+和减号-除了能连接两个数,还能单独用在单个数字前面。这时候它们就是“一元运算符”。减号-的作用是取相反数,这个很常用。而加号+基本就是个摆设,对数值没有任何影响。举个例子就明白了:

运算符 表达式 结果
加法 (+) +x 10
+y -5
减法 (-) -x -10
-y 5

算术运算的两个“坑”

通常情况下,算术运算的结果都符合直觉,但在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声明了两个变量upVolumedownVolume,来分别追踪阳线和阴线的成交量累积值。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)。
赞(0)
未经允许不得转载:图道交易 » Pine Script(4):算术运算符的使用
分享到

评论 抢沙发