新版MetaTrader 5 build 1325:锁仓选项和实时报价测试

MetaTrader 5新功能

22 四月 2016

程序端

  1. 我们已经添加第二个账户系统—锁仓,该新系统能够扩大零售外汇交易者的可能性。现在,每个交易品种可以有多个持仓,包括反向持仓。这就为实施基于所谓“锁定”的交易策略铺平道路 — 如果价格对交易者反向移动,他们可以打开一个反向持仓。

    由于新系统类似于在MetaTrader 4中使用的系统,它将被交易者所熟知。与此同时,交易者将能够享受第五代平台版本的全部优势 — 使用多个交易填写订单 (包括部分填充),支持MQL5 云网络的多货币和多线程测试等等。

    现在,您可以使用一个账户从事依附于净额系统,一个工具仅允许一个持仓的市场交易,以及在同一个平台使用另一个账户从事外汇交易和使用锁仓。

    新建锁仓账户,查看持仓账户类型
    持仓账户系统设置在一个账户水平,并显示在程序端窗口标题和日志:



    要新建一个锁仓模拟账户,请启用相应选项: 




    净额系统
    通过这个系统,在同一时间,一个交易品种您只能有一个普通持仓:

    • 如果一个交易品种有一个持仓,同向执行一个交易会提高该持仓的交易量。
    • 如果反向执行交易,那么现有的交易量可能减少,持仓可能会被关闭 (成交交易量等于持仓交易量时) 或撤销 (如果反向成交的交易量大于当前持仓)。

    这没关系,导致反向交易的是 — 已执行的市场订单或触发的挂单。

    下面示例显示了执行两个每笔0.5手的EURUSD买入交易:


    执行这两个交易即是1手的一个普通持仓。

    锁仓系统
    通过这个系统,您可以一个交易品种拥有多个持仓,包括反向持仓。

    如果您有一个交易品种的持仓,执行一个新交易(或触发挂单),那么会另外建立一个新持仓。您当前持仓不会改变。

    下面示例显示了执行两个每笔0.5手的EURUSD买入交易:


    执行这些交易则会新建两个独立的持仓。

    新交易操作类型 - Close By
    新的交易类型已经被加入锁仓账户 — 通过反向持仓来平仓。这个操作允许在单一交易品种关闭两个反向的持仓。如果反向持仓手数不同,那么两个持仓中只有一个订单保留持仓。其交易量将等于平仓手数的差异值,而持仓方向和开盘价将匹配平仓的更大(交易量)。

    相比单独关闭两个持仓,关闭反向持仓允许交易者保留一个点差:

    • 单独平仓情况下,交易者必须支付一个点差两次:以低价位(卖价)关闭买入持仓和高价位关闭卖出持仓(买价)。
    • 使用反向持仓时,第二个持仓的开盘价被用于关闭第一个持仓,而第一个持仓的开盘价被用于关闭第二个持仓。


    在后面那种情况下,下单"close by" 订单。平仓信息在该评论指明。一组反向持仓通过两个"out by"交易关闭。关闭两个持仓得到的总利润/亏损只在一个交易中指明。


  2. 除了支持锁仓外,新版平台还为从MetaTrader 4迁移账户提供了更广泛的机会。现在,交易商可以自动转移账户到MetaTrader 5,包括所有的操作:持仓和挂单,完成交易历史。

    首次连接从MetaTrader 4迁移的账户时会打开一个欢迎对话框。在迁移过程中,数据的传输安全加密。若要开始使用,请指定您在MetaTrader 4使用的账户密码,然后设置一个新密码。



    连接一旦成功,您将可以继续使用您的账户,就好似它已在MetaTrader 5持仓。来自MetaTrader 4所有交易的完整历史记录会自动添加到新账户。

    订单和持仓(包括历史订单)标签在导入过程中不会保留,因为从MetaTrader 4导入一个历史记录可能相当于MetaTrader 5中的4个历史操作。所有的交易记录都会分配新的标签。

    根据交易商导入的方式可以保留或替代账号。

  3. 程序端:新增聊天功能。现在,您可以与您的MQL5.community朋友和同事进行交流沟通了。聊天显示了您MQL5 账户的所有个人信息。开始沟通时,可以直接从聊天窗口登录您的账户或通过平台设置登录:工具 -> 选项 -> 社区。




  4. 程序端:简化的模拟账户创建对话框,添加创建锁仓账户的能力。您不再需要填写大表格。只需指定基本数据和选择交易参数:账户类型,入金,杠杆和锁仓功能。




  5. 添加自动分配模拟账户以便快速启动。如果平台还没有账户,第一个可用交易服务器上的模拟账户会在启动时分配。成功打开后,账户连接马上建立。

  6. 现在,每个持仓有一个标签 — 一个独一无二的号码。它通常匹配用于持仓的订单标签,除非标签更改为服务器上服务操作的结果,例如,收取重新持仓库存费时。程序端更新后,标签被自动分配到所有可用持仓。



  7. 修正建立导致持仓反转的市场订单时设置的止损和获利水平。直到目前,没有适当的水平设置给新持仓。
  8. 修正单击交易面板上显示4位及更多小数位的价格。
  9. 修正打印预览窗口的新闻显示。
  10. 修正报价图表显示。
  11. 修正程序端紧急关闭后打开市场深度。
  12. 添加如果显示单击交易面板控制元素时允许市场订单的检查。
  13. 假设大量新建订单和持仓情况下,优化利润和预付款计算。
  14. 添加用户界面的马来语翻译。
  15. 完全修改后的用户手册。新设计,交互式屏幕截图和嵌入式视频 — 以最大的方便性了解MetaTrader 5的交易:



  16. 修正"前景图表"模式下图形对象的展示。

Tester

  1. 新增在实时报价历史测试自动交易和技术指标的能力。

    真实报价的测试和优化尽可能地接近实际情况。代替基于分钟数据生成的报价,现在可以使用交易商积累的真实报价。有许多来自交易商和流动量提供商的报价。

    若要开始测试或优化真实报价,请在策略测试选择相应的模式:



    报价数据的大小要比分钟数据大。第一次测试期间,下载它可能需要较长的世界。按月下载的报价数据被存储在TKC文件,在 \bases\[trade server name]\ticks\[symbol name]\。
    测试真实报价
    当测试一个真实报价时,一分钟柱内的点差可能改变,因此生成一分钟报价时,使用相应柱固定的点差。

    如果一个交易品种显示市场深度,那么柱形图会严格根据最后执行的交易价格(Last)来构建。否则,tester会根据收盘价首次尝试构建柱形图,如果这些价格不存在,则使用卖价。无论收盘价是否存在,所有报价上都会触发OnTick 事件。

    请 注意,即使根据收盘价构建图表,交易操作也会始终根据卖价和买价执行。例如,如果仅使用开盘柱进行交易的EA交易(例如内置移动平均指标)收到了收盘价信 号,它以另一个价格执行一个交易(取决于方向的买价或卖价)。如果使用“每一报价”模式,柱形图通过卖价构建,而交易通过卖价和买价执行。买价作为卖价+ 对应分钟柱固定点差来计算。

    如果交易品种历史有一个无报价数据的分钟柱,tester 在“每一报价”模式下生成报价。这允许测试一定时期内的EA,以防交易商报价数据的不足。如果交易品种历史记录没有分钟柱但是有适当的分钟报价数据,那么这些报价可以忽略。分钟数据被认为更可靠。

    在MQL5 云网络测试真实报价
    测试真实报价现在不仅可用于本地和远程代理,还可以通过MQL5 云网络实现。可能需要几个月的策略优化,通过数千台电脑的计算能力,可能几个小时就可完成。

    若要使用MQL5云网络测试策略,请启动使用云代理:



    使用MQL5云网络测试真实报价可以消耗大量的数据。这可以显著影响使用网络能力的支付。
  2. 修正几个交易品种类型上妨碍计算手续费的错误。
  3. 修正根据相应持仓的专家字段填写激活SL/TP得到的交易订单的专家字段。之前,不填写这些内容。
  4. 修正切换到通常状态并进一步优化结果的标签。
  5. 修正计算和显示“轨道线”指标。
  6. 优化可视化测试。
  7. 优化了大量新建订单和持仓时的利润和预付款计算。
  8. 优化高频交易期间的交易操作。
  9. 现在,如果是非关键交易品种属性请求(不需要当前报价),则不执行历史同步。例 如,SYMBOL_SELECT,SYMBOL_DIGITS,SYMBOL_SPREAD_FLOAT,SYMBOL_TRADE_CALC_MODE,SYMBOL_TRADE_MODE,SYMBOL_TRADE_STOPS_LEVEL,SYMBOL_TRADE_FREEZE_LEVEL,SYMBOL_TRADE_EXEMODE 等等。之前,非关键交易品种历史记录在其属性的任何请求下都会同步。
  10. 修正按照每年比例计算库存费。ixed calculation of swaps as a percentage per annum.

MQL5

  1. 可执行文件EX5的格式已经变成实施MQL5语言的新功能和MetaTrader 5的新锁仓选项。通过之前版本MetaEditor编译的所有EX5应用程序更新后将能正常工作,例如正向兼容性完全保留。

    build 1325及以上版本编译的EX5程序将无法在旧版构建的程序端运行 - 不支持反向兼容性。

  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. MQL5:MqlTradeRequest 有两个新字段:

    • position — 持仓标签。锁仓模式交易下为了明确识别而改变和关闭持仓时来填写。在净额系统,填写字段不会有任何影响,因为持仓只识别一个交易品种名称。
    • position_by — 反向持仓标签。它用于通过反向持仓平仓时(打开一个同名但反向的交易品种)。该标签仅用于锁仓系统。

  5. 添加TRADE_ACTION_CLOSE_BY 值到 ENUM_TRADE_REQUEST_ACTIONS 交易操作类型枚举 — 通过反向持仓。该标签仅用于锁仓系统。

  6. 添加交易操作标签到适当订单,交易和持仓属性的枚举:

    • 添加ORDER_TICKET 属性到 ENUM_ORDER_PROPERTY_INTEGER — 订单标签。每个订单会分配一个独一无二的号码。
    • 添加 DEAL_TICKET 属性到 ENUM_DEAL_PROPERTY_INTEGER — 交易标签。每笔交易会分配一个独一无二的号码。
    • 添加POSITION_TICKET 属性到 ENUM_POSITION_PROPERTY_INTEGER — 持仓标签。每个新持仓会分配一个独一无二的号码。它通常匹配用于持仓的订单标签,除非标签更改为服务器上服务操作的结果,例如,收取重新持仓库存费时。若 要找出一个用于持仓的订单,请应用POSITION_IDENTIFIER 属性。POSITION_TICKET 值对应MqlTradeRequest::position。

  7. 添加ORDER_TYPE_CLOSE_BY 值到 ENUM_ORDER_TYPE 订单类型枚举 — close by 订单。
  8. 添加ORDER_POSITION_BY_ID 值到 ENUM_ORDER_PROPERTY_INTEGER 订单属性枚举 — ORDER_TYPE_CLOSE_BY 类型订单的反向持仓标识符。
  9. 添加DEAL_ENTRY_OUT_BY 值到 ENUM_DEAL_ENTRY 交易方向枚举 — 由close by操作执行交易。
  10. MqlTradeTransaction 也有两个类似的字段:


    • position — 由交易活动影响的持仓标签。这里填写处理市场订单(TRADE_TRANSACTION_ORDER_* except TRADE_TRANSACTION_ORDER_ADD,在这里持仓标签尚未分配) 和订单历史(TRADE_TRANSACTION_HISTORY_*)相关的交易活动。
    • position_by — 反向持仓标签。它用于通过反向持仓平仓时(打开一个同名但反向的交易品种)。这里只填写通过反向持仓而平仓的订单 (close by) 和通过反向持仓而关闭的交易 (out by)。

  11. 添加PositionGetTicket 函数 — 根据持仓列表的索引返回一个持仓标签和使用PositionGetDouble, PositionGetInteger 和PositionGetString函数自动选择持仓用于进一步工作。
    ulong  PositionGetTicket(
       int  index      // 持仓列表索引
       );

  12. 添加PositionSelectByTicket 函数 — 通过指定标签为进一步工作选择一个持仓。
    bool  PositionSelectByTicket(
       ulong   ticket     // 持仓标签
       );

  13. 添加SYMBOL_MARGIN_HEDGED 值到 ENUM_SYMBOL_INFO_DOUBLE 交易品种属性枚举 — 合约大小或一手锁仓预付款(一个交易品种的反向持仓)。

    • 如果一个交易品种指定了初始预付款 (SYMBOL_MARGIN_INITIAL),锁仓预付款被指定为绝对值(以货币计算)。
    • 如果没有设置初始预付款(等于0),预付款计算中将被使用的合约大小在SYMBOL_MARGIN_HEDGED指定。预付款使用对应一个交易品种类型 (SYMBOL_TRADE_CALC_MODE)的等式计算。

    锁仓预付款计算的详细信息会在MetaTrader 5 交易平台帮助中说明。

  14. 添加ACCOUNT_MARGIN_MODE 值到 ENUM_ACCOUNT_INFO_INTEGER 账户属性枚举 — 当前交易账户的预付款计算模式:

    • ACCOUNT_MARGIN_MODE_RETAIL_NETTING — 用于净额模式账户持仓时的场外交易市场(一个交易品种一个持仓)。预付款计算基于交易品种类型 (SYMBOL_TRADE_CALC_MODE)。
    • ACCOUNT_MARGIN_MODE_EXCHANGE — 用于交易所市场。预付款计算基于交易品种设置中指定的折扣。折扣由交易商设置,但是它们不能低于交易所设置的值。
    • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING — 用于独立持仓账户场外交易市场(锁仓,一个单一交易品种可以有多个持仓)。预付款计算基于交易品种类型 (SYMBOL_TRADE_CALC_MODE)。也要考虑锁仓预付款大小 (SYMBOL_MARGIN_HEDGED) 。

  15. 添加TERMINAL_SCREEN_DPI 值到 ENUM_TERMINAL_INFO_INTEGER 客户端属性枚举 — 分辨率显示数据通过每英寸的点数来衡量 (DPI)。该参数的信息允许指定图形对象的大小,这样它们在不同分辨率的显示器上看起来一样。

  16. 添加 TERMINAL_PING_LAST 值到 ENUM_TERMINAL_INFO_INTEGER 客户端属性 — 以微秒计算交易服务器最后得到的ping值。一秒等于一百万微秒。

  17. 修正返回SendFTP函数调用结果。之前,成功发送后返回 FALSE 而不是 TRUE。
  18. 修正偶尔导致"违规访问"执行错误的StringConcatenate函数错误。
  19. 修正使用模板函数时发生的几个错误。
  20. 添加为打印,警示和评论功能显示超过4000字符行的能力。
  21. 修正ArrayCompare函数通过不同于开始时期的初始持仓变化来比较数组和函数本身时产生的错误。
  22. 添加支持标准库的锁仓功能:

    CPosition
    添加类函数:

    • SelectByMagic — 根据魔幻数选择持仓和进一步工作的交易品种。
    • SelectByTicket — 通过进一步工作的标签选择持仓。

    CTrade
    添加类函数:

    • RequestPosition — 收到持仓标签。
    • RequestPositionBy — 接收反向持仓标签。
    • PositionCloseBy — 通过反向持仓支持标签平仓。
    • SetMarginMode — 根据当前账户设置来设置预付款计算模式。

    添加重载类函数:

    • PositionClose — 平仓标签。
    • PositionModify — 修改持仓标签。

    CAccountInfo
    改变类函数:

    • MarginMode — 接收预付款计算模式。直至目前,类函数的工作类似于新的StopoutMode 类函数。
    • MarginDescription — 接收预付款计算模式为字符串。直至目前,类函数的工作类似于新的StopoutModeDescription类函数

    添加类函数:

    • StopoutMode — 接收最小预付款水平规范模式。
    • StopoutModeDescription — 接收最小预付款水平规范模式为字符串。

    CExpert
    添加类函数:

    • SelectPosition — 为进一步工作选择持仓。

  23. 对标准程序库添加一些改进。
  24. 修正卸载DLLs。
  25. 添加支持模板类构造函数。

信号:

  1. 修正几个交易信号窗显示错误。

MetaEditor

  1. 修正“全字匹配”模式下文件的搜索词。
  2. 添加在所需文件的编译结果行上双击移动到一个文件。
  3. 修正显示Windows XP中的一些控制元素。
更新文档。