通俗的讲,变量就像是丰巢快递柜的格子,我们通过指定的格子空间存取物品(数据);在金字塔的PEL中使用的变量类型,可以分成普通变量字符串变量全局变量三种。

# 普通变量

在PEL中普通变量的定义非常简单,不需要指定变量的数据类型,直接定义变量即可使用。如下所示,定义MA1和MA2两个均线变量。

MA1:MA(CLOSE,5);
MA2:=MA(CLOSE,10);
1
2

通过公式观察,不难看出MA1通过冒号:进行定义,MA2通过冒号等号:=进行定义。两种变量定义的差别如下:

相同点

1. 两者均可以直接定义新变量。
 

不同点

1. 通过":="定义的变量,并不显示在k线图中。      
2. 只有":="能够对已经定义的变量进行重新赋值。

- name: 相同点
  desc: 1. 两者均可以直接定义新变量。</br>&nbsp;
  bgColor: '#FFE7BA'
  textColor: '#FF0000'
- name: 不同点
  desc: 1. 通过":="定义的变量,并不显示在k线图中。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </br>2. 只有":="能够对已经定义的变量进行重新赋值。
  bgColor: '#FFE7BA'
  textColor: '#FF0000'
1
2
3
4
5
6
7
8

注意

  • 这里的普通变量亦可统称为序列变量;序列变量都是和K线时完全对齐的,即每根k上都有一个对应的变量结果。

# 字符串变量

字符串变量可以认为是普通变量的一种,因其数据为字符串类型,所以在此处被单独说明。它的定义方式和普通变量定义方式相同。如下所示:

str:'helloWord';
code:STKLABEL;//返回当前品种的代码
1
2

通过观察,str和code在k线图中显示的结果并不是预期的字符串结果,为什么会有这个现象出现呢?

  • 字符串不支持直接在k线图中显示,因为k线图只能显示变量名和数值型变量。
  • 字符串显示可以通过EXPLAIN、DRAWTEXT、msgout等函数进行显示。

# 全局变量

全局变量是一种特殊变量,它的变量结果不会因为K线的改变而消失,因此全局变量的生命更长。根据作用范围的不同,可以分类三类:

  1. 作用于策略之内:VARIABLE 和 GLOBALVARIABLE
  2. 作用于整个软件:EXTGBDATA、EXTGBDATASET 和 EXTGBSTRING、EXTGBSTRINGSET
  3. 作用于多个软件:GETINIFILE、WRITEINIFILE 和 GETINIFILESTRING、WRITEINIFILESTRING 和 SETREGVAL、GETREGVAL

其中最为常用的是第一类作用于策略范围之内的全局变量。声明方法如下所示:

//声明全局变量A
VARIABLE:A=0;

//声明超全局变量B
GLOBALVARIABLE:B=0;
1
2
3
4
5

VARIABLE

生命周期:首根k线到最后一根k线。     
初始化节点:只在首根k线上进行初始化。 

GLOBALVARIABLE

生命周期:指标加载至停止运行期间。               
初始化节点:只在指标加载时对超全局变量定义的语句进行一次初始化。

- name: VARIABLE
  desc: 生命周期:首根k线到最后一根k线。&emsp;&emsp;&emsp;&nbsp;&nbsp;</br>初始化节点:只在首根k线上进行初始化。&emsp;
  bgColor: '#FFE7BA'
  textColor: '#FF0000'
- name: GLOBALVARIABLE
  desc: 生命周期:指标加载至停止运行期间。&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;</br>初始化节点:只在指标加载时对超全局变量定义的语句进行一次初始化。
  bgColor: '#FFE7BA'
  textColor: '#FF0000'
1
2
3
4
5
6
7
8

第二类和第三类是作用于整个软件和多个软件的变量,更加类似于一个微型数据库,它的保存于读取均通过策略自身逻辑进行控制。相关的使用会在之后的章节中重点介绍。

# 习题

1. 定义一个变量保存收盘价,并且在k线图中显示。(收盘价的函数是close)
MY_CLOSE:close;
1
2. 尝试定义一个字符串变量str,同时将'weistock'赋值给str。
str:'weistock'
1