我们前面聊过,在PineScript里,两个整数相除,比如10 / 3
,结果是3
,小数部分会被直接砍掉。但如果我想要的恰恰是那个被砍掉的“余数”呢?
这时候,就轮到一个特殊的算术运算符登场了:求模运算符%
。
你也可以叫它求余运算符,它的作用就是返回两个数相除后的整数余数。比如,5 % 3
的结果是2
(因为5除以3商1余2),而25 % 3
的结果是1
(因为25除以3商8余1)。
这个求余数的功能有什么用呢?它在交易脚本里最核心的用途,就是帮你实现“每隔N个周期执行某个操作”的逻辑。比如,你想每隔一周(5根日线)的周五才画一个标记,或者每隔20根K线才计算一次某个复杂的值以节省资源。虽然PineScript没有其他语言里常见的循环功能,这在一定程度上限制了%
的发挥,但在处理与周期性相关的任务时,它依然是你的不二之选。
案例一:理解求模运算的原理
为了直观地理解求模运算符的工作方式,我们来看一个简单的例子。我们来画出每根K线的编号(bar_index
)对6求余数的结果。
//@version=6
indicator(title="求模运算符 - 案例1")
// bar_index是内置变量,代表当前K线的编号(从0开始)
plot(bar_index % 6)
将此脚本添加到图表后,效果如下:
这个脚本画出的图形是一条在0到5之间不断循环的锯齿波。它的计算原理是这样的:
从这个规律我们可以发现,只有当K线索引号能被6整除时,求模的结果才为0。这个特性,正是我们实现每隔N根K线操作的关键。
案例二:高亮显示每第N根K线
基于上面的发现,我们可以很方便地在图表上高亮显示每第7根K线。
//@version=6
indicator(title="求模运算符 - 案例2", overlay=true)
// 利用条件来决定颜色
highlightColour = bar_index % 7 == 0 ? color.yellow : na
// 将颜色应用到K线和背景上
barcolor(highlightColour)
bgcolor(color.new(highlightColour, 70))
代码的核心就是bar_index % 7 == 0
这个判断条件。它只有在bar_index
是0, 7, 14, 21…这些7的倍数时,结果才为true
。我们利用这个true
或false
的结果,通过一个三元运算符来给highlightColour
变量赋值。当条件成立时,颜色为黄色;不成立时,则为na
,na
在颜色设置中代表“不应用任何颜色”,所以其他K线会保持原样。
最后,通过barcolor()
和bgcolor()
函数将这个颜色应用到K线和背景上,就实现了周期性的高亮效果。将此指标添加到图表后,效果如下:
案例三:利用求模判断奇偶数
求模运算符还有一个非常方便的用法:判断奇偶数。任何偶数对2求余的结果都是0,任何奇数对2求余的结果都是1。利用这个特性,我们可以轻松地区分奇数和偶数周期的K线。
//@version=6
indicator(title="求模运算符 - 案例3", overlay=true)
// 1. 判断K线编号是奇数还是偶数
evenBar = bar_index % 2 == 0 ? 1 : -1
// 根据数值的正负来绘制不同方向的箭头
plotarrow(evenBar, colorup=color.blue, colordown=color.yellow,
maxheight=15)
在这个例子里,我们判断bar_index
对2求余的结果。如果为0(偶数),就给evenBar
变量赋值为1
;如果不为0(奇数),就赋值为-1
。
然后,我们把这个只包含1
和-1
的evenBar
变量传给plotarrow()
函数。这个函数非常巧妙,它会根据传入数值的正负来决定箭头的方向。于是,我们就在偶数K线上画出了向上的箭头,在奇数K线上画出了向下的箭头。
将此指标添加到图表后,效果如下:
总结
求模运算符%
的主要功能是返回整数除法的余数,这个值在使用除法运算符/
时通常会被舍弃。它在交易脚本中最典型的用途,就是通过bar_index % N == 0
这个判断,轻松实现“每隔N根K线”的周期性操作。另一个常见用途是判断奇偶数:当一个数字对2求模(number % 2
)的结果为0时,表明这个数字是偶数。