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

Pine Script(119):math.ceil()向上取整与math.floor()向下取整

#Pine Script入门教学

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() 函数的自定义函数。
赞(0)
未经允许不得转载:图道交易 » Pine Script(119):math.ceil()向上取整与math.floor()向下取整
分享到

评论 抢沙发

登录

找回密码

注册