MetaTrader 4 Build 970:简化新建模拟账户,扩展MQL4功能

MetaTrader 4新功能

3 六月 2016

程序端

  1. 简化模拟账户的创建对话框。您不再需要填写繁杂的表格。只需指定基本数据并选择交易参数:账户类型,入金和杠杆。




MQL4

  1. 可执行文件 EX4 的格式发生变化,实现MQL4语言的新功能。所有通过旧版MetaEditor编译的EX4 应用程序在更新后都可以正常工作。因此,与高版本的兼容性得以完全保留。

    Build 970 及以上版本编译的EX4 程序将无法在旧版程序端运行 - 不支持与低版本的兼容性。

  2. 添加支持抽象类和纯虚函数。

    抽象类用于创建通用实体,也就是您希望用此创建更具体的派生类。抽象类只能用作一些其他类的基础类,这就是为什么无法创建抽象类类型的对象。

    至少包含一个纯虚函数的类就是抽象的。因此,从抽象类派生的类必须实现其所有的纯虚函数,否则它们也将是抽象类。

    虚拟函数通过使用pure-specifier语法声明为 "pure" 。考虑CAnimal 类的示例,创建它仅为了提供普通功能 – 对于实际使用,CAnimal 类型的对象过于普通。因此,CAnimal 是抽象类的一个很好的示例:
    class CAnimal
      {
    public:
                          CAnimal();     // 构造函数
       virtual void       Sound() = 0;   // 一个纯虚函数
    private:
       double             m_legs_count;  // 动物有多少只脚
      };
    
    这里Sound() 是一个纯虚函数,因为它通过纯虚函数PURE (=0)的说明符来声明。

    纯虚函数只是设置PURE说明符的虚拟函数:(=NULL) 或 (=0)。抽象类声明的示例和使用:
    class CAnimal
      {
    public:
       virtual void       Sound()=NULL;   // PURE 类函数,应该在派生类覆盖,CAnimal 现在是抽象的,不能被创建
      };
    //--- 从抽象类派生
    class CCat : public CAnimal
     {
    public:
      virtual void        Sound() { Print("Myau"); } // PURE 被覆写,CCat 不是抽象并且可以被创建
     };
    
    //--- 错误使用的例子
    new CAnimal;         //  'CAnimal' 错误 - 编译器返回 "不能举例说明抽象类" 错误
    CAnimal some_animal; // 'CAnimal' 错误 - 编译器返回 "不能举例说明抽象类" 错误
    
    //--- 正确使用的例子
    new CCat;  // 无错误 - CCat 类非抽象
    CCat cat;  // 无错误 - CCat 类非抽象
    
    抽象类的限制
    如果一个抽象类的构造函数调用一个纯虚函数(直接或间接),结果是未定义的。
    //+------------------------------------------------------------------+
    //| 一个抽象基类                                                       |
    //+------------------------------------------------------------------+
    class CAnimal
      {
    public:
       //--- 一个纯虚函数
       virtual void      Sound(void)=NULL;
       //--- 函数
       void              CallSound(void) { Sound(); }
       //--- 构造函数
       CAnimal()
        {
         //--- 显式调用虚拟类函数
         Sound();
         //--- 隐式调用(使用第三个函数)
         CallSound();
         //--- 构造函数和/或析构函数总是调用其自己的函数,
         //--- 即使它们是虚拟函数,并且在派生类被调用的函数覆写
         //--- 如果调用的函数是纯虚函数
         //--- 这个调用会导致 "纯虚函数调用"的关键执行错误
        }
      };
    
    然而,抽象类的构造函数和析构函数可以调用其他成员函数。

  3. 添加函数指针支持,简化事件模型的安排。

    若要声明函数指针,指定"函数指针" 类型,例如:
    typedef int (*TFunc)(int,int);
    现在,TFunc 是一个类型,可以声明变量函数指针:
    TFunc func_ptr;
    func_ptr 变量可以存储函数指针用于未来的声明:
    int sub(int x,int y) { return(x-y); }
    int add(int x,int y) { return(x+y); }
    int neg(int x)       { return(~x);  }
    
    func_ptr=sub;
    Print(func_ptr(10,5));
    
    func_ptr=add;
    Print(func_ptr(10,5));
    
    func_ptr=neg;           //错误:neg不是int (int,int)类型
    Print(func_ptr(10));    // 错误:应有两个参数
    
    函数指针可以存储和作为参数传递。您不能获得非静态类函数的指针。

  4. 添加 TERMINAL_SCREEN_DPI 值到 ENUM_TERMINAL_INFO_INTEGER 客户端属性枚举 — 数据显示分辨率以每英寸的点数衡量 (DPI)。了解这个参数允许指定图形对象的大小,以便于它们在不同分辨率的显示器下看起来一样。
  5. 添加 TERMINAL_PING_LAST 值到 ENUM_TERMINAL_INFO_INTEGER 客户端属性 — 最后得到的交易服务器ping值以微秒计算。一秒相当于一百万微秒。
  6. DRAW_NONE 缓冲区 (没有图形结构) 现在不参与图表窗口自定义指标的最小值和最大值的计算。
  7. 修正鼠标移动相关的生成事件,鼠标按键点击OBJ_LABEL 和 OBJ_TEXT 类型的对象。之前,如果它们在 OBJ_RECTANGLE_LABEL 和 OBJ_RECTANGLE 类型的其他对象之内,事件生成错误。
  8. 修正绘制自定义指标的零高度直方图。在此之前,不显示这种柱形图,而现在它们有1像素的高度。

信号

  1. 修正比较信号提供商和订阅者的可用交易品种时搜索交易品种。

Tester

  1. 修正当前点差用在测试设置时,txt文件的点差使用。

市场

  1. 修正几个市场展板的显示错误。

MetaEditor

  1. 在"仅全词匹配" 模式下,修正文件中搜索单词。
  2. 所需文件的编译结果线上,双击添加移动到一个文件。
  3. 修正Windows XP一些控制元素的显示。

修复崩溃日志中报告的错误。