外观
运算符
约 3176 字大约 11 分钟
简介
一些运算符用于构建返回结果的表达式:
其他运算符用于为变量赋值:
=用于为变量赋值,但仅限于声明变量时(第一次使用时):=用于为先前声明的变量赋值。以下运算符也可以这样使用:+=,-=,*=,/=,%=
正如类型系统页面所述,限定符和类型在确定表达式结果类型方面起着至关重要的作用。这反过来又会影响到如何使用这些结果以及使用哪些函数。表达式始终返回一个具有表达式中最强限定符的值,例如,如果将“input int”与“series int”相乘,表达式将产生“series int”结果,但您无法将其用作ta.ema()的参数length。
该脚本将产生编译错误:
Mine Script®
已复制
编译器会报错:Cannot call "ta.ema" with argument "length"="adjustedLength". An argument of "series int" type was used but a "simple int" is expected;。发生这种情况是因为 lenInput是一个“input int”,但却factor是一个“series int”(只能通过查看 每个条形图上的年份值来确定)。因此,adjustedLength变量被赋予了“series int”值。我们的问题是,ta.ema()的参考手册条目告诉我们其参数length需要一个“simple”值,这是一个比“series”更弱的限定符,因此不允许使用“series int”值。
解决我们的难题需要:
- 使用其他支持“series int”长度的移动平均函数,例如ta.ema(),或者
- 不使用计算来生成我们的长度的“series int”值。
算术运算符
Mine Script® 中有五种算术运算符:
| 运算符 | 意义 |
|---|---|
+ | 加法和字符串连接 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 模数(除法后的余数) |
上面的算术运算符都是二元的(意味着它们需要两个 操作数——或者说值——来操作,例如 in 1 + 2)。+ and -也可以作为一元运算符(意味着它们只需要一个操作数,例如 -1 or +1)。
如果两个操作数都是数字,但其中至少有一个是 float 类型,则结果也将是 float。如果两个操作数都是 int 类型,则结果也将是 int。如果至少一个操作数是 na,则结果也将是 na。
该+运算符还可用作字符串的连接运算符。 "EUR"+"USD"生成"EURUSD"字符串。
该%运算符通过将商向下舍入到尽可能低的值来计算模数。这里有一个简单的例子,有助于说明模数的幕后计算过程:
Mine Script®
已复制
比较运算符
Mine Script 中有六个比较运算符:
| 运算符 | 意义 |
|---|---|
< | 小于 |
<= | 小于或等于 |
!= | 不等于 |
== | 等于 |
> | 大于 |
>= | 大于或等于 |
比较运算是二进制的。如果两个操作数都是数值,则结果为bool类型,即true,false或 na。
例子:
Mine Script®
已复制
逻辑运算符
Mine Script 中有三个逻辑运算符:
| 运算符 | 意义 |
|---|---|
not | 否定 |
and | 逻辑与 |
or | 逻辑或 |
该运算not符为一元运算符。当应用于true, 结果为false,反之亦然。
and运算符真值表:
| a | b | a and b |
|---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
or运算符真值表:
| a | b | a or b |
|---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
?:三元运算符
?:三元运算符用于创建以下形式的表达式:
Mine Script®
已复制
三元运算符返回的结果取决于condition的值。如果为true,则valueWhenConditionIsTrue返回 。如果condition为false或na,则 valueWhenConditionIsFalse返回 。
可以使用三元表达式的组合来实现与switch结构相同的效果,例如:
Mine Script®
已复制
示例从左到右计算:
- 如果 timeframe.isintraday 为
true,则color.red返回 。如果为false,则评估timeframe.isdaily 。 - 如果 timeframe.isdaily 为
true,则color.green返回 。如果为false,则评估timeframe.ismonthly 。 - 如果 timeframe.ismonthly 为
true,则color.blue返回 ,否则 返回na。
请注意,每一侧的返回值:都是表达式 --- 而不是本地块。
[]历史引用运算符
可以 使用 []历史引用运算符来引用时间序列的过去值 。过去值是指变量在脚本当前执行的柱线(即 当前柱线)之前的柱线上的值。有关脚本在柱线上执行方式的更多信息,请参阅执行模型页面。
[]运算符用于变量、表达式或函数调用之后。运算符方括号内的值是我们要引用的过去偏移量。要引用距离当前柱线两根柱线的内置变量的volume值,可以使用volume[2]。
由于系列会动态增长,因此随着脚本在连续的柱状图上移动,运算符使用的偏移量将引用不同的柱状图。让我们看看相同偏移量返回的值是如何动态变化的,以及为什么系列与数组有很大不同。在 Mine Script 中, close变量或close[0]等效变量保存当前柱状图的“收盘价”。如果您的代码现在正在数据集的第三个柱状图(图表上所有柱状图的集合)上执行,close将包含该柱状图收盘价,close[1]将包含前一个柱状图(数据集的第二个柱状图)收盘价,以及close[2]第一个柱状图。close[3]将返回 na, 因为该位置不存在柱状图,因此其值不可用。
当在下一个柱状图上执行相同的代码时,数据集中的第四个柱状图close现在将包含该柱状图的收盘价,而close[1]代码中使用的相同代码现在将引用数据集中第三个柱状图的“收盘价”。数据集中第一个柱状图的收盘价现在为close[3],这次close[4]将返回 na。
在 Mine Script 运行时环境中,由于您的代码会针对数据集中的每个历史条形图执行一次,从图表左侧开始,Mine Script 会在序列中索引 0 处添加一个新元素,并将序列中现有元素向后移动一个索引。相比之下,数组可以具有恒定或可变的大小,并且其内容或索引结构不会被运行时环境修改。因此,Mine Script 序列与数组截然不同,仅在索引语法上与数组相似。
当图表交易品种的市场开放且脚本正在图表的最后一根柱状图(实时柱状图)上执行时,close返回当前价格的值。它仅包含脚本在该柱状图上最后一次执行时(即收盘时)实时柱状图的实际收盘价。
Mine Script 有一个变量,其中包含脚本正在执行的柱状图的编号: bar_index。在第一个柱状图上, bar_index 等于 0,并且在脚本执行的每个后续柱状图上,bar_index 都会加 1。在最后一个柱状图上, bar_index 等于数据集中的柱状图数量减一。
[]在 Mine Script 中 使用运算符时,还有另一个重要的注意事项需要牢记 。我们已经看到过历史记录引用可能返回na 值的情况。na 表示一个非数字的值,在任何表达式中使用它都会产生同样为 na的结果 (类似于NaN)。这种情况通常发生在脚本对数据集早期柱状图进行计算时,但在某些条件下也可能发生在后期柱状图。如果您的代码没有明确提供处理这些特殊情况的方法,它们可能会在脚本的计算中引入无效结果,并可能一直影响到实时柱状图。na 和 nz 函数旨在处理此类情况。
这些都是 [] 运算符的有效用法:
Mine Script®
已复制
请注意,[] 运算符只能对同一个值使用一次。以下情况是不允许的:
Mine Script®
已复制
运算符优先级
计算顺序由运算符的优先级决定。优先级高的运算符先计算。以下是按优先级降序排列的运算符列表:
| 优先级 | 运算符 |
|---|---|
| 9 | [] |
| 8 | 一元+,一元-,not |
| 7 | *,/,% |
| 6 | +,- |
| 5 | >,<,>=,<= |
| 4 | ==,!= |
| 3 | and |
| 2 | or |
| 1 | ?: |
如果一个表达式中有多个优先级相同的运算符,则按从左到右的顺序计算。
如果必须按照与优先级不同的顺序来计算表达式,则可以用括号将表达式的各个部分组合在一起。
=赋值运算符
该=运算符用于在变量初始化(或声明)时(即第一次使用)赋值。它表示这是一个我将要使用的新变量,并且我希望它在每根柱线上都以此值开始。
这些都是有效的变量声明:
Mine Script®
已复制
有关如何声明变量的更多信息,请参阅变量声明页面。
:=重新赋值运算符
:=用于将值重新赋给现有变量。它表示 使用之前在脚本中声明的变量,并赋予其新值。
先声明,然后使用 重新赋值的变量:=称为可变变量。以下所有示例均为有效的变量重新赋值。您可以 在“var”声明模式 部分 找到更多关于var工作原理的信息:
Mine Script®
已复制
注意:
- 我们声明
pHi用以下代码:var float pHi = na。var 关键字 告诉 Mine Script,我们只希望在数据集的第一个柱状图上用na初始化该变量。float关键字告诉编译器,我们正在声明一个“float”类型的变量。这是必要的,因为与大多数情况不同,编译器无法自动确定符号=右侧值的类型。 - 由于使用了var,变量声明只会在第一个柱状图上执行 ,而该
pHi := nz(ta.pivothigh(5, 5), pHi)行则会在图表的所有柱状图上执行。在每个柱状图上,它会评估 pivothigh() 调用是否返回 na, 因为当函数未找到新的枢轴时,它会这样做。nz() 函数执行“检查 na ”部分。当其第一个参数(ta.pivothigh(5, 5))为 na 时,它会返回第二个参数(pHi)而不是第一个。当 pivothigh() 返回新找到的枢轴的价格点时,该值将分配给pHi。当它由于未找到新的枢轴而返回 na时 ,我们将的先前值pHi分配给其自身,实际上保留了其先前的值。
我们的脚本的输出如下所示:

注意:
- 该线将保留其先前的值,直到找到新的枢轴。
- 在枢轴实际发生后五根柱线处检测到枢轴,因为我们的
ta.pivothigh(5, 5)调用表明我们需要在高点两侧各有五个较低的高点才能将其检测为枢轴。
有关如何为变量重新赋值的更多信息,请参阅 变量重新赋值部分。