保持敬畏之心
交易是一场持久战

Pine Script(3):赋值运算符的使用

在所有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):使用 == 进行判断,返回 truefalse;然后? color.green : color.red:根据判断结果,选择一个颜色值;最后colour = ...:使用 = 进行赋值,把最终选出的颜色值,存入 colour 变量。

这样逻辑清晰,语法正确,脚本才能完美运行:

添加到图表后,脚本如下所示,当K线的最高价创下20周期新高时,K线就会被涂成绿色:

除了赋值运算符,其他常用的运算符还包括:用于数学计算的算术运算符,用于比较数值的比较运算符,以及用于组合多个true/false表达式的逻辑运算符。

好了,关于赋值运算符 =今天就聊到这。核心就两点:

  1. 在Pine Script里,用 = 赋值更像是一次性的声明,一个变量不能被 = 重复赋值。
  2. 死死记住:= 是赋值,== 是判断相等。这是两条截然不同的路。

记住这两条,你就能在Pine Script的编程路上,避开80%关于赋值的新手错误。

赞(0)
未经允许不得转载:图道交易 » Pine Script(3):赋值运算符的使用
分享到

评论 抢沙发