新版MetaTrader 5平台build 2170:MQL5作用域,全局策略测试和内置虚拟主机更新

重新设计了内置虚拟主机管理选项。关于租用程序端以及环境迁移、停止和启动功能的所有信息,现在都可以在“工具箱”窗口的单独选项卡中获得。 在早期版本中,“虚拟主机”功能可以在“导航”窗口的快捷菜单中使用。

5 十月 2019

程序端

  1. 重新设计了内置虚拟主机管理选项。关于租用程序端以及环境迁移、停止和启动功能的所有信息,现在都可以在“工具箱”窗口的单独选项卡中获得。

    在早期版本中,“虚拟主机”功能可以在“导航”窗口的快捷菜单中使用。现在所有必要的信息和控制命令都方便简捷地排列在“VPS”选项卡中:




    基本订阅信息显示在左侧:

    • 连接数据:比较您主机服务器和本地计算机上的客户端运行之间的网络延迟。
    • 租用主机的交易账户和付款计划。
    • 独特的订阅标识符。点击ID打开MQL5.community用户个人资料中的“主机”部分,也可以在这里管理订阅。
    • 注册日期和当前状态。如果主机服务停止,那么相应的状态将立即出现在这里。

    使用“启动/停止”按键,虚拟程序端可以快速启动或停止。

    有关主机服务器硬件和CPU使用图表的数据显示在右侧窗口区。根据显示的信息,如果您的EA交易或指标使用了过多的内存或CPU时间,您将可以及时作出响应。

    有关最后交易的环境迁移以及迁移命令的信息也在这里提供。这些命令可以在购买订阅后加快环境迁移的速度。

    虚拟平台可以从“VPS”选项卡租用。租用过程不变,仍旧可以快速轻松完成租用。您只需选择一个计划和一个合适的付款方式。将会自动选择连接您交易商的最佳服务器。




  2. 添加在交易商网站快速切换到入金/出金操作的能力。

    无需在交易商网站的交易者室中搜索对应的功能。可在程序端中直接获得快速导航命令:“导航”和“工具箱”中的账户菜单 > 交易选项卡:



    • 只有在交易商对交易账户启用对应的功能,才可以进行入金/出金操作。
    • 交易程序端不执行任何账户入金/出金操作。集成功能将用户重新定向到对应的交易商网站页面。
  3. 交易品种规格中的新字段:

    分类
    这个属性用于额外标记交易品种。例如,这可以是该交易品种所属的市场行业:农业、石油&天然气等。只有在交易商提供对应信息的情况下才显示分类。

    交易所
    进行证券交易的交易所名称。只有在交易商提供对应信息的情况下才显示分类。

    手续费
    有关交易商为成交交易品种所收取的手续费的信息。计算详细信息在这里显示:

    • 手续费包括单级手续费和多级手续费,即无论成交量/交易额是多少,手续费都是相同的,或者可以根据交易规模而定。对应的数据在程序端显示。
    • 手续费可以在交易完成后,或在交易日/交易月结束时立即收取。
    • 手续费可以依据成交方向进行收取:市场买入、市场卖出或两种都包括的操作类型。
    • 手续费可按照每手或每笔交易来收取。
    • 手续费能够以资金金额、百分比或点数来计算。

    例如,下面进入交易表示交易进入和退出时立即收取手续费。如果成交量为0 - 10手,那么每次操作收取1.2 USD手续费。如果成交量为11 - 20手,那么每笔交易每手收取1.1USD手续费。
    手续费 | 立即、交易量、进入/退出交易
    0  - 10  | 每笔交易1.2 USD
    11 - 20  | 每手交易1.1 USD



  4. 附加期权相关字段已添加到交易品种规格中:

    • 期权类型 — 买进或卖出
    • 标的 — 期权的标的交易品种
    • 执行价格 — 期权执行价格

  5. 添加对期权"Greeks"交付的支持:delta、gamma、vega、theta、rho。交易商可以提供与此类交易品种相关的其他信息。这些数据显示在“市场报价”窗口的“详细信息”部分并可用于高级交易分析:



  6. “十字光标”工具现在除了之前可用的信息之外,还表示以百分比计算的价格水平之间的距离。




  7. 添加显示在“市价”执行和“交易所”执行操作期间交易对话框中产生的价格,如果该价格在收到交易商的响应时可用:




  8. 修正由于“市场报价”窗口中的“全部显示”命令无法显示所有可用交易品种列表而产生的错误。

MQL5

  1. 作用域操作已得到修改,因此MQL5更加接近C++。这为MQL5程序员在使用第三方程序库时提供更广泛的可能性。此更新消除了修改程序库和统一标识符的需求。

    例如,代码包含两个同名结构的声明,即使它们属于不同的类。在早期版本中,这类声明会导致编译错误:“标识符已使用”。现在,这个代码将被成功编译并执行。要从作用域外正确地访问所需的变量/结构/函数,您应指定一个类(在本例中是CBar::Item)。
    class CFoo
      {
    public:
       struct Item { int x; };
      };
    //+------------------------------------------------------------------+
    class CBar
      {
    public:
       struct Item { int x; };
      };
      
    CBar::Item item;  // 正确声明Bar类的Item结构
    Item       item;  // 错误声明
    添加namespace支持,它可以在MQL5应用程序使用第三方代码/程序库时提供更多的可能性。

    #define PrintFunctionName() Print(__FUNCTION__)
    
    namespace NS
    {
    void func()
      {
       PrintFunctionName();
      }
    
    struct C
      {
       int               x;
                         C() { PrintFunctionName(); };
      };
    }
    
    struct C
      {
       int               x;
                         C() { PrintFunctionName(); };
      };
    
    //+------------------------------------------------------------------+
    //|                                                                 |
    //+------------------------------------------------------------------+
    void func()
      {
       PrintFunctionName();
      }
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                                 |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       func();
       NS::func();
    
       C c;
       NS::C ac;
      }
    执行时,输出以下结果:
    2019.09.18 13:39:35.947    TestScript (AUDCAD,H1)    func
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    NS::func
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    C::C
    2019.09.18 13:39:35.949    TestScript (AUDCAD,H1)    NS::C::C

  2. 新版本支持使用以下函数更快速地访问时间序列数据:iTime、 iOpen、iHigh、iLow、iClose、iVolume、iTickVolume、iSpread。

  3. 添加对"=delete"属性的支持。它可以禁止使用某些类方法。
    class A
      {
       void              operator=(const A &)=delete;    // 禁止对象复制操作符
      };
    
    class B : public A
      {
      };
    
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                                 |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       A a1,a2;
       B b1,b2; 
      
       a1=a2;
       b1=b2;
      }
    在这个示例中,编译器将返回错误"a1=a2"和"b1=b2":
    试图引用已删除函数'void A::operator=(const A&)'
       'void A::operator=(const A&)'函数在这里被明确删除

    试图引用已删除函数'void B::operator=(const B&)'
       'void B::operator=(const B&)'函数被隐式删除,因为它由已删除函数'void A::operator=(const A&)'产生

  4. 以下值已被添加到ENUM_SYMBOL_INFO_STRING枚举:

    • SYMBOL_CATEGORY — 交易品种分类。它用于额外标记交易品种。例如,这可以是该交易品种所属的市场行业:农业、石油&天然气等。
    • SYMBOL_EXCHANGE — 进行交易品种交易的交易所的名称。

  5. 添加对通过FIFO规则平仓的支持。

    • ACCOUNT_FIFO_CLOSE值已被添加到ENUM_ACCOUNT_INFO_INTEGER。它表示只能通过FIFO规则平仓。如果属性值为true,那么每个交易品种都将按照持仓的相同顺序进行平仓:最早的持仓应最先平仓,然后以此类推。如果试图以不同的顺序进行平仓,则将返回一个错误。没有锁仓管理的账户的属性值始终为'false' (ACCOUNT_MARGIN_MODE!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)。
    • 新返回代码:MT_RET_REQUEST_CLOSE_ONLY — 请求被拒绝,因为交易品种已经设置“仅通过FIFO规则关闭现有持仓”规则

    主要有三种平仓方法:

    • 从客户端平仓:交易者使用EA,基于“信号”服务订阅等手动平仓。如果试图平仓,但不符合FIFO规则,那么交易者将收到一个对应的错误。
    • 在“止损”或“止盈”激活时平仓:这些订单在服务器端处理,因此不在交易者端(程序端)请求平仓,而是由服务器发起。如果一个持仓触发“止损”或“止盈”,且该持仓不符合FIFO规则(相同交易品种有一个更早的持仓),则该持仓将不会平仓。
    • 在“强平”触发时平仓:这些操作也在服务器端处理。在正常模式下(禁用基于FIFO平仓),“强平”时从亏损最大的持仓开始平仓。如果启用此选项,则将为亏损持仓额外检查开仓时间。服务器确定每个交易品种的亏损持仓,找出每个交易品种的最早持仓,然后在找到的持仓中关闭亏损最大的持仓。

  6. 添加通过“输入组”进行参数分组的选项。这可以根据参数的基本逻辑实现参数的可视化分离。

    在以下EA交易代码中,输入参数根据其用途进行分组:
    input group           "Signal"
    input int             ExtBBPeriod = 20;         // 布林带周期
    input double          ExtBBDeviation=2.0;       // 偏差
    input ENUM_TIMEFRAMES ExtSignalTF=PERIOD_M15;   // BB时间周期
    
    input group           "Trend"
    input int             ExtMAPeriod = 13;         // Moving Average period
    input ENUM_TIMEFRAMES ExtTrendTF=PERIOD_M15;    // MA 时间周期
    
    input group           "ExitRules"
    input bool            ExtUseSL      = true;     // 使用“止损”
    input int             Ext_SL_Points = 50;       // StopLoss in points
    input bool            ExtUseTP      = false;    // 使用“止盈”
    input int             Ext_TP_Points = 100;      // TakeProfit in points
    input bool            ExtUseTS      = true;     // 使用“追踪止损”
    input int             Ext_TS_Points = 30;       // 以点数计算“追踪止损”
    
    input group           "MoneyManagement"
    sinput double         ExtInitialLot =0.1;       // 初始手数值
    input bool            ExtUseAutoLot =true;      // 自动手数计算
    
    input group           "Auxiliary"
    sinput int            ExtMagicNumber =123456;   // EA幻数
    sinput bool           ExtDebugMessage=true;     // 打印调试信息
    当这种EA在“策略测试”中启动时,输入参数块可以通过双击组名来折叠或扩展,并且可以通过单个复选框选择组内的所有参数进行优化。




  7. 修正导入名称匹配MQL5函数名称的DLL函数。例如:
    #import "lib.dll"
    int func();
    #import
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    int func()
      {
       return(0);
      }
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                                 |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       Print( func() );
      }
    在早期版本中,编译时会返回以下错误:
    'func' - 对具有相同参数的重载函数的模糊调用可以是2种函数之一
       int func()
       int func()
    现在,默认情况下将使用优先级更高的内置MQL5函数,来代替错误。导入的函数可以通过显式指定作用域来调用:
    void OnStart()
      {
       Print( lib::func() );
      }
  8. 修正经济日历新闻中的时间规格。现在,交付事件时考虑的是程序端所连接的交易服务器的时区,而不是本地计算机的时区。
  9. 修正CopyticksCopyTicksRange函数中的过多内存消耗。

信号

  1. 修正使用Wine(Mac OS和Linux)工作时信号图表的显示。

Tester

  1. 策略测试的大规模更新。全新开始页面、重新设计的设置页面、提高了可用性。

    开始页面
    现在,tester启动之后,用户看到的是一个标准任务列表,而不是多个设置,通过选择任务,用户可以快速开始测试。新设计主要是为没有经验的用户而准备的。

    我们选择最频繁的策略测试和优化任务,并将其添加到开始页面。此外,还可以从开始页面重新启动一个以前执行的任务。如果您运行了多个任务,且这些任务不适合开始页面,那么请使用搜索栏。您可以通过任何参数找到测试:程序名称、交易品种、时间周期、建模模式等。




    隐藏不相关的参数
    选择任务之后,用户继续进一步测试参数:选择EA交易、交易品种、测试周期等。所选任务不需要的所有无关参数都将从设置页面中隐藏。例如,选择数学计算,只需要指定两个参数:选择要测试的程序和优化模式。在测试期间,将会隐藏延迟和报价生成的设置。




    方便测试设置
    为了方便起见,设置页面上的一些参数已经重新排列。对延迟和可视化参数添加了扩展解释。此外,现在测试设置可以手动保存和加载,因此交易者可以快速返回到以前的设置。




    使用相同的选项卡,您可以在MetaEditor中快速打开程序进行编辑。

    以点数计算盈利
    使用这些设置,您可以启用以点数计算盈利。这种模式加快了测试速度,同时不需要使用转化率以入金货币重新计算盈利(因此没有必要下载对应的价格历史)。在此模式下,取消库存费和手续费的计算。




    请注意,当以点数计算盈利时,成交量并不重要。每笔交易只计算盈/亏点数。此外,在此模式下不执行预付款控制。只将其用于快速粗略的策略评估,然后使用更精确的模式检查得到的结果。

    一般改进
    测试启动/停止按键和进度条已经被移到选项卡栏。因此,用户可以控制任何“策略测试”部分的流程。测试启动/停止命令也被添加到设置和输入部分的快捷菜单中。




  2. 优化图表现在可以显示在程序端的主工作区,而不是显示在单独的策略测试区。这样,就可以为数据分析提供更多的空间。同时更新了3D可视化系统。




  3. 为“市场报价中全部交易品种”模式添加保存优化缓存
  4. 添加保存测试缓存。

    在早期版本中,只有在优化EA交易时才会将所执行任务的结果保存到文件中。现在,单个测试期间也保存缓存文件,通过它用户可以返回到之前的计算,并随时查看统计数据、结余、净值和入金加载图。在未来的版本中,这个选项将支持测试结果的比较。

    要加载之前的测试结果,请使用Tester新开始页面:点击“之前的结果”并选择想要的网站:




  5. 明显加快了测试和优化的速度,包括使用MQL5云网络执行的操作。
  6. 修正并优化了周期操作。

MetaEditor

  1. 添加配置代码样式(styler)的功能。

    MetaEditor包含一个内置代码样式(styler),它可以根据所采用的标准自动格式化程序文本。现在除了常见样式外,您还可以使用其他流行的标准。为此,请打开MetaEditor设置并选择所需的样式:




    可以为样式(styler)额外设置以下参数:

    每个缩进空间
    设置用于对齐内嵌结构的空格数:
    if(condition)
      {
       //---
      }

    用空格代替制表符
    如果启用此选项,样式(styler)将用空格代替代码中的所有制表符。每个制表符的字符数在“一般”部分中设置。

    删除空行
    启用此选项后,样式(styler)将删除只有一个换行符的所有行。

    在逗号和分号之后插入空格
    启用此选项后,样式(styler)将使用元素枚举以可视方式分隔结构。示例:
    // 之前样式
    ParameterGetRange("InpX",enable,x_cur,x_start,x_step,x_stop);
    // 之后样式
    ParameterGetRange("InpX", enable, x_cur, x_start, x_step, x_stop);

    在声明操作符周围插入空格
    启用此选项后,样式(styler)将围绕赋值、等式、比较和其他操作符插入空格。示例:
    // 之前样式
    if(x==1&y!=2)
      {
       int a=0;
      }
    // 之后样式
    if(x == 1 & y != 2)
     {
      int a = 0;
     }

  2. “在导航中显示”命令已添加到文件书签的快捷菜单。因此,用户可以轻松地在编辑器文件夹结构中找到要编辑的打开文件。




  3. 修正在工具提示中显示'union'关键字。

用户界面翻译又添加了18种新语言:


  • 欧盟地区 — 瑞典语、立陶宛语、丹麦语、拉脱维亚语、爱沙尼亚语、塞尔维亚语、斯洛文尼亚语、斯洛伐克语、芬兰语、格鲁吉亚语
  • 亚洲地区 — 爪哇语、马拉地语、孟加拉语、旁遮普语、泰米尔语、泰卢固语
  • 非洲地区 — 斯瓦西里语、豪萨语

该平台界面现已支持50种语言,涵盖40多亿人使用的语言。

若要设置界面语言,请进入程序端顶部的“查看\语言”菜单。

文档已更新。

基于崩溃日志进行修复。

更新将通过实时更新系统提供。