在所有Pine Script的运算符里,有一个你每天、每行代码几乎都会用到的家伙,那就是赋值运算符 =
。
它的作用很简单,就是把一个值装进一个变量里,别看它简单,这里面可有不少新手必踩的坑,甚至一些规则和其他编程语言完全不同,今天咱们就把它彻底搞明白。
赋值运算符 =
的用途
=
是一个二元运算符,意思是它的左右两边都要有东西,它的核心工作就是,把右边的值,赋给左边的变量,主要用在两个场景下:
1. 为变量赋值
这是最常见的用法,无论是你写死的一个数字、一个从历史K线上取回来的值,还是一个复杂函数的计算结果,都可以用 =
装进一个变量里,方便后续使用。示例如下:
closingPrice = 100
prevVolume = volume[1]
emaValue = ta.ema(low, 20)
在上面的代码中,我们首先将一个常量值 100
赋给了 closingPrice
变量。接着,通过历史引用运算符 []
获取了前一根K线的成交量 (volume[1]
),并将其结果赋给了 prevVolume
变量。最后,我们将 ta.ema()
函数(一个用于计算指数移动平均线的内置函数)的计算结果,存入了 emaValue
这个变量系列中。
2. 为函数参数赋值
除了给变量赋值,=
还有一个高频用途,就是在调用函数时,为它的参数指定具体的值。你几乎在每个指标的开头都会这么写:
indicator(title="Example script", overlay=true)
这里的 indicator()
就是一个Pine Script的内置函数,我们用 =
把字符串"示例脚本"
赋给了title
参数,把布尔值true
赋给了overlay
参数,从而完成了对这个指标的基本设置。
避坑一:Pine Script独有的“一次性”赋值
注意,接下来是重点,也是所有从其他编程语言转过来的朋友最容易懵圈、最常犯错的地方!
在Pine Script里,一个变量用 =
赋值之后,就不能再用=
给它赋一个新值了。你没听错,变量用 =
声明并赋值后,这个动作就不能再对它重复。
例如,下面的这种写法,在Pine Script里是绝对错误的:
//@version=6
indicator(title="赋值示例", overlay=true)
// 第一次为变量赋值
averageClose = (close + close[1]) / 2
// 尝试第二次为同一个变量赋值
averageClose = ta.sma(close, 10)
plot(averageClose, linewidth=3)
在这段代码里,我们试图把 averageClose
的值从“两根K线的收盘价平均值”修改为“10周期的SMA值”。这个想法很自然,但Pine Script的编译器不接受,一旦你尝试保存,它就会报错:
这个错误信息直截了当,告诉你 averageClose
这个变量已经被“占用”了。
那想更新一个值怎么办?很简单,这也是Pine Script的常规思路:创建一个新变量来存储新值,就像这样:
//@version=6
indicator(title="赋值示例", overlay=true)
averageClose = (close + close[1]) / 2
smaClose = ta.sma(close, 10)
plot(smaClose, linewidth=3)
我们不再去修改 averageClose
,而是声明了一个全新的变量 smaClose
来存放SMA的计算结果。这样代码就能顺利运行了:
避坑指南二:=
vs ==
,赋值还是判断?
另一个经典大坑,就是把“赋值”和“判断相等”搞混。即使是老手,偶尔思路不清的时候也可能犯这种低级错误。
请一定牢记这两者的区别:
=
(一个等号)是赋值,是放进去、存起来的动作。==
(两个等号)是判断,是比一比、看是否相等的动作。
我们来看一个典型的错误,本该用 ==
判断的地方,错用了 =
:
//@version=6
indicator(title="赋值示例2", overlay=true)
colour = high = ta.highest(high, 20) ? color.green : color.red
barcolor(colour)
这段代码的意图是:判断当前K线的最高价 high
是否等于 近20根K线的最高价 ta.highest(high, 20)
。如果相等,颜色(colour
)就设为绿色,否则为红色。
但代码里写的 high = ta.highest(high, 20)
变成了赋值操作,等于是在命令程序“把20周期最高价的值,赋给high变量”,这在逻辑上和语法上都讲不通,所以编译器直接就报错了:
反过来,在需要赋值的地方误用 ==
同样是错的。比如,我们修正了判断部分的错误,却在给 colour
变量赋值时犯了错:
//@version=6
indicator(title="赋值示例
2", overlay=true) colour == high == ta.highest(high, 20) ? color.green : color.red barcolor(colour)
现在high == ta.highest(high, 20)
这个判断是正确的了,但我们把最开始的 colour =
写成了 colour ==
,这等于是在“判断”colour
变量是否等于后面那一长串计算的结果,而不是把结果“赋给”它。所以,这同样会触发编译错误:
当然,正确的代码应该结合使用这两种运算符:用赋值运算符(=
)为 colour
变量赋予其值,同时用相等运算符(==
)来判断当前K线的最高价是否为近20根K线的最高点:
//@version=6
indicator(title="赋值示例2", overlay=true)
colour = high == ta.highest(high, 20) ? color.green : color.red
barcolor(colour)
在这个最终版本里:high == ta.highest(high, 20)
:使用 ==
进行判断,返回 true
或 false
;然后? color.green : color.red
:根据判断结果,选择一个颜色值;最后colour = ...
:使用 =
进行赋值,把最终选出的颜色值,存入 colour
变量。
这样逻辑清晰,语法正确,脚本才能完美运行:
添加到图表后,脚本如下所示,当K线的最高价创下20周期新高时,K线就会被涂成绿色:
除了赋值运算符,其他常用的运算符还包括:用于数学计算的算术运算符,用于比较数值的比较运算符,以及用于组合多个true
/false
表达式的逻辑运算符。
好了,关于赋值运算符 =
今天就聊到这。核心就两点:
- 在Pine Script里,用
=
赋值更像是一次性的声明,一个变量不能被=
重复赋值。 - 死死记住:
=
是赋值,==
是判断相等。这是两条截然不同的路。
记住这两条,你就能在Pine Script的编程路上,避开80%关于赋值的新手错误。