📅 财经日历 📊 实时波动 📈 大盘云图 📶 行情走势 🆚 投机情绪 🚀 今日热点

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

    億秒 LV7
    2014-02-18 · 1698 阅读
    上一篇给物件命名的时候,是在函数的参数里写“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);
    }

    很简单吧?

    ""
    还没有人打赏,支持一下
    回复

    举报

     
    微信二维码

    有问题联系客服