外观
类型系统
约 10656 字大约 36 分钟
简介
Mine Script®的类型系统决定了脚本值与各种函数和操作的兼容性。虽然不了解类型系统也能编写简单脚本,但要熟练掌握这门语言就需要对其有基本理解,而深入掌握其精妙之处才能充分发挥该语言的潜力。
Mine通过类型对所有值进行分类,并通过限定符确定值和引用是常量(首次执行脚本时确立)还是在每次执行中动态变化。这套系统适用于所有Mine值和引用,包括字面量、变量、表达式、函数返回值和函数参数。
该类型系统与Mine的执行模型和时间序列概念紧密交织。只有同时理解这三者,才能真正释放Mine Script的强大功能。
注意
为简洁起见,我们常用"类型"来指代"限定类型"。
限定符
Mine Script限定符用于标识值何时可被脚本访问:
- const限定的值在编译时确定(即在Mine Editor中保存脚本或将其添加到图表时)
- input限定的值在输入时确定(即根据用户通过"设置/输入"选项卡确认值时)
- simple限定的值在零号K线确定(即脚本首次执行时)
- series限定的值可在脚本执行过程中持续变化
Mine Script 的类型限定符强度层级为:const < input < simple < series,其中 “const” 为最弱限定符,“series” 为最强限定符。该层级对应以下规则:当变量、函数或操作兼容特定限定类型时,也接受更弱限定符的值。
脚本始终根据计算中的最强限定符确定表达式返回值的限定类型。例如,计算同时包含 “input” 和 “series” 值的表达式将返回 “series” 限定值。此外,脚本不能将值的限定符降级到层级中更弱的类型。若值获得更强限定符(如初始推断为 “simple” 的值在执行中变为 “series”),该状态不可逆。
需注意:“series” 限定值是唯一能在脚本执行间变化的值(包括 close、volume 等内置变量及含 “series” 值的表达式结果),而 “const”、“input” 或 “simple” 限定的值在所有执行中保持不变。
const
“const” 限定的值或引用在编译时确定(脚本开始执行前)。编译发生在保存脚本时,无需加载到图表。“const” 值在脚本所有执行中保持恒定(包括首次执行)。
所有字面量及纯 “const” 表达式的结果自动获得 “const” 限定。
以下是各类字面量值的示例:
- 整型字面量:
1,-1,42 - 浮点型字面量:
1.,1.0,3.14,6.02E-23,3e8 - 布尔型字面量:
true,false - 颜色字面量:
#FF55C6,#FF55C6ff - 字符串字面量:
"A text literal","Embedded single quotes 'text'",'Embedded double quotes "text"'
我们的风格指南建议使用大写SNAKE_CASE命名“const”变量以提高可读性。虽然这不是强制要求,但在声明“const”变量时也可以使用var关键字,这样脚本就只会在数据集的第一个柱上初始化它们。更多信息请参阅我们用户手册中的相关章节。
以下示例展示了如何在indicator()和plot()函数中使用“const”值,这两个函数都要求其title参数必须是“const string”限定类型的值:
Mine Script®
已复制
以下示例将引发编译错误,因为它使用了syminfo.ticker——该函数返回的是“simple”限定值,因为它依赖于只能在脚本首次执行后才能获取的图表信息:
Mine Script®
已复制
const 关键字用于声明具有常量赋值的变量和参数。使用此关键字声明变量将禁止对其进行重新赋值和复合赋值操作。例如,以下脚本使用该关键字声明了 myVar 变量,然后尝试使用加法赋值运算符 (+=) 为其分配新的浮点数值,从而导致编译错误:
Mine Script®
已复制
需要重点注意的是:使用 const 关键字声明变量会强制其保持对特定表达式返回值的恒定引用,但这并不决定所赋值本身的特性。例如,脚本可以声明一个 const 变量,该变量恒定引用返回特殊类型ID的表达式。虽然脚本不能重新分配该变量,但被分配的ID可能是“series”类型的值:
Mine Script®
已复制
input
多数被限定为“input”的值是通过input.*()函数在初始化后确立的。这些函数产生的值,用户可以在脚本设置的"输入"选项卡中修改。当更改该选项卡中的任何值时,脚本会从图表历史数据的起点重新开始运行,以确保所有输入值在执行过程中保持一致。Mine内置的一些变量(例如chart.bg_color)同样使用“input”限定符,尽管它们并非由input.*()函数返回——因为脚本在输入时获取这些值。
注意
input.source()和input.enum()函数是input.*()命名空间中的例外,它们不会返回“input”限定的值。input.source()函数返回“series”值,因为诸如开盘价和收盘价等内置变量以及其他脚本绘图的值都具有“series”限定符。input.enum()函数返回“simple”结果,因为枚举的所有值在脚本首次执行时就可获取。更多信息请参阅本手册的输入页面。
以下脚本通过symbolInput和timeframeInput上下文绘制sourceInput的值。该脚本中的request.security()调用是有效的,因为其symbol和timeframe参数允许“simple string”类型的参数,这意味着它们也可以接受“input string”值,因为“input”限定符在层级关系中处于较低级别:
Mine Script®
已复制
simple
被限定为“simple”的值在脚本首次执行时确立,并在后续执行中保持不变。
用户可以通过在声明中包含simple关键字来明确定义接受“simple”值的变量和参数。
许多内置变量返回“simple”限定值,因为它们依赖于脚本开始运行后才能获取的图表信息。此外,许多内置函数要求使用不随时间变化的“simple”参数。只要脚本允许使用“simple”值,就可以接受“input”或“const”限定的值。
该脚本通过检测非标准图表类型来警告用户,使用chart.is_standard的值计算isNonStandard变量,然后使用该变量的值计算warningColor,该颜色也引用了“simple”值。bgcolor()的color参数允许“series color”参数,这意味着它也可以接受“simple color”值,因为“simple”在层级中处于较低级别:
Mine Script®
已复制
series
被限定为“series”的值在脚本中提供最大的灵活性,因为它们可以在不同执行间变化。
用户可以通过在声明中包含 series 关键字来明确定义接受“series”值的变量和参数。
内置变量如开盘价(open)、最高价(high)、最低价(low)、收盘价(close)、成交量(volume)、时间(time)和柱索引(bar_index),以及使用这些内置变量的任何表达式结果,都被限定为“series”。返回动态值的任何函数或操作的结果也总是“series”类型,使用历史引用运算符 [] 访问历史值的结果也是如此。只要脚本允许使用“series”值,它也会接受具有任何其他限定符的值,因为“series”是层级中最高的限定符。
以下脚本显示 sourceInput 在 lengthInput 柱数内的最高值和最低值。赋值给 highest 和 lowest 变量的值属于“series float”限定类型,因为它们可以在脚本执行过程中变化:
Mine Script®
已复制
类型
Mine Script 类型用于对值进行分类,并确定它们与哪些函数和操作兼容。包括:
- 基础类型:int、float、bool、color 和 string
- 特殊类型:plot、hline、line、linefill、box、polyline、label、table、chart.point、array、matrix 和 map
- 用户自定义类型(UDTs)
- 枚举类型
- void
基础类型(Fundamental types)指代值的本质属性,例如:数值1属于“int”类型,1.0属于“float”类型,“AAPL”属于“string”类型等。特殊类型和用户自定义类型使用引用特定类型对象的ID。例如,“label”类型的值包含一个作为指针引用“label”对象的ID。“void”类型指代不返回可用值的函数或方法的输出。
Mine Script可以自动将某些类型的值转换为其他类型。自动转换规则为:int → float → bool。更多信息请参阅本页的类型转换部分。
在大多数情况下,Mine Script可以自动确定值的类型。但为了代码可读性以及需要明确定义的场景(例如声明赋值为na的变量),我们也可以使用类型关键字显式指定类型。例如:
Mine Script®
已复制
int
“int”类型的值代表整数,即不包含小数部分的完整数字。
整数字面量是采用十进制表示法的数值,例如:
Mine Script®
已复制
内置变量如 bar_index、time、timenow、dayofweek 和 strategy.closedtrades 均返回“int”类型的值。
float
“float”类型的值代表浮点数,即包含整数和小数部分的数值。
浮点数字面量是使用.分隔符书写的数值,也可包含符号e或E(表示“10的X次幂”,X是e或E后的数字)。例如:
Mine Script®
已复制
“float”值在Mine Script中的内部精度为1e-16。
内置变量如close(收盘价)、hlc3(高低收平均值)、volume(成交量)、ta.vwap(成交量加权平均价)和strategy.position_size(策略持仓量)都返回“float”类型的值。
bool
“bool”类型的值表示比较或条件的真值,可用于条件结构及其他表达式中。
布尔值仅有以下两个字面量表示:
Mine Script®
已复制
“bool”类型永远不能为na,任何可能返回na的条件结构将改为返回false。例如,if条件返回布尔值,当条件不满足且未指定else块时,它将返回false。
内置变量如barstate.isfirst(是否首根K线)、session.ismarket(是否交易时段)、timeframe.isdaily(是否日线周期)均返回“bool”类型的值。
color
颜色字面量具有以下格式:#RRGGBB 或 #RRGGBBAA。字母组合代表十六进制值,范围在 00 到 FF 之间(即十进制 0 到 255),其中:
RR、GG和BB组合分别代表颜色的红色、绿色和蓝色分量的值。AA是表示颜色透明度(或 alpha 分量)的可选值,其中00表示完全透明,FF表示不透明。如果字面量不包含AA组合,脚本会将其视为完全不透明(等同于使用FF)。- 字面量中的十六进制字母可以大写或小写。
以下为“color”类型字面量的示例:
Mine Script®
已复制
Mine Script 还内置了颜色常量,包括 color.green(绿色)、color.red(红色)、color.orange(橙色)、color.blue(蓝色,plot*() 函数的默认颜色以及绘图类型中许多颜色相关属性的默认值)等。
使用内置颜色常量时,可以通过 color.new() 函数为其添加透明度信息。
请注意,在 color.*() 函数中指定红、绿或蓝分量时,我们使用 0 到 255 之间的“int”或“float”参数;指定透明度时,则使用 0 到 100 之间的值,其中 0 表示完全不透明,100 表示完全透明。例如:
Mine Script®
已复制
更多关于在脚本中使用颜色的信息,请参阅用户手册中的颜色使用指南部分。
string
“string”类型的值表示由字母、数字、符号、空格及其他字符组成的序列。
Mine中的字符串字面量是用单引号或双引号包裹的字符,例如:
Mine Script®
已复制
在 Mine Script 中,单引号和双引号在功能上完全等效。用双引号包裹的“string”可以包含任意数量的单引号,反之亦然:
Mine Script®
已复制
在 Mine Script 中,可以使用反斜杠 (\) 对字符串中的引号定界符进行转义。例如:
Mine Script®
已复制
我们可以创建包含换行转义字符 (\\n) 的“string”值,用于在以下场景显示多行文本:
plot*()函数族log.*()日志函数- 绘图类型对象
示例如下:
Mine Script®
已复制
我们可以使用 + 运算符连接“string”类型的值:
Mine Script®
已复制
str.*() 命名空间中的内置函数通过专门操作创建“string”类型的值。例如,以下脚本创建格式化字符串来表示“float”类型的价格值,并使用标签显示结果:
Mine Script®
已复制
请参阅我们用户手册中关于[文本和形状]的页面,了解有关从脚本显示“string”值的更多信息。
内置变量如 syminfo.tickerid、syminfo.currency 和 timeframe.period 都返回“string”类型的值。
plot和hline
Mine Script 的 plot() 和 hline() 函数会返回分别引用“plot”和“hline”类型实例的 ID。这些类型用于在图表上显示计算结果和水平线,并且可以将它们的 ID 赋值给变量,以便与内置的 fill() 函数一起使用。
例如,以下脚本在图表上绘制两条 EMA 线,并使用 fill() 调用填充它们之间的区域:
Mine Script®
已复制
需要特别注意的是,与其他特殊类型不同,Mine Script中不存在用于显式声明变量为“plot”或“hline”类型的plot或hline关键字。
用户可通过display.*命名空间中的变量和plot*()函数的force_overlay参数控制脚本绘图显示位置。此外,一个脚本可以通过input.source()函数将另一个脚本的绘图值用作外部输入(详见用户手册的数据源输入章节)。
绘图类型
Mine Script绘图类型允许脚本在图表上创建自定义绘图,包括以下类型:线(line)、线填充(linefill)、方框(box)、多段线(polyline)、标签(label)和表格(table)。
每种类型都有一个包含所有创建和管理绘图实例的内置函数的命名空间。例如,以下*.new()构造函数在脚本中创建这些类型的新对象: line.new()、linefill.new()、box.new()、polyline.new()、label.new()和table.new()。
这些函数返回一个ID作为唯一标识绘图对象的引用。ID始终被限定为“series”,因此其限定类型为“series line”、“series label”等。绘图ID类似指针,因为每个ID在对应绘图命名空间的所有函数中引用特定的绘图实例。例如,通过line.new()调用返回的线ID,可在后续使用line.delete()删除该特定对象时作为引用依据。
图表点
图表点(chart.point)是表示图表坐标的特殊类型。脚本通过chart.point对象确定线、框、多段线和标签的位置。 此类对象包含三个字段:time(时间戳)、index(K线索引)和price(价格)。绘图实例使用time还是index作为X坐标,取决于其xloc属性。
在 Mine Script 中创建图表点(chart.point)的可用函数:
- chart.point.new() - 创建包含指定
time、index和price的新图表点对象 - chart.point.now() - 创建具有指定价格坐标的新图表点,其
time和index字段自动填充为函数执行时的值(当前K线的 time 和 bar_index) - chart.point_from_index() - 创建具有索引X坐标(
index)和价格Y坐标(price)的新图表点。其time字段始终为 na,因此无法用于使用 xloc.bar_time 的绘图对象 - chart.point.from_time() - 创建具有时间X坐标(
time)和价格Y坐标(price)的新图表点。其index字段始终为 na,因此无法用于使用 xloc.bar_index 的绘图对象 - chart.point.copy() - 创建与函数调用中
id参数所含time、index和price信息相同的新图表点
以下示例在每根K线上绘制连接前一根K线最高点和当前K线最低点的直线,并在两点显示标签。直线和标签的坐标通过firstPoint和secondPoint变量获取,这些变量引用使用 chart.point_from_index() 和 chart.point.now() 创建的图表点:
Mine Script®
已复制
集合类型
Mine Script中的集合类型(数组、矩阵和映射)使用引用ID机制,与其他特殊类型(如标签)类似。集合ID的类型定义了集合包含元素的类型。在Mine中,我们通过在array、matrix或map关键字后添加类型模板来指定集合类型:
array<int>定义包含"int"类型元素的数组array<label>定义包含"label"类型ID的数组array<UDT>定义包含用户自定义类型(UDT)对象ID的数组matrix<float>定义包含"float"类型元素的矩阵matrix<UDT>定义包含用户自定义类型(UDT)对象ID的矩阵map<string, float>定义包含"string"类型键和"float"类型值的映射map<int, UDT>定义包含"int"类型键和用户自定义类型(UDT)实例ID的映射
例如,可以通过以下任意一种等价方式声明一个包含单个元素值10的“int”数组:
Mine Script®
已复制
需要特别注意以下事项:
int[]语法也可用于指定“int”元素数组,但不推荐使用此写法。矩阵(matrix)和映射(map)没有等效的简写语法。- 数组存在类型特定的内置函数(如array.new_int()),但更推荐使用通用的array.new<type>形式。例如创建“int”元素数组时,使用
array.new<int>()。
用户自定义类型
type 关键字允许创建用户自定义类型(UDTs),脚本可基于此类类型创建对象。UDT 是复合类型,可包含任意数量、任意类型的字段(包括其他用户自定义类型)。
用户自定义类型的声明语法如下:
[export ]type <UDT_identifier>
<field_type> <field_name>[ = <value>]
...说明如下:
<UDT_identifier>是用户自定义类型的名称。<field_type>是字段的类型。<field_name>是字段的名称。<value>是字段的可选默认值。创建该UDT的新对象时,脚本会将此值赋给字段。若未提供默认值,则字段默认为na。字段默认值的规则与函数参数默认值规则相同,例如:不能使用历史引用运算符[]的结果,不能使用包含运算符的表达式。
以下示例声明了一个 pivotPoint 用户自定义类型(UDT),包含 “int” 类型的 pivotTime 字段和 “float” 类型的 priceLevel 字段,分别用于存储计算所得枢轴点的时间和价格信息:
Mine Script®
已复制
用户自定义类型支持类型递归,即UDT的字段可以引用相同UDT的对象。我们在之前的pivotPoint类型中添加了nextPivot字段,该字段引用另一个pivotPoint实例:
Mine Script®
已复制
脚本可以使用两种内置方法来创建和复制UDT:new()和copy()。如需了解更多关于UDT操作的信息,请参阅用户手册中的对象章节。
枚举类型
enum 关键字用于创建枚举类型(也称为枚举或枚举类型)。枚举是一种包含唯一命名成员(即可能的取值)的特殊类型结构,可用于控制变量、条件表达式和集合的取值,并通过 input.enum() 函数方便地创建下拉菜单输入项。
枚举的声明语法如下:
[export ]enum <enumName>
<field_1>[ = <title_1>]
<field_2>[ = <title_2>]
...
<field_N>[ = <title_N>]在枚举类型声明中:
<enumName>是枚举类型的名称。脚本可在变量声明和类型模板中使用该名称作为类型关键字。<field_*>是枚举字段名称,代表该枚举类型的命名成员(值)。每个字段必须具有唯一名称,且不得与枚举中其他字段的名称或标题重复。通过点标记法(enumName.fieldName)引用枚举成员。<title_*>是分配给字段的“const string”类型标题。若未指定标题,则默认使用字段名称的字符串形式作为标题。input.enum() 函数会在脚本的“设置/输入”选项卡下拉菜单中显示这些标题,用户也可通过 str.tostring() 获取字段标题。与字段名称类似,每个字段的标题不得与其他字段的名称或标题重复。
以下示例声明了一个 maChoice 枚举类型。该声明中的每个字段都代表 maChoice 枚举类型的一个独立成员:
Mine Script®
已复制
需要注意的是:
枚举的所有可能值在脚本首次执行时就已经确定,并且在后续执行过程中不会改变。因此,枚举值会自动采用simple限定符。
在以下脚本中,maChoice 枚举通过 input.enum() 调用创建了“设置/输入”选项卡中的下拉菜单,该菜单显示所有字段标题。maInput 的值代表用户所选标题对应的枚举成员。脚本在 switch 结构中根据所选成员计算对应的内置移动平均线:
Mine Script®
已复制
更多关于枚举和枚举输入的使用方法,请参阅用户手册中的枚举章节和输入参数章节的枚举输入部分。
void
Mine Script 中存在“void”类型。仅产生副作用而不返回可用结果的函数会返回“void”类型。例如 plotchar() 函数:它会执行,但不返回可用值。
脚本不能在表达式中使用“void”结果,也不能将其赋值给变量。Mine Script 中没有 void 关键字,因为无法声明“void”类型的变量。
na 值
Mine Script 中存在一个特殊值 na("not available"的缩写),用于表示变量或表达式的未定义值,其功能类似于 Java 中的 null 或 Python 中的 None。
脚本可自动将 na 值转换为几乎所有类型,但在某些情况下,当存在多个可能的类型转换规则时,编译器无法推断 na 的具体类型。例如:
Mine Script®
已复制
上述代码行会导致编译错误,因为编译器无法确定变量 myVar 的类型特性,即无法判断该变量后续将用于:
- 引用绘图所需的数值
- 设置标签文本的字符串值
- 或脚本执行过程中其他用途的值
要解决此类错误,必须显式声明变量的关联类型。假设 myVar 变量将在后续脚本迭代中引用“float”类型的值,可以通过使用 float 关键字声明变量来解决错误:
Mine Script®
已复制
或者通过 float() 函数将 na 值显式转换为"float"类型:
Mine Script®
已复制
要检测变量或表达式的值是否为 na,可以调用 na() 函数。当值为未定义时,该函数返回 true。例如:
Mine Script®
已复制
禁止使用 == 运算符检测 na 值,因为未定义值无法进行等价比较:
Mine Script®
已复制
注意
任何逻辑比较中若一个或两个变量为na,则始终返回false。此行为可能违反直觉并导致意外结果。
最佳编程实践通常需要处理 na 值,以防止计算中出现未定义值。
我们可以通过 nz() 函数确保表达式在首个 K 线上也能返回可操作的值。以下代码使用 nz() 函数,当过去 K 线的收盘价为 na 时,用当前 K 线的开盘价替代:
Mine Script®
已复制
在脚本中防范空值(na)实例有助于避免计算结果的传播中出现未定义值。例如以下脚本在第一根K线上声明了历史最高价(allTimeHigh)变量,随后通过math.max()函数比较历史最高价与当前K线最高价,并在执行过程中持续更新该变量:
Mine Script®
已复制
这段脚本会在所有K线上绘制出空值(na),因为代码中未包含任何空值防护机制。为修正该现象并准确绘制预期结果(即图表价格的历史最高点),我们可以使用nz()函数替换allTimeHigh序列中的空值:
Mine Script®
已复制
类型模板
类型模板规定了集合([数组]、[矩阵]和[映射])所能包含的数据类型。
[数组]和[矩阵]的模板由单个类型标识符外加尖括号构成,例如:<int>(整型)、<label>(标签类型)、<PivotPoint>(其中 PivotPoint 为用户自定义类型 (UDT))。
[映射]的模板则由两个置于尖括号内的类型标识符组成:第一个指定键值对中键的类型,第二个指定值的类型。例如:<string, float> 是一个映射的类型模板,表示该映射使用字符串作为键,并存储浮点数值。
用户可从以下类型构建类型模板:
- 基础类型:int、float、bool、color 和 string
- 特殊类型:line、linefill、box、polyline、label、table 和 chart.point
- 用户自定义类型(UDTs)
- 枚举类型
需要特别注意:
脚本使用类型模板声明引用集合的变量,并在创建新的集合实例时使用该模板:
Mine Script®
已复制
类型转换
Mine Script 包含自动类型转换机制,必要时会将整型(int)值强制转换为浮点型(float)。需要浮点型值的变量或表达式也可使用整型值,因为任何整数都能表示为小数部分为0的浮点数。
为了向后兼容,当需要布尔型(bool)时,Mine Script 也会自动将整型(int)和浮点型(float)值强制转换为布尔型(bool)。当向需要布尔型的函数参数或运算传递数值时,Mine 会将其自动转为布尔型。但我们不建议依赖此行为。大多数将数值自动转为布尔型的脚本会产生编译器警告。通过使用显式将数值转为布尔型的 bool() 函数,既可避免编译器警告,又能提升代码可读性。
当整型或浮点型转为布尔型时:数值为0时转换为 false,不为0时始终转换为 true。
以下是展示 Mine 中已废弃的自动类型转换行为的代码示例。该脚本在每根 K 线上创建一个 “series float”(浮点序列)类型的变量 randomValue,并将其传递至 if 结构的condition 参数和 plotchar() 函数的series 参数。由于这两个参数均接受布尔型(bool)值,脚本在计算时会自动将 randomValue 转换为布尔型:
Mine Script®
已复制
当自动转换规则不适用时,有时需要显式执行类型转换。针对这类情况,可使用以下类型转换函数: int(), float(), bool(), color(), string(), line(), linefill(), label(), box(), table()。
以下示例展示了尝试将 “const float”(常量浮点数)用作 ta.sma() 函数调用中 length 参数长度的代码。由于无法自动将浮点值转为所需的整数类型(int),该脚本将编译失败:
Mine Script®
已复制
此代码会引发以下错误:“Cannot call ‘ta.sma’ with argument ‘length’=‘LENGTH’. An argument of ‘const float’ type was used but a ‘series int’ is expected.”。
编译器明确指出:代码在需要整数(int)的位置使用了浮点数(float)值。由于不存在将浮点数自动转换为整数的规则,我们必须手动完成转换。在下面的修正版代码中,我们使用 int() 函数在 ta.sma() 调用中显式将浮点数 LENGTH 值转为整型:
Mine Script®
已复制
显式类型转换在声明赋予空值(na)的变量时同样适用,如上一节所述。
例如,可通过以下两种等效方式之一,将初始值为 na 的变量显式声明为 “label” 类型:
Mine Script®
已复制
元组
*元组(tuple)*是由方括号包裹的逗号分隔表达式集合。当函数、方法或其他局部代码块需要返回多个值时,脚本会以元组形式返回这些结果。
例如,下列用户自定义函数返回两个浮点数(float)的和与积:
Mine Script®
已复制
在脚本后续调用此函数时,可通过元组声明实现:声明多个变量分别对应函数调用的返回值:
Mine Script®
已复制
需要特别注意的是:与声明单变量不同,在元组中无法显式定义变量类型(例如本例中的 hlSum 和 hlProduct)。编译器会自动推断元组中变量对应的类型。
在上例中,生成元组包含同类型值(均为 “float”)。但需强调:元组可包含多种类型值。例如,以下 chartInfo() 函数返回一个包含五种类型的元组——含 “int”, “float”, “bool”, “color” 和 “string” :
Mine Script®
已复制
元组(tuple)在处理 request.security() 单次调用中获取多个值的场景下尤为高效。
例如,以下 roundedOHLC() 函数返回一个包含 OHLC 值(开盘价、最高价、最低价、收盘价)的元组,这些值已被舍入处理至最接近该标的最小跳动点值的整数倍。在 request.security() 的expression参数中调用此函数,可一次性获取日线级别的 OHLC 元组数据:
Mine Script®
已复制
同样可以通过在 request.security() 的expression参数中直接传递舍入值元组实现等效功能:
Mine Script®
已复制
局部条件结构(包括 if 和 switch 语句)的代码块可返回元组(tuple)。例如:
Mine Script®
已复制
和:
Mine Script®
已复制
三元表达式不能包含元组,因为其返回值分支不被视为局部代码块:
Mine Script®
已复制
请注意, 函数返回的元组中所有元素的类型限定符(“simple”简单类型或“series”序列类型)取决于其内容。若元组包含任一“series”序列值,则所有元素都将自动继承“series”序列限定符。例如:
Mine Script®
已复制