MetaTrader 5新功能

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

7 三月 2024
MetaTrader 5 build 4230:更多内置应用程序和扩展ONNX支持

程序端

  1. 在标准平台包中添加28个新EA交易和12个新指标。这些应用程序可在导航器的EA交易\Free Robots和指标\Free Indicators部分获得。每个程序均以源代码形式提供,并附有详细注释,可帮助您学习MQL5语言。

    EA交易根据技术指标和蜡烛图形态实施交易策略,例如 3 Black Crows – 3 White Soldiers,Bullish Engulfing – Bearish Engulfing,Bullish Harami – Bearish Harami等。新指标是流行渠道的实施情况:Camarilla、DeMark、Donchian、Fibonacci和Keltner等。



  2. 推出纳斯达克市场数据订阅的准备工作正在进行中。通过该平台,交易者将能够访问来自最大交易所之一的数百种交易品种的实时报价和深入价格历史记录。任何在MetaQuotes-Demo服务器上拥有模拟账户和拥有MQL5.community账户的用户都可以订阅。



    首先,您只需购买订阅并将相关交易品种添加到您的市场报价中。您可以将这些交易品种用作常规交易品种:打开图表,使用对象和指标对其进行分析,并在策略测试器中运行EA交易。访问所有信息的方式与您与交易商合作的普通交易品种一样。

  3. 改进交易品种规格中的预付款部分。该部分现在提供每个交易品种的预付款率和计算值。



    修正某些交易品种类型的预付款显示错误。

  4. 在“帮助”菜单中添加MQL5 Telegram频道的链接。该频道定期分享开发人员感兴趣的内容,包括对新编程文章的评论以及来自 代码库的免费EA和指标。订阅该频道以时刻关注更新消息,确保您不会错过重要信息。



  5. 自定义配置文件的[StartUp]部分添加对ShutdownTerminal参数的支持。使用此参数启动平台以使用脚本执行一次性任务。例如,您有一个用于截图图表屏幕的脚本。您可以创建一个配置文件,与平台一起启动该脚本。如果将ShutdownTerminal设置为“是”添加到该文件中,平台将在脚本完成后立即自动关闭。
  6. 加强对网络协议和市场产品的保护。
  7. 禁用对模拟账户信号服务的支持。要获取有关练习账户的更多统计信息,请使用新交易报告。它提供了大量的指标来描述您的策略盈利能力和风险,包括增长图、平衡图和权益图,以及按方向和交易品种划分的交易分布图等。
  8. 修正“帮助”菜单中交易商协议链接的显示。
  9. 改进租用VPS时最佳服务器的选择。
  10. 修正在导航器中切换版块时刷新订阅页面的问题。
  11. 修正在开设初始账户时更新协议列表的问题。
  12. 更新用户界面翻译。

MQL5

  1. ENUM_MQL_INFO_INTEGER枚举中添加MQL_STARTED_FROM_CONFIG属性。如果脚本/EA交易从配置文件的StartUp部分启动,则返回true。这意味着脚本/EA交易已在启动程序端的配置文件中指定。
  2. 我们继续扩大对ONNX模型的支持。

    机器学习任务并不会一直需要更高的计算精度。为了加快计算速度,一些模型使用较低精度的数据类型,例如Float16甚至Float8。为了允许用户将相关数据输入到模型中,MQL5中添加了以下函数:
    bool ArrayToFP16(ushort &dst_array[],const float &src_array[],ENUM_FLOAT16_FORMAT fmt);
    bool ArrayToFP16(ushort &dst_array[],const double &src_array[],ENUM_FLOAT16_FORMAT fmt);
    bool ArrayToFP8(uchar &dst_array[],const float &src_array[],ENUM_FLOAT8_FORMAT fmt);
    bool ArrayToFP8(uchar &dst_array[],const double &src_array[],ENUM_FLOAT8_FORMAT fmt);
    
    bool ArrayFromFP16(float &dst_array[],const ushort &src_array[],ENUM_FLOAT16_FORMAT fmt);
    bool ArrayFromFP16(double &dst_array[],const ushort &src_array[],ENUM_FLOAT16_FORMAT fmt);
    bool ArrayFromFP8(float &dst_array[],const uchar &src_array[],ENUM_FLOAT8_FORMAT fmt);
    bool ArrayFromFP8(double &dst_array[],const uchar &src_array[],ENUM_FLOAT8_FORMAT fmt);
    由于16位和8位的实数格式可能不同,因此转换函数中的“fmt”参数必须指示需要处理哪种数字格式。对于16位版本,使用新的枚举NUM_FLOAT16_FORMAT,当前具有以下值:

    • FLOAT_FP16 – 标准16位格式也称为 half
    • FLOAT_BFP16 – 特殊的脑浮点格式。

    对于8位版本,使用新的ENUM_FLOAT8_FORMAT枚举,当前具有以下值:

    • FLOAT_FP8_E4M3FN – 8位浮点数,4位表示指数,3位表示尾数。通常用作系数。
    • FLOAT_FP8_E4M3FNUZ — 8位浮点数,4位表示指数,3位表示尾数。支持NaN,不支持负零和Inf。通常用作系数。
    • FLOAT_FP8_E5M2FN – 8位浮点数,5位表示指数,2位表示尾数。支持NaN和Inf。通常用于渐变
    • FLOAT_FP8_E5M2FNUZ — 8位浮点数,5位表示指数,2位表示尾数。支持NaN,不支持负零和Inf。也用于渐变。


  3. 添加机器学习中使用的新矩阵和向量方法:


  4. ONNX Runtime已更新至1.17版本。有关发布说明的详细信息,请参阅GitHub
  5. Python集成包更新至5.0.4200版本,添加对Python 3.12的支持。使用“pip install -- pgrade MetaTrader5”命令更新您的软件包以获取最新更改。
  6. 修正某些情况下的OrderCalcMargin函数操作的问题。
  7. ENUM_DEAL_REASON枚举中添加了DEAL_REASON_CORPORATE_ACTION属性。它表示由于公司行动而执行的交易:合并或重新命名证券、将客户转移到另一个账户等。
  8. 比较方法添加对复向量和矩阵比较的支持。比较涉及到复数之间距离的估算。距离的计算公式为sqrt(pow(r1-r2, 2) + pow(i1-i2, 2),是一个已经可以与epsilon进行比较的实数。
  9. 修正将颜色类型变量转换为RGB格式文本的问题。
  10. 修正在复特征值的情况下,返回Eig方法获取特征向量的结果。为复杂评估添加方法重载。

MetaEditor

  1. 在帮助\MQL5.community菜单中添加最近发布的书籍“MQL5交易者编程”的链接。该书也已添加到搜索系统,因此您可以直接从MetaEditor找到所需的信息:




  2. 内置搜索改进:

    • 工具箱窗口中的搜索结果部分分为两个选项卡:“搜索”用于在线搜索结果(文档、文章、书籍等),“在文件中搜索”用于本地结果。
    • 单独的搜索字符串已添加到结果部分。您可以使用它来代替MetaEditor主工具栏中的搜索栏。

  3. 命令行编译命令时添加对AVX、AVX2和AVX512模式的支持。要进行编译,请在下列键中选择一个添加到命令中:/avx、/avx2或/avx512。
  4. 用于数据库操作的SQLite引擎更新至版本3.45。
  5. 禁用对Internet Explorer的支持。现在仅使用Microsoft Edge WebView2来显示HTML页面。与之前的MSHTML相比,新组件通过提供对最新技术的访问,进一步扩展了内容显示功能。WebView2的使用改善了某些MetaEditor部分的外观,提高了性能,并创建了一个响应速度更快的界面。
  6. 修正在极少数情况下函数自动完成时发生的冻结问题。
  7. 修正崩溃日志中的错误报告。
  8. 修正在极少数情况下函数自动完成时发生的冻结问题。

Tester

  1. 如果测试开始日期恰好是三倍库存费日,则修正三倍库存费的计算。

MetaTrader 5网页端

改进合约规格中预付款要求的显示。现在,除了用于计算比率和初始参数之外,规格还显示最终预付款值。如果预付款数额取决于持仓量,则对话框中将显示相应的水平。



预付款的计算依据是规格窗口打开时的交易品种价格,而不是实时更新。因此,这些数值应被视为具有指示性。要根据当前价格重新计算数值,请重新打开交易品种规格。
18 一月 2024
MetaTrader 5 build 4150:交易报告导出和MQL5新机器学习方法

程序端

  1. 程序端:添加将交易报告导出为HTML和PDF文件的功能。通过这个选项,您可以轻松地与同事和投资者分享您的交易成果。新导出命令可在文件菜单和报告菜单中获得。




  2. 程序端:添加将当前"市场报价"窗口的状态保存到CSV文件的功能。为此,请在快捷菜单中选择"导出"。文件将保存导出时选择的指标。要保存更多数据,可通过快捷菜单启用其他列。




  3. 程序端:改进合约规格中预付款要求的显示。现在,规格不再显示计算的比率和初始参数,而是显示最终预付款值。如果预付款数额取决于持仓量,则对话框中将显示相应的水平。



    预付款的计算依据是规格窗口打开时的交易品种价格,而不是实时更新。因此,这些数值应被视为具有指示性。要根据当前价格重新计算数值,请重新打开交易品种规格。

  4. 程序端:禁用对模拟账户信号服务的支持。要获取有关练习账户的更多统计信息,请使用新交易报告。它提供了大量的指标来描述您的策略盈利能力和风险,包括增长图、平衡图和权益图,以及按方向和交易品种划分的交易分布图等。
  5. 程序端:修正在编辑Stop Limit订单的止盈和止损时显示潜在盈/亏值的问题。
  6. 程序端:修正和改进支付系统的操作。
  7. 程序端:修正在市场报价中从*.set文件加载一组交易品种时的重复检查。
  8. 程序端:修正Parallels的网络安装程序。现在,在装有M1/M2/M3的macOS上使用该虚拟化系统时,平台将被正确安装。
  9. 程序端:更新用户界面翻译。
  10. 修正崩溃日志中的错误报告。

MQL5

  1. 添加机器学习中使用的矩阵和向量操作新方法。

    • ConfusionMatrix:计算误差矩阵。该方法适用于预测值的向量。
    • ConfusionMatrixMultilabel:计算每个标签的误差矩阵。该方法适用于预测值的向量。
    • ClassificationMetric:计算分类指标,以评估预测数据与真实数据相比的质量。该方法适用于预测值的向量。
    • ClassificationScore:计算分类指标,以评估预测数据与真实数据相比的质量。该方法适用于真实值的向量。
     
  2. 修正使用FileWrite函数将数据以UTF-8格式保存到文本文件。
  3. 禁用和弃用的Signal*函数。现在它们将返回空信号集。

MetaEditor

  1. 提高分析采样率。现在,分析器每秒可捕捉10,000次应用程序状态,从而更准确地测量函数执行率。
  2. 更新Copilot自动编码助手的可用模型。添加ChatGPT-4 Turbo模型,删除过时的模型。
  3. 修正替换所选文本片段中的单词时出现的错误。

Tester

  1. 修正在通用优化模式下可能出现的前测冻结问题。
  2. 利用MQL5程序的交易历史记录优化和加速操作。
  3. 修正Close By操作的利润计算。与主测试交易品种不匹配的交易品种可能会出错。

网页端

  1. 修正交易商相关属性发生变化时更新交易品种属性的问题。
  2. 修正图表上蜡烛图显示的问题。图表可能无法显示小蜡烛图。
  3. 修正开户表格中国家字段的操作。
20 十月 2023
MetaTrader 5 build 4040:其他改进和修复

程序端

  1. 新交易报告改进。修正增长图表和缩减计算中第一个值的显示。



  2. 开户时,交易者会通过内部电子邮件系统收到几条信息。这些信息中会提供有关平台功能和内置服务的凭证和可用信息。我们对这些电子邮件进行了更新和改进,将其翻译成50种语言,并整体更新设计。
  3. 优化账户入金和出金页面。
  4. 修正下新订单时交易量变化的错误。在某些交易品种设置组合中,该字段无法进行编辑。
  5. 修正模拟账户开户对话框中交易商协议链接的显示问题。
  6. 更新用户界面翻译。

MQL5

  1. 修正在某些条件下可能导致MQL5程序启动时崩溃的错误。

MetaTrader 5网页端

  1. 修正在交易历史中止损和止盈值的显示问题。
  2. 增强日志记录功能。新日志信息可显示连接成功和连接失败的信息。
  3. 修正市场报价中的快捷菜单操作。
  4. 修正从市场深度进行交易时有关操作结果的通知显示。
  5. 修正在调用交易对话框时导致指标子窗口从图表中移除的错误。
  6. 修正在图表上拖动显示在分析对象顶部的交易水平的问题。
29 九月 2023
MetaTrader 5 build 4000 :改进交易报告和网页端

程序端

  1. 新交易报告中添加每月资金增长的显示。要查看该指标,请进入汇总报告并选择"结余"模式。



  2. 修正并改进新交易报告的显示。
  3. ONNX Runtime已更新至1.16版本。有关发布说明的详细信息,请参阅GitHub
  4. 更新用户界面翻译。

MetaTrader 5网页端

  1. 修正密码更改和开设账户对话框的显示问题。
  2. 修正历史记录中止损值和止盈值的显示问题。修改相关级别后可能会出现错误。
  3. 在风险预警对话框中添加滚动条。
  4. 更新用户界面翻译。
  5. 其他改进和修复。
21 九月 2023
MetaTrader 5 build 3980:其他改进和修复

程序端

  1. 新交易报告的改进。修正总库存费值和交易品种利润图表的显示问题。
  2. 优化出入金页面。有关新平台与支付系统集成的更多详细信息,请参阅build 3950发布说明
  3. 优化整个平台(包括策略测试)财务运营的重新计算。现在,利润、预付款和许多其他参数的计算速度更快。
  4. 更新用户界面翻译。

MQL5

  1. 添加复数、向量<复数>和矩阵<复数>类型共轭方法。实现复杂的共轭运算。
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                          |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       complex a=1+1i;
       complex b=a.Conjugate();
       Print(a, "  ", b);
       /*
       (1,1)  (1,-1)
       */
    
       vectorc va= {0.1+0.1i, 0.2+0.2i, 0.3+0.3i};
       vectorc vb=va.Conjugate();
       Print(va, "  ", vb);
       /*
       [(0.1,0.1),(0.2,0.2),(0.3,0.3)]  [(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)]
       */
    
       matrixc ma(2, 3);
       ma.Row(va, 0);
       ma.Row(vb, 1);
       matrixc mb=ma.Conjugate();
       Print(ma);
       Print(mb);
       /*
       [[(0.1,0.1),(0.2,0.2),(0.3,0.3)]
        [(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)]]
    
       [[(0.1,-0.1),(0.2,-0.2),(0.3,-0.3)]
        [(0.1,0.1),(0.2,0.2),(0.3,0.3)]]
       */
       
       ma=mb.Transpose().Conjugate();
       Print(ma);
       /*
       [[(0.1,0.1),(0.1,-0.1)]
        [(0.2,0.2),(0.2,-0.2)]
        [(0.3,0.3),(0.3,-0.3)]]
       */
      }
  2. 添加处理“Sequence of maps”类型的ONNX模型输出。

    对于在输出层提供Map序列(ONNX_TYPE_MAP的ONNX_TYPE_SEQUENCE)的ONNX模型,应将动态或固定的结构数组作为输出参数传递。此结构的前两个字段必须与ONNX_TYPE_MAP键和值类型匹配,并且是固定数组或动态数组。

    考虑由以下Python脚本创建的iris.onnx模型:
     sys 导入 argv
    data_path=argv[0]
    last_index=data_path.rfind("\\")+1
    data_path=data_path[0:last_index]
    
     sklearn.datasets 导入 load_iris
    iris_dataset = load_iris()
     sklearn.model_selection 导入 train_test_split
    X_train, X_test, y_train, y_test = train_test_split(iris_dataset['data'], iris_dataset['target'], random_state=0)
     sklearn.neighbors 导入 KNeighborsClassifier
    knn = KNeighborsClassifier(n_neighbors=1)
    knn.fit(X_train, y_train)
    
    # 转换  ONNX格式
     skl2onnx 导入 convert_sklearn
     skl2onnx.common.data_types 导入 FloatTensorType
    initial_type = [('float_input', FloatTensorType([None, 4]))]
    onx = convert_sklearn(knn, initial_types=initial_type)
    path = data_path+"iris.onnx"
    with open(path, "wb") as f:
        f.write(onx.SerializeToString())
    在MetaEditor中打开创建的onnx文件:

    在MetaEditor中查看ONNX模型


    Map序列作为“output_probability”传递。它有一个INT64类型键(对应于MQL5中的long)和float类型值。要从此输出接收数据,请声明以下结构:
    struct MyMap
      {
       long              key[];
       float             value[];
      };
    这里我们使用具有适当类型的动态数组。在这种情况下,我们可以使用固定数组,因为这个模型的Map始终包含3个键+值对。

    由于返回Map序列,因此应将此类结构的数组作为参数传递,以接收来自output_probability输出的数据。根据特定模型的属性,该数组可以是动态数组可以是固定数组。示例:
    //--- 声明一个数组来接收来自输出层output_probability的数据
    MyMap output_probability[];
    
    ...
    
    //--- 模型运行
    OnnxRun(model,ONNX_DEBUG_LOGS,float_input,output_label,output_probability);

MetaEditor

  1. 修正ONNX模型查看器中输出类型的显示问题。
14 九月 2023
MetaTrader 5 build 3950:在程序端出入金,更新的交易报告

程序端

  1. 添加对直接在客户端中进行交易账户出入金的结余操作的支持。

    我们将最常用的支付系统直接集成到MetaTrader 5平台中,使得交易商能够为交易者提供更高水平的服务。在入金或充值时,只需选择最适合您的付款方式即可完成交易。为了更加便捷,交易者可以保存所选银行卡,这样不用每次都输入银行卡的详细信息。交易商不会存储付款详细信息和银行卡号。用户输入的支付数据通过安全通道发送到用户选择的支付系统。

    新功能为交易者提供了无需离开客户端即可一键管理资金的机会。



  2. 全面改进交易历史报告。现在查看报告更加轻松。我们修正了信息展示方法,将枯燥的统计报告转换为互动式图表。这项工作仍在进行中,但您已经可以评估这些变化。

    要查看交易统计数据,请单击"查看"菜单中的"报告"。




    报告分为四个选项卡,每个选项卡都包含汇总信息:

    1. 摘要 — 交易摘要:账户数据、整体损益、入金和出金、结余、增长和股息图表等。
    2. 盈利/亏损 — 盈利和亏损交易的数据。参数按交易类型(手动交易、算法交易和复制交易)划分。结果可以从交易或资金的角度,按月份和年份进行分析。
    3. 买入持仓/卖出持仓 - 指定时间段的动态买卖比率,以及买入和卖出的盈利能力。
    4. 交易品种 - 按交易品种分析交易。在这里,您可以看到您在哪些交易品种上盈利或亏损、交易频率、交易图表以及货币量。

    新报告使您只需点击选项卡,就能直观地评估各方面的交易结果。直方图、图形和图表是交互式的,鼠标悬停时可提供更多信息。我们的设计人员精心设计布局,使报告尽可能简单明了。现在就来体验吧!


  3. 添加AVX2指令的使用(在CPU支持的情况下)。这样可以在启动程序端时更有效地利用CPU算力。现在,在安装或更新时,程序端本身将确定CPU架构并安装最适用的版本。在启动期间,程序端会向日志发送一条消息 (AVX/AVX2),显示程序端构建的指令集。
    Terminal	MetaTrader 5 x64 build 3914 started for MetaQuotes Software Corp.
    Terminal	Windows 10 build 19045, 20 x Intel Xeon  E5-2630 v4 @ 2.20GHz, AVX, 41 / 63 Gb memory, 58 / 280 Gb disk, UAC, GMT+2
    

    高级矢量扩展(AVX)是2008年针对Intel和AMD微处理器提出的x86指令集的扩展。进一步的发展带来AVX2和AVX-512 (2013)的出现。

  4. 除了X64和AVX上的两个版本MetaTrader 5程序端外,我们还发布了直接支持AVX2命令编译的第三个版本的桌面程序端。同时,ONNX模型现在也支持AVX2命令。
  5. 添加显示交易商必要监管文件的链接。现在您可以直接在客户端的“帮助/条款和条件”中从您的交易商获取所有必要的法律信息。



  6. 修正通过证书额外使用扩展授权情况下的2FA授权
  7. 修正在MacOS上工作时内部邮件消息的显示。
  8. 修正在Wine中工作时信号窗口的显示。
  9. 发布适用于Linux的MetaTrader 4和MetaTrader 5新安装程序。
  10. 在帮助中添加访问Linux和Mac程序端版本下载页的命令。为了方便交易者,我们在网站上专门创建一个部分,提供适用于所有平台以及浏览器交易的程序端版本。



  11. 修正将图像嵌入到内部邮件中的问题。
  12. 发布适用于Mac系统的MetaTrader 5程序端新安装程序,支持M1/M2处理器。由于要过渡到Wine 8.0.1,我们强烈建议您删除旧版本,安装新版本。当使用低于8.0.0 Wine版本时,程序端日志中会显示一条有关需要更新的消息。
  13. 在网络扫描菜单中添加“VPS主机加速”,指出到您交易服务器的ping值。这可以使您在租用内置VPS时清楚地看到网络延迟的减少情况。



  14. 加强最低密码复杂度的要求,即:

    • 密码长度 - 至少8个字符
    • 密码必须包含至少1个大小写字母,至少1个数字和至少1个特殊字符。

  15. 程序端日志中的可用链接。现在,当双击带有https链接的行时,用户将被转到他们的浏览器并打开链接。
  16. 修正在“市场报价”中搜索交易品种的问题。现在,首先按名字搜索交易品种,然后按其他字段搜索:描述、ISIN等。
  17. 修正在账户交易历史记录报告中计算结余时对交易利润的计算。在某些情况下,计算时没有考虑交易品种类型。

VPS主机

  1. 添加发送和运行在x64/AVX/AVX2命令集下编译的EX5程序的功能。内置VPS不支持AVX512程序。
  2. 内置VPS订阅位置增加到27个。现在,近距离服务器的可选范围更加广泛。

MQL5

  1. 添加对编译设置的管理,包括扩展处理器指令集的选择 - AVX、AVX2、AVX512和FMA3。

    现代CPU拥有一组高级指令,可以大幅度加快数学计算速度,但绝大多数现代程序并不使用这些功能。我们在MQL5语言编译器中添加了对这些指令的支持,从而可以更高效、更快速地生成代码。

    我们还添加了选择使用编译MQL5程序指令类型的功能。您可以在MetaEditor选项中指定单个程序的常规设置,并在项目设置中应用个人设置:



  2. 将ENUM_AVERAGE_MODE和ENUM_CLASSIFICATION_METRIC枚举添加到矩阵和向量方法中。
  3. 添加向量的设置(Set)方法。
  4. 修正OpenCL初始化 - 现在通过第一次实际使用来初始化,而不是通过加载包含OpenCL函数的MQL5程序来初始化。
  5. 修正调用SocketIsConnected函数时的错误。
  6. 修正卸载自定义指标时调用OnDeinit方法的延迟。
  7. 修正编译器错误,该错误导致indicator_label属性中的字符串长度计算不正确,从而导致图形对象的工具提示显示不正确。
  8. 修正宏主体中多行注释的使用。发生错误的宏示例:
    #define MACRO1 /*
    #define MACRO2 */
    void OnStart()
    {
    #ifdef MACRO2
        Print( 2 );
    #else
        Print( 1 );
    #endif
    }
  9. 修正MathAtan2函数的参数顺序。该顺序现在与C++中的类似函数匹配。
  10. 将TERMINAL_CPU_ARCHITECTURE新值添加到ENUM_TERMINAL_INFO_STRING枚举中。此外,还添加了__CPU_ARCHITECTURE__宏 — 用于获取运行程序端的计算机的CPU架构。使用示例:
    void OnStart()
      {
       Print("CPU name:         ",TerminalInfoString(TERMINAL_CPU_NAME));
       Print("CPU cores:        ",TerminalInfoInteger(TERMINAL_CPU_CORES));
       Print("CPU architecture: ",TerminalInfoString(TERMINAL_CPU_ARCHITECTURE));  
       Print("");
       Print("EX5 architecture: ",__CPU_ARCHITECTURE__);                            
      }
    
    CPU name:         12th Gen Intel Core i9-12900K
    CPU cores:        24
    CPU architecture: AVX2 + FMA3
    
    EX5 architecture: AVX

  11. 更改extern修饰符的行为。现在使用extern修饰符声明变量是变量预声明。

    新限制:
    1. 变量预声明不应该包含初始化。例如,在编译下面代码时,我们会得到以下错误“X - 不允许extern变量初始化(X - extern variable initialization is not allowed)”:
      extern int X=0;
      
      void OnStart()
        {
        }

    2. 在程序中声明"extern"变量时,不应使用"extern"关键字。例如,在编译下面代码时,我们会遇到"未解决的extern变量X(unresolved extern variable X)"错误:
      extern int X;
      
      void OnStart()
        {
        }

    3. 使用"extern"时,必须注意初始化顺序,因为因为变量可以在初始化之前被访问。例如,以下代码会在日志中显示"Y=0 X=5",因为变量Y的初始化发生在变量X的初始化之前:
      extern int X;
      int        Y=X;
      
      void OnStart(void)
        {
         Print("Y=",Y," X=",X);
        }
        
      int X=_Digits;

  12. ALGLIB库更新至版本3.19。ALGLIB是一个高性能的数值分析库,专用于数值方法和数据分析算法。

    我们修正了现有的库类来使用矩阵和向量,还添加了ALGLIB 3.19的新功能。所有的源代码都经过修改,并采用了单一的设计风格。ALGLIB库的源代码位于<程序端数据目录>\MQL5\Include\Math\Alglib。测试脚本位于MQL5\Scripts\UnitTests\Alglib。

    遗憾的是,MQL5 3.19版本的ALGLIB库更改非常明显,因此不存在向后兼容。如果代码使用MQL5 3.5版本的ALGLIB库,您需要明确检查您的程序并做出必要的更改。

    除了库本身之外,测试脚本也进行了更新 - 类的测试数量从62个增加到91个,接口的测试数量从143个增加到152个。因此,MetaTrader 5平台开发人员为交易者提供了更有效的解决方案:

    • MQL5语言,在速度方面的表现与C++不相上下;
    • SQLite数据库的内置处理、OpenCL计算、DirectX支持以及与Python集成;
    • 数学库,包括模糊逻辑统计和更新的ALGLIB

MetaEditor

  1. 添加AVX2指令的使用(在CPU支持的情况下)。
  2. 修正编译过程中导致冻结的错误。
  3. 改进调试时局部变量的显示。

Tester

  1. 添加AVX2指令的使用(在CPU支持的情况下)。

更新用户界面翻译。
修正崩溃日志中的错误报告。


MetaTrader 5网页端build 3950

  1. 在图表设置中添加买价的显示。



  2. 加速初始程序端加载。
  3. 添加更改密码的功能。
  4. 添加删除和保存密码的功能。
  5. 添加用于显示交易历史记录的自定义时段。
  6. 修正强制更改密码的问题。
  7. 修正计算差异 — 开盘价与止盈/止损水平之间的差异。


  8. 修正关闭所有订单/交易时报价停止的错误。
  9. 修正启用经济日历事件时并未显示在图表上的显示错误。
  10. 修正更改图表交易品种时指标重置的问题。
  11. 修正确认电话/邮箱时开设真实账户的错误。
  12. 添加新翻译并更正现有翻译。
8 六月 2023
MetaTrader 5 build 3800:预订或取消(Book or Cancel)订单、AI编码助手和增强ONNX支持

程序端

  1. 添加对新订单成交指令的支持 — 被动/预订或取消(BOC)。


    新订单成交指令 — 被动/预订或取消


    BOC指令意味着只能在市场深度(订单簿)中下订单。如果该订单可以在下单时立即成交,则该订单被取消。事实上,通过该指令可保证所下订单的价格不及当前市场价。BOC用于实现被动交易:保证下单后订单不立即执行,因此不会影响当前的流动性。此成交指令仅支持交易所执行模式中的limit订单和stop limit订单。

    新成交指令的可用性取决于交易商。

  2. 平台切换到使用Microsoft Edge WebView2来显示HTML内容。

    与之前的MSHTML相比,新组件通过提供对现代技术的访问进一步扩展了内容显示功能。WebView2的使用改善了一些平台部分的外观,提高了性能,并创建了一个响应更快的界面。特别是,新组件将影响市场、信号和VPS部分。
    Windows 10引入了对WebView2的全面支持。我们强烈建议所有用户升级到最新操作系统版本并安装所有可用更新。该平台将继续支持Windows 7和Wine下的MSHTML,但不会提供新功能。推荐的最低操作系统版本是Windows 10 21H2(build 19044,2021年11月)。

  3. 完善市场保障体系。现在,若要运行产品,用户必须在平台上获得购买产品时使用的相同MQL5账户的授权。该账户必须在工具\选项\社区部分指定:


    在平台设置中指定您的MQL5账户


    如果没有指定账户或者账户无效,产品将无法启动,平台日志中会显示如下信息:
    'ProductName' requires active MQL5 account in Tools->Options->Community
  4. 在历史部分快捷菜单中添加了概述命令。该命令可以打开该账户的交易报告


    打开交易报告的命令


  5. 修正双重身份验证对话框中的显示错误。如果程序端存在多个号码相同但在不同交易商开立的账户,账户连接表单可能无法显示动态密码字段。
  6. 实现通过DRAW_COLOR_CANDLES显示样式快速渲染指标。
  7. 修正交易报告创建错误。在某些情况下,图表上的利润和净值可能显示不正确。
  8. 在交易报告中添加成本显示。该值显示相对于交易品种的当前中点价格(中点点差成本)执行交易时发生的总成本。这是交易者因点差而损失的金额。该值的可用性取决于交易商。
  9. 更新用户界面的翻译。
  10. 改进在Wine系统下的稳定性,尤其在macOS系统。我们建议完全移除旧程序端并重新安装程序端:


  11. 加快程序包安装速度和更新下载过程。改进选择分配程序包时对用户计算机上AVX可用性的分析。
  12. 在Web协议中启用对TLS 1.3的支持。TLS1.0被认为已弃用且安全性低,因此已被禁用。
  13. 修正交易历史报告中代理手续费的会计核算。计算最终利润时可忽略相关交易。
  14. 修正无法在账户连接对话框中更改服务器的问题。当程序端中有多个来自不同交易商的相同号码的账户时,就会出现这个问题。
从此版本开始,安装程序将仅适用于64位平台版本。将停止对32位版本的支持。之前安装的32位平台版本将在2024年1月1日之后不再支持。

MQL5

  1. ENUM_STATISTICS枚举中添加了新STAT_COMPLEX_CRITERION值。使用该属性获取计算的复杂标准值,作为优化的结果。
  2. 改进RegressionMetric方法,用于根据传递的矩阵或向量计算回归指标。添加vector_true和matrix_true参数,用于传递评估预测数据质量的真值。
    double vector::RegressionMetric(
       const vector& vector_true,        // 真值
       const ENUM_REGRESSION_METRIC metric     // 指标
       );
     
    double matrix::RegressionMetric(
       const matrix& matrix_true,        // 真值
       const ENUM_REGRESSION_METRIC metric   // 指标
       );
     
    vector matrix::RegressionMetric(
       const matrix& matrix_true,               // 真值
       const ENUM_REGRESSION_METRIC metric,   // 指标
       const int                     axis   // 坐标轴
       );
  3. 添加LinearRegression方法。它返回一个向量/矩阵,其中包含为传递的向量/矩阵计算线性回归值。
    vector vector::LinearRegression();
     
    matrix matrix::LinearRegression(
       ENUM_MATRIX_AXIS axis=AXIS_NONE          // 沿其计算回归的轴线
       );
    示例:
    vector vector_a;
    //--- 用价格填写向量
    vector_a.CopyRates(_Symbol,_Period,COPY_RATES_CLOSE,1,100);
    //--- 获得线性回归
    vector vector_r=vector_a.LinearRegression();
    该结果在图形中可视化:


    可视化LinearRegression方法返回的结果


  4. 添加HasNan方法,该方法返回矩阵/向量中NaN值的数量。
    ulong vector::HasNan();
    ulong matrix::HasNan();
    当比较具有NaN值的相应元素对时,CompareCompareByDigits方法认为这些元素相等,而在通常的浮点数比较中,NaN != NaN。

  5. 修改用于操作ONNX(开放神经网络交换)模型的OnnxTypeInfo结构:

    struct OnnxTypeInfo
      {
       ENUM_ONNX_TYPE       type;      // 参数类型
       OnnxTensorTypeInfo   tensor;       // 张量描述
       OnnxMapTypeInfo      map;       // 地图描述
       OnnxSequenceTypeInfo sequence;        // 序列描述
      };

    使用新子结构在结构中指定数据类型:

    • OnnxTensorTypeInfo — 张量
    • OnnxMapTypeInfo — 地图
    • OnnxSequenceTypeInfo — 序列

    struct OnnxTensorTypeInfo
      {
       ENUM_ONNX_DATATYPE   data_type;       // data type in the tensor
       long            dimensions[];      // 元素数量
      };
    
    struct OnnxMapTypeInfo
      {
       ENUM_ONNX_DATA_TYPE  key_type;        // key type
       OnnxTypeInfo      type_info;      // 值类型
      };
    
    struct OnnxSequenceTypeInfo
      {
       OnnxTypeInfo       type_info;      // 序列中的数据类型
      };
    根据OnnxTypeInfo::type(ONNX_TYPE_TENSOR、ONNX_TYPE_MAP或ONNX_TYPE_SEQUENCE),填写相关子结构。

  6. 改进对ONNX模型的支持。
  7. 添加CopyIndicatorBuffer方法,可以将指标缓冲区数据获取到 向量中。
    bool vector::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,ulong start_pos,ulong count);
    bool vector::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,ulong count);
    bool vector::CopyIndicatorBuffer(long indicator_handle,ulong buffer_index,datetime start_time,datetime stop_time);
  8. 修正FrameAddFrameNext方法中具有两个或更多维度的数组的操作。
  9. 修正CRedBlackTree::Remove标准程序库的方法。
  10. 实现模糊逻辑库中的修复。

MetaEditor

  1. 添加与高级自动编码助手Copilot的集成。其操作基于OpenAI模型。输入注释或函数的一部分并发送提示。神经网络将分析提示并提供编码选项来实现这一想法。


    Copilot编码助手


    根据文件类型,字符串“MQL5语言”、“Python语言”或“C++语言”会自动插入到每个提示开头。因此,神经网络将以所需的语言提供结果。

    Copilot目前是免费的,并且已在编辑器中启用。在Tools(工具)\ Options(选项)\ Copilot 下有几个选项可用:


    Copilot设置


    付款设置:

    • 使用您的MQL5账户:此选项目前免费提供。稍后,您将能够直接从您的MQL5账户余额中支付订阅费用。
    • 如果您已购买订阅并拥有相关密钥,请使用OpenAI密钥。

    提示设置:

    • 模型 — 一个将处理您的请求的神经网络。目前可用text-davinci-003和gpt-3.5-turbo。不久将添加对gpt-4的支持。
    • 最大令牌数 — 模型可以响应提示返回的文本单元数。
    • 可变性 — 影响神经网络遵循提示的严格程度。值越大,结果随机性越大。该选项对应于OpenAI模型中的温度参数。

  2. 添加查看ONNX模型属性的功能。

    您可以直接在编辑器中查看*.onnx文件的内容。例如,在Toolbox \ Public Projects下找到项目ONNX.Price.Prediction并在快捷菜单中选择加入。该项目将下载到您的计算机并显示在导航器中。


    直接在MetaEditor中打开ONNX模型


  3. 添加使用 Netron可视化机器学习模型和神经网络的功能。该查看器支持多种流行模型,包括ONNX、TensorFlow Lite、Caffe、Keras和ncnn等。

    要查看模型,请在导航器中选择其文件并单击“在Netron中打开”。如果未安装此实用程序,将打开其GitHub页面 ,您可以根据您的操作系统从中下载相关安装程序。例如,使用适用于Windows的 Netron-Setup-XXXexe。如果程序已安装,模型将立即打开,以便从导航器中查看。


    使用Netron的可视化机器学习模型


    支持的格式:

    • armnn, caffemodel, circle, ckpt, cmf, dlc, dnn, h5, har, hd5, hdf5, hn, keras, kmodel,
    • lite, mar, meta, mge, mlmodel, mlnet, mlpackage, mnn, model, nb, ngf, nn, nnp,
    • om, onnx, ort, paddle, param, pb, pbtxt, pdiparams, pdmodel, pdopt, pdparams, prototxt, pt, pth, ptl,
    • rknn, t7, tfl, tflite, tmfile, tm, tnnproto, torchscript, uff, xmodel

  4. 更新用户界面的翻译。

Tester

  1. 修正测试报告中“平均亏损交易”指标的计算。以前,如果对此类交易收取手续费,计算可能会错误地包括进场交易。
  2. 改进策略测试中的自定义手续费的选项。要设置交易品种,请指定其名称而不是整个路径。
  3. 更新策略测试中的图标。新隐喻将使它们更容易理解。

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


网页端

  1. 改进交易历史部分:

    • 交易历史中添加结余操作的展示,如存取款、手续费、和调整等。
    • 在交易历史中添加总计显示:结余、盈利、手续费、存款、取款和订单数量等。
    • 添加在移动版本中按深度对操作进行排序和过滤历史记录的功能。


    更新交易历史部分


  2. 加强交易品种合约规范。添加了以下信息:交易量限制、报价大小和价值、初始预付款和锁仓预付款。
  3. 改进配色方案:

    • 挂单在图表上以灰色显示。持仓颜色取决于持仓方向:红色代表卖出,蓝色代表买入。新颜色提供了更便利的导航,尤其是在图表上显示大量操作的时候。
    • 当查看/编辑持仓时,只有这个持仓和它的水平高亮显示,而所有其他持仓和订单变成灰色,水平从价格标尺中隐藏。因此,将更容易管理单独的操作。
    • 止损颜色已从红色更改为橙色,以避免与卖出持仓混淆。
    • 改进图表上指示平仓时间的图标。绿色图标用于止盈平仓,红色图标用于止损平仓。

  4. 添加阿拉伯语、保加利亚语、越南语、希腊语、印度尼西亚语、马来语、荷兰语、波斯语、波兰语、泰语、乌克兰语和印地语的界面翻译。该网页端现已提供24种语言。
  5. 修正土耳其语的用户界面翻译。
  6. 修正在网页端移动版挂单修改删除问题。
  7. 修正图表上的“关闭市场”工具提示。
  8. 修正交易对话框中平仓按键的利润显示。错误通常发生在部分平仓期间。
  9. 修正图表交易通知的显示。
  10. 修正在市场深度中使用箭头修改交易量的问题。
  11. 修正在某些情况下可能导致运行指标设置被重置的错误。
  12. 修正开设新账户时的用户名检查。以前,认为名称中的撇号是错误的。
  13. 修正重新报价的处理。在某些情况下,可能不会显示包含重新报价的对话框。
  14. 修正Ichimoku Kinko Hyo指标的显示。Chikou-Span、Up Kumo和Down Kumo线将以正确的偏移量显示。
  15. 修正在开设新订单时初始预付款的检查问题。该问题通常出现在锁仓持仓账户系统。
  16. 修正合约规范窗口中的滚动问题。

MQL5.community

  1. MQL5云网络网站已整体重新设计:https://cloud.mql5.com

    了解如何使用全球数千台计算机的处理能力来优化您的交易策略。通过MQL5云网络,即使最繁重的计算也可以在几分钟内完成。访问该网站并了解如何参与该网络以及如何通过提供您的计算机资源来获得收入。


    访问更新的MQL5云网络网站


  2. 改进市场 产品中的屏幕截图部分。作者最高可以上传1920*1800像素的图片来演示应用程序的工作原理。屏幕截图库也已更新。滚动播放显示图像缩略图,单击它们可打开全尺寸图像。


    改进市场中的屏幕截图部分


  3. 自由职业者服务部分的改进。现在用户在首次下单时将收到更多提示:

    • 需求规范示例和添加提醒
    • 订单创建说明
    • 模板使用技巧

    这些提示可以帮助您创建订单并获得所需的结果。


    自由职业者服务的改进


24 三月 2023
MetaTrader 5 build 3660:其他改进和修复

客户端

  1. 修正偶尔出现的不正确的平台日志创建。
  2. 更新用户界面的翻译。

MQL5

  • 修正对全局变量的检查。当在不同的命名空间声明相同的变量时,编译器会给出一个错误的警告,即该变量已经被声明。

网页端

  1. 添加葡萄牙语的用户界面翻译。该网页端现已提供12种语言。
  2. 修正添加标准偏差指标的对话框。
  3. 其他小问题的修正和改进。
17 三月 2023
MetaTrader 5 build 3640:11种语言的网页端

网页端

  1. 添加10种常用语言的UI翻译:简体中文和繁体中文、法语、德语、意大利语、日语、韩语、西班牙语、土耳其语和俄语。此语言列表将在未来版本中进一步增加。要切换语言,请使用相关菜单:


    网页端界面提供11种语言


  2. 优化与交易服务器的连接机制。

MQL5

  • MQL5:分别为CopyTicksCopyTicksRangeCopyRates方法添加COPY_TICKS_VERTICAL和COPY_RATES_VERTICAL标识。

    默认情况下,报价和函数沿水平轴复制到矩阵,这意味着数据添加到右侧,在行尾。在练习的ONNX模型运行任务中,这样的矩阵需要被转置以提供输入数据:

    const long   ExtOutputShape[] = {1,1};    // 模型输出形状
    const long   ExtInputShape [] = {1,10,4}; // 模型输入形状
    #resource "Python/model.onnx" as uchar ExtModel[]// 作为资源的模型
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                         |
    //+------------------------------------------------------------------+
    int OnStart(void)
      {
       matrix rates;
    //--- 获取10个柱状图
       if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC,2,10))
          return(-1);
    //--- 输入一组OHLC向量
       matrix x_norm=rates.Transpose();
       vector m=x_norm.Mean(0);               
       vector s=x_norm.Std(0);
       matrix mm(10,4);
       matrix ms(10,4);

    通过在调用该方法时指定附加标识COPY_RATES_VERTICALCOPY_TICKS_VERTICAL用于报价),可以消除额外的数据转置操作:

    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                         |
    //+------------------------------------------------------------------+
    int OnStart(void)
      {
       matrix rates;
    //--- 获取10个柱状图
       if(!rates.CopyRates("EURUSD",PERIOD_H1,COPY_RATES_OHLC|COPY_RATES_VERTICAL,2,10))
          return(-1);
    //--- 输入一组OHLC向量
  • ENUM_CHART_PROPERTY_INTEGER枚举中的新值 — CHART_SHOW_TRADE_HISTORY。该属性控制图表上交易历史的交易显示。使用ChartGetIntegerChartSetInteger函数获取和设置属性。有关图表上交易显示的更多详细信息,请参阅平台文档

MetaEditor

  • 修正在某些条件下文件编译过程中可能发生的界面冻结。

客户端

  • 修正崩溃日志中的错误报告。
10 三月 2023
MetaTrader 5 build 3620:网页端改进,ONNX支持和MQL5快速矩阵乘法

程序端

  1. 修正交易报告中的总利润计算的问题。
  2. 更新通过市场报价窗口获取的交易品种的基本数据
  3. 修正交易品种在Linux系统中Wine 7.0.1下启动的问题。
  4. 修正通过搜索栏将交易品种添加到市场深度中的问题。通过描述找到的交易品种无法通过点击其行来添加到列表中。

MQL5

  1. 添加对ONNX模型(开放式神经网络交换)操作的支持。

    ONNX是一种机器学习模型的开源格式。许多平台支持这种格式,包括Chainer, Caffee2PyTorch。使用专门的工具创建ONNX模型,将其整合到您的MQL5应用程序,并使用它来做出交易决策。

    所有支持的功能描述都在文件中提供。在MetaEditor公共项目中提供了一个测试ONNX模型的示例。在“工具箱/公共项目”中找到ONNX.Price.Prediction项目,在快捷菜单中选择加入。该项目将下载到您的计算机,并显示在导航器中:


    在公共项目中使用ONNX模型的示例


    编译该项目并在EURUSD H1上运行以查看结果。

    除了模型和运行模型的MQL5代码外,该项目还包括PricePredictionTraining.py Python脚本。该脚本显示了您如何自己创建一个ONNX模型。要运行该脚本,请在计算机上安装Python,并从提示行安装所需的模块:

    python.exe -m pip install --upgrade pip
    python -m pip install --upgrade tensorflow
    python -m pip install --upgrade pandas
    python -m pip install --upgrade scikit-learn
    python -m pip install --upgrade matplotlib
    python -m pip install --upgrade tqdm
    python -m pip install --upgrade metatrader5
    python -m pip install --upgrade onnx==1.12
    python -m pip install --upgrade tf2onnx
    关于如何使用ONNX的说明可在文件中获得。

  2. 添加对一般矩阵乘法(GeMM)的支持。该算法通过并行化任务和优化使用L1/L2/L3缓存来加速某些处理器类型的计算。计算速度可与广受欢迎的软件包相媲美,如Math Kernel Library (MKL)和OpenBLAS。详细的对比测试即将公布。

    matrix::GeMM方法目前支持新算法。如果您的处理器支持AVXFMA指令(2013年后发布的大多数处理器都支持这些指令),该算法将被自动启用。

  3. 添加将矩阵和向量传输到DLL的功能。这使得能够从外部变量导入使用相关类型的函数

    矩阵和向量作为指向缓冲区的指针传递给DLL。例如,要传递一个float类型的矩阵,从DLL导出的函数对应的参数必须带一个float类型的缓冲区指针。示例:

    MQL5
    #import "mmlib.dll"
    bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
    #import
    C++
    extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
    除了缓冲区之外,您还应该传递矩阵和向量大小以进行正确的处理。

  4. 添加新CopySeries函数,用于将同步时间周期从MqlRates复制到单独的数组中。

    CopySeries函数允许在一次调用中只获取必要的时间周期到不同的指定数组中,同时所有的时间周期数据将被同步。这意味着结果数组中特定索引N的所有值将属于指定交易品种/时间周期上的同一柱形图。因此,程序员无需另外通过柱形图开盘时间来同步接收的时间序列。

    与将完整的时间周期集作为MqlRates数组返回的CopyRates不同,CopySeries函数允许将特定的所需时间周期获取到单独的数组中。这可以通过指定一个标识组合来选择时间序列的类型来实现。传递到函数的数组顺序必须与MqlRates结构中字段的顺序相匹配:

    struct MqlRates
      {
       datetime time;         // 期初
       double   open;         // 开仓价
       double   high;         // 该时间段的最高价
       double   low;          // 该时间段的最低价
       double   close;        // 平仓价
       long     tick_volume;  // 报价量
       int      spread;       // 点差
       long     real_volume;  // 交易量
      }

    因此,如果您需要获取当前交易品种/时间帧的最近100柱形图的"time","close"和"real_volume"时间周期的值,您应该使用以下调用:

    datetime  time[];
    double    close[];
    long      volume[];
    CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
    

    数组"time,close,volume"顺序必须与MqlRates结构中字段的顺序相匹配。忽略rates_mask中值的顺序。掩码可以如下所示:

    COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

    示例

    //--- 输入参数
    input datetime InpDateFrom=D'2022.01.01 00:00:00';
    input datetime InpDateTo  =D'2023.01.01 00:00:00';
    input uint     InpCount   =20;
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                         |
    //+------------------------------------------------------------------+
    void OnStart(void)
      {
    //--- 从Rates结构获取时间周期的数组
       double   open[];
       double   close[];
       float    closef[];
       datetime time1[], time2[];
    //---将平仓价请求到double数组
       ResetLastError();
       int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
       PrintFormat("1. CopySeries  returns %d values. Error code=%d", res1, GetLastError());
       ArrayPrint(close);
       
    
    //--- 现在还请求开仓价;为平仓价使用float数组
       ResetLastError();
       int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
       PrintFormat("2. CopySeries  returns %d values. Error code=%d", res2, GetLastError());
       ArrayPrint(closef);
    //--- 对比接收的数据
       if((res1==res2) && (time1[0]==time2[0]))
         {
          Print("  | Time             |    Open      | Close double | Close float |");
          for(int i=0; i<10; i++)
            {
             PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                         i, TimeToString(time1[i]), open[i], close[i], closef[i]);
            }
         }
    /*  Result
            1. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
            2. CopySeries  returns 0 values. Error code=0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
             | Time       |   Open      |     Close double   |     Close float |
            0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
            1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
            2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
            3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
            4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
            5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
            6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
            7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
            8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
            9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
    */
      }
  5. 修正OrderSend函数的操作。如果在多个平台上同时使用同一个账户,该函数请求可能会返回错误的订单。
  6. 修正EX5程序库的导入。如果导入程序库的名称与导入的文件名称一致,则发生错误。

MetaEditor

  1. 添加向共享项目成员发送推送通知的功能。新选项可以通知用户有关项目设置和文件的更改。要启用通知,请在您的MQL5.community个人资料的“设置\安全”部分输入您的MetaQuotes ID


    关于项目更新的推送通知


  2. 更新导航器中的文件图标。全新、简单的隐喻将使它们更容易理解。

Tester

  1. 修正导致输入字符串参数在包含“|”字符时被截断的错误。

MetaTrader 5网页端build 3620

  1. 为网页端界面添加现有的颜色模板。模板会影响图表柱形图和线型图的显示,以及市场报价和账户财务报表中的价格。我们设计团队根据您的建议和传统颜色组合准备了颜色模板预设。


    新网页端颜色模板


  2. 重新设计交易品种规格窗口。为了便于查看,交易品种数据已重新排列成逻辑块。


    更新交易品种规格窗口


  3. 修正通过网页端开设真实账户的问题。服务器可能会在填写注册表后返回错误。
  4. 修正交易对话框中的错误。如果用户在持仓修改对话框打开时通过按下工具箱窗口中的X按键关闭持仓,则对话框内容不会重置。更新后,在这种情况下对话框将自动重置为新的下单模式。
  5. 修正账户管理对话框中服务器字段的显示。
  6. 修正工具栏上当前时间周期的显示。
  7. 修正在交易对话框中基础资产单位的交易量显示。
  8. 修正持仓止损和止盈水平的修改。修改在某些情况下其中一个值可能会重置第二个值。
  9. 修正投资风险提示的显示。
6 三月 2023
MetaTrader 5 iPhone/iPad:改进图表交易和分析功能
  1. 添加在图表下stop order订单和stop-limit order订单的功能。

    早期版本仅提供limit order订单。通过连续按下图表底部面板中的按键来选择所需的类型。


    在图表下stop order订单和stop-limit order订单


  2. 添加从图表访问平仓或删除挂单功能。在图表上选择持仓或订单水平,相关命令将出现在下方的交易面板中:


    从图表管理持仓和订单


  3. 改进移动价格图表右边框的功能。若要更改移位,只需将图表滚动到最后一个价格,直到出现垂直分隔符。接下来,拖动图表底部标尺的三角形:


    通过拖动底部标尺的三角形来更改图表移位


  4. 添加在图表上复制分析对象的功能。这可以更快地进行图表标记。长按打开对象菜单并选择“复制”:

    创建分析对象的副本


  5. 添加管理不同时间周期内指标显示的功能。如果该指标不适用于某些图表周期,则可以将其隐藏以释放屏幕上的空间供其他分析工具使用。


    管理不同时间周期内的指标显示


  6. 在交易品种规格窗口中添加交易品种手续费的显示。


    在交易品种规格中查找手续费金额


  7. 添加密码恢复链接。账户密码只能通过相关交易商恢复。该链接显示了交易商的联系方式。


    帮助恢复密码


  8. 添加分享MQL5.community频道链接的功能。


    通过应用程序分享您的频道链接


  9. 改进连接到具有交易限制的账户时的用户体验。

    交易可能因各种原因受到限制:只读模式连接;交易协议未被接受;交易商验证尚未完成等。此前,没有解释交易功能不可用的原因。

    现在,如果交易被限制,“交易”部分的下单按键将显示为灰色。按下此键,会显示相关信息和建议。


    交易受限时的有用信息


  10. 通过用于高级身份验证的SSL证书改进工作流程。

    现在,当用户连接到高级身份验证的账户时,该应用程序将显示所需操作的简要说明。


    改进SSL证书工作


    证书可以从PFX文件导入。在文件应用程序中保存必要的文件,然后在开始对话框中使用导入功能。

    还可以将证书导入文件,这样就可以在其他设备上使用证书。为此,请进入“设置”\“证书”并在证书菜单中选择“导出”。

  11. 价格图表的构建已转移到Metal,这是Apple设备中使用的最新一代图形API。这可以明显提高图表、指标和对象的渲染性能。
  12. 修正市场深度中止损和止盈水平的替换。对于FIFO账户,止损水平将根据相同交易品种的现有未结持仓的止损水平自动设置。这个过程要求遵循FIFO规则。
  13. 修正重新报价。当返回重新报价时,用户有很短的时间来接受或拒绝新价格。如果在要求的时间范围内没有采取任何行动,请求将被自动拒绝,重新报价窗口将自动关闭。
  14. 修正在使用深色界面主题时“图表”部分的时间显示问题。
16 十二月 2022
MetaTrader 5 build 3550:改进和修复

客户端

  1. 程序端:更新用户界面的翻译。
  2. 基于崩溃日志进行修复。

网页端

9 十二月 2022
MetaTrader 5 build 3540:2FA/TOTP身份验证和改善网页端的市场报价

网页端

  1. 添加对使用Google Authenticator和类似应用程序进行2FA/TOTP身份验证的支持。

    2FA/TOTP身份验证可以保护交易账户即使在泄露登录名和密码的情况下也可以免受未经授权的访问。可以使用多种移动应用程序来实现使用基于时间的动态密码算法(TOTP) 的身份验证。其中最受欢迎的是Google Authenticator、Microsoft Authenticator、LastPass Authenticator和Authy。现在您可以通过这种Authenticator应用程序生成的动态密码在MetaTrader 5客户端连接您的账户。

    要启用双重身份验证选项,请通过MetaTrader 5网页端连接到您的账户。然后在菜单中点击您的账户,并在新打开的对话框中选择“启用2FA/TOTP”。在您的移动设备上安装并运行Authenticator应用程序,点击"+"添加您的交易账户,并用客户端扫描二维码。在“动态密码”字段中输入生成的代码,并点击“启用2FA”。然后,在交易商的交易服务器上,将为您的账户注册一个密钥。


    添加对使用Google Authenticator和类似应用程序进行2FA/TOTP身份验证的支持


    保存的密钥将用于Authenticator应用程序中,以便生成您每次连接账户时所需的OTP代码(动态密码)。每个动态密码在30秒内有效。失效后会再生成一个新动态密码。


    连接到账户时,需要从Authenticator应用程序中获得的附加动态密码


    在二维码对话框中还会显示一个备份代码,用于链接到生成器。将其保存在一个安全的地方。如果您失去对链接设备的访问,该代码将允许您再次将账户添加到Authenticator应用程序中。

    如果您决定从Authenticator应用程序中删除存储的密钥,您应首先通过对应账户的菜单命令禁用2FA/TOTP身份验证。如果您的账户没有新2FA/TOTP身份验证方法,请联系您的交易商。

  2. 扩大市场报价中显示的数据量。现在,除了当前的卖价/买价以及价格变化百分比外,您还可以看到:

    • 当前交易时段的最高和最低卖价/买价
    • 当前交易时段的开盘价和上一交易时段的收盘价

    使用快捷菜单来自定义显示的信息:


    其他市场报价数据


  3. 添加当交易商启用相应的设置时显示风险通知。一些监管机构要求交易者在交易前阅读并接受通知。
  4. 修正在屏幕顶部有缺口的iPhone机型上,显示顶部工具条的问题。之前,顶部工具条有时可以覆盖面板上的按键。
  5. 修正在谷歌浏览器中显示账户的最终财务参数(利润、净值等)。有时,这些数据没有被更新。

客户端

  1. 程序端:优化并大幅度加快模拟账户开户对话框。
  2. 程序端:更新用户界面的翻译。
  3. 基于崩溃日志进行修复。

MQL5

  1. 将新方法添加到标准程序库的COpenCL类:

    • BufferFromMatrix — 用矩阵中的数据填充设备缓冲区
    • BufferToMatrix — 将数据从设备缓冲区读入到矩阵中
    • ContextCreate — 创建设备上下文(Initialize方法的第一部分)
    • ProgramCreate — 基于OpenCL源代码创建一个程序(Initialize方法的第二部分)
    • ContextClean — 释放属于设备上下文的所有数据(类似于Shutdown方法,但不删除上下文)
    • GetDeviceInfoInteger — 接收一个整数设备属性
    • GetKernelInfoInteger — 接收一个整数内核属性
    • GetDeviceInfo — 接收任何ENUM_OPENCL_PROPERTY_INTEGER枚举中不存在的单一整数设备属性

    GetDeviceInfo使用实例:
    long preferred_workgroup_size_multiple=OpenCL.GetDeviceInfo(0x1067);
  2. 添加TERMINAL_CPU_NAME和TERMINAL_OS_VERSION值到ENUM_TERMINAL_INFO_STRING枚举中。它们允许接收用户的CPU和操作系统名称。
    void OnStart()
      {
       string cpu,os;
    //---
       cpu=TerminalInfoString(TERMINAL_CPU_NAME);
       os=TerminalInfoString(TERMINAL_OS_VERSION);
       PrintFormat("CPU: %s, OS: %s",cpu,os);
      }
    
    Result:
    CPU:Intel Xeon  E5-2630 v4 @ 2.20GHz, OS:Windows 10 build 19045
  3. 修正DatabasePrintDatabaseExport函数中"table_or_sql"参数的操作。现在除了SQL查询外,还能传递一个表格名称。

MetaEditor

  1. 修正对数据库中可显示最大列数的检查。现在最多可以显示64列。
  2. 修正短结构中断点的操作,如IF[ if(cond) break; ]。
25 十一月 2022
MetaTrader 5 build 3520:使用Google Authenticator进行2FA/TOTP身份验证

程序端

  1. 添加使用Google Authenticator和类似应用程序进行2FA/TOTP身份验证。

    2FA/TOTP身份验证可以保护交易账户即使在泄露登录名和密码的情况下也可以免受未经授权的访问。可以使用多种移动应用程序来实现使用基于时间的动态密码算法(TOTP) 的身份验证。其中最受欢迎的是Google Authenticator、Microsoft Authenticator、LastPass Authenticator和Authy。现在您可以通过这种Authenticator应用程序生成的动态密码在MetaTrader 5客户端连接您的账户。

    要启用双重身份验证选项,请连接到您的账户并执行账户快捷菜单中的“启用2FA/TOPT”命令。在您的移动设备上安装并运行Authenticator应用程序,点击"+"添加您的交易账户,并用客户端扫描二维码。在“动态密码”字段中输入生成的代码,并点击“启用2FA”。然后,在交易商的交易服务器上,将为您的账户注册一个密钥。


    添加对使用Google Authenticator和类似应用的2FA/TOTP身份验证的支持。

    保存的密钥将用于Authenticator应用程序中,以便生成您每次连接账户时所需的OTP代码(动态密码)。每个动态密码在30秒内有效。失效后会再生成一个新动态密码。



    连接到账户时,需要从Authenticator应用程序中获得的附加动态密码

    如果您决定从Authenticator应用程序中删除存储的密钥,您应首先通过对应账户的快捷菜单命令禁用2FA/TOTP身份验证。如果您的账户没有新2FA/TOTP身份验证方法,请联系您的交易商。

MQL5

  1. 修正对自定义交易品种的CopyTicks函数的操作。当使用自定义交易品种时,在某些条件下,可能会返回前一个时段的初始报价,而不是所要求的数据。

  2. MQL5:添加新枚举值,以获得最后OpenCL错误代码和文本描述。
    1. CL_LAST_ERROR (код 4094)值已被添加到ENUM_OPENCL_PROPERTY_INTEGER枚举中

      当通过CLGetInfoInteger获取最后一个OpenCL错误时,忽略句柄参数。错误描述:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS
      对于未知错误代码,会返回字符串"unknown OpenCL error N(未知OpenCL错误N)",其中N是错误代码。

      示例:
      //--- 在获得最后一个错误代码时,将忽略第一个句柄参数
      int code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);

    2. CL_ERROR_DESCRIPTION (4093)值已添加到ENUM_OPENCL_PROPERTY_STRING枚举中。
      可以使用CLGetInfoString获得文本错误描述。错误描述:https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS

      当使用CL_ERROR_DESCRIPTION时,应将错误代码传递为CLGetInfoString中的句柄参数。如果传递的是CL_LAST_ERROR而不是错误代码,该函数将返回最后的错误描述。

      示例:
      //--- 获得最后一个OpenCL错误的代码
      int    code = (int)CLGetInfoInteger(0,CL_LAST_ERROR);
      string desc; // 要获得错误的文本描述
      
      //--- 使用错误代码来获得错误的文本描述
      if(!CLGetInfoString(code,CL_ERROR_DESCRIPTION,desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      
      
      //--- 要在没有接收代码的情况下获取最后一个OpenCL错误的描述,请传递CL_LAST_ERROR  
      if(!CLGetInfoString(CL_LAST_ERROR,CL_ERROR_DESCRIPTION, desc))
         desc = "cannot get OpenCL error description, " + (string)GetLastError();
      Print(desc);
      内部枚举名称作为错误描述传递。其解释可显示在https://registry.khronos.org/OpenCL/specs/3.0-unified/html/OpenCL_API.html#CL_SUCCESS。例如,CL_INVALID_KERNEL_ARGS值意味着“在某些内核参数未设置或无效时,在对内核进行排队时返回。”

  3. 修正matrix::MatMul方法的操作。在处理大型矩阵时,程序端可能在某些尺寸上出现崩溃的情况。

修正崩溃日志中的错误报告。
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 3440:移动网页端版本和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个。用户将能够通过最受欢迎的经济聚合器访问更多代码的信息。


    更新交易品种的基本数据库

    大约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

  • 更新用户界面的翻译。

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

上一页123456789101112131415