MetaTrader 5新功能

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

18 十一月 2022

MetaTrader 5 build 3510:网页端的改进

MetaTrader 5 WebTerminal

  1. 在移动版中,我们已经实现了交易历史的排序和深度过滤。使用顶部面板的命令自定义历史显示:


    移动版中可定制的交易历史视图


    操作可以按主要参数进行排序,如日期、单号、交易品种和交易量等。

  2. 改进对交易账户细节的访问。

    • 在桌面版中,当前账户数据可以点击。点击账户,查看其详细信息。
    • 在移动版中,当前账户显示在设置部分。点击账户,查看其详细信息。


    改进对交易账户数据的访问

  3. 修正账户管理窗口中账户类型的显示问题。
  4. 修正在手机浏览器中刷新网页端页面后净值和可用预付款的显示问题。
  5. 修正火狐手机浏览器中的底栏显示。

程序端

  1. 修正交易报告中净值和结余图形计算的问题。

MQL5

  1. typename(expr)的新行为。更新后的函数返回带有修饰符和维度的完整类型(数组):
    class A
      {
      };
    
    void OnStart(void)
      {
       const A *const arr[][2][3]={};
       Print(typename(arr));
      }
    
    Result:
    "class A const * const [][2][3]"

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

11 十一月 2022

MetaTrader 5 build 3500:改进和修复

程序端

  1. 在交易和历史部分的快捷菜单中增加一个新命令,新交易报告


    交易报告提供以下工作数据:
    • 图表和表格,可视化每月增长指标
    • 净值图表
    • 雷达图,可以快速评估账户状态
    • 按交易品种划分的交易统计数据
    • 用于交易分析的各种额外指标

  2. 修正交易报告中初始存款的计算。
  3. 修正使用图表和市场观察中快速交易面板时止损和止盈水平的设置。即使不需要继承,也可以从以前开设的持仓继承水平(相关功能针对基于FIFO账户实现)。
  4. 更新用户界面翻译。

MQL5

  1. 修正一个编译器错误,该错误允许使用带有字段名值的常量字符串访问结构字段。
  2. 修正使用TerminalInfoInteger(TERMINAL_KEYSTATE_*)函数检查密钥状态的问题。

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

MetaTrader 5 WebTerminal(网页端)build 3500

  1. 修正重新报价时的平仓。
  2. 修正在将长时间不活动的浏览器窗口最大化后重新连接到服务器的问题。
  3. 修正信贷资金的显示。
  4. 其他改进和修复。

4 十一月 2022

MetaTrader 5 build 3490:移动网页端版本和MQL5的新矩阵方法

网页平台的移动端版本

全新网页端为移动设备提供全功能的支持。该界面将自动适应屏幕尺寸,实现iOS与Android手机和平板电脑的高效操作:

在新网页端中添加对移动设备的支持

此外,网页端还进行多项修复和改进。

全新MetaTrader 5网页端支持全部交易功能。使用户能够:

  • 使用模拟账户和真实账户进行交易
  • 接收任何交易品种的报价
  • 在任何市场进行交易
  • 使用30多个指标和20个图形对象分析交易品种报价
  • 使用经济日历数据进行基本面分析


程序端

  1. 扩展任务管理器功能。新版本可以更准确地监控消耗的资源。
    • 添加线程中堆栈大小的显示。
    • 添加上下文切换数量的显示。
    • 添加对系统和第三方DLL线程的识别。
    • 添加内核模式运行时间的显示。与在用户模式下花费的时间相比,该指标的增加可能表明系统级问题:驱动程序问题、硬件错误或减缓硬件。更多细节,请参阅Microsoft文档
    • 添加用户模式运行时间的显示。

    控制可用设备的OpenCL管理器


  2. 程序端设置中用于管理可用设备的新OpenCL选项卡。新OpenCL管理器能够明确指定用于计算的设备。

    控制可用设备的OpenCL管理器

  3. 为在FIFO模式下运行的账户添加在市场深度中止损和止盈水平的指示(该模式可以在交易商端启用)。

    根据FIFO规则,每个交易品种的持仓只能按照开仓的相同顺序进行平仓。为确保通过止损位平仓符合FIFO标准,在客户端实施以下逻辑:

    如果同一交易品种存在多个持仓,则为任何持仓设置止损水平会导致所有其他持仓也设置相同的水平。因此,如果触发一个水平,则所有仓位都将按照FIFO规则平仓。

    现在,当用户为已经有未结持仓的交易品种打开市场深度时,现有持仓水平(如果有)会自动在止损和止盈字段中指定。

  4. 修正使用工具箱\交易窗口中的X按键删除止损和止盈水平的问题。该错误通常在禁用快速交易功能时发生。单击该按键将打开一个交易对话框,其中包含相关级别的空值。

  5. 修正交易报告中的图形标题和最后手续费计算的问题。该部分可能显示报告统计中的不正确的利润,和净值与结余图的工具提示中的不正确值。

MQL5

  1. 添加向量和矩阵方法CopyTicks和CopyTicksRange。它们可以轻松地将报价数据数组复制到向量和矩阵中。
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    复制的数据类型使用ENUM_COPY_TICKS枚举在"flags"参数中指定。以下值可供使用:
    COPY_TICKS_INFO    = 1,       // 由卖价和/或买价更改得出的报价
    COPY_TICKS_TRADE   = 2,       // 由最后价和交易量更改得出的报价
    COPY_TICKS_ALL     = 3,       // 所有报价都发生变化
    COPY_TICKS_TIME_MS = 1<<8,    // 以毫秒为单位的时间
    COPY_TICKS_BID     = 1<<9,    // 卖价
    COPY_TICKS_ASK     = 1<<10,   // 买价
    COPY_TICKS_LAST    = 1<<11,   // 最后价
    COPY_TICKS_VOLUME  = 1<<12,   // 交易量
    COPY_TICKS_FLAGS   = 1<<13,   // 报价标识
    如果选择了多种数据类型(仅适用于矩阵),矩阵中的行序将对应于枚举中的值的顺序。

  2. 扩展了matrix::Assignvector::Assign方法的功能。

    现在可以为矩阵分配一个一维数组或向量:
    bool matrix::Assign(const vector &vec);
    结果将是一个单行矩阵。

    此外,现在可以将矩阵分配给向量(将执行矩阵平滑):
    bool vector::Assign(const matrix &mat);
  3. 为向量和矩阵添加Swap方法。
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    每个数组、向量或矩阵都指向一个包含该对象元素的内存缓冲区。Swap方法实际上交换指向这些缓冲区的指针,而不将元素写入内存。因此,矩阵仍然是矩阵,向量仍然是向量。交换矩阵和矢量会产生一个带有矢量元素的单行矩阵和一个平面表示的带有矩阵元素的矢量(见Flat方法)。
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                           |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {4, 5, 6}};
      Print("a before Swap: \n", a);
      matrix b= {{5, 10, 15, 20},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {25, 30, 35, 40},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {45, 50, 55, 60}};
      Print("b before Swap: \n", b);  
    //--- swap矩阵指针
      a.Swap(b);
      Print("a after Swap: \n", a);
      Print("b after Swap: \n", b);
      /*
      a before Swap:
      [[1,2,3]
      [4,5,6]]
      b before Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      a after Swap:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      b after Swap:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("v before Swap: \n", v);
      Print("b before Swap: \n", b);
      v.Swap(b);
      Print("v after Swap: \n", v);
      Print("b after Swap: \n", b);
      /*
      v before Swap:
      [7,7,7,7,7,7,7,7,7,7]
      b before Swap:
      [[1,2,3]
      [4,5,6]]
      
      v after Swap:
      [1,2,3,4,5,6]
      b after Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    Swap()方法还可以使用动态数组进行操作(固定大小的数组不能作为参数传递)。数组可以是任何维度,但具有约定的大小,这意味着矩阵或向量的总大小必须是数组零维度的倍数。数组零维度是第一个索引处包含的元素数。例如,对于动态三维数组"double array[][2][3]",零维是第二维和第三维大小的乘积:2x3=6。因此,这样的数组只能在Swap方法中用于总大小为6的倍数的矩阵和向量:6、12、18、24等。

    考虑以下示例:
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                           |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- 用7.0值填写1x10矩阵
      matrix m= matrix::Full(1, 10, 7.0);
      Print("matrix before Swap:\n", m);
    //--- 尝试交换矩阵和数组
      double array_small[2][5]= {{1, 2, 3, 4, 5},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {6, 7, 8, 9, 10}};
      Print("array_small before Swap:");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("array_small after Swap:");
        ArrayPrint(array_small);
        Print("matrix after Swap: \n", m);
       }
      else // 矩阵大小不是第一个数组维度的倍数
       {
        Print("m.Swap(array_small) failed. Error ", GetLastError());
       }
      /*
      matrix before Swap:
      [[7,7,7,7,7,7,7,7,7,7]]
      array_small before Swap:
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      m.Swap(array_small) failed. Error 4006
      */
    //--- 使用更大的矩阵并重试交换操作
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("array_static before Swap:");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("array_static after Swap:");
        ArrayPrint(array_static);
        Print("matrix after Swap: \n", m);
       }
      else // 静态数组不能用于与矩阵交换
       {
        Print("m.Swap(array_static) failed. Error ", GetLastError());
       }
      /*
      array_static before Swap:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      m.Swap(array_static) failed. Error 4006
      */
    //--- 交换数组和矩阵的另一种尝试
      double array_dynamic[][10];    // 动态数组
      ArrayResize(array_dynamic, 3); // 设置第一维度大小
      ArrayCopy(array_dynamic, array_static);
    //--- 现在为swap使用动态数组
      if(m.Swap(array_dynamic))
       {
        Print("array_dynamic after Swap:");
        ArrayPrint(array_dynamic);
        Print("matrix after Swap: \n", m);
       }
      else //  没有错误
       {
        Print("m.Swap(array_dynamic) failed. Error ", GetLastError());
       }
      /*
      array_dynamic after Swap:
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      matrix after Swap:
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  4. 添加向量和矩阵的LossGradient方法。这种方法计算损失函数对预测值的偏导函数的向量或矩阵。在线性代数中,这样的向量被称为梯度,并在机器学习中使用。
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  5. 启用SQLite中的FOREIGN KEYS,以在SQL查询中加强表格之间的关系。  示例:
    CREATE TABLE artist(
      artistid    INTEGER PRIMARY KEY, 
      artistname  TEXT
    );
    
    CREATE TABLE track(
      trackid     INTEGER, 
      trackname   TEXT, 
      trackartist INTEGER,
      FOREIGN KEY(trackartist) REFERENCES artist(artistid)
    );

  6. 修正根据方法和对象的不变性,选择对应类方法的问题。

MetaEditor

  1. 添加提交到MQL5存储中的评论的允许长度。 在大型项目中,向存储库提交修改时的详细评论被认为是很好的实践,但以前评论的长度被限制在128个字符。现在允许的长度最多260个字符。

MetaTester

  1. 提高可视模式下测试速度开关的灵敏度。

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

17 九月 2022

MetaTrader 5 build 3440:新交易账户报告

程序端

  1. 增加新账户交易业绩报告。这类似于在统计资料可用性和数据展示方面的熟悉的信号报告。以下性能数据将在平台上提供:
    • 图表和表格,可视化每月增长指标
    • 净值图表
    • 雷达图,可以快速评估账户状态
    • 按交易品种划分的交易统计数据
    • 用于交易分析的各种额外指标

    报告可以直接在平台中查看,而不需要将其导出到文件中。要打开它,请在“查看”菜单中选择“报告”。




  2. 修正数量或交易品种类型不匹配的看涨和看跌合约成交的期权板
  3. 修正Close by操作过程中交易对话框中的持仓选择。对于按任何列而非单号排序的反向订单列表,可能会发生错误。
  4. 加快平台记录速度。
  5. 修正自定义交易品种图表上的评论显示。

MQL5

  1. 修正CArrayList::LastIndexOf函数操作。以前,总是返回-1,而不是最后找到的元素的索引。
  2. 增加新矩阵和向量方法 - Assign。它用传递的矩阵/向量或数组数据替换矩阵/向量元素。
    bool vector<TDst>::Assign(const vector<TSrc> &assign);
    bool matrix<TDst>::Assign(const matrix<TSrc> &assign);
    
    示例:
      //--- copying matrices
      matrix b={};
      matrix a=b;
      a.Assign(b);
      
      //--- copying an array to a matrix
      double arr[5][5]={{1,2},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    {3,4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    {5,6}};
      Print("array arr");
      ArrayPrint(arr);
      b.Assign(arr);
      Print("matrix b \n",b);
    /*
    array arr
            [,0]    [,1]    [,2]    [,3]    [,4]
    [0,] 1.00000 2.00000 0.00000 0.00000 0.00000
    [1,] 3.00000 4.00000 0.00000 0.00000 0.00000
    [2,] 5.00000 6.00000 0.00000 0.00000 0.00000
    [3,] 0.00000 0.00000 0.00000 0.00000 0.00000
    [4,] 0.00000 0.00000 0.00000 0.00000 0.00000
    matrix b 
    [[1,2,0,0,0]
     [3,4,0,0,0]
     [5,6,0,0,0]
     [0,0,0,0,0]
     [0,0,0,0,0]]
    
    */
  3. 增加新矩阵和向量方法 - CopyRates。它将价格数据数组复制成向量和矩阵。
    bool matrix::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    bool vector::CopyRates(string symbol,ENUM_TIMEFRAMES period,ulong rates_mask,ulong from,ulong count);
    复制的数据类型使用ENUM_COPY_RATES枚举在rates_mask参数中指定。有以下值可供使用:
    COPY_RATES_OPEN
    COPY_RATES_HIGH
    COPY_RATES_LOW
    COPY_RATES_CLOSE
    COPY_RATES_TIME
    COPY_RATES_VOLUME_TICK
    COPY_RATES_VOLUME_REAL
    COPY_RATES_SPREAD
    COPY_RATES_OHLC
    COPY_RATES_OHLCT
    最后两个值可以同时选择多个柱形图参数。开盘价、最高价、最低价、收盘价和时间。

    如果选择了多种数据类型(仅适用于矩阵),矩阵中的行序将对应于枚举中的值的顺序。

  4. 修正文本标签对象的显示。当使用OBJPROP_XOFFSET和OBJPROP_YOFFSET属性时,可能会在图表上显示一个错误的图像片段。

  5. 修正改变将常量参数作为对象指针引用传递给函数时的错误。

    const指定符将一个变量声明为常量,以防止它在程序执行中被更改。它只允许在声明时进行一次性的变量初始化。OnCalculate函数中的常量变量示例:

    int OnCalculate (const int rates_total,      // price[] array size
                     const int prev_calculated,  // bars processed on previous call
                     const int begin,            // meaningful data starts at
                     const double& price[]       // array for calculation
       );
    

    下面的示例包含一个编译器错误,它允许隐式指针强制转换引用参数:

    class A {};
    const A *a = new A;
    
    void foo( const A*& b )
      {
       b = a;
      }
    
    void OnStart()
      {
            A *b; 
            foo(b);  // not allowed
            Print( a,":",b );
      }
    编译器会检测到这种非法操作,并返回相关错误。

MetaEditor

  1. 修正调试器中复数引用的显示。
  2. 改进MQL5云保护器。以前,文件保护在某些情况下可能会失败。
  3. 修正崩溃日志中的错误报告。


全新MetaTrader 5网页端

我们发布了经过改进的MetaTrader 5网页端,它提供了更新的界面和重新设计的内核。新界面类似于iPad程序端:



它还包含许多新功能:

  • 能够通过详细的注册表单和文件提交选项请求真实账户
  • 支持价格数据订阅和接收延迟报价的能力
  • 更多的分析对象和便捷的管理选项
  • 在图表上显示市场进入和退出
  • 在图表上显示经济日历事件
  • 在“市场报价”中方便地配置交易品种,以及每日价格变化数据
  • 简化界面,帮助初学者开始使用程序端:删除图表快捷菜单和顶部菜单;所有图表控制命令、对象和指标都在左侧和顶部面板中可用,而其他命令可以通过归类菜单访问
  • 界面的暗模式
立即体验www.mql5.com新网页端。它不久将可供您的交易商使用。

4 八月 2022

MetaTrader 5 build 3390:在OpenCL和数学函数中的浮点,机器学习的激活和损失方法

程序端

  1. 添加在第一次连接到交易账户时自动打开教程。这将帮助初学者学习交易基础知识和了解平台功能。本教程分为几个部分,每个部分都提供有关特定主题的简要信息。训练进度以蓝线显示。

    添加在第一次连接到交易账户时自动打开教程。


  2. 修正‘关闭盈利’/‘关闭亏损’批量操作。以前,如果存在此类持仓,该平台将使用反向持仓。例如,如果您有两个亏损买入持仓(EURUSD)和一个盈利卖出持仓(EURUSD),所有三个持仓都将在‘关闭亏损’批量操作中关闭。买入和卖出将通过'Close by'操作关闭,而其余的买入将通过正常操作关闭。现在,这些指令操作正常:它们只关闭选定的持仓,无论是盈利还是亏损。
  3. 修正显示负历史价格。此类价格将正确显示在所有时间周期内。
  4. 优化并显著降低程序端的系统资源消耗。
  5. 更新交易品种的基本数据库。可用于交易所交易品种的数据聚合器数量已扩大到15个。用户将能够通过最受欢迎的经济聚合器访问更多代码的信息。

    更新交易品种的基本数据库。可用于交易所交易品种的数据聚合器数量已扩大到15个。

    大约7,000只证券和2,000多只ETF在全球交易所市场上市。此外,交易所还提供期货和其他衍生品。MetaTrader 5平台提供对交易所交易品种的庞大数据库的访问权限。要访问相关的基本数据,用户可以从市场报价直接一键切换到所选聚合器网站。为方便起见,该平台为每种交易品种提供了多种信息源。

  6. 修正在新下单窗口中的止损和止盈指示。对于FIFO账户,停止水平将根据相同交易品种的现有未结持仓的停止水平自动设置。这个程序要求符合FIFO规则。

MQL5

  1. 数学函数现在可以处理矩阵和向量。

    我们致力于继续扩展MetaTrader 5平台的功能,用于算法交易和机器学习。之前,我们添加新数据类型:矩阵和向量,从而无需使用数组进行数据处理。已有70多种方法添加到MQL5中,用于这些数据类型的操作。新方法可以在单个操作中进行线性代数和统计计算。乘法、变换和方程组可以很容易地实现,无需过多的代码行。最新更新包括数学函数。

    数学函数最初设计用于对标量值执行相关操作。在此基础上,大多数函数都可以应用于矩阵和向量。这些包括MathAbs、MathArccos、MathArcsin、MathArctan、MathCeil、MathCos、MathExp、 MathFloor、MathLog、MathLog10、MathMod、MathPow、MathRound、MathSin、MathSqrt、MathTan、MathExpm1、MathLog1p、MathArccosh、MathArcsinh、MathArctanh、MathCosh、MathSinh和MathTanh。这类操作意味着对矩阵或向量进行元素式处理。示例:
    //---
      matrix a= {{1, 4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
     {9, 16}};
      Print("matrix a=\n",a);
    
      a=MathSqrt(a);
      Print("MatrSqrt(a)=\n",a);
      /*
       matrix a=
       [[1,4]
        [9,16]]
       MatrSqrt(a)=
       [[1,2]
        [3,4]]
      */
    对于MathModMathPow,第二个元素既可以是标量,也可以是相应大小的矩阵/向量。

    以下示例显示了如何通过将数学函数应用于向量来计算标准偏差。
    //+------------------------------------------------------------------+
    //| Script program start function                  |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- Use the initializing function to populate the vector
      vector r(10, ArrayRandom); // Array of random numbers from 0 to 1
    //--- Calculate the average value
      double avr=r.Mean();       // Array mean value
      vector d=r-avr;            // Calculate an array of deviations from the mean
      Print("avr(r)=", avr);
      Print("r=", r);
      Print("d=", d);
      vector s2=MathPow(d, 2);   // Array of squared deviations
      double sum=s2.Sum();       // Sum of squared deviations
    //--- Calculate standard deviation in two ways
      double std=MathSqrt(sum/r.Size());
      Print(" std(r)=", std);
      Print("r.Std()=", r.Std());    
     }
    /*
      avr(r)=0.5300302133243813
      r=[0.8346201971495713,0.8031556138798182,0.6696676534318063,0.05386516922513505,0.5491195410016175,0.8224433118686484,...
      d=[0.30458998382519,0.2731254005554369,0.1396374401074251,-0.4761650440992462,0.01908932767723626,0.2924130985442671, ...
       std(r)=0.2838269732183663
      r.Std()=0.2838269732183663
    */ 
    //+------------------------------------------------------------------+
    //| Fills the vector with random values                |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }
    

  2. 在模板函数中,添加对标记matrix<double>、matrix<float>、vector<double>、vector<float>的支持,而不是对应的matrix、matrixf、vector和vectorf类型。

  3. 改进浮点类型运算的数学函数。新实现的将数学函数应用于‘float'矩阵和向量的可能性可以改进应用于‘float'标量的数学函数。以前,这些函数参数被无条件地转换为‘double'类型,然后调用相应实施的数学函数,并将结果转换回‘float'类型。现在,实施这些操作,无需其他类型转换。

    以下示例显示了数学正弦计算的差值:

    //+------------------------------------------------------------------+
    //| Script program start function                  |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---  Array of random numbers from 0 to 1
      vector d(10, ArrayRandom);
      for(ulong i=0; i<d.Size(); i++)
       {
        double delta=MathSin(d[i])-MathSin((float)d[i]);
        Print(i,". delta=",delta);
       }
     }
    /*
       0. delta=5.198186103783087e-09
       1. delta=8.927621308885136e-09
       2. delta=2.131878673594656e-09
       3. delta=1.0228555918923021e-09
       4. delta=2.0585739779477308e-09
       5. delta=-4.199390279957527e-09
       6. delta=-1.3221741035351897e-08
       7. delta=-1.742922250969059e-09
       8. delta=-8.770715820283215e-10
       9. delta=-1.2543186267421902e-08
    */
    //+------------------------------------------------------------------+
    //| Fills the vector with random values                |
    //+------------------------------------------------------------------+
    void ArrayRandom(vector& v)
     {
      for(ulong i=0; i<v.Size(); i++)
        v[i]=double(MathRand())/32767.;
     }

  4. 为矩阵和向量添加激活和导数方法:
    AF_ELU               Exponential Linear Unit函数
    AF_EXP               Exponential函数
    AF_GELU              Gaussian Error Linear Unit函数
    AF_HARD_SIGMOID      Hard Sigmoid函数
    AF_LINEAR            Linear函数
    AF_LRELU             Leaky REctified Linear Unit函数
    AF_RELU              REctified Linear Unit函数
    AF_SELU              Scaled Exponential Linear Unit函数
    AF_SIGMOID           Sigmoid函数
    AF_SOFTMAX           Softmax函数
    AF_SOFTPLUS          SoftPlus函数
    AF_SOFTSIGN          Softsign函数
    AF_SWISH             Swish函数
    AF_TANH              Hyperbolic Tangent函数
    AF_TRELU             Thresholded REctified Linear Unit函数
    神经网络激活函数决定了加权输入信号如何在网络层面转化为节点输出信号。激活函数的选择对神经网络的性能有很大的影响。模型的不同部分可以使用不同的激活函数。除了所有已知函数外,MQL5还提供导数。导数函数可以根据学习中收到的错误快速计算调整。

  5. 为矩阵和向量添加损失函数。它包括以下参数:

    LOSS_MSE            均方差损失函数
    LOSS_MAE            平均绝对误差损失函数
    LOSS_CCE            Categorical Crossentropy函数
    LOSS_BCE            Binary Crossentropy函数
    LOSS_MAPE           平均 绝对百分比误差损失函数
    LOSS_MSLE           均方对数误差损失函数
    LOSS_KLD            Kullback-Leibler Divergence函数
    LOSS_COSINE         Cosine similarity/proximity函数
    LOSS_POISSON        Poisson函数
    LOSS_HINGE          Hinge函数
    LOSS_SQ_HINGE       Squared Hinge函数
    LOSS_CAT_HINGE      Categorical Hinge函数
    LOSS_LOG_COSH       双曲余弦对数 函数
    LOSS_HUBER          Huber函数

    损失函数评估模型预测实际值的程度。模型构建的目标是在每个阶段最小化函数值。该方法取决于特定的数据集。此外,损失函数可能取决于权重和偏移量。损失函数是一维函数,不是向量,因为它提供对神经网络的普通评估。

  6. 矩阵和向量添加matrix::CompareByDigits和vector::CompareByDigits方法。它们比较两个矩阵/向量的元素,直到有效数字。

  7. 添加对字符串MathMinMathMax函数的支持。这些函数将使用字典式比较:字母按字母顺序比较,区分大小写。

  8. OpenCL对象的最大数已从256个增加到65536个。OpenCL对象句柄在MQL5程序中使用CLContextCreateCLBufferCreateCLProgramCreate函数创建。之前256个句柄的限制不足以有效使用机器学习方法。

  9. 添加在没有‘double' 支持的情况下在图形卡上使用OpenCL的功能。以前,在MQL5程序中只允许使用支持双精度类型的GPU,尽管许多任务允许使用浮点类型进行计算。浮点类型最初被认为是并行计算的原生类型,因为它占用的空间更少。因此,旧的要求已被取消。

    要为特定任务设置强制使用支持双精度类型的GPU,请在CLContextCreate调用中使用 CL_USE_GPU_DOUBLE_ONLY。
       int cl_ctx;
    //--- Initializing the OpenCL context
       if((cl_ctx=CLContextCreate(CL_USE_GPU_DOUBLE_ONLY))==INVALID_HANDLE)
         {
          Print("OpenCL not found");
          return;
         }

  10. 修正CustomBookAdd函数的操作问题。以前,MqlBookInfo::volume_real字段中的非零值会阻止函数创建市场深度快照。现在执行如下检查:
    传输的数据经过验证:必须为每个元素指定类型、价格和交易量数据。此外,MqlBookInfo.volume和MqlBookInfo.volume_real不得为零或负数。如果两边交易量都是负数,这将被视为错误。您可以指定任何交易量类型或两者都指定,而系统将使用指示的交易量类型或正值交易量类型:

       volume=-1 && volume_real=2 — volume_real=2将被使用,

       volume=3 && volume_real=0 — volume=3将被使用。

    精度更高的交易量MqlBookInfo.volume_real的优先级高于MqlBookInfo.volume。因此,如果两个值都已指定且有效,则将使用 volume_real。

    如果有任何市场深度元素描述不正确,系统将完全丢弃转移状态。

  11. 修正CalendarValueLast函数的操作问题。由于错误,在使用货币过滤器时,经济日历更改后的连续函数调用(调用后‘change' 参数设置一个新值)可能会跳过一些事件
    CalendarValueLast(change, result, "", "EUR")
  12. 修正ArrayBSearch函数行为的问题。如果找到多个相同的元素,将返回指向第一个结果的链接,而不是随机链接。
  13. 修正对类中模板函数可见性的检查。由于错误,声明为私有/受保护的类模板函数显示为公开

MetaEditor

  1. 修正MetaAssist的错误和模棱两可行为的问题。
  2. 添加对%terminal%宏的支持,该宏指示程序端安装目录的路径。例如,%terminal%\MQL5\Experts。 

    添加对%terminal%宏的支持,该宏指示程序端安装目录的路径。

  3. 改进调试器中数组的显示。
  4. 增加从调试器复制值的缓冲区。
  5. 改进错误提示。
  6. 在*.mproj项目文件中添加相对路径的指示。以前,使用绝对路径,如果项目被移动,这会导致编译错误。
  7. 添加自动嵌入BMP资源为项目中全局可用的32位位图数组。这消除了在代码中需要调用ResourceReadImage来读取图形资源。
    'levels.bmp' as 'uint levels[18990]'
    
  8. 改进读取扩展的BMP文件格式。
  9. 更新用户界面的翻译。
  10. 修复崩溃日志中报告的错误。


2 六月 2022

MetaTrader 5 build 3320:其他改进和修复

程序端

  1. 扩展图表中显示的交易对象的工具提示:
    • 市场退出交易现在显示盈利。
    • 针对由于激活止盈或止损而执行的交易而显示相关指示。

    类似的工具提示可用于连接进入和退出交易的行。

    扩展交易对象的工具提示



  2. 改进图形系统性能。
  3. 程序端:添加对未结订单和未结持仓批量操作的记录。当这样的命令被执行时,相关记录将被添加到日志中,例如:"开始批量关闭XXX持仓"。
  4. 程序端:修正批量关闭反向持仓。
  5. 程序端:修正图表上显示交易历史对象的更新。在更改图表交易品种时会发生错误。

MQL5

  1. 矩阵和向量函数的开发正在进行中:正在实施对“浮点”和“复数”的支持。
  2. MQL5:指针操作符"!" (LNOT)通过隐含的CheckPointer调用来检查其有效性。操作符"=="应该用于快速检查NULL。例如:ptr==NULL或ptr!=NULL。

MetaTester

  1. 修正测试图表上交易对象的显示。
  2. 改进图形系统性能。

MetaEditor

  • 更新用户界面的翻译。

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

20 五月 2022

MetaTrader 5 build 3300: MetaEditor中的快速编译和改进代码导航

程序端

  1. 添加通过拖动矩形图形对象的四个角来调整其大小的功能。


  2. 加快图形用户界面渲染。
  3. 改进对IPv6地址的支持。
  4. 修正首次平台启动时较低日期字段的高度计算和右侧价格字段的宽度计算的问题。

MQL5

  1. 添加处理矩阵和向量的函数 —  RegressionMetric。它设置了回归评估的指标。
     double vector.RegressionError(const enum lr_error);
     double matrix.RegressionError(const enum lr_error);
     vector matrix.RegressionError(const enum lr_error,const int axis);
    以下变量可用作度量指标:
    enum REGRESSION_ERROR
      {
       REGRESSION_MAE,     // 平均绝对误差
       REGRESSION_MSE,     // 均方差
       REGRESSION_RMSE,    // 均方根误差
       REGRESSION_R2,      // R平方
       REGRESSION_MAPE,    // 平均绝对百分比误差
       REGRESSION_MSPE,    // 均方百分比误差
       REGRESSION_RMSLE    // 均方根对数误差
      };
  2. 添加写入数据大小大于INT_MAX(结构数组)的数组的功能。

MetaEditor

  1. 选项卡栏改进:
    • 即使只打开一个窗口,面板也不会隐藏。因此,选项卡快捷菜单命令始终对用户可见。
    • 每个选项卡都添加了'X'关闭按钮。此外,可以使用鼠标中键或通过快捷菜单关闭选项卡。


  2. 添加用于快速程序编译的命令。此模式会跳过代码优化,从而显著加快EX5可执行文件的创建速度。当您需要快速检查编写的代码时,且在积极开发阶段可使用此模式。在最终程序编译期间,打开最大优化模式以增强性能。


    项目设置中的“最大优化”参数执行相同的功能。

    所有编译关系操作都可在“构建”菜单下获得。

  3. 代码管理改进:
    • 已经实现用于跳转到定义和声明的单独命令。以前,菜单只有一个命令可以打开选择子菜单。新命令可以更快地切换到必要的代码部分。
    • 除了"Enter"之外,还添加用"Tab"键替换已识别的关键字。


  4. 添加在调试器报价列表中自动显示局部变量的功能。可以通过“本地”快捷菜单命令启用显示。随着调试器操作在代码中进行,当前作用域中的变量会自动显示在列表中。



  5. 对向量和矩阵的调试器报价列表进行改进。
  6. 修正项目文件中的路径。错误可能会导致文件从项目中消失。

Tester

  1. 改进在平台关闭时停止测试器代理的问题。
  2. 添加第五个MQL5 云网络节点。该节点位于香港。新节点通过最近区域的网络加快EA的优化速度。

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

29 四月 2022

MetaTrader 5 build 3280:根据交易者反馈的其他改进和修复

程序端

  1. 修正在未结订单和未结持仓的快捷菜单中显示标准追踪止损水平的问题。


  2. 更新用户界面翻译。

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

21 四月 2022

MetaTrader 5 build 3270: 其他改进和修复

程序端

  1. 内置聊天功能的改进。
    • 更新设计。现在显示消息没有圆圈气泡,来优化显示和空间利用率。添加头像和日期分隔符。
    • 复制和删除命令已添加到消息菜单中。
    • 漏洞修复和稳定性改进。



  2. 修正批量平仓命令。使用锁仓账户系统的账户会出现错误。
  3. 修正生成持仓历史时,对某些交易类型的考虑。

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

15 四月 2022

MetaTrader 5 build 3260:批量操作,矩阵和向量函数,增强聊天功能

程序端

  1. 添加批量平仓和取消挂单的命令。

    新“批量操作”命令已添加到交易选项卡的快捷菜单。可用命令列表会根据所选操作和您的账户类型自动形成。



    菜单中始终提供以下命令:
    • 关闭锁仓账户中的所有持仓,系统尝试反向平仓(Close By),然后按照常规程序关闭剩余持仓。
    • 关闭所有盈利持仓或亏损持仓
    • 删除所有挂单
    • 删除特定类型的挂单:limit(限价单)、stop(停损单)和stop limit(停损限价)

    如果您选择一个持仓,菜单中会出现其他命令:
    • 关闭交易品种的所有持仓
    • 关闭同方向的所有持仓(锁仓账户)
    • 关闭相同交易品种的反向持仓(锁仓账户)
    • 持仓逆转(单边账户)

    如果您选择挂单,菜单中会出现其他命令:
    • 删除同一交易品种的所有挂单
    • 删除相同交易品种的所有相同类型的挂单

    这些命令仅在平台设置中启用一键交易时可用:工具\选项\交易。
  2. 增强内部聊天功能:
    • 添加回复消息的功能。回复中将引用源消息文本。
    • 添加创建不同内容类型的消息的功能,例如带有文本的图像和带有附件的文本等。
    • 修正显示已读和未读消息之间的分隔符。
    • 错误修复和稳定性改进。



  3. 优化和加快程序端图形系统的运行速度。界面渲染需要的资源将会更少。
  4. 修正期货每日价格变化的计算。如果交易商提供清算价格,该价格将被用于计算。
    ((Last - Clearing Price)/Clearing Price)*100
    文档中提供了所有计算类型的详细说明。

  5. 修正购买MQL5服务时出现的错误:
    • 在某些条件下,支付系统可能为成功操作返回错误。
    • 市场中的中间产品租用环节可能会显示不正确的价格。

  6. 修正购买/下载市场产品页面上的“开始”按键的操作。现在,该按键在第一个打开的图表上正确启动应用程序。
  7. 修正生成持仓历史时,对某些交易类型的考虑。

MQL5

  1. 添加处理矩阵和向量的新函数:
    • Median — 返回矩阵或向量元素的中位数
    • Quantile — 返回矩阵/向量元素或沿指定轴的元素的第q个分位数
    • Percentile — 返回矩阵/向量元素或沿指定轴的元素的第q个百分位数
    • Std — 计算矩阵或向量元素的标准差
    • Var — 计算矩阵或向量元素的方差
    • CorrCoef — 计算矩阵/向量相关系数
    • Correlate — 计算两个向量的交叉相关
    • Convolve — 返回两个向量的离散,线性卷积
    • Cov — 计算协方差矩阵

  2. 我们已经开始为数值数组添加内置方法。新方法增强了可用性,提高代码紧凑性,并加强代码与其他语言的兼容性。

    以下三种方法已经可用:
    • ArgSort — 按指定维度对数组进行排序;默认使用最后一个 (axis=-1)。
    • Range — 返回指定数组维度中的元素数。类似于ArrayRange
    • Size — 返回数组元素的数量。类似于ArraySize

    例如:
    void OnStart()
      {
       int arr[4][5]=
         {
            {22, 34, 11, 20,  1},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            {10, 36,  2, 12,  5},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            {33, 37, 25, 13,  4},
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
            {14,  9, 26, 21, 59}
         };
       ulong indexes[4][5];
    //--- 排序数组
       arr.ArgSort(indexes,-1,0);
       Print("indexes");  
       ArrayPrint(indexes);
      }
    
    // 结果日志:
    // 索引
    //     [,0][,1][,2][,3][,4]
    // [0,]   4   2   3   0   1
    // [1,]   2   4   0   3   1
    // [2,]   4   3   2   0   1
    // [3,]   1   0   3   2   4

  3. 我们已开始为字符串添加内置方法。

    目前可以使用以下方法:
    • BufferSize — 返回为字符串分配的缓冲区大小。
    • Compare — 比较两个字符串并将比较结果返回为整数。
    • Length — 返回字符串中的字符数。
    • Find — 搜索字符串中的子字符串。
    • Upper — 将字符串大写。
    • Lower — 将字符串转换为小写。
    • Replace — 替换一个子字符串。
    • Reserve — 为字符串保留缓冲区。

    所有方法都类似于字符串函数

    例如:
    void OnStart()
      {
       string test="some string";
       PrintFormat("String length is %d",test.Length());
      }
    
    // 结果日志:
    // 字符串长度是11
  4. 将SYMBOL_SUBSCRIPTION_DELAY值添加到ENUM_SYMBOL_INFO_INTEGER枚举中,以延迟特定交易品种的报价交付。

    它仅用于基于订阅的交易品种。延迟通常适用于试用模式提供的数据。

    只能为在市场报价中选择的交易品种请求该属性。否则,将返回ERR_MARKET_NOT_SELECTED (4302)错误。

  5. 将ACCOUNT_HEDGE_ALLOWED属性添加到ENUM_ACCOUNT_INFO_INTEGER枚举中 — 启用反向持仓和挂单。该属性仅用于锁仓账户,以符合特定监管要求,根据该监管要求,同一交易品种的账户不能有反向持仓,但允许同向持仓。

    如果禁用此选项,则账户将不允许持有同一交易品种的反向持仓和订单。例如,如果该账户是Buy持仓,那么用户就不能建立Sell持仓或下单卖出挂单。如果用户尝试执行此类操作,则会返回TRADE_RETCODE_HEDGE_PROHIBITED错误。

  6. ENUM_SYMBOL_INFO_DOUBLE枚举中的新属性:
    • SYMBOL_SWAP_SUNDAY
    • SYMBOL_SWAP_MONDAY
    • SYMBOL_SWAP_TUESDAY
    • SYMBOL_SWAP_WEDNESDAY
    • SYMBOL_SWAP_THURSDAY
    • SYMBOL_SWAP_FRIDAY
    • SYMBOL_SWAP_SATURDAY

    使用这些值来获取一周中特定日期的库存费计算率。1 — 单库存费,3 — 三倍库存费,0 — 无库存费。

  7. 修正CopyTicksCopyTicksRange 函数操作。过夜时,该错误可能导致返回过时的数据。当没有为交易品种提供报价时会发生错误。
  8. 修复崩溃日志中报告的错误。

11 二月 2022

MetaTrader 5 build 3210:修订夏普比率计算算法、新矩阵方法和对指标最小值/最大值的控制

MQL5

  1. 为向量和矩阵添加Min、Max、ArgMin、ArgMax和Sum函数。使用函数查找最小值和最大值、相关指数和总和。
  2. 添加对矩阵平面方法的支持。使用这些方法,矩阵元素可以通过一个索引而不是两个索引来寻址。
    double matrix::Flat(ulong index) const;      // getter
    void matrix::Flat(ulong index,double value); // setter

    计算矩阵元素地址的伪代码:

    ulong row=index / mat.Cols();
    ulong col=index % mat.Cols();
    
    mat[row,col]

    例如,对于'matrix mat(3,3)',访问元素可以按如下写出:

       阅读:'x=mat.Flat(4)',相当于'x=mat[1][1]'
       书写:'mat.Flat(5, 42)',相当于'mat[1][2]=42'

    如果使用无效的矩阵索引调用函数,则会抛出OutOfRange严重执行错误

  3. 改进MQL5程序输入参数中浮点数的格式。在读取一些实数时,将带有许多零的数字代入输入参数,例如,0.4表示为0.400000000002。
  4. 修正Math\Stat\Math.mqh数学库中出现的错误。该数学库中的MathSample函数已经过修改,以匹配类似数学库在回溯采样时的传统行为。
  5. 修正当没有提供交易品种报价时,可能导致过夜返回过时数据的CopyTicks/CopyTicksRange错误。
  6. 在ENUM_CUSTOMIND_PROPERTY_INTEGER枚举中,添加INDICATOR_FIXED_MINIMUM和INDICATOR_FIXED_MAXIMUM新值。
    使用这些属性,您可以使用IndicatorSetInteger函数修正/取消修正最小和最大指标值。调用IndicatorSetInteger(INDICATOR_FIXED_MINIMUM/INDICATOR_FIXED_MAXIMUM, true)时,使用当前的最小值或最大值。


Tester

  1. 修正夏普比率计算算法以匹配传统公式,公式值对应于一年的间隔。之前的算法基于获得的PnL的变量,却忽略了针对未结持仓的净值波动。现在计算包括净值变动,而夏普比率则是按照经典方式进行解释:
    • 夏普比率 < 0 该策略无利润,也不合适。不好。
    • 0 < 夏普比率 < 1.0 风险不会得到回报。当没有其他选择时,可以考虑这种策略。不明确。
    • 夏普比率 ≥ 1.0 如果夏普比率大于 1。这可能意味着风险得到回报,并且投资组合/策略可以显示结果。好。
    • 夏普比率 ≥ 3.0 高数值表示在每笔特定交易中获得损失的概率非常低。非常好。

程序端

  1. 优化程序端的内存消耗。
  2. 通过网络子系统改进平台操作,以提高性能并减少网络延迟。
  3. 删除禁用网格渲染时指标中零网格级别的显示。

28 一月 2022

MetaTrader 5 build 3180:MQL5中的向量和矩阵,提高可用性

程序端

  1. 添加将市场报价交易品种或交易操作从账户历史移动到图表窗口的激活。

    这两个操作可将图表交易品种更改为选定的交易品种。在此之前,他们不会如此激活图表窗口。因此,一些进一步的操作,例如调用交易对话框(F9)或使用热键更改比例(+/-),可能会错误地应用于另一个图表。现在,已通过拖动更改其交易品种的图表将立即被选中以进行进一步的工作。

  2. 添加双击账户历史中交易操作时打开新订单窗口。用户点击操作中的交易品种会立即插入对话框中,从而加快交易速度。快捷菜单中添加一个类似的命令。



  3. 添加在打开新图表时的真实交易量或报价量的智能包含。在分析市场时,此数据很重要。但是,并非所有交易者都知道它在平台中的可用性。

    真实交易量具有更高的优先级。如果交易量是由交易商提供,则会显示在图表上。否则,将启用显示报价量。

    该机制仅在使用default.tpl模板打开图表时使用。如果用户在图表设置中手动禁用了交易量,则在重新打开图表时不再启用交易量。自定义模板不受影响。

  4. 优化并大幅度加速用户界面显示。
  5. 改进通过文件菜单调用的图表打印功能:
    • 修正保存打印设置的问题
    • 改进打印页面外观:增加网格线,删除程序名称,更新页眉字体
    • 放大打印对话框以正确显示界面

  6. 修正图表快速交易面板中的交易量字段操作的问题。在修正之前,输入新值并按下Tab后,值会重置为上一个值。
  7. 修正图表上的交易历史显示。在此之前,在账户之间切换时,之前账户操作不会从图表中删除。
  8. 修正通过PayPal支付MQL5.com的问题。
  9. 修正显示期权波动率图表时平台冻结的问题。
  10. 修正在真实账户注册窗口中的电话号码验证问题。在某些情况下,平台不允许用户在输入正确号码后进入下一个注册阶段。
  11. 修正在加入与MQL5.com成员的群聊时检查权限的问题。以前,新加入的用户只能阅读消息而不能编写消息。
  12. 在数据缺失的情况下更改图表文本。现在,用交易品种名称、时间周期和交易品种替换“等待更新”。
  13. 改进支持build 2450中添加的负价格。现在也可以为相应的市场报价交易品种显示零值。
  14. 修正在Wine下工作时在市场上显示产品LOGO的问题。

MQL5

  1. 我们继续添加向量和矩阵支持。这些新函数大幅度扩展基于神经网络的解决方案开发人员的可能性。

    多个函数目前已准备使用:
    • Eye — 构造一个矩阵,其中指定对角线上为1,其他位置为0。
    • Identity — 构造一个具有指定大小的矩阵,主对角线上为1,其他位置为0。
    • Ones — 构造一个用1填充且具有指定大小的矩阵。
    • Zeroes — 构造一个用零填充且具有指定大小的矩阵。
    • Full — 构造一个用指定值填充且具有指定大小的矩阵。
    • Copy — 构造一个矩阵或向量的副本。
    • Diag — 从矩阵中提取对角线并用向量中的值填充指定的对角线。
    • Tri — 构造一个矩阵,其中指定对角线及其下方为1,其他位置为0。
    • Row — 将矩阵行返回为向量,并用向量中的值填充指定行。
    • Col — 将矩阵列返回为向量,并用向量中的值填充指定列。
    • Rows — 返回矩阵中的行数。
    • Cols — 返回矩阵中的列数。
    • Transpose — 转置一个矩阵。
    • * — 矩阵、向量和标量的乘积 — 点积。
    • Power — 将矩阵提升为幂。
    • Kron — Kronecker乘积。
    • Cholesky — Cholesky分解。
    • QR — 矩阵的QR因式分解。
    • SVD — 奇异值分解。
    • LU — 矩阵的LU分解。
    • LUP — 矩阵的LUP分解。
    • Norm — 计算矩阵范数。
    • Cond — 计算矩阵的条件数。
    • Spectrum — 计算矩阵的频谱。
    • Det — 计算矩阵的行列式。
    • Rank — 计算矩阵的秩。
    • SLogDet — 计算矩阵行列式的符号和底对数。
    • Trace — 计算矩阵迹线。
    • Solve — 求解线性方程组。
    • LstSq — 使用最小二乘法求解线性方程组。
    • Inv — 计算矩阵的逆。
    • PInv — 通过Moore-Penrose方法计算矩阵的伪逆。
    • Compare — 使用epsilon比较两个矩阵。

    有关更多详细信息,请参阅相关MQL5文档

  2. 修正处理与路径长度限制相关的文件和数据库时的错误。特别是,DatabaseOpen函数允许将路径设置为大于可接受的路径,从而导致错误的数据库创建。现在该函数正确返回ERR_TOO_LONG_FILE_NAME错误代码。
  3. 修正变量恒常性控制。之前,编译器有时会跳过“常量变量不能作为引用传递”错误。
  4. 修正关于使用未初始化变量时错误的编译器警告。
  5. 修正指标的ChartWindowOnDropped函数操作。以前,它通常返回零。
  6. 将对Python 3.10的支持添加到Python集成模块。

VPS

  1. 修正在导航器中显示VPS项目的问题。之前,它有时会在账户之间切换时消失。

MetaEditor

  1. 修正调试观察窗口中复杂表达式的展开问题。

Tester

修正将测试报告导出到文件的问题。如果将精度为0位小数的货币用作入金货币,则某些值可能会被错误地四舍五入。例如,JPY。

22 十月 2021

MetaTrader 5 Build 3091:其他改进

程序端

  1. 修正购买MQL5服务时打开空白页面的问题。现在,操作结果会立即显示给用户。
  2. 修正请求真实账户时,用户上传的文档图像压缩过度的问题。这将提高自动检查KYC的质量,促进整体开户流程。
  3. 修正测试完成后打开的图形的操作问题。

MQL5

  1. 添加支持SQLite 3.36.0。

MetaEditor

  1. 添加对匹配括号的背景高亮。该选项可以通过MetaEditor常规设置来启用。
  2. 改进MQL5程序调试器

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

21 十月 2021

MetaTrader 5 build 3090:其他改进和修复

程序端

  1. 修正在某些条件下可能导致自定义交易品种消失的错误。
  2. 改进菜单和工具栏图标。
  3. 在MQL5.com新增三种语言:法语、意大利语和土耳其语。

    现在,最大的算法交易者社区 - MQL5.community,已提供11种语言版本。我们已经实现网站界面、文档和重要论坛主题的本地化。新语言的文章和经济日历也即将到来。

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

MQL5

  1. 修正StringConcatenate函数中的错误。
  2. 修正当使用FileSave函数时_LastError值的设置。在某些条件下,该变量可能包含null值而不是函数错误的描述。
  3. 修正从资源导入数据到double类型数组。

MetaTester

  1. 修正在可视化测试期间导致图表窗口冻结的错误。
更新文档。

14 十月 2021

MetaTrader 5 build 3081:改进MQL5服务和设计更新

Terminal

  1. 改进MQL5.community服务中的导航功能。

    市场信号VPS版块已经从主平台工作区移动到导航器。新位置为访问所需产品提供更多方便,并可以有效地管理购买和订阅。每个服务都添加了“如何工作”部分,以提供基本的使用信息。


    改进通过MQL5.community服务的导航功能


  2. 所有菜单和工具栏图标都已完全重新设计。客户端界面也更加人性化:

    • 删除图标中的小元素
    • 减少使用的颜色数量,避免颜色干扰
    • 使用更少的渐变来提高可读性
    • 使用更直接的隐喻


    平台中的所有菜单、工具栏和对话框都已重新设计


  3. 添加交易执行的成本显示。相关信息显示在交易历史中。此功能适用于NFA监管的交易商。


    账户历史显示交易成本>


    如果您的交易商在服务器上启用成本计算,则新成本列将出现在您的账户交易历史中。该列显示了相对于交易品种的当前中点价格的交易执行成本(中点点差成本)。

  4. 推出MQL5.com韩语版

    这是MQL5.community(最大的算法交易者社区)提供的第八种语言。网站界面、文章、经济日历和重要论坛主题都已经提供韩语。MQL5文档也将很快进行翻译。

  5. 修正加载自定义交易品种。在某些情况下,新创建的交易品种设置可能会覆盖现有的交易品种设置。
  6. 修正在图表上显示信号交易历史。以前,相关选项可以显示所有交易品种的所有交易,而不仅仅是图表交易品种。
  7. 在交易历史报告中添加费用列的导出。之前,该值仅显示在历史中,但无法保存到文件中。
  8. 优化和加速市场报价中和图表上的一键交易面板的操作。
  9. 修正自定义交易品种的预付款比率字段的操作。在某些条件下,这些值可以重置为零。
  10. 我们继续实施订阅服务,通过此服务,交易者可以购买交易商的额外交易服务。修正报价订阅窗口中的错误。
  11. 修正显示趋势线分析对象。以前,趋势线可能会在缩放或调整图表窗口大小时消失。
  12. 修正显示矩形分析对象。如果定位点之一超出图表可见区域,则该对象可能会消失。
  13. 与内置MQL5.community图表的操作相关的修复和操作速度改进。
  14. 修正持仓列表中的“值”参数的四舍五入。在以前版本中可以隐藏小数部分。
  15. 修正开户过程中的手机验证。某些中国运营商的电话号码可能会被识别为不正确。
  16. 添加对长度超过32个字符的MQL5账户密码的支持。
  17. 修正在Wine中工作时的证书导出。该选项用于从桌面版迁移到移动设备时的具有扩展认证的账户。
  18. 修正在工具箱窗口下面板中打开MQL5服务的按键。当窗口取消锁定时,该按键处于非活动状态。
  19. 添加“文件\新图表”菜单大小的限制。现在,菜单包含的交易品种组不能超过128个子菜单,每个子菜单不超过32个交易品种。这一限制加快了程序端操作,并避免在向市场报价添加大量交易品种(2000或更多)时被冻结。

MQL5

  1. 我们继续添加向量和矩阵支持。这些新功能将大幅度扩展基于神经网络的解决方案开发人员的可能性。
  2. 在ENUM_DEAL_PROPERTY_DOUBLE枚举中添加DEAL_SL和DEAL_TP值 — 交易的止损和止盈级别。

    根据发起这些交易的订单的止损和止盈来设置进入和逆转交易的相关值。平仓时对应持仓的止损值/止盈值被用于退出交易。

  3. 在ENUM_MQL_INFO_INTEGER枚举中添加MQL_HANDLES_USED值 — MQL程序中活动类对象(句柄)的数量。这些包括动态(通过新值创建)和非动态对象、全局/局部变量或类成员。程序使用的句柄越多,它消耗的资源就越多。

  4. 添加用于使用描述经济日历事件的MqlCalendarValue结构的新方法:

    • HasActualValue(void) — 如果设置实际值,则返回true;否则返回false
    • HasForecastValue(void) — 如果设置预测值,则返回true;否则返回false
    • HasPreviousValue(void) — 如果设置过去值,则返回true;否则返回false
    • HasRevisedValue(void) — 如果设置修正值,则返回true;否则返回false
    • GetActualValue(void) — 如果未设置相关值,则返回事件(double)或nan的实际值
    • GetForecastValue(void) — 如果未设置相关值,则返回事件(double)或nan的预测值
    • GetPreviousValue(void) — 如果未设置相关值,则返回事件(double)或nan的过去值
    • GetRevisedValue(void) — 如果未设置相关值,则返回事件(double)或nan的修正值

  5. 修正使用EX5文件形式程序库的MQL5程序的调试问题。
  6. 加速编译包含由序列初始化的大型数组的程序。
  7. 修正使用自定义交易品种数据执行CopyTicksRange函数的问题。该函数可能返回请求期间之外的数据。
  8. 修正参数专业化期间对所有模板参数可用性的验证。在某些情况下,使用调试模板编译代码可能会导致“代码生成错误”。

Signals

  1. 添加自动续订信号订阅的功能。

    您的订阅不会突然终止,因为系统会通过您用于初始订阅购买的付款方式自动续订一个月。


    为信号订阅启用自动续订


    如果您之前使用银行卡进行付款并且续订付款失败,系统将尝试从您的MQL5账户余额中支付。

    不要担心订阅价格的变化。如果价格上涨,自动续订将被取消。您将通过电子邮件收到相关通知。

    您可以在MQL5.com随时通过我的订阅部分启用或禁用自动续订选项。


    在MQL5.com“我的订阅”部分管理自动续订


  2. 修正信号展示的显示问题。现在系统可正确识别信号与当前账户的兼容性。

Market

  1. 在市场展示区添加通过作者姓名和登录名进行产品搜索。以前,该服务仅支持按产品名称和描述搜索。

VPS

  1. 改进自动订阅续订选项。

    以前,续订付款只能从MQL5账户结余中支付。用户必须确保其账户中有可用的相关金额。

    现在无需为MQL5账户充值。系统将使用您用于初始订阅的相同付款方式续订订阅。如果您使用银行卡支付VPS并启用自动续订选项,系统将对新订阅期使用相同的付款方式。如果付款失败,系统将尝试从您的MQL5账户余额中支付。


    使用银行卡和其他付款方式进行自动续订


    通过这个新选项,您可以确保EA交易和信号订阅不会因为VPS到期而停止。此外,无需手动检查和充值您的余额。
    该选项将仅用于新订阅。现有订阅的续订费用将从MQL5账户余额支付。

Tester

  1. 修正可视化测试错误。在某些情况下,图表可能无法显示EA交易中使用的指标。

MetaEditor

  1. 修正使用Alt+G跳转到函数或变量声明的问题。如果声明低于调用行,操作可能会失败。
  2. 添加对调试器中类对象引用的对象类型的显示。
  3. 添加在观察表达式列表中显示联合的功能。

MetaTrader 5 iPhone/iPad,MetaTrader 5 Android

  1. 添加在应用程序启动时显示免责声明。请仔细阅读。此外,一些交易商可以在应用程序第一次启动时自动创建模拟账户。在这种情况下,您将看到相关条款。


    MetaTrader 5 iPhone/iPad中添加的免责声明

  2. 添加从移动应用程序直接将账户连接到信号服务中的监控的功能。这可以通过从菜单中选择“账户监控”来完成。为方便起见,账户号和交易商名称会自动添加到注册窗口中。您应该另外指定信号名称和只读密码。

    将账户连接到监控以访问高级交易统计数据,与其他交易者分享结果或开始出售您的信号。

  3. 为在Android操作系统上运行的移动端,添加对Huawei AppGallery(华为应用市场)和HMS服务的支持。华为智能手机用户可以从相关商店安装该应用程序并使用推送通知。

更新文档。

18 六月 2021

MetaTrader 5 build 2980: 交易操作的推送通知

程序端

  1. 添加从服务器接收推送通知的功能。即使您的程序端关闭的情况下,您也能收到已执行交易操作的通知。



    在早期版本中,移动设备的通知只能从交易者桌面程序端发送。交易操作执行后,程序端向设置中指定的MetaQuotes ID发送相关通知。通知只能从正在运行的程序端发送。此要求已被取消。如果在您的计算机关闭时在服务器上触发止盈,您将收到来自服务器的平仓通知。

    要开始从服务器接收通知,您应该:
    • 拥有真实账户,因为服务器通知不适用于模拟账户
    • 在您的智能手机上安装MetaTrader 5 iOSAndroid
    • 在移动端打开消息部分,找到您的MetaQuotes ID并将其指定在桌面程序端的设置中
    • 在桌面程序端设置中启用服务器通知

    服务器通知应由您的交易商提供

    支持三种通知类型:订单操作、交易操作和结余操作。当您启用该选项时,可用的通知类型将显示在程序端日志中:
    '1222': subscribed to deals, orders, balance notifications from trade server

  2. 更新MetaTrader VPS展示。VPS部分变得更加方便:
    • 界面适应任何屏幕宽度。
    • 展示区占用的垂直空间更少,以适应工作区域。
    • 必要的信息仅在需要时出现。付款详细信息仅在您选择付款计划后显示。



    程序端:在策略测试面板中,添加用于快速切换到MQL5服务和工具箱窗口的命令。这些命令仅显示在“概览”部分,而在其他选项卡中,该面板用于管理测试。



  3. 为MQL5服务添加窗口状态的保存。如果您在关闭程序端之前将市场保持打开状态,相关窗口将在您下次启动程序端时打开。
  4. 修正定期同步MQL5账户状态。由于出现错误,信号复制在某些情况下可能会失败。
  5. 修正显示一系列推荐的市场产品。
  6. 修正导航器中的信号快捷菜单。您可以使用菜单查看您订阅的信号或取消订阅信号。

MQL5

  1. 修正在标准程序库(file MQL5\Include\Math\Alglib\complex.mqh)中实现复数时的"-"运算符错误。
  2. 现在您可以在初始化序列中使用任何表达式,而不仅仅是常量表达式。这可以提高可用性和与C++代码的兼容性。
    struct POINT
      {
       int x,y;
      };
    
    int GetYFunc(y)
      {
       return(y * y);
      }
    
    void SomeFunction(int x1,int x2,int y)
      {
       POINT pt={ x1+x2, GetYFunc(y) };
       ProcessPoint(pt);
      };
  3. 修正在以大量数据数组编译union时发生的错误。
  4. 修正StringToCharArray函数操作。现在它将整个传递的字符串转换为Char数组,而不是在第一个终止null字符处停止。
  5. 如果类/结构的父类没有默认构造函数,则添加对类/结构的构造函数调用的显式存在的控制。

MetaEditor

  1. 分析工具报告中添加显示内联函数的调用位置。

    在下面示例中,func();调用现在突出显示如下:



    func函数本身不会突出显示,因为它的完整代码位于OnStart中。

  2. 添加创建空项目的功能。对于具有默认模板不适合的特定文件结构的非标准开发项目,这是一个有用的功能。



    在这种情况下,将创建一个空设置文件"mqproj"。应手动创建源代码文件。

  3. 实现快速启动MetaEditor。
  4. 修正调试期间观察表达式列表中的数据显示。在某些条件下,该列表可能会显示不正确的变量值。
  5. 修正将".py"扩展名自动添加到使用MQL向导创建的Python脚本文件的问题。
更新文档。

21 五月 2021

MetaTrader 5 Build 2940: 在主工作区MQL5服务的显示布局及更新设计

程序端

  1. 交易服务(包括市场信号虚拟主机)现在可以方便地显示在平台的主工作区。
    在早期版本中,MQL5服务购买区位于主窗口下面的小工具箱窗口。新布局可以显示所有功能以及方便的购买选项。移除下面区域不必要的选项卡可为其他平台功能提供更多空间。



    访问附加服务不会影响主要功能,例如交易和图表分析。
    • 服务选项卡位于柱状图的末端,所有图表选项卡之后。
    • 未使用的服务窗口可以关闭。要重新打开它们,请使用导航器、工具栏或“服务”菜单。

    我们还完全重新设计了服务。设计变得更加简洁和轻便。信号包含之前只能通过MQL5.community网站显示区获得的附加数据:具有主要特性、可靠性、活动度量和其他变量的极坐标图。



  2. 添加对IPv6地址的支持。
    每个网络中使用的IPv4创建于30年前。它包含32位的IP地址,这些IP地址表示为由点分隔的四个8位数字。该算法可产生超过40亿个唯一IP地址。但是,迅速增长的用户数和设备数加速了可用地址池的消耗。

    为避免耗尽问题,某些产品还提供对现代IPv6标准的额外支持。该协议使用128位地址,表示为x:x:x:x:x:x:x:x,其中每个x是六个16位地址元素的十六进制值。从理论上讲,此格式允许5 x 10 ^ 28个唯一地址。除了扩展的地址空间之外,该协议还具有较旧版本的其他优势。有关更多详细信息,请参阅专业文章。

    MetaTrader 5平台已完全支持IPv6。如果您的交易商或提供商切换到新协议,则将可在平台中直接启用协议支持,而无需您采取其他任何操作。

  3. 我们将在build 2815中继续实施提供的任务管理器功能。我们为运行MQL程序调试或性能分析的图表添加了明确的指示。




  4. 实现macOSLinux电脑中Wine下的平台更快启动。常规优化和错误修复:
    • 改进菜单、工具栏和对话框的显示。
    • 修正显示“市场”、“信号”和“ VPS”部分时出现的错误。尤其是,我们已修正“市场”展示中产品logo的加载问题。
    • 更新DMG软件包,便于在macOS电脑上轻松安装MetaTrader 5。借助这个软件包,平台安装过程与其他应用相同:将平台图标拖拽至应用程序,然后等待安装完成。
      该软件包包含可使操作更加稳定和快速的附加组件。强烈建议所有软件包用户在下面链接下载最新版本并重新安装MetaTrader 5:https://download.mql5.com/cdn/web/metaquotes.software.corp/mt5/MetaTrader5.pkg.zip
    如果您使用CrossOver,请完全重新安装MetaTrader 5,获得最新的64位平台版本。
  5. 修正“Ctrl+F9”键盘快捷键操作。它可激活工具箱中的交易选项卡。

MQL5

  1. 我们继续限制包括32位组件在内的旧技术的发布。
    • 不再允许32位程序端加载市场中的程序。
    • 32位程序端无法连接到主机服务。
    • 32位MetaEditor版本不支持通过MQL5 Cloud Protector提供的附加文件保护。
    • 使用MetaEditor旧版本(5年前或更早发布的版本)编译的MQL5程序不能在新程序端版本中运行。

    一年前,也就是在发布build 2361之后就停止了对32位平台版本的支持。我们强烈建议升级到MetaTrader 5 64位版本,以便无限制地访问平台的所有功能。
    此外,我们建议所有之前将32位产品版本上传到市场的卖方,使用最新64位MetaEditor重新编译并上传新版本。在程序端中运行32位MQL5程序的功能将很快完全被禁用。
  2. 添加对复数操作的支持。

    添加新内置类型“复杂”。
    struct complex
      {
       double             real;   // 实数部分
       double             imag;   // 虚数部分
      };
    “复数”类型可以作为MQL5函数的参数按值传递(与普通结构不同,普通结构只通过引用传递)。对于从DLL导入的函数,“复数”类型只能通过引用来传递。

    'i'后缀用于描述复常数:
    complex square(complex c)
      {
       return(c*c);
      }
      
    void OnStart()
      {
       Print(square(1+2i));  // 常量作为参数传递
      }
    
    // "(-3,4)"将被输出,这是复数的字符串表示
    目前,复数只有简单的运算可用:=、+、-、*、/、+=、-=、*=、/=、==、!=。

    之后将添加对附加数学函数的支持,以支持计算绝对值、正弦、余弦等。

  3. 新错误代码TRADE_RETCODE_HEDGE_PROHIBITED —由于禁止锁仓持仓,因此不允许开仓或下挂单。如果用户在禁用账户锁仓以及用户对相同交易品种已有反向订单或持仓的情况下试图执行交易操作,则返回错误。

MetaEditor

  1. 修正非可视模式下调试和分析终止。
  2. 修正对真实数据的指标分析。在某些情况下,这种分析可能无法启动。

VPS

  1. 修正环境迁移到VPS。包含指标作为资源的EA交易可能会出现错误。

信号

  1. 修正交易模式检查复制信号的问题。可以在交易商端限制交易品种的交易,即交易商可以设置“仅买入”、“仅卖出”或“仅平仓”的条件。在早期版本中,同步需要完整的交易条件,因此在所有其他情况下均不允许复制。更新后,部分受限的条件将被视为“交易”。此功能尤其对希望复制信号的股票交易商客户有用。

Tester

  1. 修正测试期间检查交易时段的问题。在某些条件下,交易操作执行可能会在测试期间失败,在这种情况下,即使操作是在交易时段内启动,也会返回“市场已关闭”错误。
更新文档。

2 四月 2021

MetaTrader 5 build 2875:其他改进和修复

程序端

  1. 修正导致将更新的MQL5标准程序复制到程序端根数据目录而不是MQL5子目录的问题。由于这个错误,在数据目录下可能会创建额外的"Experts"、"Images"、"Include"和其他文件夹。

    平台更新后,将检查这些文件夹并自动删除。

  2. 修正会阻止用户登录到内置MQL5.community聊天的错误。

Tester

  1. 修正通过MQL5云网络优化EA交易。在某些条件下,优化可能无法启动。

MetaEditor

  1. 修复MQL5程序调试和分析期间出现的错误和崩溃。

更新文档。

26 三月 2021

MetaTrader 5 build 2860:增强改进Wine和SQL集成

程序端

  1. 添加启用/禁用其他MQL5.community服务的功能。例如,如果您对MQL5编程文章信号服务的复制交易特性不感兴趣,您可以禁用相关部分,进而优化资源和程序端工作空间。



    默认启用所有服务。

  2. 我们重点优化了macOSLinux系统中Wine下的程序端操作:
    • 现在,未锁定的服务窗口(导航器、工具箱)不可以被拖拽出程序端边界。之前,这可能会导致很难将窗口拖回程序端。
    • 修正在更改窗口大小时调整服务窗口的内容。
    • 修正任务管理器中显示性能指标的问题。
    • 改进工具栏上图标的显示。
    • 修正聊天中的未读消息计数。
    • 修正显示图表系统命令:隐藏、展开和关闭。
    • 修正日志显示。
    • 修正显示图表工具提示。
    • 修正图表打印命令。
    • 修正使用Linux皮肤时顶部菜单的显示。
    • 修正MetaEditor中GitHub、MSDN和堆栈溢出的搜索

    我们建议所有用户将Wine更新到最新稳定版。这会提高平台的性能和稳定性。
  3. 添加在BORSA Istanbul(伊斯坦布尔交易所)交易时对"Market To Limit"订单的支持。这类订单最初作为市价单执行。如果流动性不足,则剩余交易量将作为限价单添加到订单簿中,并带有最后交易价格。
  4. 修正波动图表的显示。现在,将根据选项板上选择的到期日期来构建图表。
  5. 修正通过快速搜索条将交易品种添加到市场深度。如果交易品种名称带有空格,则该交易品种将不会添加到列表中。




MQL5

  1. 扩展使用SQL数据库的可能性。现在,查询支持多种统计和数学函数。

    统计函数
    • 模式
    • 中值(50百分位)
    • percentile_25
    • percentile_75
    • percentile_90
    • percentile_95
    • percentile_99
    • stddev或stddev_samp — 采样标准偏差
    • stddev_pop — 总体标准偏差
    • variance或var_samp — 采样方差
    • var_pop — 总体方差

    数学函数

    例如
    select
      count(*) as book_count,
      cast(avg(parent) as integer) as mean,
      cast(median(parent) as integer) as median,
      mode(parent) as mode,
      percentile_90(parent) as p90,
      percentile_95(parent) as p95,
      percentile_99(parent) as p99
    from moz_bookmarks;
  2. 添加新
    • __COUNTER__ — 每次调用逐一添加。在模板和宏中使用时,提供单独的计数器。
    • __RANDOM__ — 生成一个随机ulong数;它类似于MathRand函数。

  3. 修正当图表交易品种不存在情况下同步图表请求的操作。现在,函数将返回一个相关的错误,而不是无限期等待结果。不存在交易品种的情况则由使用不同交易品种设置的交易账户之间切换引起的。
  4. 优化并加快CopyTicks*函数的速度。

MetaEditor

  1. 使用历史数据更改分析调试的顺序。

    现在,性能分析始终以非可视模式运行。默认调试也以非可视模式运行。相应选项可在MetaEditor设置中手动启用:




  2. 添加配置服务的功能。这个过程类似于其他MQL5程序。
  3. 修正性能分析报告中函数名称的显示。在某些情况下,名称可以指定为<uknown>。

文档已更新。

26 二月 2021

MetaTrader 5 build 2815: 从Python访问市场深度,改进调试器和分析工具

程序端

  1. 添加通过Python API访问市场深度数据的功能。
    三项新功能可以快速获取用于统计计算和机器学习任务的数据,这可以使用大量即用型Python程序库来实现。

    • market_book_add — 订阅MetaTrader 5 程序端,接收与指定交易品种市场深度更改相关的事件。
    • market_book_get — 从BookInfo返回一个元组,其中包含指定交易品种的市场深度记录。
    • market_book_release — 取消MetaTrader 5 程序端订阅与指定交易品种市场深度更改相关的事件。

  2. 推送通知的最大长度从256个字符增加到1024个字符。现在,您可以从移动设备上的MQL5程序发送更多信息。
  3. 添加任务管理器的初始版本,它可以通过按F2键来调用。

    任务管理器可以监视平台消耗的资源。您可以查看图表消耗的内存量,EA交易以及其他性能指标使用的CPU资源。如果平台性能下降,则可以轻松检测并解决问题



  4. 加强订阅服务。为有延迟报价的交易品种添加特殊指示:
    • 市场报价中的交易品种标记为时钟图标,并且延迟值显示在工具提示中
    • 数据延迟通知显示在图表上



  5. 修正没有交易账户连接时的订阅列表显示。
  6. 修正电子邮件和时事通讯中的链接。现在,所有链接都在默认浏览器中打开。以前,链接仅在IE中打开。
  7. 修正从WebRequest函数到包含IPv6地址和Cloudflare保护的主机的连接。
  8. 改进VPS服务的功能和响应能力。
  9. 改进WineMacOS/Crossover下的操作,包括带有M1处理器的macOS Big Sur版本。

MQL5

  1. 修正ArrayPrint函数中的错误。该函数有时可能无法打印数组。
  2. 优化通过File*函数执行的文件操作。现在,文件读取和写入操作运行得更快。
  3. 取消当动态数组用作函数参数时要求指定动态数组第二,第三和第四维度大小的限制。这增加了代码的重用性和灵活性。
    void func(int &arr[ ][ ][ ][ ])
      {
      }
  4. 修正ArrayBsearch函数的操作。该函数可能会在二进制搜索过程中返回找到的元素的错误索引。

MetaEditor

  1. 经过改进的调试器中提供了更多新功能。
    • 现在,数组将根据ArraySetAsSeries设置的排序显示在观察窗口中。
    • 添加对局部静态变量的支持。
    • 修正指定数组元素值的显示。
    • 修正处理“静态”类字段。
    • 为更准确而可靠的调试而进行的其他改进。

  2. 添加“在分析中启用优化”的选项。
    可以禁用代码优化模式,以便在性能分析报告中包含更多详细信息。没有优化的代码速度可能会慢几倍,但是此模式可提供更广泛的代码覆盖范围。请注意,通过优化的代码瓶颈可能不准确。
    可以通过禁用“在分析中启用内联”来设置较温和的分析模式。


    优化管理选项也已添加到项目设置
    • 如果在项目中禁用优化,则新选项将被忽略,因此,性能分析将始终禁用优化(包括内联操作)。
    • 如果在项目中启用优化,则在性能分析编译期间将考虑新选项。

  3. 添加用于调试和分析过程的日志记录。在操作开始时记录环境设置;在操作停止时记录收集的数据统计信息。
    MQL5 profiler    starting 'ExpertMACD.ex5' on history with parameters:
    MQL5 profiler       symbol: 'EURUSD'
    MQL5 profiler       period: 'H1'
    MQL5 profiler       date from: '2021.01.01'
    MQL5 profiler       date to: '2021.02.22'
    MQL5 profiler       ticks mode: 'every tick'
    MQL5 profiler       execution delay: 0 ms
    MQL5 profiler       deposit: 10000
    MQL5 profiler       currency: 'USD'
    MQL5 profiler       leverage: 1:100
    MQL5 profiler       profit in pips: NO
    MQL5 profiler    profile data received (4640 bytes)
    MQL5 profiler    758 total measurements, 0/0 errors, 470 kb of stack memory analyzed
    MQL5 profiler    7782 total function frames found (1929 mql5 code, 342 built-in, 1403 other, 4108 system)

Tester

  1. 修正高级测试设置中的非交易时间的规范。

更新文档。
12345678