Pine Script 中对数值取整的三种方法
在 TradingView 的指标和策略脚本中,我们会用到大量的数值。但有时,在对这些值进行下一步处理前,我们希望先对它们进行取整。我们该如何操作呢?让我们来了解一下在 TradingView Pine 中取整的三种方法。
在 TradingView 中对数值进行取整的不同方法
几乎每一个 TradingView 脚本都离不开数值计算。无论是移动平均线还是最高价,数字无处不在。但有时我们希望对数值进行取整。例如,我们可能想在图表上显示更少的小数位数,以使指标更易于阅读;或者将资金管理公式的计算结果向下取整,以避免交易过大的头寸。
在 TradingView Pine 中,我们可以通过三种方法来对数值进行取整:
math.round()函数:将数值四舍五入到最接近的整数。对于 .5 的情况,则向上取整。math.floor()函数:将数值向下取整到最接近的整数。math.ceil()函数:将数值向上取整到最接近的整数。
注意事项
- 整数 (integer) 是任何不带小数或分数的数字。这意味着 0、-3、8 和 28,024 都是整数,但 3.87 和 1 2/3 不是。我们通常使用上述三个函数来从一个实数中获取整数部分。
- 实数 (real number) 是任何可以表示为小数的数字,例如 3.1415926535 和 23,434.95。因此,
math.round()、math.floor()和math.ceil()函数的作用就是将一个实数转换为整数。
下面让我们来更深入地了解这些函数及其运作方式。
四舍五入到最接近的整数
math.round() 函数会返回其参数值四舍五入到最接近整数的结果,其中 .5 会被向上取整。例如,math.round(close) 会将交易品种的收盘价取整为整数。
以下是一些 math.round() 的示例及其返回值:
| 代码示例 | 返回值 |
|---|---|
math.round(126.8) |
127 |
math.round(13.30) |
13 |
math.round(1.31667) |
1 |
math.round(-23.492) |
-23 |
math.round(-1.34) |
-1 |
math.round(-4.5) |
-4 |
请注意表中的最后一行:math.round(-4.5) 返回的是 -4,而不是 -5。这是因为 math.round() 在处理 .5 的情况时,是向上(即朝向数值更大的方向)取整,而不是向下。
注意事项
若要将数值四舍五入到小数点后指定的位数,可以先将该数值乘以一个10的倍数,传入 math.round() 函数,然后再将结果除以相同的倍数。
- 例如,
math.round(ta.sma(close, 30) * 10) / 10会将 SMA 的值四舍五入到小数点后一位(例如 281.1、77.2、23.9)。 - 另一方面,
math.round(close * 10000) / 10000则会将数值四舍五入到整个点子(pip,即小数点后第四位)。这意味着收盘价 1.16606 会变为 1.1661,而 1.16826 会变为 1.1683。
顺带一提,math.round() 会返回我们所提供参数的取整结果,但它并不会改变我们传入函数的那个变量本身的值:
varA = 123.4567
varB = round(varA)
plot(series=varA) // 绘制出的仍然是 123.4567,而不是 123
这个特性同样适用于 math.floor() 和 math.ceil()。这些函数也不会改变我们提供给它们的参数值,而是仅仅返回参数取整后的结果。
范例:将移动平均线取整为整数
下方是一个使用 math.round() 的快速范例脚本,它会绘制一个只显示整数值(不带小数)的30周期简单移动平均线(SMA)。该脚本的代码如下:
//@version=5
indicator(title="Round example", overlay=true)
roundSMA = math.round(ta.sma(close, 30))
plot(roundSMA, color=color.orange)
在这个迷你指标中,我们首先用 indicator() 函数定义脚本的名称和叠加设置。然后,我们用 ta.sma() 函数来计算一个30周期的SMA,该函数在这里基于收盘价(close)进行计算。
我们将 ta.sma() 函数直接放在 math.round() 函数内部。这样一来,无论 ta.sma() 计算出什么值,都会被四舍五入到最接近的整数。最后,我们使用 plot() 函数将这个取整后的SMA以常规线图的形式绘制在图表上。
下图展示了这条只绘制整数值的SMA在图表上的样子:
使用 math.floor() 向下取整
我们使用 TradingView 的 math.floor() 函数来对数值进行向下取整。该函数接受一个数值参数,并返回小于或等于该参数的最大整数。因此,对于 12.89,math.floor() 会返回 12,而不是 13。
通过 math.floor(),我们总是舍去小数部分,只保留其整数的底部。这意味着:
- 一个正数通过
math.floor()处理后,其值会变小:例如 9.75 变为 9。 - 一个负数通过
math.floor()处理后,其值也会变小(即,变得更负)。例如,math.floor()会将 -2.3 变为 -3。这是因为从 -2.3 开始沿数轴向左(负方向)寻找,我们遇到的第一个整数就是 -3。
以下是一些其他的 math.floor() 示例及其返回值:
| 代码示例 | 返回值 |
|---|---|
math.floor(126.8) |
126 |
math.floor(13.30) |
13 |
math.floor(1.31667) |
1 |
math.floor(-23.492) |
-24 |
math.floor(-1.34) |
-2 |
math.floor(-4.5) |
-5 |
正如这些示例所示,math.floor() 函数无论是处理正数还是负数,都遵循向下取整的原则。
范例:向下取整计算仓位大小
在计算策略的仓位大小时,我们通常会使用 TradingView 的 math.floor() 函数。这样可以确保订单数量总是向下取整到最近的整数合约、股、单位或手数。通过这种方式,交易策略就不会开出过大的仓位。
比方说,我们最多希望在一个仓位上投资10,000美元。用这笔钱我们能买多少股呢?下面的迷你指标可以找出答案:
//@version=5
indicator(title="Floor example", overlay=false)
posSize = math.floor(10000 / close)
plot(posSize, color=color.orange)
首先,我们用 indicator() 函数定义指标的属性。然后,我们创建一个名为 posSize 的变量,将其值设为 10,000 除以K线收盘价 (close) 的结果。
我们将这个除法运算放在 math.floor() 函数内部,这样计算结果就会被向下取整到最接近的整数。之后,我们使用 plot() 函数将这个仓位大小绘制在图表上。下图展示了它的样子:
只要 S&P 500 指数保持在 2,500 点以下,我们用10,000美元就可以购买4个单位。但一旦价格上涨超过 2,500,我们的1万美元最多就只能买到3个单位了。
从这个例子中,我们也能看出 math.floor() 和 math.round() 的区别。图表上的最后一个价格是 2,566.8,这让我们能买到 3.8959 个单位 (10,000 / 2,566.8)。math.round() 函数会将 3.8959 四舍五入为 4,这意味着我们将交易一个略微过大的仓位。而 math.floor() 则会将 3.8959 向下取整为 3。这虽然使我们的投资额少于1万美元,但也降低了风险。
使用 math.ceil() 向上取整
我们使用 TradingView 的 math.ceil() 函数来对数值进行向上取整。该函数接受一个数值参数,并返回大于或等于该参数的最小整数。因此,对于 12.34,math.ceil() 会返回 13,而不是 12。
通过 math.ceil(),我们总是舍去小数部分,并进位到其整数的顶部。这意味着:
- 一个正数通过
math.ceil()处理后,其值会变大:例如 8.4 变为 9,3.02 变为 4。 - 对于一个负数,
math.ceil()会朝向更大的值(即,更接近正数或0的方向)向上取整:例如 -2.3 变为 -2,-8.65 则得到 -8。
以下是一些 math.ceil() 示例及其返回值:
| 代码示例 | 返回值 |
|---|---|
math.ceil(126.8) |
127 |
math.ceil(13.30) |
14 |
math.ceil(1.31667) |
2 |
math.ceil(-23.492) |
-23 |
math.ceil(-1.34) |
-1 |
math.ceil(-4.5) |
-4 |
从表中我们可以看出,math.ceil() 无论是处理正数还是负数,都遵循向上取整的原则。
范例:将成交量向上取整到千位
比方说,我们想要绘制一个交易品种的成交量,但并不关心其精确数值,而是希望成交量以千为单位来显示。下面的代码展示了我们如何将成交量向上取整到最接近的1k(一千):
//@version=5
indicator(title="Ceil example", overlay=false)
volCeil = math.ceil(volume / 1000)
plot(volCeil, color=color.orange, style=plot.style_columns)
我们以 indicator() 函数开始这个快速范例指标。然后,我们将交易品种的成交量向上取整到最接近的1,000。
为此,我们首先将K线的成交量(volume)除以1,000。我们在 math.ceil() 函数内部执行这个运算,这样就会将结果向上取整到最接近的整数。例如,2,842股的成交量将显示为3,而13,402股则显示为14。
然后我们创建一个柱状图,在图表上显示这些成交量读数:
总结
在 TradingView 中有三种对数值进行取整的方法。通过 math.round() 函数,我们可以将数值四舍五入到最接近的整数,其中小数部分为 .5 时会向上取整。
我们也可以总是向下取整到最接近的整数,这需要使用 math.floor() 函数。通过它,2.34 和 2.87 都会变为 2,而 -8.6 和 -8.01 则都会变为 -9。
第三种取整方式是使用 math.ceil()。这个函数会向上取整到最接近的整数。它会将 4.6 和 4.12 返回为 5,而对于 -7.31 和 -7.75,则会返回 -7。
综上所述,math.round() 会根据数值大小向上或向下取整;math.floor() 得到的值总是小于或等于其参数值;而 math.ceil() 得到的值则总是大于或等于其参数值。
math.round():四舍五入到最接近的数值
Pine Script 可以通过多种方式对数字进行取整。其中一种是四舍五入:当一个数的小数部分大于或等于0.5时,我们向上取整;否则,向下取整。
这种取整方式正是 Pine Script 的 math.round() 函数所实现的。这个函数既可以将数值取整为整数,也可以按指定的小数位数进行取整。下面我们来分别讨论这两种用法及其运作方式。
取整为整数
当我们只给 math.round() 函数提供一个数值参数时,它会将其取整为整数 。例如,1.3 会变为 1,7.94 会变为 8。
对于取整为整数,该函数的默认语法格式如下 :
math.round(number)
number 指的是需要被取整的数值。
要使用该函数,我们只需向 math.round() 传入一个值,它就会返回一个取整后的数字。例如:
math.round(3.2) // 返回: 3
math.round(6.5) // 返回: 7
取整范例
为了更直观地了解 math.round() 的功能,下表展示了该函数如何将一些示例值取整为整数:
| 原始值 | 取整后的整数 |
|---|---|
| 5.92991 | 6 |
| 3.72 | 4 |
| 1.23 | 1 |
| 0.00002 | 0 |
| 0.000 | 0 |
| -0.00009 | 0 |
| -1.12 | -1 |
| -4.75 | -5 |
| -9.8953 | -10 |
| na | 0 |
| “1.83” | 错误;不能对字符串调用 math.round()。 |
从表中我们可以看出,math.round() 会根据数值进行向上或向下取整。例如,3.72 被向上取整为数值更大的 4。
同样地,-4.75 被向下取整为数值更小的 -5。
指标范例
下面的这个快速范例在一个 Pine Script 指标中演示了 math.round() 的用法:
//@version=5
indicator(title="Round to whole number with 'round()'", overlay=true)
// 将图表交易品种的价格取整为整数
plot(math.round(close), color=color.fuchsia, linewidth=2, title="Rounded Close")
这个迷你指标做了两件事。首先,我们用 indicator() 函数配置其设置,例如指标的名称 (title) 以及是否将其叠加显示在主图的交易品种上 (overlay=true)。
然后我们用 plot() 函数在图表上绘制数据。因为我们没有设置绘图类型,Pine Script 默认会创建一个常规的线图。这条线显示的是K线收盘价(close)经过 math.round() 函数取整为整数后的值。
该线以紫红色(color.fuchsia)显示,并且线宽(linewidth)比正常稍大。我们通过 title 参数为这条绘图线命名。
在图表上,该指标看起来是这样的:
我们可以看到,当 EOS/USD 的价格保持在3.5或以上时,价格被向上取整为4。但当价格跌破3.5水平时,math.round() 则会将价格向下取整为3。
按指定的小数位数进行取整
math.round() 函数还有第二种用法,那就是将一个数字按指定的小数位数进行取整。
要实现对小数值的取整,我们需要向 math.round() 函数提供两个参数。其默认的语法格式如下 :
math.round(number, precision)
number:需要被取整的数值。precision:设置要取整到的小数位数。这是一个可选参数。如果我们不设置它,math.round()会默认使用0作为其值,即取整为最接近的整数。
以下是一个快速示例,演示其运作方式:
math.round(2.163, 2) // 返回: 2.16
math.round(4.678, 1) // 返回: 4.7
取整范例
为了更直观地了解按小数位数取整的运作方式,下表展示了 math.round() 对一些示例值的返回结果:
| 原始值 | 四舍五入到1位小数 |
|---|---|
| 5.92991 | 5.9 |
| 3.72 | 3.7 |
| 1.23 | 1.2 |
| 0.00002 | 0.0 |
| 0.000 | 0.0 |
| -0.00009 | 0.0 |
| -1.12 | -1.1 |
| -4.75 | -4.8 |
| -9.8953 | -9.9 |
| na | 0 |
| “1.83” | 错误;不能对字符串调用 math.round()。 |
math.round() 会对小数值进行向上或向下取整。例如,3.72 被向下取整为 3.7。另一方面,-1.12 则被向上取整为 -1.1。
脚本范例
下面的这个 Pine Script 指标演示了如何按指定的小数位数进行取整:
//@version=5
indicator(title="Round to decimals with 'round()'", overlay=true)
// 将图表交易品种的价格四舍五入到1位小数
plot(math.round(close, 1), color=color.silver, linewidth=2,
title="Close Rounded to 1 Decimal")
这个快速指标首先通过 indicator() 函数定义其设置,用于命名该指标并将其叠加显示在主图的交易品种上。
然后我们用 plot() 函数进行绘图。由于没有定义绘图类型,函数会默认创建一个常规的线图。这条线显示的是K线收盘价(close)经过 math.round() 函数处理后,四舍五入到1位小数的结果。
该线以银灰色(color.silver)显示,并且线宽(linewidth)设为 2,比正常稍粗。我们还为这条绘图线命名,以便与图表上的其他绘图区分开。
该指标在图表上看起来是这样的:
当 EUR/USD 的价格保持在 1.15000 以下时,math.round() 将价格取整为 1.1。但一旦价格超过 1.15000 水平,取整后的价格就变为 1.2。这个微小的数值变化足以使绘图线发生跳变。
math.round() 的特性
- 取舍规则:当取整时遇到
.5的情况,math.round()会向上取整 。例如,1.5会被取整为2。 - 变量的不可变性:当我们向
math.round()传入一个变量时,该函数并不会改变这个变量本身的值,而是返回一个新的取整后的值。因此,如果要对一个现有变量的值进行取整,我们需要将该变量的值更新为math.round()的返回结果。例如:myVariable = close // ... myVariable := math.round(myVariable) - 取整到整十/百/千位:
math.round()也可以对数值取整到整十、整百、整千位。要实现这一点,我们首先将数值除以这些位数(10, 100, 1000),然后用math.round()对结果进行取整,最后再乘以相同的位数。例如,要将交易品种的成交量取整到最接近的千位,我们可以这样做:volumeRounded = math.round(volume / 1000.0) * 1000 - 与截断的区别:四舍五入与截断(truncation)是不同的概念。当我们截断一个值时,我们是直接丢弃其小数部分,这使得
5.9和5.3都会变为5。但当我们进行四舍五入时,小数点前的整数部分可能会发生改变。更多信息请参阅 Pine Script 中的截断值。 - 版本变化:在 Pine Script 版本4及更早的版本中,
math.round()函数的名称是round()。除了名称变化外,其功能并未改变。
总结
math.round(number)将给定的数值向上或向下取整为整数。math.round(number, precision)将给定的数值向上或向下取整到指定的小数位数。- 当取整时遇到
.5的情况,math.round()会向上取整。







