用户定义函数

介绍

用户定义函数是您编写的函数,与 Pine Script™ 中的内置函数不同。它们可用于定义您必须重复执行的计算,或您想要与脚本的主要计算部分隔离的计算。当没有内置函数可以满足您的需要时,可以将用户定义函数视为扩展 Pine Script™ 功能的一种方式。

您可以通过两种方式编写函数:

  • 在一行中,当它们很简单时,或者
  • 在多行上

函数可以位于两个地方:

  • 如果某个函数仅在一个脚本中使用,则可以将其包含在使用它的脚本中。请参阅我们的 样式指南,了解有关在脚本中放置函数的位置的建议。
  • 您可以创建一个 Pine Script™ 来包含您的函数,这样它们就可以在其他脚本中重复使用,而无需复制其代码。库函数有独特的要求。它们在 页面中有说明。

无论使用一行还是多行,用户定义函数都具有以下特点:

  • 它们不能被嵌入。所有函数都在脚本的全局范围内定义。
  • 它们不支持递归。函数不允许在其自身代码中调用自身
  • 函数返回值的类型是自动确定的,并且取决于每个特定函数调用中使用的参数类型。
  • 函数的返回值是函数主体中的最后一个值。
  • 脚本中函数调用的每个实例都维护其自己的独立历史记录。

单行函数

简单函数通常可以写在一行中。这是单行函数的正式定义:

<function_declaration>
<identifier>(<parameter_list>) => <return_value>
<parameter_list>
{<parameter_definition>{, <parameter_definition>}}
<parameter_definition>
[<identifier> = <default_value>]
<return_value>
<statement> | <expression> | <tuple>

以下是一个例子:

f(x, y) => x + y

声明函数后f(),可以使用不同类型的参数来调用它:

a = f(open, close)
b = f(2, 2)
c = f(open, 2)

在上面的例子中,变量的类型aseries,因为参数都是series。变量的类型binteger ,因为参数都是文字整数。变量的类型cseries ,因为series文字整数相加 会产生series结果。

多行函数

Pine Script™ 还支持具有以下语法的多行函数:

<identifier>(<parameter_list>) =>
<local_block>
<identifier>(<list of parameters>) =>
<variable declaration>
...
<variable declaration or expression>

在哪里:

<parameter_list>
{<parameter_definition>{, <parameter_definition>}}
<parameter_definition>
[<identifier> = <default_value>]

多行函数的主体由多条语句组成。每条语句都放在单独的一行上,并且前面必须有 1 个缩进(4 个空格或 1 个制表符)。语句前的缩进表示它是函数主体的一部分,而不是脚本全局范围的一部分。在函数代码之后,第一个没有缩进的语句表示函数主体已结束。

表达式或声明的变量应为函数主体的最后一个语句。此表达式(或变量)的结果将是函数调用的结果。例如:

geom_average(x, y) =>
    a = x*x
    b = y*y
    math.sqrt(a + b)

该函数geom_average有两个参数,并在函数主体中创建两个变量:ab。最后一个语句调用该函数 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()

Original text
Rate this translation
Your feedback will be used to help improve Google Translate