|
上一篇给物件命名的时候,是在函数的参数里写“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); } 很简单吧? |
E&K Studio