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

Pine Script(204):数组的平均值与协方差计算

#Pine Script入门教学

用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。

赞(0)
未经允许不得转载:图道交易 » Pine Script(204):数组的平均值与协方差计算
分享到

评论 抢沙发

登录

找回密码

注册