草龟打架:变量和作用域(特厉害的MT5/MQL5指标编程教程第八篇:变量及其作用域) | 特厉害

来源:百度文库 编辑:偶看新闻 时间:2020/02/22 07:56:31

变量和作用域(特厉害的MT5/MQL5指标编程教程第八篇:变量及其作用域)

 

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

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

变量在使用之前必须声明,声明了才会分配内存地址,这一点不同语言要求不一样,属于编译原理部分,像php就不需要,记住mql5中的变量必须先声明再使用就行了。就以《特厉害的MT5/MQL5指标编程教程第七篇:价格坐标》的程序为例,在特殊参数声明后面,也就是“int OnInit()”上面,加上一句“string hline_name = "telihai_hline";”然后把后面的两个“"telihai_hline"”都改成“hline_name”,注意变量名不要加引号,不然会被理解成字符串。

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

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

int OnInit(){
string hline_name = "telihai_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);
}

很简单吧?

转载请注明,转载自:特厉害 ? 变量和作用域(特厉害的MT5/MQL5指标编程教程第八篇:变量及其作用域)
原文链接:http://www.telihai.com/node/9