用array.max()获取Pine Script数组的最大值
在我们创建并填充数组后,可以用array.max()函数获取数组中的最大值。
该函数的标准语法是:
array.max(id)
id是你想获取最大值的整数或浮点数数组的引用,由创建数组的函数(如array.new_int()或array.new_float())返回。通过它,Pine Script才能知道要对哪个数组进行操作。
array.max()函数的返回值有两种可能:一种是返回一个整数或浮点数,代表数组中的最大值;另一种是返回na值,这在数组为空没有任何元素,或者数组中所有元素都是na时会发生。
要注意的是,如果数组中部分元素是na、另一部分是有效数字,array.max()在计算时会忽略所有的na值,只从有效数字中找出最大值。
快速示例
要获取一个数组的最大值,首先需要一个整数或浮点数数组。假设我们已经创建了这样一个数组,引用存储在myArray变量中,可以像这样获取它的最大值:
// 从 'myArray' 数组中获取最大值
dataMaximum = array.max(id=myArray)
顺便一提,id=这个关键字参数是可选的,省略它代码也能正常工作,还能少打点字:
// 从 'myArray' 数组中获取最大值
dataMaximum = array.max(myArray)
array.max()分步详解
为了更深入地理解array.max(),我们一步步来看。要获取最大值,首先需要一个数组,先创建一个:
// 创建一个新的空数组
myArray = array.new_int()
这行代码创建了一个整数数组,引用存入myArray变量。由于未指定大小,这个数组现在是空的:
[ ]
此时获取最大值是毫无意义的——数组是空的,只会得到一个na值。所以先用array.push()向数组中添加一些数字:
// 向数组添加值
array.push(id=myArray, value=27)
array.push(id=myArray, value=-10)
array.push(id=myArray, value=84)
现在数组的内容变为:
[27, -10, 84]
现在可以获取最大值了:
// 获取数组的最大值
dataMax = array.max(id=myArray)
我们调用array.max(),把myArray作为参数传入,函数返回的最大值存储在dataMax变量中。结果是:
84
这个值就是当前数组的最大值。如果我们改变数组的内容,最大值也可能随之改变,要获取更新后的最大值,需要再次调用array.max()。用array.unshift()在数组开头添加两个新元素来改变数组:
// 再添加两个值到数组开头
array.unshift(id=myArray, value=10 * 2)
array.unshift(id=myArray, value=105)
现在数组包含以下数字:
[105, 20, 27, -10, 84]
要获取新的最大值,再次调用array.max():
// 获取数组更新后的最大值
dataMax := array.max(id=myArray)
这一次,函数返回的新最大值是:
105
array.max()的用途
array.max()函数的主要用途就是返回整数或浮点数数组中的最大值。这个函数非常方便,避免了手动编写循环来遍历数组查找最大值的麻烦。
虽然可以把数组的最大值(array.max())和最小值(array.min())结合起来计算数组的范围(range),但Pine Script已经提供了一个专门的array.range()函数来做这件事,所以通常不会为了计算范围而使用array.max()。
示例脚本
通过一个完整的脚本来看看array.max()的实际应用。下面的指标会把每根K线的成交量存储到一个数组中,当图表上所有K线的数据都收集完毕后,用array.max()找出所有K线中最高的单根K线成交量。指标代码如下:
//@version=5
indicator(title="array.max() 示例脚本", overlay=true)
// 创建一个持久性的浮点数数组
var volumeData = array.new_float()
// 在每根K线上,将其成交量添加到数组
array.push(id=volumeData, value=volume)
// 在最后一根K线上,显示最大成交量
if barstate.islast
label.new(x=bar_index, y=high,
color=#D0F0C0, textcolor=color.black, size=size.large,
text="最高成交量:\n" +
str.tostring(array.max(id=volumeData), format.volume))
解析一下这段代码。脚本先用indicator()进行配置,再用array.new_float()创建一个浮点数数组,var关键字确保该数组是持久的,内容可以在K线之间保留。
在每根K线上,都用array.push()把该K线的成交量volume添加到volumeData数组中。然后用if语句和barstate.islast变量确保代码只在图表的最后一根K线上执行一次,并在该K线上用label.new()创建一个标签。
标签的文本由两部分组成:一部分是固定的字符串”最高成交量:\n”,另一部分是数组的最大值——调用array.max(volumeData)获取最大值,再用str.tostring()函数转换为文本。特别地,这里使用了format.volume格式,能让成交量自动显示为K(千)或M(百万)的形式,更具可读性。
把这个脚本应用到图表时,它会显示出该图表加载周期内的单根K线最高成交量:

array.max()的特性
array.max()仅适用于整数数组和浮点数数组。如果对其他类型的数组(如颜色或字符串数组)使用此函数,Pine Script会报错:cannot call ‘array.max’ with argument ‘id=(…)’. An argument of ‘(…)’ type was used but a ‘float[]’ is expected.
总结
array.max()函数返回整数或浮点数数组中的最大值。如果数组为空,或其中只包含na值,array.max()将返回na。
用array.median()获取Pine Script数组的中位数
当我们创建了数组并向其填充了元素后,可以用Pine Script的array.median()函数返回该数组中所有元素的中位数。
该函数的标准语法格式如下:
array.median(id)
id是目标数组的引用,该数组必须是整数或浮点数类型。这个引用通常由创建数组的函数(如array.new_int()或array.new_float())返回,它告诉Pine Script要对哪个数组进行计算,不可或缺。
array.median()的返回值有两种可能:一是一个整数或浮点数值,代表数组的中位数;二是na值,当数组是空的(没有任何元素),或者数组中只包含na值时会返回na。如果数组在包含na值的同时也包含有效数值,array.median()会自动忽略na值,仅计算有效数值的中位数。
快速入门
要获取数组的中位数,首先需要一个整数或浮点数类型的数组。如果我们已经创建了这样一个数组,引用存储在myArray变量中,可以像下面这样获取它的中位数:
// 获取 'myArray' 数组的中位数
dataMedian = array.median(id=myArray)
顺便一提,id=这个关键字参数并非强制要求,示例中使用它主要是为了让代码意图更清晰。你完全可以省略它以减少代码量,像这样也完全正确:
// 获取 'myArray' 数组的中位数
dataMedian = array.median(myArray) // 省略了可选的 'id='
array.median()进阶示例
为了更好地理解array.median()函数的用法,通过一个详细的示例来逐步拆解。首先,在计算中位数之前,需要一个数组:
// 创建一个新数组
myArray = array.new_int(size=2, initial_value=2)
这段代码用array.new_int()创建了一个整数数组,引用存入myArray变量。我们指定了数组的初始大小为2,且所有元素的初始值都为2。因此,此时数组的内容是:
[2, 2]
现在来获取这个数组的中位数:
// 获取数组的中位数
dataMedian = array.median(id=myArray)
myArray变量告诉array.median()函数要操作的目标数组。返回的结果存入dataMedian变量,其值将是:
2
当我们修改数组内容后,它的中位数也可能随之改变,要获取更新后的中位数,需要再次调用array.median()。先向数组中添加几个新元素:
// 向数组中添加新值
array.push(id=myArray, value=5)
array.push(id=myArray, value=7)
array.push(id=myArray, value=9)
array.push()函数在数组末尾依次添加了5、7和9。现在,数组的新内容是:
[2, 2, 5, 7, 9]
要获取更新后的中位数,再次调用array.median():
// 获取数组更新后的中位数
dataMedian := array.median(id=myArray)
此时,dataMedian变量的值将被更新为数组的新中位数:
5
每当数组发生变化,获取新中位数的过程都是一样的。假设我们再添加两个元素到数组的开头:
// 添加新值
array.unshift(id=myArray, value=10)
array.unshift(id=myArray, value=579)
array.unshift()函数将10和579添加到了数组的头部,数组内容变为:
[579, 10, 2, 2, 5, 7, 9]
再次获取中位数:
// 获取数组的中位数
dataMedian := array.median(id=myArray)
现在得到的新中位数值是:
7
array.median()的应用场景
array.median()函数能够返回一个整数或浮点数数组的中位数。这是一个了解数组数据集中趋势的有用工具,并且它免去了我们自己手动排序数组并寻找中间值的麻烦。除了高效地获取中位数之外,该函数的功能非常专一,没有其他额外的应用场景。
实战脚本
来看一个使用array.median()的完整脚本。下面的指标会收集图表上所有K线的单根K线成交量变化,当脚本运行到图表的最后一根K线时,它会通过一个文本标签显示所有这些成交量变化的中位数。指标的完整代码如下:
//@version=5
indicator(title="array.median() example script", overlay=true)
// 创建一个持久性数组,用于存储单根K线的成交量变化
var volumeChanges = array.new_float()
// 在每根K线上,将成交量的绝对变化值添加到数组
array.push(id=volumeChanges, value=math.abs(volume - volume[1]))
// 在最后一根K线上,通过文本标签显示成交量变化的中位数
if barstate.islast
label.new(x=bar_index, y=high,
color=#FFFACD, textcolor=color.black, size=size.large,
text="成交量变化中位数:\n" +
str.tostring(array.median(id=volumeChanges), format.volume))
首先,indicator()函数配置了脚本的基本属性。
然后,array.new_float()创建了一个浮点数数组。我们用var关键字声明volumeChanges变量,这意味着这个变量(及其关联的数组)在整个脚本生命周期中只被创建一次。因此,该数组是持久性的,它的元素能够在不同的K线之间得以保留和累加,而不是在每根K线上都被清空重建。
接着,array.push()函数在每根K线上向数组中添加新元素。我们添加的值是当前K线与前一根K线的成交量之差(volume – volume[1]),并通过math.abs()取其绝对值,以衡量变化的幅度而非方向。
最后,一个if语句检查当前是否为图表的最后一根K线(barstate.islast)。如果是,就用label.new()创建一个文本标签,背景色为淡黄色(#FFFACD)。标签的文本由两部分组成:一段描述性文字,以及数组的中位数值。由于array.median()返回的是一个数字,而标签需要文本,我们用str.tostring()函数进行转换,还使用了format.volume格式化参数,它会自动为数值加上K(千)和M(百万)等后缀,使其更符合成交量的常见显示格式。
脚本在图表上运行时,会显示出所有K线成交量变化的中位数。例如在这张AMD日线图上,该值为886K:

array.median()的特性
array.median()只能作用于整数或浮点数类型的数组。如果对其他类型的数组(如颜色数组)调用此函数,Pine Script会生成cannot call ‘array.median’ with argument ‘id=(…)’. An argument of ‘(…)’ type was used but a ‘float[]’ is expected.的错误。
总结
array.median()函数返回一个整数或浮点数数组中所有数值的中位数。如果数组是空的,或只包含na值,array.median()将返回na。
用array.min()获取Pine Script数组的最小值
在我们创建并填充数组后,可以用array.min()函数获取数组中所有元素的最小值。
该函数的标准语法是:
array.min(id)
id是你想获取最小值的整数或浮点数数组的引用,由创建数组的函数(如array.new_int()或array.new_float())返回。通过它,Pine Script才能知道要对哪个数组进行操作。
array.min()函数的返回值有两种可能:一种是返回一个整数或浮点数,代表数组中的最小值;另一种是返回na值,这在数组为空没有任何元素,或者数组中所有元素都是na时会发生。
要注意的是,如果数组中部分元素是na、另一部分是有效数字,array.min()在计算时会忽略所有的na值,只从有效数字中找出最小值。
快速示例
要获取一个数组的最小值,首先需要一个整数或浮点数数组。假设我们已经创建了这样一个数组,引用存储在myArray变量中,可以像这样获取它的最小值:
// 从 'myArray' 数组中检索最小值
arrayMinimum = array.min(id=myArray)
顺便一提,id=这个关键字参数是可选的,省略它代码也能正常工作:
// 从 'myArray' 数组中检索最小值
arrayMinimum = array.min(myArray)
array.min()分步详解
为了更深入地理解array.min(),我们一步步来看。要获取最小值,首先需要一个数组,先创建一个:
// 创建一个新数组
myArray = array.new_float(size=1, initial_value=3.25)
这行代码创建了一个浮点数数组,初始大小为1个元素,该元素的值是3.25,返回的引用存入myArray变量。此刻数组的内容是:
[3.25]
Pine Script并不要求数组必须达到某个最小尺寸才能计算最小值,所以现在就可以直接获取:
// 获取数组的最小值
dataMin = array.min(id=myArray)
我们调用array.min(),把myArray作为参数传入。由于数组中只有一个元素,所以dataMin变量得到的值就是该元素的值:
3.25
当我们改变数组的内容时,最小值也可能随之改变,要获取更新后的最小值,需要再次调用array.min()。先用array.push()向数组中添加一些新值:
// 向数组中填充更多值
array.push(id=myArray, value=0.02)
array.push(id=myArray, value=9.47)
array.push(id=myArray, value=-4.6)
添加完这些新元素后,数组的内容变为:
[3.25, 0.02, 9.47, -4.6]
要获取更新后的最小值,再次调用array.min():
// 获取数组更新后的最小值
dataMin := array.min(id=myArray)
dataMin变量的值现在被更新为数组中新的最小值:
-4.6
每次数组内容发生变化,都需要重新调用array.min()。再试一次,这次在数组开头添加几个值,包括一个na值:
// 在数组开头添加额外的值
array.unshift(id=myArray, value=2 * -5)
array.unshift(id=myArray, value=25)
array.unshift(id=myArray, value=na)
这个操作通过array.unshift()在数组开头添加了三个元素。现在数组的内容变为:
[NaN, 25, -10, 3.25, 0.02, 9.47, -4.6]
注意:当na值被转换为字符串时,它显示为NaN(Not a Number)。
现在再次获取数组的最小值:
// 获取数组最新的最小值
dataMin := array.min(id=myArray)
当数组中既有na值又有有效数字时,array.min()会忽略na值。因此,数组的最小值是:
-10
array.min()的用途
array.min()函数的主要用途就是返回整数或浮点数数组中的最小值。这个函数非常方便,避免了手动编写循环来遍历数组查找最小值的麻烦。
虽然可以把数组的最小值(array.min())和最大值(array.max())结合起来计算数组的范围(range),但Pine Script已经提供了一个专门的array.range()函数来做这件事,所以通常不会为了计算范围而使用array.min()。
示例脚本
通过一个完整的脚本来看看array.min()的实际应用。下面的指标会收集每根K线的成交量到一个数组中,当脚本运行到图表的最后一根K线时,它会找出所有K线中最低的单根K线成交量,并用一个文本标签显示出来。指标代码如下:
//@version=5
indicator(title="array.min() 示例脚本", overlay=true)
// 为成交量值创建一个持久性的数组
var volumeData = array.new_float()
// 在每根K线上,将其成交量添加到数组
array.push(id=volumeData, value=volume)
// 在最后一根K线上,用标签显示最低成交量
if barstate.islast
label.new(x=bar_index, y=low, style=label.style_label_up,
color=#FFE5B4, textcolor=color.black, size=size.large,
text="最低成交量:\n" +
str.tostring(array.min(id=volumeData), format.volume))
解析一下这段代码。脚本先用indicator()进行配置,再用array.new_float()创建一个浮点数数组,var关键字确保该数组是持久的,内容可以在K线之间保留。
在每根K线上,都用array.push()把该K线的成交量volume添加到volumeData数组中。然后用if语句和barstate.islast变量确保代码只在图表的最后一根K线上执行一次,并在该K线上用label.new()创建一个指向上方的标签。
标签的文本由两部分组成:一部分是固定的字符串”最低成交量:\n”,另一部分是数组的最小值——调用array.min(volumeData)获取最小值,再用str.tostring()函数转换为文本。特别地,这里使用了format.volume格式,能让成交量自动显示为K(千)或M(百万)的形式,更具可读性。
把这个脚本应用到图表时,它会显示出该图表加载周期内的单根K线最低成交量。例如在这个Netflix的日线图上,该值略低于300K:

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


