在Pine Script中有以下7类运算符/操作符(Operators):
● 数学运算符(Arithmetic Operators)。
● 比较运算符(Comparison Operators)。
● 逻辑运算符(Logical Operators)。
● 条件运算符(Conditional Operator)。
● 历史数据引用操作符(History Reference Operator)。
● 赋值运算符(Assignment Operator)。
● 再赋值运算符(Reassignment Operator)。
在Pine Script中有5个数学运算符,如表6-1所示。
表6-1 数学运算符列表
数学运算符表达式结果的类型取决于操作数的类型。
● 如果操作数中至少有一个是series类型,那么结果也是series类型。
● 如果两个操作数都是数值类型,且其中至少有一个是float类型,那么结果也是float类型。
● 如果两个操作数都是int型,那么结果也是int型。
● 如果至少有一个操作数是na,那么结果也是na。
当“+”“-”分别表示正号与负号时,是一元运算符,只有一个操作数。这里用“unary+”“unary-”区分。
在Pine Script中有6个比较运算符,如表6-2所示。
表6-2 比较运算符列表
比较运算表达式结果的类型由操作数的类型决定。
● 如果比较运算符两侧的操作数中至少有一个是series类型的,那么结果是series bool类型的。
● 如果两个操作数都是numeric(数值)类型的,则结果为bool类型的。
在Pine Script中有3个逻辑运算符,如表6-3所示。
表6-3 逻辑运算符列表
所有逻辑运算符都可以使用bool类型、numeric类型或者series类型的操作数进行运算。类似数学运算符和比较运算符,如果逻辑运算符两侧的操作数至少有一个是series类型的,那么结果也是series类型的。在其他所有情况下,结果都是bool类型的。
not是一元运算符,其只有一个操作数,且操作数只能是true或false。not true的结果是false,反之亦然。
条件运算符“?:”是三元运算符,通常用于条件表达式。条件表达式中包含3个操作数。
条件表达式:condition?result1:result2。在这里,如果condition为true,则条件表达式返回result1,否则返回result2。
条件运算符的组合可以构建类似其他编程语言中的switch语句的结构。例如,下面“=”右侧的多层条件表达式:
为了增加可读性和使逻辑更清晰,上面的表达式也可以改写为:
上面例子的运算逻辑为:若时间周期为日内(timeframe.isintraday=true),则c1=color.red;若时间周期为每日(timeframe.isdaily=true),则c1=color.green;若时间周期为每月(timeframe.ismonthly=true),则c1=color.blue;若前面条件都不满足,则c1=na。
Pine Script中的历史行情数据即series数据,可以使用“[]”操作符引用历史行情数据。“[]”内的数字表示时间序号,为非负整数。例如,在日线图上,close[0]指当日收盘价;close[1]指昨日的收盘价;close[10]指时间往前数第10日的收盘价。
Pine Script中的大多数数据是series类型的。series类型有点像数组,不同之处是series类型有动态索引。在Pine Script语句中,close与close[0]表示同等含义,即表示当前时点的收盘价。
在Pine Script中,几乎所有的内置函数都返回一个series类型的结果。有个便捷方法可以直接将“[]”操作符应用于函数调用,如下面的语句所示。
使用“[]”操作符,也可能得到返回值na,这时需要在脚本中做特殊处理。有以下3种处理方法:
(1)使用包含内置变量na的表达式。
(2)使用内置函数na()。
(3)使用内置函数nz()。
下面分别举例说明。
示例1:使用包含内置变量na的表达式。
示例2:使用内置函数na()。
示例3:使用内置函数nz()。
“[]”运算符仅可以对series类型变量进行一维操作,如下所示的用法是错误的。
赋值运算符“=”用于变量声明或变量初始化。合法的变量声明/初始化语句如下所示。
再赋值运算符“:=”用于对前面进行过变量声明或者初始化过的变量进行再赋值。如以下脚本所示,先使用关键字var对变量pHi进行初始化/变量声明,再使用“:=”对变量pHi进行再赋值。
将该脚本添加到图表中,以SPDR标普500指数ETF(SPY)为例,如图6-1所示。
图6-1 使用再赋值运算符的示例
在Pine Script的表达式中,经常用到多个运算符,这些运算符的计算顺序由其优先级决定。运算符的优先级列表(按优先级由高到低排序)如表6-4所示。
表6-4 运算符的优先级列表
● 如果在一个表达式中出现了多个具有相同优先级的运算符,则按从左到右的顺序计算。
● 如果表达式必须以不同于优先级的顺序计算,则需要使用括号。
1.表达式的定义
Pine Script中的表达式(Expressions)是指由运算符与操作数(变量或常数)构成的有序组合或函数调用,用于定义脚本所需的计算或操作。
2.表达式的分类
Pine Script中的表达式分为以下几类:
● 数学表达式。
● 赋值表达式。
● 条件表达式。
● 函数调用表达式。
其中,条件表达式在Pine Script中应用的频率很高,它可以将复杂的逻辑精简为一条语句,也经常应用于图表的颜色渐变、颜色渲染处理。
1.语句的定义
语句(Statements)是Pine Script中的基本组成单位。Pine Script中的脚本是多条语句组成的有序组合,用于向计算机系统发出一系列操作指令。一条语句本身也可能具有内部结构,例如表达式。
2.语句分类
Pine Script中的语句分为以下几类:
● 控制语句(包括条件语句和循环语句)。
● 表达式语句。
● 变量声明语句。
● 变量赋值语句。
● 函数声明语句。
● 函数调用语句。
本章介绍了Pine Script中的运算符、表达式和语句,这些内容是编写脚本的基础知识,掌握它们能够让我们更加高效地编写脚本,并实现更加复杂的逻辑处理和功能的实现。同时,这些知识也为我们深入学习和应用其他高级技术,如指标编写、策略开发和图表自定义等,奠定了基础。
此外,包含历史数据引用操作符和条件表达式是Pine Script语言的特色之一,对于编写复杂指标和实现图表的自定义非常重要,可以帮助我们在计算当前K线的指标时引用历史K线的数据。条件表达式在Pine Script中也有丰富的运用,它可以将复杂的逻辑处理为一条语句,也经常应用于图表的颜色渐变、颜色渲染处理和其他逻辑运算处理,是“熟手”需要掌握的技巧之一。