在Pine Script中,存在两种不同的变量声明(Variable Declaration):一般变量声明和多元组变量声明,这两者的格式有所不同,具体如下。
一般变量声明语句格式如下所示。
● []:表示其内的部分为可选项,可以选择性地省略。
● <>:表示其内的部分为必选项,必须提供相应的值或信息。
● =:表示赋值运算符。
● |:表示“或”。
● declaration_mode:指变量声明的模式,可以是var或varip,也可以缺省。
● type:指定变量的类型。
● identifier:指所声明的变量名/标识符名。
● expression:可以是常量名、变量名、表达式或函数调用。
● structure:可以是if、for、while或switch结构。
合法的一般变量声明语句如下所示。
多元组变量声明语句格式如下所示。
● <>:表示其内的部分为必选项,必须提供相应的值或信息。
● =:表示赋值运算符。
● |:表示“或”。
● tuple_declaration:表示多元组声明,指包含在方括号内的由逗号分隔的变量名列表,如[bbMiddle,bbUpper,bbLower]。
● function_call:函数调用;
● structure:可以是if、for、while或switch结构。
合法的多元组变量声明语句如下所示。
显式类型声明(Explicit type declaration)是指当变量声明时,使用int、float、bool、color、string、label、line、box和table等关键字定义变量的数据类型。一些显式类型声明语句如下所示。
隐式类型声明(Implicit type declaration)是指并未使用int、float、bool、color、string、label、line、box和table等关键字定义数据类型,而根据等号右侧的数据类型或表达式类型推导出等号左侧的变量类型。一些隐式类型声明语句如下所示。
在Pine Script中,na是一种特殊值,即表示数据缺失或未定义。在Pine Script中,变量初始化经常以na为初值。使用na初始化变量,如下所示。
在上述代码中,第一行和第二行对变量baseLine1和baseLine2的声明方式都是正确的,且这两种变量声明方式是等价的。但是在代码的最后一行,变量baseLine0的声明方式是错误的,因为编译器无法确定变量baseLine0的类型,而na没有特定的数据类型(任何类型的变量都可以有na值)。
在Pine Script中,na值可以应用于任何数据类型的变量中。需要注意的是,如果未指定变量类型,编译器就无法识别该变量的数据类型,从而导致编译错误。
在Pine Script中,可以使用运算符“:=”为变量再赋值(Variable Reassignment)。但是在为变量赋值之前,必须先对变量进行声明,有时需要在局部程序块中修改全局变量的值。在下面的脚本中,需要给全局变量maColor再赋值。
在本例中使用了常见的颜色渲染绘图方法,根据趋势的方向不同,将均线MA的颜色设置为绿色或紫色。当趋势向上时,均线MA为绿色;当趋势向下时,均线MA为紫色。在初始化时,全局变量maColor被设置为灰色。在后续的局部程序块中,根据条件判断,再次为maColor赋新值。将以上脚本添加到图表中,以宁德时代(300750)为例,如图7-1所示。
图7-1 变量再赋值的示例
在Pine Script中,所有的用户自定义变量都可以使用运算符“:=”进行再赋值操作。需要注意的是,当变量进行再赋值操作后,可能会改变该变量的数据类型。
变量声明模式(Declaration Mode)决定了给变量再赋值的存储方式。本节内容与第2.3节的执行模式和第4.3.2节中关于K线状态的内置变量内容相关。
变量声明模式有以下3种:
● 未指定变量声明模式(即未使用关键字var或varip)。
● var模式。
● varip模式。
若未指定变量声明模式(即没有使用关键字var或varip),则每条K线都会进行初始化。
在前面的章节中给出了一些合法的变量声明示例,其中包括未指定变量声明模式的变量声明语句,如下所示。
使用var模式的变量声明仅对变量初始化一次。
示例1:以下语句说明了var关键字的作用。
下面比较示例2和示例3两个例子,示例2在变量声明语句中使用了关键字var,而示例3未使用。
示例2:如果我们想要计算图表上有多少条绿色K线,则可以通过下面的代码实现。
说明: 在这里使用到关键字var,用来指示编译器只创建和初始化该变量一次。这种做法在变量的值必须通过对连续的K线进行迭代计算来得到结果的情况下非常有用。
示例3:将示例2脚本中关键字var删掉。如果没有关键字var,则每次K线更新触发脚本重新计算时,变量count都会被重置为零。
我们先后将示例2(Green Bars Count 1)与示例3(Green Bars Count 2)的脚本添加到图表中,对两者进行比较,如图7-2所示。
图7-2 使用关键字var和不使用关键字var的指标显示结果对比
通过比较图7-2中的指标Green Bars Count 1和Green Bars Count 2,可以看出两者所绘图表不同的主要原因在于变量声明语句“count=0”中有没有使用关键字var。若没有使用关键字var,则意味着每当K线更新时,脚本都会重新计算,并将变量count重置为零。
下面比较示例1和示例2两个例子,在示例1中未指定变量updateNo的声明模式,在示例2中使用varip模式声明变量updateNo。
示例1:未指定变量updateNo的声明模式。
示例2:使用varip模式声明变量updateNo。
依次把上面的示例1“None specified declaration mode”和示例2“Varip mode”添加到图表中,两者的差异在红框内标注,如图7-3所示。
图7-3 使用和不使用关键字varip的指标显示结果对比
在图7-3中,示例1的脚本“None specified declaration mode”仅将历史数据绘制成了一条纵坐标为1的水平虚线,示例2的脚本“Varip mode”不仅将历史数据绘制成了一条纵坐标为1的水平虚线,而且将当前行情数据绘制成一些零散的圆点,随着时间的流逝,这些圆点的分布是不规则的。
这是因为在实时行情下,两者对当前K线(图表上最右侧的K线)的处理不同。
● 对于历史行情数据,barstate.isnew的值总为true。
● 在实时行情中,仅当系统首次生成当前K线数据时,barstate.isnew的值才为true。
本章介绍了Pine Script中的变量声明、变量声明模式和变量再赋值,但需要注意对特殊值na的使用,同时注意变量声明模式var和varip,以及未指定变量声明模式之间的差异。
变量声明和变量再赋值是Pine Script中的基础要素。我们需要了解变量类型、作用域和生命周期等基本概念,以及遵循最佳实践和规范,以确保程序的正确性和可维护性。