用array.avg()获取Pine Script数组的平均值
创建并填充数组后,可以用Pine Script的array.avg()函数计算数组中所有元素的平均值(均值)。
该函数的标准语法是:
array.avg(id)
id是你想计算平均值的整数或浮点数数组的引用,由创建数组的函数(如array.new_int()或array.new_float())返回。通过它,Pine Script才能知道要对哪个数组进行计算。
array.avg()的返回值有两种可能:一种是返回一个整数或浮点数,代表数组元素的平均值;另一种是返回na值,这在数组为空没有任何元素,或者数组中所有元素都是na时会发生。
要注意的是,如果数组中部分元素是na、另一部分是有效数字,array.avg()在计算时会忽略所有的na值,只对有效数字求平均。
快速示例
要获取一个数组的平均值,首先需要一个整数或浮点数数组。假设我们已经创建了这样一个数组,引用存储在myArray变量中,可以像这样获取它的平均值:
// 获取 'myArray' 数组的平均值
dataAverage = array.avg(id=myArray)
顺便一提,id=这个关键字参数是可选的,省略它代码也能正常工作:
// 获取 'myArray' 数组的平均值
dataAverage = array.avg(myArray)
array.avg()分步详解
为了更深入地理解array.avg(),来看一个分步示例。在计算平均值之前,首先需要创建一个数组:
// 创建一个空数组
myArray = array.new_int()
这里我们创建了一个整数数组,引用存入myArray变量。由于未指定初始值,这个数组现在是空的:
[ ]
如果此时对它调用array.avg(),将会返回na,因为空数组没有平均值。所以先用array.push()向数组中添加一些值:
// 向数组添加初始值
array.push(id=myArray, value=43)
array.push(id=myArray, value=-18)
array.push(id=myArray, value=230)
现在数组的内容变为:
[43, -18, 230]
有了数据,就可以计算平均值了:
// 计算数组的平均值
dataAverage = array.avg(id=myArray)
我们调用array.avg(),把myArray作为参数传入,函数返回的平均值存储在dataAverage变量中。计算结果是:
85
当数组内容发生变化时,平均值通常也会随之改变。要获取更新后的平均值,需要再次调用array.avg()。先用array.set()修改一个元素的值:
// 更新最后一个元素(索引为2)的值
array.set(id=myArray, index=2, value=29)
数组内容现在是:
[43, -18, 29]
再次调用array.avg():
// 重新计算数组的平均值
dataAverage := array.avg(id=myArray)
这一次,函数返回的新平均值是:
18
无论是修改还是添加元素,只要数组内容变了,就需要重新调用array.avg()获取最新的平均值。例如用array.unshift()在数组开头添加一个新元素:
// 添加一个新元素到数组开头
array.unshift(id=myArray, value=-503)
数组变为:
[-503, 43, -18, 29]
再次计算平均值:
// 再次获取数组的最新平均值
dataAverage := array.avg(id=myArray)
现在,返回的结果是:
-112.25
array.avg()的用途
array.avg()函数的主要用途就是获取整数或浮点数数组的平均值。它非常方便,省去了手动编写循环来累加求平均的麻烦,而且内置函数的执行效率也更高。除此之外,array.avg()没有其他功能。
示例脚本
通过一个完整的脚本来看看array.avg()的实际应用。下面的指标会把每根K线的波幅(最高价-最低价)存储到一个数组中,然后在图表的最后一根K线上计算所有波幅的平均值,并用一个标签显示出来。指标代码如下:
//@version=5
indicator(title="array.avg() 示例脚本", overlay=true)
// 创建一个持久性的浮点数数组
var highLowRange = array.new_float()
// 在每根K线上,将其高低波幅添加到数组
array.push(id=highLowRange, value=high - low)
// 在最后一根历史K线上,用标签显示数组的平均值
if barstate.islastconfirmedhistory
label.new(x=bar_index, y=close, style=label.style_label_left,
color=#FFEBCD, textcolor=color.black, size=size.large,
text="平均高低波幅:\n" +
str.tostring(array.avg(id=highLowRange), "0.0000"))
解析一下这段代码。脚本先用indicator()进行配置,再用array.new_float()创建一个浮点数数组,var关键字确保该数组是持久的,内容可以在K线之间保留。
在每根K线上,都用array.push()把该K线的波幅(high – low)添加到highLowRange数组中。然后用if语句和barstate.islastconfirmedhistory变量确保代码只在图表的最后一根历史K线上执行一次,并在该K线上用label.new()创建一个标签。
标签的文本由两部分组成:一部分是固定的字符串”平均高低波幅:\n”,另一部分是数组的平均值——调用array.avg(highLowRange)获取平均值,再用str.tostring()函数将其转换为带四位小数的文本,以便在标签上显示。
把这个脚本应用到图表时,它会显示出该交易品种在所加载K线范围内的平均高低波幅:

array.avg()的特性
array.avg()仅适用于整数数组和浮点数数组。如果对其他类型的数组(如颜色或字符串数组)使用此函数,Pine Script会报错:cannot call ‘array.avg’ with argument ‘id=(…)’. An argument of ‘(…)’ type was used but a ‘float[]’ is expected.
总结
array.avg()函数返回整数或浮点数数组中所有数值的平均值。如果数组为空,或其中只包含na值,array.avg()将返回na。
用array.covariance()计算两个数组的协方差
当我们创建了数组并填充了元素后,便可以用Pine Script的array.covariance()函数计算两个数组之间的协方差。
该函数的标准语法格式如下:
array.covariance(id1, id2)
id1是第一个数组的引用,该数组必须是整数或浮点数类型,这个引用通常由创建数组的函数(如array.new_int()或array.new_float())返回,它告诉Pine Script我们要操作的是哪个数组。id2是第二个数组的引用,同样必须是整数或浮点数类型。Pine Script会计算id1和id2这两个数组之间的协方差。
array.covariance()的返回值有两种可能:一是一个浮点数值,代表两个数组的协方差;二是na值,当其中一个或两个数组是空的(没有任何元素),或者其中一个或两个数组只包含na值时会返回na。值得注意的是,如果数组在包含na值的同时也包含有效数值,array.covariance()会自动忽略na值,仅用有效数值进行计算。
快速入门
要计算协方差,首先需要两个数值类型的数组(整数或浮点数)。假设我们已经创建了这两个数组,引用分别存储在myArray1和myArray2变量中,可以像这样获取它们的协方差:
// 获取 'myArray1' 和 'myArray2' 数组的协方差
dataCovar = array.covariance(id1=myArray1, id2=myArray2)
顺便提一下,id1=和id2=这类关键字参数并非强制要求,示例中使用它们是为了让代码意图更清晰。你完全可以省略它们以减少代码量,像这样也完全正确:
// 获取 'myArray1' 和 'myArray2' 数组的协方差,
// 省略可选的 'id1=' 和 'id2='
dataCovar = array.covariance(myArray1, myArray2)
array.covariance()进阶示例
为了更好地理解array.covariance()的运作方式,来看一个分步示例。首先,要计算协方差,需要创建两个数组:
// 创建两个新数组
myArray1 = array.new_float()
myArray2 = array.new_float()
这里用array.new_float()创建了两个浮点数数组,引用分别存入myArray1和myArray2变量,以便后续访问。
这两个数组初始时是空的,无法计算协方差,所以先填充一些元素:
// 向两个数组中添加初始值
array.push(id=myArray1, value=1.09)
array.push(id=myArray1, value=2.38)
array.push(id=myArray1, value=-3.75)
array.unshift(id=myArray2, value=3.2)
array.unshift(id=myArray2, value=0.8032)
array.unshift(id=myArray2, value=-2.282)
我们用array.push()向第一个数组(myArray1)的末尾添加了三个值,同时用array.unshift()向第二个数组(myArray2)的开头添加了三个值。操作完成后,两个数组的内容分别如下:
[1.09, 2.38, -3.75]
[-2.282, 0.8032, 3.2]
现在数据准备就绪,可以计算协方差了:
// 获取数组的协方差
dataCovariance = array.covariance(id1=myArray1, id2=myArray2)
通过myArray1和myArray2变量,array.covariance()函数知道了计算的目标。返回的结果存入dataCovariance变量,其值将是:
0.772968
如果修改了任一数组的内容,协方差也会随之改变。要获取更新后的协方差,只需再次调用array.covariance()函数。例如向两个数组中各插入一个新元素:
// 更新数组的值
array.insert(id=myArray1, index=0, value=3 * 0.482)
array.insert(id=myArray2, index=3, value=2.583 / 5)
array.insert()函数分别在第一个数组的开头(索引0)和第二个数组的索引3位置添加了新元素,数组内容变为:
[1.446, 1.09, 2.38, -3.75]
[-2.282, 0.8032, 3.2, 0.5166]
再次计算协方差:
// 获取更新后的协方差
dataCovariance := array.covariance(id1=myArray1, id2=myArray2)
这将返回一个新的协方差值:
0.650536825
array.covariance()的应用场景
array.covariance()函数的主要用途就是计算两个数组间的协方差。这个便捷的函数让我们无需手动编写循环来执行复杂的统计计算,大大简化了代码。除此之外,该函数的功能非常专一,没有其他额外的应用场景。
实战脚本
来看一个使用array.covariance()的完整脚本。下面的指标创建了两个数组,一个用来存放K线的最高价,另一个存放最低价。在每根K线上,脚本都会把最近3根K线的最高价和最低价分别存入两个数组;在图表的最后一根K线上,它会通过一个文本标签显示这两个价格序列之间的协方差。指标的完整代码如下:
//@version=5
indicator(title="array.covariance() example script", overlay=true)
// 创建两个浮点数数组
highData = array.new_float()
lowData = array.new_float()
// 将最近三个最高价和最低价添加到数组
array.push(id=highData, value=high)
array.push(id=highData, value=high[1])
array.push(id=highData, value=high[2])
array.push(id=lowData, value=low)
array.push(id=lowData, value=low[1])
array.push(id=lowData, value=low[2])
// 在最后一根K线上,用标签显示数组的协方差
if barstate.islast
label.new(x=bar_index, y=high,
color=#FAFAD2, textcolor=color.black, size=size.large,
text="最高价与最低价数组的协方差:\n" +
str.tostring(array.covariance(id1=highData, id2=lowData)))
脚本首先用indicator()函数配置基本属性,然后用array.new_float()创建两个浮点数数组,用于存储高低价数据,引用分别存入highData和lowData变量。
接着,用array.push()函数向两个数组中分别添加当前K线、前一根K线和再前一根K线的最高价和最低价。
最后,一个if语句检查当前是否为图表的最后一根K线(barstate.islast)。如果是,就用label.new()创建一个文本标签,背景色为淡黄绿色(#FAFAD2),文本内容显示最高价数组和最低价数组之间的协方差——调用array.covariance()计算该值,再用str.tostring()转换为字符串以便在标签中显示。
脚本在图表上运行时,将显示出近期高低价序列的协方差:

array.covariance()的特性
使用这个函数有两点要求。一是长度要求:array.covariance()要求两个数组的长度必须完全相同,如果长度不一致,TradingView会触发Size of arrays for covariance() should be equals(用于协方差计算的数组大小应相等)的运行时错误。二是类型要求:array.covariance()只能作用于整数或浮点数类型的数组,如果对其他类型的数组(如颜色数组)使用此函数,Pine Script会生成cannot call ‘array.covariance’ with argument ‘id=(…)’. An argument of ‘(…)’ type was used but a ‘int[]’ is expected.的错误。
总结
array.covariance()函数返回两个数组之间的协方差。这两个数组的长度必须相同,并且必须是整数或浮点数类型。如果两个数组都是空的,或只包含na值,array.covariance()将返回na。


