龙听期货论坛's Archiver

龙听 发表于 2024-3-29 13:57

【PART 2】算术运算符:TradingView Pine 中的模数运算符 (%)

TradingView Pine 中的模数运算符 (%)

除了 TradingView Pine 中的算术运算符外,还有一个用于执行计算的运算符:模运算符 (%)。该运算符的作用是什么,如何使用?

TradingView Pine 中的模数运算符

实际上,所有 TradingView 脚本都包含运算符。运算符是对一个或多个值进行运算的代码元素,这些值称为操作数(Sharp,2013;Stephens,2014)。TradingView Pine 有四个基本算术运算符,分别为加法 (+)、减法 (-)、除法 (/) 和乘法 (*)。

在 TradingView 中执行整除时,任何小数余数都会丢失(参见《Pine 脚本语言教程》,未注明出处)。这意味着 10 / 7 返回 1,而不是 1.4286。但有时我们确实希望计算整除的余数,而不是将其丢弃。为此,我们使用模运算符 (%)。该运算符接受两个操作数,并返回整数除法的余数(Pine Script Language Tutorial,n.d.;TradingView,n.d.)。因此,在其他编程语言中,该运算符有时也被称为余数运算符(Sharp,2013 年)。

例如,5 % 3 的结果是 2(5 / 3 = 1,余数为 2),而 25 % 3 的结果是 1(25 / 3 = 8,余数为 1)。这样的表达式可以理解为 "25 modulo three 等于 1",或者简称为 "25 mod three"(Liberty & MacDonald, 2009)。

有了模运算符,我们可以很容易地找到某事物的第 n 次出现。在其他编程语言中,它主要用于循环(例如,参见 Liberty & Cadenhead, 2011; Liberty & MacDonald, 2009)。由于 TradingView Pine 没有任何循环,因此模运算符的使用很有限。但正如我们将在下面的示例中看到的,在某些情况下,我们仍然需要了解这个有用的运算符。

TradingView 模量运算符的基本示例

为了更好地了解模数运算符的工作原理,我们来看下面的示例:[code]//@version=5
indicator(title="Modulus - example 1")

plot(bar_index % 6)[/code]首先,我们必须使用 indicator() 函数来定义指标的属性。然后使用 plot() 函数绘制一条实线,其结果为 6 modulo bar_index。后面的 bar_index 变量返回当前条数(TradingView,注)。当我们将此脚本添加到图表中时,它看起来就像这样:

[img]http://p.algo2.net/2024/0329/7380aa8d80c45.png[/img]

在这里,我们可以看到模运算符的结果介于 0 和 5 之间。如果我们再仔细观察,就会发现模运算符会为每个平均分成 6 的条形数字返回 0:

龙听 发表于 2024-3-29 13:57

[table=98%]
[tr][td]Bar number[/td][td]Expression[/td][td]Result[/td][/tr]
[tr][td]0[/td][td]0 % 6[/td][td]0[/td][/tr]
[tr][td]1[/td][td]1 % 6[/td][td]1[/td][/tr]
[tr][td]2[/td][td]2 % 6[/td][td]2[/td][/tr]
[tr][td]3[/td][td]3 % 6[/td][td]3[/td][/tr]
[tr][td]4[/td][td]4 % 6[/td][td]4[/td][/tr]
[tr][td]5[/td][td]5 % 6[/td][td]5[/td][/tr]
[tr][td]6[/td][td]6 % 6[/td][td]0[/td][/tr]
[tr][td]7[/td][td]7 % 6[/td][td]1[/td][/tr]
[tr][td]8[/td][td]8 % 6[/td][td]2[/td][/tr]
[tr][td]9[/td][td]9 % 6[/td][td]3[/td][/tr]
[tr][td]10[/td][td]10 % 6[/td][td]4[/td][/tr]
[tr][td]11[/td][td]11 % 6[/td][td]5[/td][/tr]
[tr][td]12[/td][td]12 % 6[/td][td]0[/td][/tr]
[tr][td]13[/td][td]13 % 6[/td][td]1[/td][/tr]
[tr][td]14[/td][td]14 % 6[/td][td]2[/td][/tr]
[tr][td]15[/td][td]15 % 6[/td][td]3[/td][/tr]
[tr][td]16[/td][td]16 % 6[/td][td]4[/td][/tr]
[tr][td]17[/td][td]17 % 6[/td][td]5[/td][/tr]
[tr][td]18[/td][td]18 % 6[/td][td]0[/td][/tr]
[/table]

龙听 发表于 2024-3-29 14:01

使用 TradingView 的模数运算符突出显示第 n 个价格条

在上一个示例的基础上,我们可以使用模数运算符突出显示每第 7 个价格条:[code]//@version=5
indicator(title="Modulus - example 2", overlay=true)

highlightColour = bar_index % 7 == 0 ? color.yellow : na

// Colour chart and bar in yellow (or use no colour change)
barcolor(highlightColour)
bgcolor(color.new(highlightColour, 70))[/code]使用 indicator() 设置脚本属性后,我们创建了一个名为 highlightColour 的变量。该变量的值由条件三元运算符 (?:) 设置。当 bar_index modulo 7 等于(==)0 时,该运算符将为变量指定黄色。就颜色而言,na 是默认颜色(Pine Script Language Tutorial, n.d.),这意味着它不会影响图表的视觉效果。

下一条语句使用 barcolor(),这是一个设置价格条颜色的函数(TradingView, n.d.)。它的第一个参数设置为 highlightColour 变量。这样,所有价格条要么是默认颜色(由于 na),要么是黄色。

然后,我们用 bgcolor() 将图表的背景颜色设置为相同的变量(Pine Script Language Tutorial, n.d.)。在这里,我们使用 color.new() 函数使颜色的透明度达到 70%,然后再将其应用于图表背景。这样我们就得到了一个浅黄色的背景。

将此示例脚本添加到图表中会产生以下效果:

[img]http://p.algo2.net/2024/0329/c9c77ba69caf5.png[/img]

使用 TradingView 的模运算符查找偶数和奇数

当我们对一个数字执行模 2 时,% 运算符会在数字为偶数时返回 0(Sempf、Sphar 和 Davis,2010 年)。因此,我们可以使用模运算符查找偶数和奇数。例如[code]//@version=5
indicator(title="Modulus - example 3", overlay=true)

evenBar = bar_index % 2 == 0 ? 1 : -1

plotarrow(evenBar, colorup=color.blue, colordown=color.yellow,
     maxheight=15)[/code]我们首先在这里用 indicator() 指定指标的设置。

然后创建 evenBar 变量,并使用条件三元运算符 (?:) 从两个值中选择一个。该运算符会评估当前条形图编号(bar_index)的 2 次模数是否等于(==)0。如果是,则给 evenBar 赋值为 1;否则赋值为-1。

然后,evenBar 中的正负值将用于 plotarrow()。当其第一个参数为正值时,该函数会绘制向上的箭头,而当该参数为负值时,则会绘制向下的箭头(TradingView,注)。

因此,根据我们在 evenBar 中输入的值,在偶数条上显示向上箭头,在奇数条上显示向下箭头。使用 colorup 时,向上箭头显示为蓝色(color.blue),使用 colordown 时,向下箭头显示为黄色(color.yellow)。通过将最大高度设置为 15 像素,所有箭头的大小都相同。

添加到图表中后,这个示例看起来就像这样:

[img]http://p.algo2.net/2024/0329/defbd1bf72cd7.png[/img]

总结

模运算符 (%) 返回整数除法的余数,这个值在使用除法运算符 (/) 除两个整数时被丢弃。使用模运算符,我们可以通过检查数字 % bar_index 是否等于 0,轻松找到第 n 次出现的数字。模运算符的另一个用途是检查偶数(或奇数),在这种情况下,数字 % 2 等于 0。

页: [1]