用户定义函数
介绍
用户定义函数是您编写的函数,与 Pine Script™ 中的内置函数不同。它们可用于定义您必须重复执行的计算,或您想要与脚本的主要计算部分隔离的计算。当没有内置函数可以满足您的需要时,可以将用户定义函数视为扩展 Pine Script™ 功能的一种方式。
您可以通过两种方式编写函数:
- 在一行中,当它们很简单时,或者
- 在多行上
函数可以位于两个地方:
- 如果某个函数仅在一个脚本中使用,则可以将其包含在使用它的脚本中。请参阅我们的 样式指南,了解有关在脚本中放置函数的位置的建议。
- 您可以创建一个 Pine Script™ 库来包含您的函数,这样它们就可以在其他脚本中重复使用,而无需复制其代码。库函数有独特的要求。它们在 库页面中有说明。
无论使用一行还是多行,用户定义函数都具有以下特点:
- 它们不能被嵌入。所有函数都在脚本的全局范围内定义。
- 它们不支持递归。函数不允许在其自身代码中调用自身。
- 函数返回值的类型是自动确定的,并且取决于每个特定函数调用中使用的参数类型。
- 函数的返回值是函数主体中的最后一个值。
- 脚本中函数调用的每个实例都维护其自己的独立历史记录。
单行函数
简单函数通常可以写在一行中。这是单行函数的正式定义:
以下是一个例子:
f(x, y) => x + y
声明函数后f()
,可以使用不同类型的参数来调用它:
a = f(open, close)
b = f(2, 2)
c = f(open, 2)
在上面的例子中,变量的类型a
是series,因为参数都是series。变量的类型b
是integer
,因为参数都是文字整数。变量的类型c
是series ,因为series和文字整数相加
会产生series结果。
多行函数
Pine Script™ 还支持具有以下语法的多行函数:
在哪里:
多行函数的主体由多条语句组成。每条语句都放在单独的一行上,并且前面必须有 1 个缩进(4 个空格或 1 个制表符)。语句前的缩进表示它是函数主体的一部分,而不是脚本全局范围的一部分。在函数代码之后,第一个没有缩进的语句表示函数主体已结束。
表达式或声明的变量应为函数主体的最后一个语句。此表达式(或变量)的结果将是函数调用的结果。例如:
geom_average(x, y) =>
a = x*x
b = y*y
math.sqrt(a + b)
该函数geom_average
有两个参数,并在函数主体中创建两个变量:a
和b
。最后一个语句调用该函数
math.sqrt
(平方根的提取)。geom_average
调用将返回最后一个表达式的值:(math.sqrt(a + b))
。
脚本中的范围
在函数体或其他局部块外部声明的变量属于全局作用域。用户声明的函数和内置函数以及内置变量也属于全局作用域。
每个函数都有自己的局部作用域。函数内声明的所有变量以及函数的参数都属于该函数的作用域,这意味着不可能从外部引用它们 --- 例如从全局作用域或另一个函数的局部作用域。
另一方面,由于可以从函数范围引用全局范围中声明的任何变量或函数(自引用递归调用除外),因此可以说局部范围嵌入到全局范围中。
在 Pine Script™ 中,不允许使用嵌套函数,即不能在一个函数中声明另一个函数。所有用户函数都在全局范围内声明。本地范围不能相互交叉。
返回多个结果的函数
在大多数情况下,一个函数只返回一个结果,但可以返回一个结果列表(类似元组的结果):
fun(x, y) =>
a = x+y
b = x-y
[a, b]
调用此类函数需要特殊语法:
[res0, res1] = fun(open, close)
plot(res0)
plot(res1)
限制
用户定义函数可以使用任何 Pine Script™ 内置函数,但以下函数除外: barcolor()、 fill()、 hline()、 indicator()、 library()、 plot()、 plotbar()、 plotcandle()、 plotchar()、 plotshape() 和 strategies()。