MetaTrader 5新功能

桌面版,移动版和网页平台的更新历史

2 八月 2017

MetaTrader 5 Android build 1642:简化真实账户申请流程

MetaTrader 5 Android版,现在能够轻松创建初始真实交易账户。从菜单选择“开立真实账户”并在服务器列表中找到您的交易商。您只需附加两份文件,包括您的身份证明文件和银行账户账单。然后您的请求将被转发至交易商,同时开立账户时您可能会被要求提供其他信息。

21 七月 2017

MetaTrader 5 Build 1640:创建和测试自定义交易品种

程序端

  1. 现在可以在程序端创建自定义的金融品种。使用该新选项,您可以创建任何交易品种,配置其设置,导入您的价格数据到交易品种并查看其图表。

    创建自定义交易品种
    通过“市场报价”窗口的快捷菜单打开交易品种管理窗口并点击“创建自定义交易品种”:



    大量的交易品种参数可以被配置。完整的参数列表及其描述在文档中可以查询。您可以通过复制任何类似品种的参数并修改它们来配置您的自定义交易品种。在“复制自”字段选择现有的交易品种。
    自定义交易品种的名称不可与交易商提供的交易品种名称相同。如果您连接到存在同名交易品种的服务器,那么自定义交易品种将被删除。
    这里还提供了导入和导出参数的命令。您可以在您的程序端之间轻松地分享自定义交易品种或转移交易品种。设置会被导出到JSON文本文件。

    管理自定义交易品种
    所有交易品种都显示在独立的自定义组。如果您需要更改或删除一个交易品种,请使用列表的快捷菜单:



    导入价格历史
    您可以从任何文本文件以及MetaTrader 历史文件HST和HCC导入价格数据到您的自定义交易品种。选择一个交易品种并转到“柱形图”标签。



    在导入对话框,指定到文件的路径并设置所需的参数:

    • 分隔符 — 文本文件中的元素分隔符。
    • 跳过列和行 — 导入过程中将要跳过的列数(从左向右)和行数(从上到下)。
    • 迁移 — 时间迁移小时数。导入不同时区保存的数据时使用的选项。
    • 仅使用选定 — 仅导入在行查看区域突出显示的行。您可以按住 Ctrl 或 Shift 并用您的鼠标突出标记行。

    1分钟柱文件有以下格式:日期 时间 开盘价 最高价 最低价 收盘价 报价量 交易量 点差。例如;
    2016.06.27    00:01:00    1.10024    1.10136    1.10024    1.10070    18    54000000    44
    2016.06.27    00:02:00    1.10070    1.10165    1.10070    1.10165    32    55575000    46
    2016.06.27    00:03:00    1.10166    1.10166    1.10136    1.10163    13    13000000    46
    2016.06.27    00:04:00    1.10163    1.10204    1.10155    1.10160    23    51000000    41
    您可以使用任何现有品种的数据应用于您的自定义交易品种。导出数据(该选项已添加到之前的平台版本),必要情况下进行修改再将其导回。
    价格历史以一分钟柱的形式存储在MetaTrader 5中。其他所有时间周期都基于这些柱来创建。您也可以导入较高时间周期的数据,但这种情况下较低周期的图表将会出现差别。例如,如果您导入一小时数据,按小时显示的柱形图将会出现在M1图表上。
    自定义交易品种的价格数据保存在独立的自定义目录中(不在交易服务器数据存储的目录中):
    C:\Users\[windows account]\AppData\Roaming\MetaQuotes\Terminal\[instance id]\bases\Custom

    使用自定义交易品种
    自定义交易品种的用法类似于使用交易商提供的品种。自定义交易品种显示在市场报价窗口;您可以打开这种交易品种的图表并在这里使用指标和分析对象。自定义交易品种不可以进行交易。

    测试自定义交易品种的策略
    自定义交易品种可以在策略测试中测试自动交易和指标。以此来优化交易策略,甚至包括交易商目前尚未提供的金融品种。您只需要正确导入历史数据并配置自定义交易品种的属性。



    当计算预付款和利润时,策略测试会自动使用可用的交叉汇率。假设我们在外汇预付款计算类型创建AUDCAD.custom交易品种而我们账户的货币为美元。那么,测试器会根据外汇交易品种名称按照下面顺序搜索所需的交易品种:
    1.     首先,会搜索AUDUSD.custom(计算预付款)和USDCAD.custom(计算交易利润)格式的交易品种
    2.     如果其中一些交易品种不存在,那么会搜索第一个与所需货币对名称(AUDUSD和USDCAD分别进行)相对应的交易品种。例如,找到了AUDUSD.b 和 NZDUSD.b 交易品种。这意味着可以使用它们的汇率计算预付款和利润。

    其他预付款计算类型的工具(期货和 股票交易)则需要一种货币对把工具货币兑换成入金货币。假设我们创建了一个利润和预付款货币为GBP的自定义交易品种而入金货币是CHF。这种情况下,会依照以下顺序搜索测试交易品种:
    1. 检查是否存在GBPCHF (GBP vs CHF) 对应的交易品种。
    2. 如果这种交易品种不存在,那么会搜索第一个与GBPCHF名称相对应的交易品种,例如GBPCHF.b或GBPCHF.def。

    当通过自定义工具测试应用程序时,要确保交易账户包含全部所需的货币对。否则,测试期间将无法计算金融结果和预付款需求。

    在MetaTrader 5平台未来的版本中将会提供更多的可能性
    自定义交易品种的开发尚未完成,在接下来的平台版本中将会添加更多的功能。您将可以从EA交易直接导入历史记录到自定义交易品种,以及实时放送该交易品种的数据(添加报价)。

  2. 添加通过交易量过滤成交时间&交易量功能。

    少于指定交易量的实际交易量可以从成交时间&交易量表格中隐藏。如果使用这个过滤器,那么将只有大额交易才会显示在成交时间&交易量窗口。

    双击成交时间&交易量窗口的第一行,指定最小交易量手数,然后点击市场深度的任何其他区域。交易将被过滤,而当前过滤值将会出现在交易量列的标题。



    您还可以使用成交时间&交易量的快捷菜单指定最小交易量。

  3. 添加绑定市场深度和活动图表的选项。每次您切换到金融品种的图表时,在市场深度窗口都会自动启用相同品种。所以,您无需为每个新交易品种打开市场深度窗口。




  4. 修正程序端窗口最小化和最大化后的工具栏刷新。
  5. 修正交易单和持仓单重复情况下生成的持仓交易历史。

MQL5

  1. 添加在价格历史分析MQL5程序的选项。该选项无需等候新报价就可以检查程序性能。

    当基于真实数据进行分析时,可以在程序端标准图表中启用程序。许多程序,尤其是指标,只有在收到新报价(OnTickOnCalculate)时才会执行计算。因此,若要评估程序表现,您必须等候实时新报价。如果您使用历史数据测试程序,您可以立即提供所需的负载。分析在策略测试中以可视化模式启动,您可以一次性接收许多新报价事件。



  2. 添加支持union。Union是一种特殊的数据类型,由几个共享相同内存区的变量组成。因此,union提供了以两种(或更多)不同的方式讲解相同位序列的能力。Union声明从'union'关键字开始。
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    与结构不同,不同的union成员属于同一个内存区。在该示例中,LongDouble函数的union是通过共享同一个内存区的long和double类型值来声明。请注意,由于long_value 和 double_value 变量重复(在内存中),所以union不可以同时存储long整型值和double真实型值(不同于结构)。 换句话说,MQL5程序随时都可以将union的数据处理为整型(long)或真实型(double)值。因此,union允许接收表示相同数据序列的两种(或更多种)选项。

    union声明期间,编译器会自动分配足够的内存区以便在变量union存储最大的类型(交易量)。同样的语法也用于访问关于结构的union元素,例如,点操作符
    union LongDouble
    {
      long   long_value;
      double double_value;
    };
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                                        |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       LongDouble lb;
    //--- 获得并显示无效 -nan(ind) 数字
       lb.double_value=MathArcsin(2.0);
       printf("1.  double=%f                integer=%I64X",lb.double_value,lb.long_value);
    //--- 最大的标准化数值 (DBL_MAX)
       lb.long_value=0x7FEFFFFFFFFFFFFF;
       printf("2.  double=%.16e  integer=%I64X",lb.double_value,lb.long_value);
    //--- 最小的正标准化 (DBL_MIN)
       lb.long_value=0x0010000000000000;    
       printf("3.  double=%.16e  integer=%.16I64X",lb.double_value,lb.long_value);
      }
    /*  Execution result
        1.  double=-nan(ind)                integer=FFF8000000000000
        2.  double=1.7976931348623157e+308  integer=7FEFFFFFFFFFFFFF
        3.  double=2.2250738585072014e-308  integer=0010000000000000
    */

  3. 为结构和类对象添加自动生成隐式复制操作符。现在,编译器可以自动创建复制操作符,它可以为对象编写简单的条目,例如b=a:
    class Foo
      {
       int               value;
    public:
       string Description(void){return IntegerToString(value);};
       //--- 默认构造函数
                         Foo(void){value=-1;};
       //--- 参数化构造函数   
                         Foo(int v){value=v;};
      };
    //+------------------------------------------------------------------+
    //|  包括 Foo 类型对象的结构                           |
    //+------------------------------------------------------------------+
    struct MyStruct
      {
       string            s;
       Foo               foo;
      };
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
    //---
       MyStruct a,b;
       Foo an_foo(5);
       a.s="test";
       a.foo=an_foo;
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    //---
       Print("b=a");
       b=a;
    //---
       Print("a.s=",a.s," a.foo.Description()=",a.foo.Description());
       Print("b.s=",b.s," b.foo.Description()=",b.foo.Description());
    /*
       Execution result;
       a.s=test a.foo.Description()=5
       b.s= b.foo.Description()=-1
       b=a
       a.s=test a.foo.Description()=5
       b.s=test b.foo.Description()=5
    */
      }
    在隐式操作符中执行对象的成员逐一复制。

    • 如果成员是一个对象,那么该对象对应的复制操作符将会被调用。
    • 如果成员是一个对象数组,那么调用每个元素对应的复制操作符之前就会使用ArrayResize增加或减少接收数组到所需的大小。
    • 如果成员是简单类型数组,ArrayCopy函数将用于复制。
    • 如果成员是一个对象指针,那么将会复制指针而不是它指向的对象。

    必要的情况下,您可以使用重载覆盖这个行为然后创建您自己的选项来替代隐式复制操作符。

  4. 当使用Copy* 函数访问来自EA交易的价格历史时,优化内存使用。当处理大量数据将会大幅降低内存消耗。

  5. 现在,TimeToStruct函数返回一个布尔值,允许检查datetime到MqlDateTime转换的成功率。
  6. 添加禁止在结构使用FileWriteStructFileReadStruct函数的禁令,包括字符串,动态数组,对象和指针。
  7. 已添加以下返回代码:

    • TRADE_RETCODE_REJECT_CANCEL — 激活挂单的请求被拒绝,订单被取消
    • TRADE_RETCODE_LONG_ONLY — 由于交易品种设置了“仅允许买入持仓”的规则,所以请求被拒绝
    • TRADE_RETCODE_SHORT_ONLY — 由于交易品种设置了“仅允许卖出持仓”的规则,所以请求被拒绝
    • TRADE_RETCODE_CLOSE_ONLY — 由于交易品种设置了“仅允许关闭现有持仓”的规则,所以请求被拒绝

  8. 通过SYMBOL_ORDER_MODE参数添加SymbolInfoInteger函数的新返回值。SYMBOL_ORDER_CLOSEBY — Close By操作的权限,例如,通过反向持仓来平仓。
  9. SYMBOL_CUSTOM布尔属性已添加到ENUM_SYMBOL_INFO_INTEGER枚举。该属性可以了解交易品种是否为自定义。使用SymbolInfoInteger函数来获得属性。
  10. 现在有可能获得创建一个订单,交易或持仓的原因。

    新属性


    订单,交易和持仓的创建原因
    已添加三个变量用来获得创建交易操作的原因:

    ENUM_POSITION_REASON ENUM_DEAL_REASON ENUM_ORDER_REASON 原因描述
    POSITION_REASON_CLIENT DEAL_REASON_CLIENT ORDER_REASON_CLIENT 激活从桌面程序端下单的订单而执行该操作
    POSITION_REASON_MOBILE DEAL_REASON_MOBILE ORDER_REASON_MOBILE 激活从手机应用下单的订单而执行该操作
    POSITION_REASON_WEB DEAL_REASON_WEB ORDER_REASON_WEB 激活从网页平台下单的订单而执行该操作
    POSITION_REASON_EXPERT DEAL_REASON_EXPERT ORDER_REASON_EXPERT 激活从MQL5程序下单的订单而执行该操作,例如EA交易或脚本
    - DEAL_REASON_SL ORDER_REASON_SL 激活止损而执行该操作
    - DEAL_REASON_TP ORDER_REASON_TP 激活止赢而执行该操作
    - DEAL_REASON_SO ORDER_REASON_SO 由于Stop out 事件而执行该操作
    - DEAL_REASON_ROLLOVER - 由于展期交割而执行交易
    - DEAL_REASON_VMARGIN - 收取变动预付款后执行交易
    - DEAL_REASON_SPLIT - 股票或其他资产分割(价格减少)后执行交易,宣布分割期间拥有持仓

  11. 优化同步和访问报价历史。
  12. CopyTicksRange函数中,修正返回报价到统计数组。在早期版本中,这种情况下经常返回0报价。
  13. 模糊逻辑库完成了多种修正。

信号

  1. 修正无交易账户连接的情况下从网站打开的信号。

Tester

  1. 优化并加速处理订单和交易历史。当处理大量数据时(数万条历史条目)将大幅度提高操作速度。
  2. 修正测试报告中计算的持仓时间。

MetaEditor

  1. 修正了调试程序中静态类成员数组的显示内容。
  2. 在调试程序中添加了一个断点列表。该列表可以使用Debug标签的快捷菜单来打开:



    若要跳转到断点,请双击它。
更新文档。


8 六月 2017

MetaTrader 5 iOS build 1605: 开立初始交易账户

新版MetaTrader 5 iOS build 1605提供了轻松开立初始交易账户的可能性。请从菜单选择“开立真实账户”并在服务器列表寻找您的交易商。填写您的个人详细资料,附加两份可以确认您身份和地址的文档并提交请求。您的交易商将会为您开立一个真实账户,必要情况下您还需要提供其他信息。


新版MetaTrader 5 iOS还具有优化和重新设计邮箱版块的特性:

  • 现在相关邮件都绑定在一起并在邮件列表中显示为一项。
  • 添加预览邮件附件。
  • 现在一封邮件最多可以发送五个附件(文件大小不能超过8Mb)。

26 四月 2017

MetaTrader 5 Build 1596:访问价格历史

程序端

  1. 添加访问柱形图和报价历史的功能。现在,不仅仅使用MQL5语言,还可以通过交易平台界面从服务器直接下载完整的1分钟柱形图和报价历史。访问价格历史已经扩展成为推出定制数据源功能准备工作的一部分。不久的将来,平台将提供可以基于用户价格数据建立图表,以及创建综合交易品种和使用离线图表。
    若要下载数据,请通过“市场报价”窗口的快捷菜单打开交易品种管理对话框:


    对话框显示两个新标签:“柱形图”和“报价”。选择交易品种,想要的时间间隔并点击“请求”。平台将从服务器请求全部可用数据,如果已被下载则将会立即显示数据。已保存的价格数据可以导出为CSV文件。

  2. 添加持仓,交易和订单时间的毫秒精确显示。




  3. 在交易对话框,修正拒绝执行Close By请求的通知。

MQL5

  1. 修正PositionSelect函数。该函数可以偶尔选择不同于最低单号的持仓。
  2. 修正请求深度报价历史数据时的CopyTicksCopyTicksRange函数的操作。

信号

  1. 修正复制增加现有持仓大小的操作。单边账户可能偶尔出现这个错误。

Tester

  1. 修正处理交易所模式的限价单。优于市价单(买价低于市场价或卖价高于市场价)的限价单可以无滑点的执行。不如市价单的限价单以下单时的市场价立即执行。

更新文档。

8 四月 2017

MetaTrader 5 Android build 1576:以持仓的形式显示交易历史

MetaTrader 5 Android的交易历史现在能够以持仓的形式显示。在此之前,历史标签仅仅包含订单和交易信息,然而现在,可以根据持仓信息来分析交易。持仓相关的全部交易数据都集中显示在一条记录,显示如下:

  • 持仓和平仓时间(取决于第一笔交易和最后一笔交易)
  • 持仓交易量(如果部分平仓,记录会包括已平仓交易量和初始交易量)
  • 加权平均持仓开盘价和收盘价
  • 与持仓相关的全部金融交易结果


30 三月 2017

MetaTrader 5 iOS build 1547:以持仓的形式显示交易历史

现在交易历史能够以持仓的形式显示。在此之前,历史标签仅仅包含订单和交易数据。现在,它还包括了持仓数据。交易平台收集持仓相关的交易数据,然后将数据合并为一个记录。该记录包括:

  • 由第一笔交易和最后一笔交易决定的持仓和平仓时间
  • 持仓交易量。部分平仓情况下,记录包括平仓和初始交易量
  • 加权平均持仓开盘价和收盘价
  • 与持仓相关的金融交易的全部结果

24 三月 2017

MetaTrader 5 Build 1570:改进市场展示,扩展MQL5模板函数

程序端

  1. 更新MetaTrader 市场商店的应用程序展示。现在,您可以更加方便的浏览EA交易和技术指标。我们更新了界面设计并添加了产品选择:

    • 现在,主界面可以显示最受欢迎的EA交易,指标,新的市场产品以及热门的免费应用程序。
    • EA交易,指标和实用工具版块还有其分版块:网格和锁仓EA交易,趋势和多货币指标以及更多内容。



  2. 修正当使用有权限限制的Windows账户时的客户端更新和市场、信号及虚拟主机的内置购买。
  3. 修正偶然发生的持仓历史的错误分类。
  4. 优化和修正展示标签的显示。

MQL5:

  1. 添加支持使用参数重载模板函数。例如,我们有一个通过类型转换将第二个参数的值写入第一个参数的模板函数。MQL5不允许string到bool的类型转换。但是,我们可以自己完成。让我们创建一个模板函数的重载:
    //+------------------------------------------------------------------+
    //| 模板函数                                     |
    //+------------------------------------------------------------------+
    template<typename T1,typename T2>
    string Assign(T1 &var1,T2 var2)
      {
       var1=(T1)var2;
       return(__FUNCSIG__);
      }
    //+------------------------------------------------------------------+
    //|  bool+string的特殊重载                            |
    //+------------------------------------------------------------------+
    string Assign(bool &var1,string var2)
      {
       var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0);
       return(__FUNCSIG__);
      }
    //+------------------------------------------------------------------+
    //| 脚本起始函数                                        |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       int i;
       bool b;
       Print(Assign(i,"test"));
       Print(Assign(b,"test"));
      }
    代码执行后,我们可以看到Assign() 模板函数已被用于int+string组,而重载版也已在第二次调用时用于bool+string组。
    string Assign<int,string>(int&,string)
    string Assign(bool&,string)

  2. 新增模板函数的显式规范。因此,在调用函数列表之前,请先指定代表参数:
    template<typename T>
    T Func() { return (T)0; }
      
      
    void OnInit()
      {
       Func<double>();   // 模板函数显式规范
      }
    因此,类型的显式规范将会执行代表参数而非调用参数。

  3. 优化DRAW_ZIGZAG 绘制类型的自定义指标的显示。
  4. 添加新值到ENUM_DEAL_TYPE交易类型枚举:

    • DEAL_DIVIDEND — 股息操作。
    • DEAL_DIVIDEND_FRANKED — 税务减免(免税)股息操作(公司缴纳税费,而非客户)。
    • DEAL_TAX — 收税。

  5. 修正DRAW_FILLING绘制类型的自定义指标的显示。如果上下线坐标一致,绘制细线。
  6. 修正CHART_SHOW参数设置为'false'时计算位图标签对象坐标。参数通过ChartSetInteger函数来设置并允许隐藏全部价格图表元素来创建一个自定义程序界面。
  7. 修正将24位图像置于MQL5应用程序资源时的重新编码。
  8. 修正使用ArrayPrint函数的印刷结构。
  9. 更新MQL5标准程序库。

MetaEditor

  1. 新增马来语的用户界面翻译。

信号

  1. 修正在MQL5.community网站移动但没有连接交易账户时打开程序端的信号页面的问题。

Tester

  1. 修正策略测试中的CopyTicks函数操作。
  2. 修正生成报告时排序出金交易。
  3. 修正更改挂单。

主机

  1. 修正超高清屏幕(4К)上虚拟主机向导的显示。

更新文档。

22 二月 2017

MetaTrader 5 平台Build 1545:通过鼠标滚动快速切换窗口和改变价格

程序端

  1. 在'工具箱'和'策略测试'窗口之间快速切换。



  2. 提供了可以通过鼠标滚动编辑价格和订单交易量的新选项:




  3. 现在,当您切换到下载移动程序端时,将会记录您的交易服务器列表。然后,当您在iPhone或Android设备上安装MetaTrader时,将会向您显示一份准备好的服务器列表。 您就可以迅速连接您现有的交易账户。而当前连接账户的服务器将会第一时间显示在移动程序端。




  4. 显著降低隐形(最小化)图表和对象产生的程序端负载。
  5. 修正偶尔错误触发追踪止损水平。
  6. 修正在账户交易历史中通过交易品种筛选交易。
  7. 修正持仓历史中'类型'字段的显示。
  8. 修正以持仓形式展示交易历史。
  9. CLR_NONE用于颜色的情况下,修正绘制类型为DRAW_COLOR_LINE,DRAW_COLOR_ZIGZAG和DRAW_COLOR_SECTION的自定义指标的显示。

MQL5

  1. 修正使用常量指针打印模板。
  2. 修正管理访问私有和受保护的类成员。

Tester

  1. 当订单触发价格不如当前市场价时(买价高于或卖价低于市场价),修正激活交易所品种的限价订单。
  2. 移除具有64种输入参数的自定义指标测试的连接限制。
  3. 添加印地语的UI 翻译。

更新文档。

9 二月 2017

MetaTrader 5 iOS build 1509:通过Facebook登录MQL5.com
  • 添加通过Facebook注册和登录您的MQL5.com账户的功能。如果您拥有该群组网络的账户,只需几次点击您就可以访问聊天功能及全套的MetaTrader 5服务。


  • 进一步改进及修正。

18 一月 2017

MetaTrader 5 Android build 1506:交易筛选和排序
  • 交易和历史标签现在提供排序的功能,可以帮助您按照交易品种(金融工具),订单和持仓/平仓时间对全部交易进行排序。除了排序功能以外,历史标签还可以根据不同的交易品种筛选交易。

  • 同时优化了多窗口模式下的图表工作。经过改进的菜单不但可以打开新窗口,删除旧窗口,还可以将其重新排列并选择想要的布局(垂直布局,水平布局或拼图布局)。


9 十二月 2016

MetaTrader 5 Build 1495:改善MQL5处理自定义图形的功能

MQL5:

  1. 添加CopyTicksRange函数。
  2. 添加改善的抗锯齿函数到CCanvas类:
  3. 在MQL5参考文档中添加图形程序库的描述。该程序库可以直接在价格图表上创建直方图,分布图和线性图。
  4. 添加系统键状态标识符到客户端属性常量列表。调用TerminalInfoInteger(TERMINAL_KEYSTATE_XXX)返回GetKeyState()函数在MSDN相同键的状态代码。
  5. 禁用支持分配字符串类型到bool。检查字符串之前,需要使用明确的条件。例如,在新版本中,编译以下代码将会出现错误:
    string str;
    ...
    if(str)                        // 将会导致"不能转换'string'类型到'bool'"编译错误(在之前版本不会出现错误)
       Print("str is true");
    应该使用明确的条件:
    string str;
    ...
    
    //--- 检查字符串是否被初始化
    if(str!=NULL)
       Print("str is true");
    
    or
    
    //--- 检查字符串值是否为"true"
    if(StringCompare(str,"true",false))
       Print("str is true");
    
    or
    
    //--- 检查字符串是否为不等于零的整数
    if((int)str!=0)
       Print("str is true");
修正崩溃日志中报告的错误。

2 十二月 2016

MetaTrader 5 网页平台:双重认证及更改密码
  • 我们已经添加了使用动态密码的双重认证选项,从而提高账户保护性能,防止未经授权的账户访问。启用双重认证功能之前,请先启动MetaTrader 5移动应用程序。登录并在设置窗口选择动态密码(OTP)生成选项。OTP生成器可以绑定您的全部交易账户并为每个账户自动生成一个唯一的六位动态密码。登录网页平台时输入该动态密码。





  • 另一个新选项就是可以改变主密码和只读密码。赶快抓住这个机遇,创建一个好记的个人ID吧。
  • 同时,更新的网页平台可以自动生成模拟账户。现在,您可以使用任何浏览器启动MetaTrader 5网页平台,即刻开始外汇、股票、期货或等金融交易品种的交易。

24 十一月 2016

MetaTrader 5 Build 1485: 附加测试模式和标准程序库的图形

程序端

  1. 更改了程序端和MetaEditor日志中的条目顺序。更新之前,首先突出最新的日志条目。现在,日志会最先显示之前的条目。更传统的逆向排列顺序使得阅读日志更加轻松。




    此外,现在使用日志快捷菜单还可以隐藏'时间'和'源'所在列。

  2. 在锁仓模式,平仓的单号现在会显示在交易历史记录的订单和交易。这可以更轻松的查找相关的打开和关闭操作。




  3. 修正相同工具下导致从现有持仓到新持仓复制SL/TP的错误。当在锁仓模式使用一键交易功能(例如,从图表或从市场报价窗口)时可能发生该错误。
  4. 修正超高清屏幕(4K)下箭头对象的显示。

MQL5

  1. 添加新的打印简单类型和结构到数组日志的ArrayPrint功能。
    void  ArrayPrint(
       const void&   array[],             // 输出数组
       uint          digits=_Digits,      // 小数位数
       const string  separator=NULL,      // 结构字段值之间的分隔符
       ulong         start=0,             // 最先显示元素的指数
       ulong         count=WHOLE_ARRAY,   // 显示的元素数
       ulong         flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN    
       );
    
    ArrayPrint无法打印全部结构数组字段到日志 – 跳过对象的数组字段和指针字段。如果您想打印全部结构字段,您应该使用所需格式批量打印的定制功能。
    //--- 显示最近的10个柱形图值
       MqlRates rates[];
       if(CopyRates(_Symbol,_Period,1,10,rates))
         {
          ArrayPrint(rates);
          Print("Проверка\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]");
          for(int i=0;i<10;i++)
            {
             PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
             TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
             rates[i].open,rates[i].high,rates[i].low,rates[i].close,
             rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
            }
         }
       else
          PrintFormat("CopyRates failed, error code=%d",GetLastError());
    //--- 日志示例
    /*
                        [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295         18110       10   17300175000
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747         17829        9   15632176000
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744         13458       10    9593492000
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194         15362        9   12352245000
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172         16833        9   12961333000
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052         15933        8   10720384000
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528         11888        9    8084811000
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915          7284       10    5087113000
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904          8710        9    6769629000
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263          8956        7    7192138000
       Check
       [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 
    */
    

  2. 修正添加字符串类型S1=S2+S1的错误
  3. 更改ArrayResize函数的行为。如果 -1作为reserve_size参数传递,如果函数没有增加数组大小,函数仅释放未使用(保留)的内存。 以reserve_size=-1设置新数组大小为0相当于ArrayFree调用。新行为可以优化MQL5程序的内存使用率。
    void OnStart()
      {
       int arr[];
    //--- 最初使用的内存数量 
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- 用于数组大小1的内存数量,保留
       ArrayResize(arr,1,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- 增加数组以后,使用的内存数量因保留而无法更改
       ArrayResize(arr,1024*512,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- 减少数组以后,内存大小也不会改变
       ArrayResize(arr,1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- 移除储备内存后将释放未使用的内存
       ArrayResize(arr,1,-1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      }
    

  4. 图表绘制函数已经添加到标准程序库。若要使用新功能,请将 MQL5\Include\Graphics\Graphic.mqh 加入到您的项目。

    基于三个数据系列使用GraphPlot绘制图表:
    #include <Graphics/Graphic.mqh>
    
    double Func1(double x) { return MathPow(x,2); }
    double Func2(double x) { return MathPow(x,3); }
    double Func3(double x) { return MathPow(x,4); }
    
    void OnStart()
      {
       GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      }
    
    
    结果:


    基于数据数组使用GraphPlot绘制图表:
    #include <Math/Stat/Binomial.mqh>
    #include <Graphics/Graphic.mqh>
    
    void OnStart(void)
      {
       double    vars[101];
       double    results[101];
       const int N=2000;
    //---  
       MathSequence(0,N,20,vars);
       MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
       ArrayPrint(results,4);
       GraphPlot(results);
    //---
      }
    
    结果:



  5. 更新标准程序库中处理数学统计的函数。我们已经彻底检查了MQL5版和源R语言所有函数的质量和准确性。若要控制准确度和性能速度,单元测试可以沿着静态库进行分布。它们可以在\MQL5\Scripts\UnitTests\Stat目录取得。

    • TestStat.mq5 — 是测试计算结果的主要测试脚本
    • TestPrecision.mq5 — 计算精度的测试
    • TestBenchmark.mq5 — 测试包括计算测量性能

Tester

  1. 该更新强调了测试期间配置执行延迟的高级设置。现在您可以在多种交易条件下测试您的EA交易,包括无延迟的理想情况和任何自定义设置的延迟。



    在早期版本只提供随机延迟模式

  2. 修正在'基于高开低收的M1'模式生成柱形图的报价量。
  3. 修正锁仓模式交易时订单和持仓建立时间说明提高到毫秒。
  4. 修正'真实报价'模式下多货币或多时间周期模式期间可能出现的'旧报价'错误。
  5. 改进从位于磁盘的数据库阅读请求报价时的CopyTicks性能速度。

MetaEditor

  1. 导航条和工具箱中的文件快捷菜单现在突出了处理源代码版本库MQL5存储的命令。




  2. 修正处理存储中超过1024文件时可能偶尔破坏本地MQL5存储库完整性的错误。
  3. 修正MQL5存储文件树的显示。
  4. 修正批量文本替换的显示。

更新文档。

24 十一月 2016

MetaTrader 5 iOS build 1425
  • 改进图表上的一键交易面板:现在也可用在纵向模式;通过从列表选择意向值快速改变交易量。



  • 图表交易品种现在可以通过在窗口标题点击交易品种名称进行更改。
  • app设置版块的改进:现在可以突出当前账户信息,合理安排单元和改进设计。
  • 多项改进和修正。

14 十月 2016

MetaTrader 5平台Build 1455:MQL5 的数学函数库

程序端

  1. 在交易对话框添加买入,卖出和关闭按键的工具提示。工具提示包括操作期间买入或卖出安全性的信息,以帮助新手了解交易的过程。




  2. 在“交易”和“历史”标签添加订单,交易和持仓的新图标。




  3. 更新的程序端提供了优化及更快(最高加速4-5倍)的市场深度,市场深度报价图表以及成交时间&交易量数据的展示和更新。
  4. 修正非交易时间报价历史的同步。这一过程在某些情况下可能会消耗过多的网络流量。

MQL5

  1. 标准程序库中加入了MQL5版的ALGLIB数值分析库

    程序库特点

    • 线性代数
    • 线性和非线性方程组
    • 插值
    • 优化
    • 快速傅里叶变换
    • 数值积分
    • 线性和非线性最小平方拟合
    • 常微分方程
    • 特殊函数
    • 描述性统计和假设测试
    • 数据分析 - 分类,回归
    • 多种精确算法中的线性代数,插值等的实施算法(使用MPFR)

    如何使用

    ALGLIB 文件位于\MQL5\Include\Math\Alglib。若要使用这些函数,请将主程序文件添加到您的程序:

     #include <Math\Alglib\alglib.mqh> 

  2. 标准程序库包含了数理统计函数。MQL5 现在提供R语言的功能,这是最好的统计数据处理和分析工具之一。

    程序库特点

    统计程序库包含计算数据统计特征的函数以及统计分布操作的函数:

    • 计算数组元素统计特征的函数
    • 统计分布操作的选项:常态分布,对数常态分布,贝塔分布等。

    如何使用

    统计程序库文件位于 \MQL5\Include\Math\Stat。若要使用该程序库,请将所需函数的文件添加到您的程序,例如:

    #include <Math\Stat\Binomal.mqh>
    #include <Math\Stat\Cauchy.mqh>
    
    
    

    程序库函数的详细描述可在文章MQL5统计分布 - 使用最好的R中得到。


  3. 标准程序库中加入了MQL5版的Fuzzy程序库。Fuzzy程序库实现了Mamdani和Sugeno模糊推理系统。

    程序库特点

    • 13 个成员函数
    • 灵活的开发模糊系统规则的形式
    • Mamdani模糊推理系统
    • Sugeno模糊推理系统
    • Mamdani - 类型系统的5种去模糊化方式
    • 无限数量的输入输出变量

    如何使用

    Fuzzy程序库文件位于\MQL5\Include\Math\Fuzzy。若要使用该程序库,请将所需函数的文件添加到您的程序,例如:

    #include <Math\Fuzzy\mamdanifuzzysystem.mqh>
    #include <Math\Fuzzy\sugenofuzzysystem.mqh>
    
    
    

    程序库的详细描述可在代码库:Fuzzy - 开发模糊模型的程序库中得到


  4. CHART_QUICK_NAVIGATION新属性允许在图表中启用/禁用快速导航栏。如果您需要更改和访问属性状态,请使用ChartSetInteger和ChartGetInteger函数。




    导航栏可以通过按下回车或空格键来打开。它允许您快速转到图表上的指定日期,以及切换到交易品种和时间周期。如果您的MQL5程序会处理按下回车或空格键,请禁用CHART_QUICK_NAVIGATION属性,以避免程序库拦截这些事件。快速导航栏仍然可以通过双击打开。

  5. 添加了FileLoad和FileSave新函数。它们提供了一种简单的阅读和数组保存到文件的方式。不同于FileRead*和FileWrite*,这些函数不需要指标处理程序。FileLoad和FileSave操作数值类型的数组,以及没有字符串,动态数组或类对象的简单结构。
    long  FileLoad(
       const string filename,      // [in] 文件名
       void         &buffer[],     // [out] 阅读文件的数组
       uint         common_flag=0  // [in] 0 - 搜索程序端Files文件夹中的文件,FILE_COMMON - 在程序端普通目录中搜索
       );
    
    bool  FileSave(
       const string filename,      // [in] 文件名
       const void   &buffer[],     // [in] 保存文件的数组
       uint         common_flag=0  // [in] 0 - 创建程序端Files文件夹中的文件,FILE_COMMON - 在程序端普通目录中创建
       );
    
    
    如何将报价写入文件然后阅读的示例:
    //--- 输入参数
    input int      ticks_to_save=1000; // 报价数
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       string  filename=_Symbol+"_ticks.bin";
       MqlTick ticks[];
    //---
       int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
       if(copied!=-1)
         {
          PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
          //--- 如果报价历史被同步,错误代码等于零
          if(!GetLastError()==0)
             PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError);
          //---  写入报价到文件
          if(!FileSave(filename,ticks,FILE_COMMON))
             PrintFormat("FileSave() failed, error=%d",GetLastError());
         }
       else
          PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError());
    //--- 现在阅读返回到文件的报价
       ArrayFree(ticks);
       long count=FileLoad(filename,ticks,FILE_COMMON);
       if(count!=-1)
         {
          Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags");
          for(int i=0;i<count;i++)
            {
             PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x",
             TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000,
             ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags);
            }
         }
      }
    
    

  6. 通过DRAW_CANDLES 绘制模式更改自定义指标的展示。现在该模式可以设置1-3种颜色。蜡烛图的显示取决于设定的颜色数量。

    如果指定一种颜色,图表上的所有蜡烛图都将绘制这种颜色。
    //--- 绘制相同颜色的蜡烛图 
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- 仅指定一种颜色,所以所有蜡烛图都是相同的颜色
    #property indicator_color1  clrGreen  
    
    
    如果指定两种颜色,一种颜色用于蜡烛图的边框,另一种用于主体。
    //--- 蜡烛图的颜色不同于阴影颜色
    #property indicator_label1  "Two color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- 蜡烛图边框和阴影为绿色,主体为白色
    #property indicator_color1  clrGreen,clrWhite 
    
    
    如果指定三种颜色,一种颜色用于蜡烛图的边框,其他两种颜色用于牛市蜡烛图和熊市蜡烛图的主体。
    //--- 蜡烛图的颜色不同于阴影颜色
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- 蜡烛图边框和阴影为绿色,牛市蜡烛图主体为白色,熊市蜡烛图主体为红色
    #property indicator_color1  clrGreen,clrWhite,clrRed
    
    
    DRAW_CANDLES 风格允许设置自定义颜色的蜡烛图。使用PlotIndexSetInteger函数运行指标期间还可以动态更改所有颜色(drawing_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_number, color),在这里modifier_number 可能是以下的值:
    • 0 – 边框和阴影的颜色
    • 1 – 牛市蜡烛图主体颜色
    • 2 – 熊市蜡烛图主体颜色
    //--- 设置边框和阴影的颜色
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
    //--- 设置牛市蜡烛图主体颜色
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
    //--- 设置熊市蜡烛图主体颜色
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
    
    
  7. 修正漏洞并改进使用CopyTicks函数的报价历史操作。
  8. 从新版开始,操作符可用于接口(之前是不允许的)。

市场

  1. 修正从市场买入产品时可能导致重复请求登录MQL5.community的错误。

Tester

  1. 添加希腊语,马来语和希伯来语的UI 翻译。

更新文档。

29 九月 2016

MetaTrader 5 网页平台更加快速便捷
  • 添加调整网页应用程序模块大小的能力,包括市场报价和价格图表窗口。
  • 添加工具箱窗口的交易和历史标签按列排序的能力。列宽可以更改。
  • 添加详情标签和快速添加交易品种的功能。
  • 由于代码优化,提高了网页程序端的整体操作速度。账户初始化,添加交易品种以及交易本身,现在都可以更快速的执行。

26 九月 2016

MetaTrader 5 iOS build 1403
  • 改变交易选项展示 -现在交易数据表示取决于交易账户上的风险管理系统:零售外汇,期货或交易所模式。


  • 常规设置中移动界面语言选择到一个单独的菜单。
  • 其他修正和改进。

26 九月 2016

MetaTrader 5 Android build 1372
  • 应用程序支持多窗口模式,允许交易者同时监控多个交易品种的价格变化。
  • 添加改变指标子窗口高度的功能。
  • 现在,移动平台具备交易品种快速选择按 键以及独立的图表设置菜单。


  • 我们还增加了编辑指标水平的功能以及保加利亚语的翻译界面。

16 九月 2016

MetaTrader 5 Build 1430:更新展示标签

程序端



  1. 实现为交易所市场形成展示标签的新算法。现在,平台根据应用于交易账户的风险管理系统来适应资产显示:零售外汇,期货或交易所模式。

    资产部分有助于在交易所交易外汇或期货 显示它们当前的市场状态。相同货币可以在不同的交易品种种类中找到:作为货币组中的一个,作为基础货币,等等。例如,您可以反向持仓 GBPUSD,USDJPY和GBPJY。在这种情况下,了解您有多少货币以及您需要多少货币是非常困难的。持有超过3个持仓会使这个任务进一步复杂化。 如今在此种情况下,账户的所有状态都可以轻松地在资产标签查看。
    让我们使用3种相同的持仓举例说明:

    以134.027 的价位买入1手 GBPJPY— 收到 100 000 GBP,给出134 027 000 JPY
    以102.320 的价位卖出1手 USDJPY— 给出 100 000 USD,收到102 320 000 JPY
    以1.30923 的价位卖出1手 GBPUSD— 给出100 000 GBP,收到 103 920 USD

    我们同时买入卖出100 000GBP。我们有0GBP,资产标签不会显示这个货币。而USD,我们在一种情况下给出货币而在另一种情况下接收它。由于入金货币也是USD,资产标签会计算最终结果并将其添加到当前结余。参与两个交易的JPY意味着该标签显示其总值。




    使用交易所模式的人们 可以使用这个部分了解他们资金的使用情况。与之前模式不同,资金是在交易执行的时候直接出金/加入。例如,如果您买入EURRUB,您马上会收到EUR而 相应的RUB总值会从结余取出。在交易过程中,账户结余甚至可能是负数:当您使用借款时而购买的资产则用作抵押。在这种情况下,资产标签可以使您轻松地了 解交易账户状态。

    此外,在这里您还可以看到清算值 — 账户的金额和以市价平掉当前所有持仓的价格(结果)。




  2. 修正交易操作历史记录中显示的交易类型。
  3. 修正重新连接交易账户时重复显示的风险提示窗口。
  4. 优化和修正大量交易品种情况下交易品种选择对话框的使用情况(几千甚至更多)。
  5. 修正基于Moving Average(Bollinger Bands,Adaptive Moving Average等)计算的内置指标的展示水平。在此之前,当在独立子窗口绘制指标时会产生错误。
  6. 修正如果订单价格与合约上限或下限价格一致的情况下偶尔出现的干扰下期货合约订单的错误。

MQL5

  1. 优化和加快MQL5应用程序的编译速度。
  2. 为类,结构和函数添加支持'final' 和'override'修饰符。

    类和结构的'final'修饰符
    'final'修饰符在声明一个结构或类的时候禁止进一步继承它。 如果在这个类(结构)中无需做出任何进一步变化或这种变化出于安全原因无法接受,则以'final'修饰符声明那个类(结构)。在这种情况下,所有类的类函数也默认为 'final'。
    class CFoo final
      {
      //--- 类主体
      };
     
    class CBar : public CFoo
      {
      //--- 类主体
      };
    当如上面显示的一样试图以'final'修饰符从一个类继承时,编译器显示一个错误:
    不能像其被声明为'final'一样从'CFoo' 继承
    参照 'CFoo' 声明

    函数的'override'修饰符
    'override' 修饰符表示声明的函数应该始终重写父类的类函数。使用修饰符可以使您避免重写时的错误,例如意外修改类函数的签名。例如,接受 'int' 类型变量的 'func' 类函数定义在基本类中:
    class CFoo
      {
       void virtual func(int x) const { }
      };
    类函数重写在继承类:
    class CBar : public CFoo
      {
       void func(short x) { }
      };
    但是自变量类型错误的从'int' 变为'short'。实际上,替代重写的重载类函数在这种情况下执行。根据重载函数定义算法进行操作时,编译器在有些情况下可能会选择基本类中定义的类函数而不是重写的类函数。

    为了避免这种错误,'override' 修饰符应该明确添加到重写的类函数。
    class CBar : public CFoo
      {
       void func(short x) override { }
      };
    如果在重写过程中更改了类函数签名,编译器将无法在发布编译错误的父类中找到相同签名的类函数:
    'CBar::func' 类函数是通过'override'标识符声明但不会重写任何基本类的类函数

    函数的'final'修饰符

    'final' 修饰符操作是相反的 — 它禁止在衍生类中重写类函数。如果类函数的实现非常充分并得到完全完成,则以 'final' 修饰符声明它以确保其以后不被修改。
    class CFoo
      {
       void virtual func(int x) final { }
      };
     
    class CBar : public CFoo
      {
       void func(int) { }
      };
     
    当如上面显示的一样试图以'final'修饰符重写一个类函数,编译器显示一个错误:
    声明为'final'的'CFoo::func' 类函数不能通过 'CBar::func'重写
    请见 'CFoo::func' 声明
  3. 以默认参数修正编译的模板函数。

市场

  1. 修正分类市场产品的几个错误。

Tester

  1. 修正为可视测试模式的打开订单和持仓订单更新当前市场价格。
  2. 移除使用交易所交易品种进行测试时买入限价和卖出限价订单执行的滑移。
  3. 修正"开盘价"测试模式下意外生成的错误价格。
  4. 修正测试时生成OnTrade交易事件。
  5. 当基于真实报价测试时,不匹配的报价数据(取决于用于生成柱形图的价格的卖价或最后价)和现有分钟柱形图的最低值或最高值会出现在tester日志中。

MetaEditor

  1. 修正源代码文件中配置的数据展示。

更新文档。

19 八月 2016

MetaTrader 5 build 1395:更快的交易操作,视觉测试得到改进

程序端

  1. 客户端现在提供更快速地发送交易命令。
  2. 修正阻止在32位Windows 10,build 1607运行的程序端中执行MQL5应用程序的错误。
  3. 现在导航显示交易账户是否在锁仓模式亦或单边模式操作。
  4. 新快捷菜单命令已经添加到导航,它允许使用选定的账户连接网页程序端。
  5. 菜单的帮助部分已经更新,现在它能够链接到视频指南
  6. 修复在高分辨率显示器(4K)上连接操作的错误。
  7. 修复用户界面波斯语翻译的错误。

MQL5

  1. 添加新'void *'指针,以使用户创建抽象对象归集。任何类对象的指针都可以保存至这个变量类型。
    建议使用操作符dynamic_cast<class name *>(void * pointer) 来转换。如果无法转换,则结果为NULL。
    class CFoo { };
    class CBar { };
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                      |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       void *vptr[2];
       vptr[0]=new CFoo();
       vptr[1]=new CBar();
    //---
       for(int i=0;i<ArraySize(vptr);i++)
         {
          if(dynamic_cast<CFoo *>(vptr[i])!=NULL)
             Print("CFoo * object at index ",i);
          if(dynamic_cast<CBar *>(vptr[i])!=NULL)
             Print("CBar * object at index ",i);
         }
       CFoo *fptr=vptr[1];  // 将返回类型转换指针错误,vptr[1] 并不是CFoo对象
      }
    //+------------------------------------------------------------------+
  2. 添加支持字符串操作符[ ] 。该操作符可以使用户根据索引获得一个字符串符号。如果指定的索引超出了字符串,则结果为0。
    string text="Hello";
    ushort symb=text[0];  // 将返回符号'H'代码
    
  3. 新增具备int OnTesterInit(void)签名的另一个版本的TesterInit 事件处理程序,它可以返回INIT_SUCCEEDED (0) 或 INIT_FAILED (或任何非零值)。如果OnTesterInit 返回一个非零值,则优化不会开始。
  4. 修正一个可能导致不同ChartGetString重载函数返回不同结果的错误。

Tester

  1. 为视觉测试添加额外的命令和热键。现在可以像在程序端一样在视觉测试配置图表:改变颜色,配置各种元素的可视性,应用模板等等。




  2. 修正在"开盘价"测试模式中Sleep函数的操作。
  3. 修正W1和MN1时间周期上形成的不正确的柱形图状态。

MetaEditor

  1. 添加繁体中文的UI翻译。
更新文档。
12345678