math.ceil():向上取整
在 Pine Script 中有多种取整方法。其中一种是始终向上取整。对此我们有两种选择:我们可以向上取整为整数,或者向上取整到指定的小数位数。下面我们来详细了解一下。
向上取整为整数
第一种方法是向上取整到下一个整数。这会使得 3.2 和 3.823 都变为 4。
要实现这种取整,我们使用 Pine Script 的 math.ceil() 函数。该函数返回一个大于或等于其参数的最小整数 。通俗地说,这个函数就是将数值向上取整到最接近的整数。
math.ceil() 的默认语法格式如下 :
math.ceil(number)
number 指的是我们希望向上取整为整数的数值。
math.ceil() 会返回一个整数值。要使用该函数,我们可以这样做:
math.ceil(10.2) // 返回: 11
math.ceil(-2.45) // 返回: -2
取整范例
为了更直观地了解 math.ceil() 的返回值,下表展示了该函数对各种示例数字的输出结果:
| 原始值 | 向上取整后的整数 |
|---|---|
| 5.92991 | 6 |
| 3.72 | 4 |
| 1.23 | 2 |
| 0.00002 | 1 |
| 0.000 | 0 |
| -0.00009 | 0 |
| -1.12 | -1 |
| -4.75 | -4 |
| -9.8953 | -9 |
| na | na |
| “1.83” | 错误;不能对字符串值调用 math.ceil() 函数。 |
从表中我们可以看出,math.ceil() 对正数和负数都会进行向上取整。所以,一个正数的数值会变大。例如,3.72 变为 4。
一个负数则会被 math.ceil() 变得更接近0(数值更大)。例如,-9.8953 变为数值更大的 -9。
指标范例
下面的这个 TradingView 指标演示了如何使用 math.ceil() 函数:
//@version=5
indicator(title="Round up to whole number with 'ceil()'", overlay=true)
// 将图表交易品种的价格向上取整为整数
plot(math.ceil(close), color=color.teal, linewidth=2, title="Rounded Close")
这个迷你脚本首先通过 indicator() 函数来定义其脚本设置,用于命名该脚本并将其叠加显示在主图的交易品种上。
然后,plot() 函数在图表上绘制一个数据序列。这个绘图显示的是K线收盘价(close)经过 math.ceil() 函数向上取整为整数后的值。由于我们没有设置绘图类型,Pine Script 默认会创建一个常规的线图。
我们让这条线以青色(color.teal)显示,并且线宽(linewidth)比正常稍大。
该绘图在图表上的效果如下:
从图中我们可以看到,当 EOS/USD 的价格低于4(在3.00到3.99的范围内)时,math.ceil() 函数会将价格向上取整为4。但当价格超过4时,math.ceil() 则会向上取整到下一个整数,即5。
math.ceil() 的特性
- 变量的不可变性:当我们向
math.ceil()传入一个数值时,它会返回一个新的、向上取整后的值,但并不会改变原始的数值本身。如果要向上取整一个变量的值,我们需要将该变量的值更新为math.ceil()的返回结果。例如:myVariable = (close + open) / 2 // ... myVariable := math.ceil(myVariable) - 取整到整十/百/千位:我们也可以使用
math.ceil()来向上取整到最接近的整十(10)、整百(100)或整千(1,000)位。要实现这一点,我们首先将数值除以这些位数,然后让math.ceil()对结果进行向上取整,最后再乘以相同的位数。例如,要将交易品种的成交量向上取整到下一个整数千位,我们可以这样做:volumeRounded = math.ceil(volume / 1000.0) * 1000 - 版本变化:在 Pine Script 版本4及更早的版本中,
math.ceil()函数的名称是ceil()。除了名称不同外,其行为并未改变。
向上取整到指定的小数位数
第二种向上取整的方式是取整到指定的小数位数。这会使得 7.23 变为 7.3,2.253 变为 2.26。
目前,Pine Script 没有内置函数来实现这种取整,但我们可以自己创建一个。让我们看看如何实现。
自定义函数
下面的这个自定义函数 RoundUp() 可以将数值向上取整到指定的小数位数:
// RoundUp() 函数将给定的数值向上取整到指定的小数位数。
RoundUp(number, decimals) =>
factor = math.pow(10, decimals)
math.ceil(number * factor) / factor
该函数有两个参数:一个是需要被向上取整的数值(number),另一个是指定要取整到的小数位数(decimals)。
在函数内部,我们首先将10进行 decimals 次幂的运算(math.pow(10, decimals)),这会得到一个修正因子,我们将用它来向右移动小数点。
然后,在 math.ceil() 函数内部,我们将 number 值与 factor 变量相乘。这一步将小数点向右移动,然后 math.ceil() 将结果向上取整为整数。最后,我们将取整后的结果除以 factor 变量,将小数点移回其原始位置。
让我们通过一个例子来让这段代码更具体。假设我们想将 52.432 向上取整到2位小数。10的2次方等于100。它乘以输入值 52.432 得到 5243.2。当我们用 math.ceil() 对该值向上取整时,得到 5244。最后我们再除以100,以恢复正确的数量级,这就得到了 52.44 这个正确的结果。
以下是如何使用这个自定义的 RoundUp() 函数:
RoundUp(12.89, 1) // 返回: 12.9
RoundUp(1.201, 2) // 返回: 1.21
RoundUp(-3.24, 1) // 返回: -3.2
取整范例
为了感受一下 RoundUp() 的返回值,下表展示了该函数如何将一些示例值向上取整到1位小数:
| 原始值 | 向上取整到1位小数 |
|---|---|
| 5.92991 | 6.0 |
| 3.72 | 3.8 |
| 1.23 | 1.3 |
| 0.00002 | 0.1 |
| 0.000 | 0.0 |
| -0.00009 | 0.0 |
| -1.12 | -1.1 |
| -4.75 | -4.7 |
| -9.8953 | -9.8 |
| na | 错误;不能对 na 参数调用此函数。 |
| “1.83” | 错误;不能对字符串参数调用此函数。 |
从表中可以看出,RoundUp() 会使正数变得更大一点。例如,1.23 被取整为 1.3。
同样地,负数也会略微变大(更接近0)。例如,-4.75 向上取整为 -4.7。
指标范例
下面的这个 Pine Script 指标演示了如何使用自定义的 RoundUp() 函数:
//@version=5
indicator(title="Round up to decimals with 'RoundUp()'", overlay=true)
// RoundUp() 函数将给定的数值向上取整到指定的小数位数。
RoundUp(number, decimals) =>
factor = math.pow(10, decimals)
math.ceil(number * factor) / factor
// 将图表交易品种的价格向上取整到1位小数
plot(RoundUp(close, 1), color=color.orange, linewidth=2,
title="Close Rounded to 1 Decimal")
这个快速指标首先调用 indicator() 函数来配置脚本设置,通过 title 命名指标,并用 overlay 将其叠加显示在主图的交易品种上。
然后,我们引入了上面讨论过的自定义 RoundUp() 函数。
接下来,我们使用 plot() 函数绘制数据。由于没有指定绘图类型,Pine Script 默认会创建一个常规的线图。这条线显示的是K线收盘价(close)经过 RoundUp() 函数处理后,向上取整到1位小数的结果。
我们让这条线以橙色(color.orange)显示,并且线宽(linewidth=2)比正常更粗。
该指标在图表上的效果如下:
随着 EUR/USD 价格低于 1.10000,脚本将价格向上取整为 1.1。然后当价格越过 1.10000 后,下一个向上取整的值就变为了 1.2。
总结
math.ceil()将一个数值向上取整到最接近的整数。- 向上取整会使正数变得更大(例如 4.2 变为 5),也会使负数更接近0(例如 -1.8 变为 -1)。
- 要向上取整到指定的小数位数,我们可以使用一个巧妙利用了
math.ceil()函数的自定义函数。
math.floor():向下取整
Pine Script 提供了几种对数字进行取整的方法。其中一个选择是始终向下取整。对此我们有两种方式:我们可以向下取整为整数,或者向下取整到指定的小数位数。下面我们来逐一探讨。
向下取整为整数
第一种方式是向下取整到下一个整数。通过这种方式,我们可以将 2.23 变为 2,将 5.89 变为 5。
要实现这种取整,我们使用 Pine Script 的 math.floor() 函数。该函数返回一个小于或等于其参数的最大整数 。用一种更通俗的方式说,math.floor() 就是将数值向下取整到最接近的整数。
math.floor() 的默认语法格式如下 :
math.floor(number)
number 指的是我们希望向下取整为整数的数值。
math.floor() 会返回一个整数值。要使用该函数,我们可以这样做:
math.floor(10.2) // 返回: 10
math.floor(-2.45) // 返回: -3
取整范例
为了感受一下 math.floor() 的返回值,下表列出了该函数对一些示例值的计算结果:
| 原始值 | 向下取整后的整数 |
|---|---|
| 5.92991 | 5 |
| 3.72 | 3 |
| 1.23 | 1 |
| 0.00002 | 0 |
| 0.000 | 0 |
| -0.00009 | -1 |
| -1.12 | -2 |
| -4.75 | -5 |
| -9.8953 | -10 |
| na | na |
| “1.83” | 错误;不能对字符串值调用 math.floor() 函数。 |
从表中我们可以看出,math.floor() 对正数和负数都会进行向下取整。所以,一个正数的数值会变小。例如,3.72 变为 3。
一个负数则会被 math.floor() 变得更小(离0更远)。例如,-1.12 变为 -2。
指标范例
下面的指标演示了如何使用 math.floor() 函数:
//@version=5
indicator(title="Round down to whole number with 'floor()'", overlay=true)
// 将图表交易品种的价格向下取整为整数
plot(math.floor(close), color=color.maroon, linewidth=2,
title="Rounded Close")
这个脚本首先通过 indicator() 函数定义其设置,用于命名该脚本并将其叠加显示在主图的交易品种上。
然后 plot() 函数进行绘图。由于我们没有设置绘图类型,Pine Script 默认会创建一个常规的线图。这个绘图显示的是K线收盘价(close)经过 math.floor() 函数向下取整为整数后的值。
我们让这条线以栗色(color.maroon)显示,并且线宽(linewidth=2)比正常稍大。
它在图表上看起来是这样的:
当 EOS/USD 的价格保持在4以下时(即在 3.00 – 3.99 的范围内),math.floor() 将价格向下取整为3。一旦价格超过4,取整后的值就跳升为4。
math.floor() 的特性
- 变量的不可变性:当我们向
math.floor()传入一个数值时,它会使用该值返回一个新的、向下取整后的数值,但并不会改变我们传入的原始数值本身。如果我们想向下取整一个变量的值,就需要将该变量的值更新为math.floor()的返回结果。代码如下所示:myVariable = ta.rsi(close, 14) // ... myVariable := math.floor(myVariable) - 风险控制:当我们在计算仓位大小时使用
math.floor(),我们永远不会交易超出我们最大风险允许范围的仓位。这是因为math.floor()总是向下取整。(然而,round()函数和ceil()函数则可能向上取整仓位大小,从而增加风险。) - 取整到整十/百/千位:
math.floor()也可以将数值向下取整到最接近的整十(10)、整百(100)或整千(1000)位。这需要三个步骤:首先,我们将数值除以这些位数;然后,我们用math.floor()对结果进行向下取整;最后,再乘以相同的位数。例如,要将交易品种的成交量向下取整到下一个整数百位,我们可以这样做:volumeRounded = math.floor(volume / 100.0) * 100 - 版本变化:在 Pine Script 版本4及更早的版本中,
math.floor()的名称是floor()。除了名称不同外,其函数结果并未改变。
向下取整到指定的小数位数
还有第二种向下取整的方式,那就是取整到指定的小数位数。这可以将 3.59 变为 3.5,将 8.768 变为 8.76。
目前,Pine Script 没有内置函数来实现这种取整。但没关系,我们可以自己创建一个。让我们看看如何实现。
自定义函数
下面的这个自定义函数 RoundDown() 可以将数值向下取整到指定的小数位数:
// RoundDown() 函数将指定的数值向下取整到给定的小数位数。
RoundDown(number, decimals) =>
factor = math.pow(10, decimals)
math.floor(number * factor) / factor
该函数有两个参数:第一个是需要被向下取整的数值(number),第二个是指定要取整到的小数位数(decimals)。
在函数内部,我们做的第一件事是将10进行 decimals 次幂的运算,这会得到一个修正因子。我们将用这个值来向右移动待取整数值的小数点(.)。
接下来,在 math.floor() 函数内部,我们将 number 参数与 factor 变量相乘。这一步首先将 number 的小数点向右移动,然后将其向下取整为整数。之后,我们将这个结果再除以 factor 变量,从而将小数点移回其原始位置。
上面的描述可能过于抽象,所以让我们来看一个例子。假设我们想将 2.438 向下取整到2位小数。首先计算10的2次方,得到100。它乘以待取整的值 (2.438) 得到 243.8。当我们用 math.floor() 函数对其向下取整时,得到 243。然后我们再除以100,以恢复正确的数量级,也就是将小数点(.)向左移回两位。这样就得到了 2.43 这个最终结果。
以下是如何使用这个自定义的 RoundDown() 函数:
RoundDown(12.89, 1) // 返回: 12.8
RoundDown(1.209, 2) // 返回: 1.20
RoundDown(-10.98, 1) // 返回: -11.0
取整范例
下表展示了当我们向下取整到1位小数时,RoundDown() 对一些示例值的返回结果:
| 原始值 | 向下取整到1位小数 |
|---|---|
| 5.92991 | 5.9 |
| 3.72 | 3.7 |
| 1.23 | 1.2 |
| 0.00002 | 0.0 |
| 0.000 | 0.0 |
| -0.00009 | -0.1 |
| -1.12 | -1.2 |
| -4.75 | -4.8 |
| -9.8953 | -9.9 |
| na | 错误;不能对 na 参数调用此函数。 |
| “1.83” | 错误;不能对字符串参数调用此函数。 |
从表中我们可以看出,RoundDown() 会使一个正数略微变小。例如,当我们向下取整到1位小数时,3.72 变为 3.7。
同样地,负数也同样会变小。例如,-4.75 会减少到更小的值 -4.8。
脚本范例
下面的这个 TradingView 指标演示了如何使用自定义的 RoundDown() 函数:
//@version=5
indicator(title="Round down to decimals with 'RoundDown()'", overlay=true)
// RoundDown() 函数将指定的数值向下取整到给定的小数位数。
RoundDown(number, decimals) =>
factor = math.pow(10, decimals)
math.floor(number * factor) / factor
// 将图表交易品种的价格向下取整到1位小数
plot(RoundDown(close, 1), color=color.blue, linewidth=2,
title="Close Rounded to 1 Decimal")
这个指标以 indicator() 函数开始,用于定义脚本的设置。我们通过 title 命名脚本,并通过 overlay 使其叠加显示在主图的交易品种之上。
然后,我们加入了上面讨论过的自定义 RoundDown() 函数。
接下来,我们用 plot() 函数进行绘图。由于没有指定绘图类型,Pine Script 默认会创建一个常规的线图。我们绘制的数据是K线的收盘价(close)经过 RoundDown() 函数处理后,向下取整到1位小数的结果。
我们让这条绘图线以蓝色(color.blue)显示,并且线宽(linewidth=2)比正常稍粗。
它在图表上看起来是这样的:
当 EUR/USD 的价格低于 1.10000(但高于 1.00000)时,RoundDown() 函数会将这些价格向下取整为 1.0。但当价格移动到 1.10000 水平之上时,向下取整后的值就跳升到了下一个级别 1.1。
总结
math.floor()将一个数值向下取整为整数。- 向下取整会使正数变得更小(例如 3.7 变为 3),也会使负数变得更小(例如 -1.1 变为 -2)。
- 要向下取整到指定的小数位数,我们可以使用一个巧妙利用了
math.floor()函数的自定义函数。






