用array.sum()对Pine Script数组所有元素求和
当我们创建了数组并向其填充了元素后,可以用array.sum()函数计算并返回一个数组中所有元素的总和。
该函数的标准语法格式如下:
array.sum(id)
id是目标数组的引用,该数组必须是整数或浮点数类型。这个引用通常由创建数组的函数(如array.new_int()或array.new_float())返回,通过它,Pine Script才能准确地知道要对哪个数组进行操作。
array.sum()的返回值有两种可能。一是一个整数或浮点数值,代表数组中所有元素相加的总和。二是na值,这在数组是空的(不包含任何元素),或者数组中只包含na值时会发生。如果数组在包含na值的同时也包含有效数值,array.sum()会自动忽略na值,仅计算有效数值的总和。
快速入门
要获取一个数组中所有元素之和,首先需要一个整数或浮点数类型的数组。如果我们已经创建了这样一个数组,引用存储在myArray变量中,可以像下面这样获取它的总和:
// 获取 'myArray' 数组中所有值的总和
dataSum = array.sum(id=myArray)
顺便一提,array.sum()的id关键字参数并非强制要求,示例中使用它主要是为了让代码意图更清晰。你完全可以省略它以减少代码量,像这样也完全正确:
// 获取 'myArray' 数组中所有值的总和
dataSum = array.sum(myArray) // 省略了可选的 'id='
array.sum()进阶示例
为了更好地理解array.sum()的运作方式,通过一个详细的示例来逐步拆解。首先,在求和之前需要一个数组,先创建一个:
// 创建一个新的空数组
myArray = array.new_int()
这里用array.new_int()创建了一个整数数组,引用存入myArray变量。由于未指定初始大小,数组在创建之初是空的:
[ ]
此时,由于数组是空的,对其调用array.sum()函数没有太大意义,只会返回一个na值。所以先向数组中添加几个元素:
// 向数组中添加初始值
array.push(id=myArray, value=206)
array.push(id=myArray, value=-32)
array.push(id=myArray, value=83)
array.push()函数在数组末尾添加了三个元素。现在,数组的内容是:
[206, -32, 83]
数据准备就绪后,我们来获取数组的总和:
// 获取数组的总和
dataSum = array.sum(id=myArray)
array.sum()函数会把数组中的所有元素相加,并将结果返回。我们把返回的总和存入dataSum变量,其值将是:
257
如果我们修改了数组的内容,总和也可能随之改变,要获取更新后的总和,需要再次调用array.sum()。再向数组中添加几个元素:
// 向数组中再添加几个元素
array.unshift(id=myArray, value=20)
array.unshift(id=myArray, value=412)
array.unshift()函数在数组的开头添加了两个新元素。现在,数组的内容变为:
[412, 20, 206, -32, 83]
再次计算总和:
// 获取数组当前的总和
dataSum := array.sum(id=myArray)
此时,数组中所有数字的新总和是:
689
array.sum()的应用场景
array.sum()函数能够把数组中的所有数字相加。这个便捷的函数让我们无需手动编写循环来执行求和,大大简化了代码。
在实际应用中,我们常常会把array.sum()与其他数组统计函数结合使用,例如通过array.sum()和array.size()来计算平均值(等同于array.avg())。除了计算数组元素总和这个核心功能外,该函数没有其他额外的应用场景。
实战脚本
来看一个使用array.sum()的完整脚本。下面的指标会把图表上每根K线的成交量都存储到一个数组中,当脚本运行到图表的最后一根K线时,它会通过一个文本标签显示整个图表期间的总成交量。该指标的完整代码如下:
//@version=5
indicator(title="array.sum() example script", overlay=true)
// 创建一个持久性数组,用于存储每根K线的成交量
var barVolumes = array.new_float()
// 在每根K线上,将该K线的成交量添加到数组
array.push(id=barVolumes, value=volume)
// 在图表的最后一根K线上,显示一个带有
// 所有K线总成交量的文本标签
if barstate.islast
label.new(x=bar_index, y=high,
color=#0038A8, textcolor=color.white, size=size.large,
text="图表上所有K线的总成交量:\n" +
str.tostring(array.sum(id=barVolumes),
"###,###,###,###,###,###.##"))
脚本首先用indicator()函数配置基本属性,然后用array.new_float()创建一个浮点数数组(因为某些品种的成交量可能不是整数),引用存入barVolumes变量。
接着,用array.push()在每根K线上把成交量volume添加到数组末尾。
最后,一个if语句检查当前是否为图表的最后一根K线(barstate.islast)。如果是,就用label.new()创建一个文本标签,背景色为宝蓝色(#0038A8)。标签的文本由两部分组成:一段描述性文字,以及数组的总和。由于array.sum()返回的是数字,需要用str.tostring()将其转换为字符串。为了增强可读性,这里提供了一个”###,###,###,###,###,###.##”格式化字符串——每个井号(#)都代表一个可选的数字占位符,而逗号(,)则用于在适当的位置插入千位分隔符,使大数字更易于阅读。
脚本在图表上运行时,会显示出图表上所有K线的累计总成交量。例如对于瑞波币(XRPUSD),总成交量为:

array.sum()的特性
array.sum()只能作用于整数或浮点数类型的数组。如果对其他类型的数组(如线段或颜色数组)调用此函数,Pine Script会生成cannot call ‘array.sum’ with argument ‘id='(…). An argument of ‘(…)’ type was used but a ‘float[]’ is expected的错误信息。
总结
array.sum()函数返回一个整数或浮点数数组中所有数值的总和。如果数组是空的,或只包含na值,array.sum()将返回na。
用array.variance()获取Pine Script数组的方差
在我们创建并填充数组后,可以用Pine Script的array.variance()函数计算数组中所有元素的统计方差。
该函数的标准语法是:
array.variance(id)
id是你想计算方差的整数或浮点数数组的引用,由创建数组的函数(如array.new_int()或array.new_float())返回。通过它,Pine Script才能知道要对哪个数组进行分析。
array.variance()函数的返回值有两种可能:一种是返回一个整数或浮点数,代表所有数组元素的方差;另一种是返回na值,这在数组为空(不包含任何元素),或者数组中所有元素都是na时会发生。
要注意的是,如果数组中部分元素是na、另一部分是有效数字,array.variance()在计算时会忽略所有的na值,只对有效数字计算方差。
快速示例
要从一个数组中获取方差,首先需要一个整数或浮点数数组。假设我们已经创建了这样一个数组,引用存储在myArray变量中,可以像这样获取它的方差:
// 从 'myArray' 数组中的值获取方差
dataVariance = array.variance(id=myArray)
顺便一提,id=这个关键字参数是可选的,省略它代码也能正常工作:
// 从 'myArray' 数组中的值获取方差
dataVariance = array.variance(myArray)
array.variance()分步详解
通过一个详细的步骤来看看array.variance()函数是如何工作的。要获取方差,首先需要一个数组,先创建一个:
// 创建一个新的浮点数数组
myArray = array.new_float()
这行代码创建了一个浮点数数组,引用存入myArray变量。由于未指定大小,这个数组现在是空的:
[ ]
计算空数组的方差是没有意义的,因为array.variance()只会返回na。所以先用array.push()向数组中添加一些值:
// 向数组添加一些值
array.push(id=myArray, value=5.30)
array.push(id=myArray, value=2.12)
array.push(id=myArray, value=-3.95)
现在数组的内容变为:
[5.3, 2.12, -3.95]
有了数据,就可以来计算方差了:
// 获取数组的方差
dataVariance = array.variance(id=myArray)
我们调用array.variance(),把myArray作为参数传入。函数返回的方差被存储在dataVariance变量中。结果是:
14.7244222222
当我们改变数组的内容时(增、删、改),方差也可能随之改变,要获取更新后的方差,需要再次调用array.variance()。用array.unshift()在数组开头添加几个新元素:
// 向数组添加更多值
array.unshift(id=myArray, value=1.04)
array.unshift(id=myArray, value=1.98)
现在数组的内容变为:
[1.98, 1.04, 5.3, 2.12, -3.95]
要获取新的方差,再次调用array.variance():
// 检索数组更新后的方差
dataVariance := array.variance(id=myArray)
更新后数组的方差是:
8.952976
array.variance()的用途
array.variance()函数可以直接获取数值数组的统计方差。这个函数非常方便且高效,避免了手动编写循环来完成这一复杂的统计计算。
为了更好地理解数据的特性,我们可以把array.variance()与array.stdev()(标准差)和array.avg()(平均值)等函数结合使用。除了计算方差这个核心功能外,array.variance()没有其他特殊用途。
示例脚本
通过一个完整的脚本来看看array.variance()的实际应用。下面的指标会收集所有K线的真实波幅(True Range),并将这些值存入一个数组;当脚本运行到图表的最后一根K线时,它会计算所有这些波幅值的方差,并用一个文本标签显示出来。指标代码如下:
//@version=5
indicator(title="array.variance() 示例脚本", overlay=true)
// 创建一个持久性的浮点数数组,用于存储所有K线的真实波幅
var barTrueRanges = array.new_float()
// 在每根K线上,将其真实波幅添加到数组
array.push(id=barTrueRanges, value=ta.tr)
// 在最后一根K线上,创建标签显示真实波幅的方差
if barstate.islast
label.new(x=bar_index, y=hl2, style=label.style_label_left,
color=#F4C2C2, textcolor=color.black, size=size.large,
text="所有K线的真实波幅\n方差:\n" +
str.tostring(array.variance(id=barTrueRanges), "0.0000"))
解析一下这段代码。脚本先用indicator()进行配置,再用array.new_float()创建一个浮点数数组,var关键字确保该数组是持久的,内容可以在K线之间保留。
在每根K线上,都用array.push()把该K线的真实波幅(通过ta.tr获取)添加到barTrueRanges数组中。然后用if语句和barstate.islast变量确保代码只在图表的最后一根K线上执行一次,并在该K线上用label.new()创建一个指向左方的标签。
标签的文本由两部分组成:一部分是固定的字符串,另一部分是数组的方差——调用array.variance(barTrueRanges)获取这个统计值,再用str.tostring()函数转换为带四位小数的文本,以便在标签上显示。
把这个脚本应用到图表时,它会先收集所有K线的真实波幅,然后在图表末尾显示这些波幅的方差。例如在这个欧洲斯托克50指数期货图表上:

array.variance()的特性
array.variance()仅适用于整数数组和浮点数数组。如果对其他类型的数组(如布尔或颜色数组)使用此函数,Pine Script会报错:cannot call ‘array.variance’ with argument ‘id=(…)’. An argument of ‘(…)’ type was used but a ‘float[]’ is expected.
总结
array.variance()函数返回一个整数或浮点数数组中所有数值的方差。如果数组为空,或其中只包含值为na的元素,array.variance()将返回na值。


