MetaTrader 5平台build 2005:经济日历,MQL5应用程序服务以及R语言API

MetaTrader 5新功能

21 二月 2019

程序端

    1. 完全修正了内置经济日历。

      经济日历是我们专有的解决方案。在这里,您将看到600+财经新闻和与美国、欧盟、日本、英国、加拿大、澳大利亚、中国等,全球13个大型经济体相关的指标。相关数据都是从开放资源实时收集。

      新版本具有更新的内容和高级的事件过滤器:按照时间、优先级、货币和国家来分类。

      现在可以从MQL5程序访问经济日历数据。请参阅以下内容了解详情。




    2. 新增一种全新的MQL5应用程序类型 —— 服务。这个新类型可以为程序端创建自定义价格源,即,可以实现实时交付来自外部系统的价格,如同直接在交易商交易服务器上实施。

      与EA交易、指标和脚本不同,服务并不链接特定的图表。这些应用程序在后台运行,当程序端启动时自动启动(除非被强制停止)。

      服务可以从“导航”窗口的一个新部分进行管理:





      如何创建服务
      若要创建服务模板,请使用对应的MQL5向导选项。服务有一个Onstart切入点,类似于脚本。在这个点,您可以使用网络函数来实现无限的数据接收和处理循环。

      如何启动服务
      要使用不同的参数运行多个EA交易或指标副本,您应该在不同图表上启动它们。在这种情况下,将创建不同的程序实例,然后彼此独立操作。服务没有链接到图表,因此形成了一种创建服务实例的特殊机制。

      从“导航”选择一个服务,并在快捷菜单中点击“添加服务”。这将打开一个标准的MQL5程序对话框,您可以在其中启用/禁用交易和对信号的访问,以及设置参数。




      可以使用对应的实例菜单启动和停止服务实例。要管理所有实例,请使用服务菜单。

    3. 学习方案已实施。

      这个新功能将帮助初学者学习如何与平台互动。我们已经添加了100+关于平台主要功能的互动提示。

      • 这些提示可以在工具栏的进度条上直接显示,因而并不会分散用户的注意力。
      • 这些提示仅针对您在平台上从未执行的操作显示。
      • 所有提示都包含交互式链接,使用这些链接您可以导航到相关的界面元素。例如,可以从提示直接启动带有所需程序的交易对话框或菜单。

      每当您执行对应操作以及继续学习时,进度条的填充区域将会增加。




    4. 交易账户历史记录可以显示为持仓。平台收集与持仓相关的成交数据(开仓、交易量增加、部分或全部平仓)并将这些信息组合成一条记录。因此,您可以访问持仓的详细信息:开仓时间和平仓时间、交易量、价格和结果。这种有效的显示方式现在可以在导出到文件的历史报告中使用。




    5. 通过使用R语言的应用程序,增加MetaTrader 5程序端数据的新API启用请求。

      我们准备了一个特殊的MetaTrader软件包。它包含用于R和MetaTrader 5程序端之间互动的DLL、文档和辅助r文件。我们正在CRAN存储库中完成软件包注册,之后就可以下载和安装。




      软件包可以使用特殊命令来安装:
      R CMD INSTALL --build MetaTrader

      可使用以下与数据请求有关的命令:

      • MT5Initialize初始化并建立与MetaTrader 5程序端的连接。如果需要,可在命令执行期间启动程序端。
      • MT5Shutdown 去初始化并与MetaTrader 5断开连接。
      • MT5Version获得MetaTrader 5程序端版本。
      • MT5TerminalInfo获得到交易商服务器的程序端连接的状态和参数(账号和服务器地址)。
      • MT5WaitTerminal用于等待MetaTrader 5程序端连接到交易商服务器。
      • MT5CopyTicksFrom(symbol, from, count, flags)从指定日期开始复制指定报价数。该日期从1970.01.01开始,以毫秒指定。
      • MT5CopyTicksRange(symbol, from, to, flags)从指定周期内复制报价。这些日期从1970.01.01开始,以毫秒指定。
      • MT5CopyRatesFrom(symbol, timeframe, from, count)从指定日期开始复制指定的一分钟柱数量。该日期从1970.01.01开始,以秒指定。
      • MT5CopyRatesFromPos(symbol, timeframe, start_pos, count)从相对于最后柱形图的指定持仓复制一分钟柱形图。
      • MT5CopyRatesFromRange(symbol, timeframe, date_from, date_to)从指定周期内复制柱形图。这些日期从1970.01.01开始,以秒指定。

      支持的命令列表将进一步扩展。

    6. 优化用于反向平仓的Close By对话框。现在,这个对话框即使您有大量持仓也不会变慢。
    7. 修正了导致偶尔跳过数据的合成交易品种的计算错误。
    8. 自定义交易品种被删除时,存储其报价和柱形图历史的文件也被删除。这可以避免在硬盘上积累不用的数据。
    9. 修正在高清屏幕上显示搜索结果。

    MQL5

    1. 实现从MQL5程序访问经济日历数据。

      新函数

      CalendarCountryById — 根据标识符获得国家描述。
      bool CalendarCountryById(
         const long           country_id,    // country ID
         MqlCalendarCountry&  country        //国家描述
         );
      CalendarEventById — 根据标识符获得事件描述。
      bool CalendarEventById(
         const long           event_id,      // 事件ID
         MqlCalendarEvent&    event          // 事件描述
         );
      CalendarValueById — 根据标识符获得事件值描述。
      bool CalendarValueById(
         const long           value_id,      // 值ID
         MqlCalendarValue&    value          // 值描述
         );
      CalendarEventByCountry — 获得国家可用事件的数组。
      bool CalendarEventByCountry(
         string               country_code,  // 国家代码
         MqlCalendarEvent&    events[]       // 事件数组
         );
      CalendarEventByCurrency — 获得受影响货币的可用事件数组。
      bool CalendarEventByCurrency(
         string               currency,      //货币
         MqlCalendarEvent&    events[]       // 事件数组
         );
      CalendarValueHistoryByEvent — 根据事件标识符,获取特定时期的值数组。
      bool CalendarValueHistoryByEvent(
         ulong                event_id,      // 事件ID
         MqlCalendarValue&    values[],      // 值数组
         datetime             datetime_from, // 特定时期开始日期
         datetime             datetime_to=0  // 特定时期结束日期
         );
      CalendarValueHistory — 根据国家和/或货币筛选,获取所有事件在特定时期的值数组。
      bool CalendarValueHistory(
         MqlCalendarValue&    values[],          // 值数组
         datetime             datetime_from,     // 特定时期开始
         datetime             datetime_to=0,     // 特定时期结束
         string               country_code=NULL, // 国家代码
         string               currency=NULL      // 货币
         );
      CalendarValueLastByEvent — 根据标识符获取最后时间值的数组。此函数可以请求自上一个请求出现的值。这个操作还使用了in/out参数"change_id"。

      每当日历数据库出现变化,"change_id"属性(最后更改的标识符)都会更新。数据请求期间,您指定"change_id"则程序端返回在此之后出现的事件,以及可用于下一个请求的"change_id"当前值。在第一个函数调用期间,指定"change_id"为零:该函数将不返回任何事件,但将为进一步请求返回当前"change_id"。
      bool CalendarValueHistory(
         ulong                event_id,          // 事件ID
         ulong&               change_id,         //最后一个日历更改 ID
         MqlCalendarValue&    values[]           // 值数组
         );
      CalendarValueLast — 根据国家和/或货币筛选,获取所有事件最后值的数组。此函数可以请求自上一个请求出现的值。类似于CalendarValueLastByEvent,请求使用"change_id"属性。
      bool CalendarValueHistory(
         ulong                event_id,          // 事件ID
         ulong&               change_id,         // 最后一个日历更改 ID
         MqlCalendarValue&    values[],          // 值数组
         string               country_code=NULL, // 国家代码
         string currency=NULL                    // 货币
         );

      新结构

      MqlCalendarCountry — 国家描述。
      struct MqlCalendarCountry
        {
         ulong             id;                        // ISO 3166-1中的国家ID
         string            name;                      // 国家文本名称
         string            code;                      // ISO 3166-1 alpha-2中的国家代码名称
         string            currency;                  // 国家货币代码
         string            currency_symbol;           // 国家货币符号/标志
         string            url_name;                  // mql5.com上URL中使用的国家名称
        };
      MqlCalendarEvent — 事件描述。
      struct MqlCalendarEvent
        {
         ulong                          id;           // 事件ID
         ENUM_CALENDAR_EVENT_TYPE       type;         // 事件类型
         ENUM_CALENDAR_EVENT_SECTOR     sector;       // 事件所属区
         ENUM_CALENDAR_EVENT_FREQUENCY  frequency;    // 事件发布频率
         ENUM_CALENDAR_EVENT_TIMEMODE   time_mode;    // 事件发布时间模式
         ulong                          country_id;   // 国家ID
         ENUM_CALENDAR_EVENT_UNIT       unit;         // 时间值单位
         ENUM_CALENDAR_EVENT_IMPORTANCE importance;   // 事件重要性
         ENUM_CALENDAR_EVENT_MULTIPLIER multiplier;   // 事件重要性的倍数
         uint                           digits;       // 事件值中的小数位数
         string                         source_url;   // 源URL
         string                         event_code;   // 事件代码
         string                         name;         // 事件在程序端语言中的文本名称
        };
      MqlCalendarValue — 事件值描述。
      struct MqlCalendarValue
        {
         ulong             id;                        // 值ID
         ulong             event_id;                  // 事件ID
         datetime          time;                      // 事件日期和时间
         datetime          period;                    // 事件发布期间
         int               revision;                  // 就报告所述期间发表的指标修正
         long              actual_value;              // 当前事件值
         long              prev_value;                // 之前事件值
         long              revised_prev_value;        // 修改之前事件值
         long              forecast_value;            // 预测事件值
         ENUM_CALENDAR_EVENT_IMPACRT impact_type;     // 对汇率的潜在影响
        };

      新枚举

      enum ENUM_CALENDAR_EVENT_FREQUENCY
        {
         CALENDAR_FREQUENCY_NONE            =0,   // 没有使用
         CALENDAR_FREQUENCY_WEEK            =1,   // 每周
         CALENDAR_FREQUENCY_MONTH           =2,   // 每月
         CALENDAR_FREQUENCY_QUARTER         =3,   // 每季度
         CALENDAR_FREQUENCY_YEAR            =4,   // 每年
         CALENDAR_FREQUENCY_DAY             =5,   // 每日
        };
      
      enum ENUM_CALENDAR_EVENT_TYPE
        {
         CALENDAR_TYPE_EVENT                =0,   // 事件(会议,演讲等)
         CALENDAR_TYPE_INDICATOR            =1,   // 指标
         CALENDAR_TYPE_HOLIDAY              =2,   // 假日
        };
      
      enum ENUM_CALENDAR_EVENT_SECTOR
        {
         CALENDAR_SECTOR_NONE               =0,   // 无
         CALENDAR_SECTOR_MARKET             =1,   // 市场
         CALENDAR_SECTOR_GDP                =2,   // GDP
         CALENDAR_SECTOR_JOBS               =3,   // 工作
         CALENDAR_SECTOR_PRICES             =4,   // 价格
         CALENDAR_SECTOR_MONEY              =5,   // 资金
         CALENDAR_SECTOR_TRADE              =6,   // 交易
         CALENDAR_SECTOR_GOVERNMENT         =7,   // 政府
         CALENDAR_SECTOR_BUSINESS           =8,   // 业务
         CALENDAR_SECTOR_CONSUMER           =9,   // 消费者
         CALENDAR_SECTOR_HOUSING            =10,  // 家庭
         CALENDAR_SECTOR_TAXES              =11,  // 税收
         CALENDAR_SECTOR_HOLIDAYS           =12,  // 假日
        };
        
      enum ENUM_CALENDAR_EVENT_IMPORTANCE
        {
         CALENDAR_IMPORTANCE_NONE           =0,   // 无
         CALENDAR_IMPORTANCE_LOW            =1,   // 低
         CALENDAR_IMPORTANCE_MODERATE       =2,   // 适中
         CALENDAR_IMPORTANCE_HIGH           =3,   // 高
        };
      
      enum ENUM_CALENDAR_EVENT_UNIT
        {
         CALENDAR_UNIT_NONE                 =0,   // 无
         CALENDAR_UNIT_PERCENT              =1,   // 百分比
         CALENDAR_UNIT_CURRENCY             =2,   // 本国货币
         CALENDAR_UNIT_HOUR                 =3,   // 小时数
         CALENDAR_UNIT_JOB                  =4,   // 工作数
         CALENDAR_UNIT_RIG                  =5,   // 钻井数
         CALENDAR_UNIT_USD                  =6,   // 美元
         CALENDAR_UNIT_PEOPLE               =7,   // 人口数
         CALENDAR_UNIT_MORTGAGE             =8,   // 抵押贷款数
         CALENDAR_UNIT_VOTE                 =9,   // 投票数
         CALENDAR_UNIT_BARREL               =10,  // 原油桶数
         CALENDAR_UNIT_CUBICFEET            =11,  // 立方英尺数量
         CALENDAR_UNIT_POSITION             =12,  // 工作职位数
         CALENDAR_UNIT_BUILDING             =13   // 建筑物数量
        };
        
      enum ENUM_CALENDAR_EVENT_MULTIPLIER
        {
         CALENDAR_MULTIPLIER_NONE           =0,   // 无
         CALENDAR_MULTIPLIER_THOUSANDS      =1,   // 数以千计
         CALENDAR_MULTIPLIER_MILLIONS       =2,   // 数百万
         CALENDAR_MULTIPLIER_BILLIONS       =3,   // 数十亿
         CALENDAR_MULTIPLIER_TRILLIONS      =4,   // 数万亿
        };
        
      enum ENUM_CALENDAR_EVENT_IMPACRT
        {
         CALENDAR_IMPACT_NA                 =0,   // 不可使用
         CALENDAR_IMPACT_POSITIVE           =1,   // 积极影响
         CALENDAR_IMPACT_NEGATIVE           =2,   // 消极影响
        };
      
      enum ENUM_CALENDAR_EVENT_TIMEMODE
        {
         CALENDAR_TIMEMODE_DATETIME         =0,   //消息来源发布确切时间
         CALENDAR_TIMEMODE_DATE             =1,   // 该事件花了一整天时间
         CALENDAR_TIMEMODE_NOTIME           =2,   //消息来源没有发布事件时间
         CALENDAR_TIMEMODE_TENTATIVE        =3,   // 消息来源只提供日期,但没有提前发布确切时间,确切时间在事件发生时添加
        };

      新错误代码

      ERR_CALENDAR_MORE_DATA             =5400,   // 低于整个结果,数组较小(传递数组中合适的值)
      ERR_CALENDAR_TIMEOUT               =5401,   // 等待经济日历数据请求的反应超时
      ERR_CALENDAR_NO_DATA               =5402,   // 数据没找到

    2. 有关报价和柱形图历史的修正和操作速度的改进。
    3. 有关自定义交易品种的报价和柱形图更改函数CustomTicks*CustomRates*的修正和操作速度显著提高。
    4. 新增数据转化漏斗模型。

      CharArrayToStruct将uchar数组复制到POD结构。
      bool  CharArrayToStruct(
         void&         struct_object,    //结构
         const uchar&  char_array[],     // 数组
         uint          start_pos=0       // 数组中的开始位置
         );
      StructToCharArray将POD结构复制到uchar数组。
      bool  StructToCharArray(
         const void&  struct_object,     //结构
         uchar&       char_array[],      //数组
         uint         start_pos=0        // 数组中的开始位置
         );

    5. 添加MathSwap函数,用于更改ushort、uint和ulong值中的字节顺序。
      ushort MathSwap(ushort value);
      uint   MathSwap(uint   value);
      ulong  MathSwap(ulong  value);

    6. 添加网络函数,用于通过系统套接创建TCP与远程主机的连接:

      • SocketCreate创建具有指定标识的套接并返回其句柄
      • SocketClose关闭套接
      • SocketConnect连接到服务器,使用超时控制
      • SocketIsConnected检查套接当前是否已连接
      • SocketIsReadable获得可以从套接读取的字节数
      • SocketIsWritable检查在当前时间是否可以将数据写入该套接
      • SocketTimeouts为系统套接对象设置数据接收和发送超时
      • SocketRead从套接读取数据
      • SocketSend将数据写入套接
      • SocketTlsHandshake使用TLS Handshake协议启动与指定主机的安全TLS (SSL)连接
      • SocketTlsCertificate接收有关用于安全网络连接的证书的信息
      • SocketTlsRead读取来自安全TLS连接的数据
      • SocketTlsReadAvailable读取来自安全TLS连接的所有可用数据
      • SocketTlsSend使用TLS连接发送数据

      使用网络函数建立连接的主机地址必须明确添加到程序端设置中的可允许地址列表中。

      为网络函数的操作添加了新错误代码

      • ERR_NETSOCKET_INVALIDHANDLE (5270):传递给函数的套接句柄无效
      • ERR_NETSOCKET_TOO_MANY_OPENED (5271):打开套接过多(最多128)
      • ERR_NETSOCKET_CANNOT_CONNECT (5272):连接远程主机时出错
      • ERR_NETSOCKET_IO_ERROR (5273):从套接发送/接收数据时出错
      • ERR_NETSOCKET_HANDSHAKE_FAILED (5274):安全连接建立错误 (TLS Handshake)
      • ERR_NETSOCKET_NO_CERTIFICATE (5275) — 没有用于安全连接的证书数据

    7. 添加用于字符串操作的新函数

      StringReserve为字符串保留指定大小的内存缓存区。
      bool  StringReserve(
         string&        string_var,          // 字符串
         uint           new_capacity         // 字符串的缓冲区大小
         );
      StringSetLength设置字符中指定的字符串长度。
      bool  StringSetLength(
         string&        string_var,          //字符串
         uint           new_length           //新字符串长度
         );

    8. 为数组操作添加新函数

      ArrayRemove从数组中移除从指定索引开始的指定元素数。
      bool  ArrayRemove(
         void&         array[],              // 任何类型的数组
         uint          start,                // 要开始移除的索引
         uint          count=WHOLE_ARRAY     // 元素数
         );
      ArrayInsert 从指定索引开始,向接收方数组插入源数组中指定元素数。
      bool  ArrayInsert(
         void&         dst_array[],          // 接收方数组
         const void&   src_array[],          // 源数组
         uint          dst_start,            // 在要插入的接收方数组位置的索引
         uint          src_start=0,          // 要开始复制的源数组索引
         uint          count=WHOLE_ARRAY     // 插入元素数
         );
      ArrayReverse从指定索引开始,在数组中反转指定元素数。
      bool  ArrayReverse(
         void&         array[],              // 任何类型的数组
         uint          start=0,              // 开始反转的索引
         uint          count=WHOLE_ARRAY     // 元素数
         );

    9. 新"uint count"参数已被添加到CustomRatesUpdateCustomRatesReplaceCustomTicksAddCustomTicksReplace函数中。它可以指定传递数组中将要用于这些函数的元素数量。WHOLE_ARRAY值默认用于参数。这意味着整个数组将被利用。
    10. 添加CustomBookAdd函数,以传递自定义交易品种的市场深度的状态。该函数可以推广市场深度,类似于价格从交易商服务器到达。
      int  CustomBookAdd(
         const string        symbol,            // 交易品种名称
         const MqlBookInfo&  books[]            // 带有DOM元素描述的数组
         uint                count=WHOLE_ARRAY  // 要使用的元素数
         );
    11. 添加CustomSymbolCreate函数重载。它可以基于现有交易品种创建一个自定义交易品种。创建之后,可以使用对应的函数编辑任何交易品种的属性。
      bool  CustomSymbolCreate(
         const string        symbol_name,       //自定义交易品种名称
         const string        symbol_path="",    // 将在其中创建交易品种的组名
         const string        symbol_origin=NULL // 将基于其创建自定义交易品种的交易品种名称
         );
      自定义交易品种属性的复制源的交易品种名称在"symbol_origin"参数中指定。

    12. 将带有日期/时间的字符串转换为datetime值的StringToTime函数已经更新。现在,它支持以下日期格式:

      • yyyy.mm.dd [hh:mi]
      • yyyy.mm.dd [hh:mi:ss]
      • yyyymmdd [hh:mi:ss]
      • yyyymmdd [hhmiss]
      • yyyy/mm/dd [hh:mi:ss]
      • yyyy-mm-dd [hh:mi:ss]

    13. ENUM_TERMINAL_INFO_INTEGER枚举中的TERMINAL_VPS新属性;它显示程序端正在MetaTrader虚拟主机服务器上运行 (MetaTrader VPS)。如果应用程序在主机服务器上运行,您可以禁用其所有可视化功能,因为虚拟服务器没有图形用户界面。
    14. ENUM_SYMBOL_INFO_INTEGER枚举中的SYMBOL_EXIST新属性,意味着同名交易品种已存在。
    15. 修正使用模板函数预声明时的输入。
    16. 添加更改交易账户时重新初始化指标的功能。
    17. 优化StringSplit函数。
    18. 修正标准程序库操作中的错误。

    Tester

    1. 新增TesterStop函数 — 测试代理上EA交易的例行早期关闭。现在,达到指定数量的亏损交易、预设的下跌水平或任何其他标准后,您可以强制停止测试。

      使用此函数完成的测试被视为成功测试。函数调用之后,测试期间获得的交易历史和所有交易统计数据将被传递到程序端。

    2. 禁止在实时报价模式下通过MQL5云网络测试和优化EA交易的功能。这个模式只能在本地代理和本地网络上使用。
    3. 改进了可视化测试过程中的指标使用。现在,价格图表和指标线同步绘制,甚至包括最大的可视化速度。
    4. 优化并显著增加了测试和优化的速度。
    5. 修正了关于历史数据的指标调试。现在,可以正确地调试OnInit和OnDeinit指标函数。
    6. 在测试多货币EA交易时,更快访问历史数据。
    7. 修正在调试历史数据期间可视化测试器的偶尔冻结问题。
    8. 当通过代理处理任务包时,更快启动优化传递。
    9. 更改了向测试代理分发任务包的策略。任务包大小增加,从而大大减少网络操作上的资源损耗。
    10. 更改了选项行为,允许使用本地、网络和云代理。现在,当您关闭这些选项时,代理将完成接收任务的处理,且不再向其提供新任务。在早期版本中,该行为类似于“禁用”命令,该命令可以立即停止代理操作。




    MetaEditor

    1. 在调试器中添加了对非ANSI字符的支持。现在,即使使用斯拉夫字母指定变量名称,表达式仍可以正确显示。
    2. 修正在高清屏幕上显示搜索结果。

    添加克罗地亚语的用户界面翻译。

    文档已更新。