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

Pine Script(118):数值取整的三种方法,math.round()四舍五入详解

#Pine Script入门教学

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.95.3 都会变为 5。但当我们进行四舍五入时,小数点前的整数部分可能会发生改变。更多信息请参阅 Pine Script 中的截断值。
  • 版本变化:在 Pine Script 版本4及更早的版本中,math.round() 函数的名称是 round() 。除了名称变化外,其功能并未改变。

总结

  • math.round(number) 将给定的数值向上或向下取整为整数。
  • math.round(number, precision) 将给定的数值向上或向下取整到指定的小数位数。
  • 当取整时遇到 .5 的情况,math.round() 会向上取整。
赞(0)
未经允许不得转载:图道交易 » Pine Script(118):数值取整的三种方法,math.round()四舍五入详解
分享到

评论 抢沙发

登录

找回密码

注册