外观
用户自定义函数
约 1202 字大约 4 分钟
简介
用户自定义函数是指由您编写的函数,与Mine Script®中的内置函数相对应。当内置函数无法满足需求时,这类函数可用于定义需要重复执行的计算,或是将特定计算逻辑与脚本主体分离。您可以将用户自定义函数视为扩展Mine Script功能的一种方式。
用户自定义函数可通过两种形式编写:
- 单行形式(适用于简单函数)
- 多行形式
函数可定义在以下两个位置:
- 若函数仅在单个脚本中使用,可直接包含在该脚本内
无论采用单行还是多行形式,用户自定义函数均具有以下特性:
- 必须定义在脚本的全局作用域(不支持嵌套函数)
- 不支持递归调用(函数内部不能调用自身)
- 返回值类型由每次具体调用的参数类型自动确定
- 函数返回值即为函数体中最后一个表达式的值
- 脚本中每次函数调用都会维护独立的计算历史
单行函数
简单函数通常可以用单行代码编写。以下是单行函数的正式定义:
<function_declaration>
<identifier>(<parameter_list>) => <return_value>
<parameter_list>
{<parameter_definition>{, <parameter_definition>}}
<parameter_definition>
[<identifier> = <default_value>]
<return_value>
<statement> | <expression> | <tuple>以下是示例代码:
Mine Script®
已复制
声明函数 f() 后,可通过不同类型的实参进行调用:
Mine Script®
已复制
在上例中,变量a的类型是series,因为两个参数都是series。变量b的类型是integer,因为参数都是字面整数。变量c的类型是series,因为series与字面整数相加会产生series结果。
多行函数
Mine 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个制表符)开头。语句前的缩进表明它是函数体的一部分,而非脚本全局作用域的内容。在函数代码之后,第一个没有缩进的语句标志着函数体结束。
函数的最后一条语句应当是一个表达式或已声明的变量。该表达式(或变量)的结果将作为函数调用的返回值。例如:
Mine Script®
已复制
函数 geom_average 接收两个参数,并在函数体内创建两个变量 a 和 b。最后一条语句调用了 math.sqrt 函数(计算平方根)。geom_average 的调用将返回最后一个表达式的值:(math.sqrt(a + b))。
脚本中的作用域
在函数体或其他局部代码块外部声明的变量属于全局作用域。用户自定义函数、内置函数以及内置变量同样属于全局作用域。
每个函数拥有独立的局部作用域。函数内声明的所有变量及其参数均属于该函数的局部作用域,这意味着无法从外部(如全局作用域或其他函数的局部作用域)访问这些变量。
另一方面,由于可以从函数作用域内访问全局作用域中声明的任意变量或函数(递归调用自身除外),因此可以说局部作用域是嵌套在全局作用域中的。
在Mine Script中,不允许嵌套函数,即无法在一个函数内部声明另一个函数。所有用户函数都必须在全局作用域中声明,且局部作用域之间不能相互交叉。
返回多个结果的函数
在大多数情况下,函数仅返回单个结果,但也支持返回多个结果(类似元组的返回值):
Mine Script®
已复制
调用此类多返回值函数需要使用特殊语法:
Mine Script®
已复制
限制
用户自定义函数可使用除以下内置函数外的所有 Mine 函数:barcolor(), fill(), hline(), indicator(), library(), plot(), plotbar(), plotcandle(), plotchar(), plotshape(), strategy()。