变量和作用域(指标编程教程第八篇:变量及其作用域)

提示

这是 2011 年写的一个系列教程。

上一篇给物件命名的时候,是在函数的参数里写 bary_hline 这样的方式,直接以一个字符串给物件命名。如果我想给我的物件改个名字,语句少还好说,逐个改下就行了,如果是程序已经写了很多很多了,那么可能工作量就相当大了,或者我想给很多物件批量命名为 xxx_1xxx_2xxx_3......的形式,使用变量就比一个一个写方便多了。

变量的命名方式和类型跟函数一样:长度不能超过 63 个字节。可以使用数字 0 - 9、拉丁字母大写 A - Z 和小写 a - z(大小写有区分的)还有下划线 _。此外首字母不可以是数字,不能和保留字冲突。大概分为:整型、浮点型、字符型、字符串型、布尔型、时间型、颜色型。(参见:《指标编程教程第四篇:基础语法、数据类型、函数声明》)

变量在使用之前必须声明,声明了才会分配内存地址,这一点不同语言要求不一样,属于编译原理部分,像 PHP 就不需要,记住 MQL5 中的变量必须先声明再使用就行了。就以《指标编程教程第七篇:价格坐标》的程序为例,在特殊参数声明后面,也就是 int OnInit() 上面,加上一句:

string hline_name = "bary_hline";

int OnInit(){
    // 创建一条叫 bary_hline 的水平线,
    ObjectCreate(0, hline_name, OBJ_HLINE, 0, 0, 0);
}

然后把后面的两个 "bary_hline" 都改成 hline_name ,注意变量名不要加引号,不然会被理解成字符串。

声明变量的时候可以没有初始值,可以分成两句:

string hline_name;
hline_name = "bary_hline";

在程序头声明的变量是全局变量,也就是在所有函数里都可以用的变量。如果我们只是在 OnInit() 函数的一对大括号里声明的 string hline_name;,那么在 OnCalculate() 里是无法使用的,这就是变量的作用域,MQL5 中文文档翻译为“变量的可见范围和变量使用期”。

也就是现在在两个函数中,hline_name 都是 "bary_hline" 的代名词,如果把声明写在初始化函数里:

int OnInit(){
    string hline_name = "bary_hline";
    ObjectCreate(0, hline_name, OBJ_HLINE, 0, 0, 1.55);
}

则初始化函数结束后,hline_name 就被释放了,删掉了一样,OnCalculate() 中的 ObjectSetDouble(0, hline_name, OBJPROP_PRICE, ... 是无法知道 hline_name 是什么意思的。

横线物件的价格坐标,也可以用变量来代替,而且不需要初始化函数也知道,就可以写在计数事件函数中了,如下:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[]){
    // 声明变量。
    double close_plus_two;
    // 赋值。
    close_plus_two = close[rates_total - 1] + 0.002;
    // 设置水平线的价格坐标为当前价 + 0.002。
    ObjectSetDouble(0, hline_name, OBJPROP_PRICE, close_plus_two);
}

很简单吧?

  • 802
回复内容较长可以拖右下角↑
回到
顶部