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. 修正开户表格中国家字段的操作。

15 十二月 2023

介绍《交易者的MQL5编程》

本书面向所有级别的程序员。书中介绍了主要开发工具和基本编程概念,初学者可以从中学习到基础知识。通过这份资料,您就可以在MetaTrader 5交易平台上创建、编译和运行您的第一个应用程序。拥有其他编程语言经验的用户可以立即进入MQL5中与创建EA交易和分析应用程序相关的应用部分。

介绍《交易者的MQL5编程》

本书可在MQL5.community网站的"书籍"部分在线免费获取。这本书由七个部分组成:

  1. MQL5和开发环境简介 – 概述MQL5编程和MQL5开发环境的基本原理,包括MetaEditor编辑和编译功能。
  2. MQL5编程基础 – 基本概念,包括适用于过程式MQL5程序开发的数据类型、指令、操作符、表达式、变量、代码块和程序结构。
  3. 面向对象编程 – 尽管MQL5与其他支持OOP范式的语言(尤其是C++)有相似之处,但MQL5仍具有与众不同的特点。
  4. 常用函数 – 经常使用的适用于任何程序的内置函数。
  5. 创建应用程序 – 深入了解MQL5程序在架构上的细微差别,以及与交易相关任务类型的专业化,如使用指标进行技术分析、图表管理和图形对象的使用等。
  6. 交易自动化 – 如何分析交易环境并使用EA实现交易自动化。
  7. 高级语言工具 – 一套专业的应用程序接口,旨在促进MQL5与相关技术(包括数据库、数据交换、OpenCL和Python)的集成。

书中提供了大量源代码示例。根据讲解,您可以在内置编译器中执行自己的应用程序,并在平台中即时查看程序执行结果。源代码可在公共项目 \MQL5\Shared Projects\MQL5Book和代码库中获得。

现在就开始学习MQL5,探索专业算法交易的世界。获得的知识将帮助您把想法变为现实。您还可以通过市场开发和出售应用程序,以及在自由职业者服务中承接编程订单,将它们应用到商业环境中。


9 十一月 2023

下载MetaTrader 5 macOS和MetaTrader 5 Linux

我们早前就已经准备了专门的交易平台安装程序。适用于macOS的安装程序提供完整的向导,可以像本地应用程序一样直接安装。 对于Linux,我们提供一个可以使用单个命令下载和启动的脚本。

安装程序执行所有必要的操作:识别用户的系统,下载并安装最新的Wine版本,对其进行配置,然后在其中安装MetaTrader。所有步骤均以自动模式完成,安装后即可立即开始使用该平台。

安装程序链接可在https://www.metatrader5.com网站和交易平台的帮助菜单中获得:



macOS:检查您的Wine版本

我们最近完全更新macOS安装程序,其中包含很多改进。如果您已经在macOS上使用MetaTrader,请检查当前的Wine版本,版本号会在启动时显示在程序端日志中:

LP 0 15:56:29.402 Terminal MetaTrader 5 x64 build 4050 started for MetaQuotes Software Corp.
PF 0 15:56:29.403 Terminal Windows 10 build 18362 on Wine 8.0.1 Darwin 23.0.0, 12 x Intel Core i7-8750H  @ 2.20GHz, AVX2, 11 / 15 Gb memory, 65 / 233 Gb disk, admin, GMT+2

如果您的Wine版本低于8.0.1,我们建议您移除旧平台以及安装它的Wine前缀。您可以像往常一样将平台从“应用程序”部分移至垃圾箱来将其删除。Wine前缀可以使用Finder删除。选择“前往 > 前往文件夹”菜单并输入目录名称:~/Library/Application Support/。进入该目录,根据安装的MetaTrader版本删除以下文件夹:

~/Library/Application Support/Metatrader 5
~/Library/Application Support/net.metaquotes.wine.metatrader5
~/Library/Application Support/Metatrader 4
~/Library/Application Support/net.metaquotes.wine.metatrader4

然后,使用我们的安装程序重新安装程序端。

  • 在此过程中,系统将提示您安装其他Wine软件包(Mono、Gecko)。请同意这个提示,因为这是正常运行所必需的。
  • 最低macOS版本是适用于MetaTrader 4的Big Sur和适用于MetaTrader 5的Mojave。


您不再需要搜索手动安装说明或使用第三方解决方案。您只需点击几下即可安装该平台并立即开始交易:

8 十一月 2023

MetaTrader 5 iPhone/iPad:批量操作、21个时间周期和交易通知

我们不断改进MetaTrader 5 iOS移动应用程序,增加更多交易功能和分析功能。在过去六个月里,我们推出批量交易操作、额外时间周期、交易通知等。以下是所有这些新功能的详细介绍。

  1. 批量平仓和删除订单。应用程序现在支持对持仓和订单的批量操作。例如,在重要新闻发布时,您只需点击几下,就可以关闭所有未结持仓,从而迅速锁定利润。您还可以快速取消所有挂单,防止它们因价格剧烈波动而被触发。

    要进行批量操作,请点击持仓或订单部分的三个点,或打开特定操作的上下文菜单。



  2. 交易通知。打开通知功能,随时了解账户交易操作情况。信息以推送通知的形式从交易商服务器发送,因此即使应用程序不运行,您也能收到信息。根据所选账户开户交易商的设置,通知可能包括订单、交易、出入金相关信息。每个账户可单独启用通知功能;在服务器上保存设置。



  3. 止损水平的盈/亏。移动止盈和止损水平时,您将立即看到触发该水平可能带来的潜在盈亏。数值以点数和货币形式显示。



  4. 改进交易面板。新设置可以将交易面板放置在图表的上方或下方。我们还增加了交易量更改选项与"买"和"卖"按键之间的距离,以避免意外发送订单。



  5. 支持21个时间周期。我们额外增加12个分钟和小时时间周期,为价格分析提供更多选择。要将您的常用时间周期添加到快速访问面板,请转到图表上方的时间周期菜单,并长按进行选择。



  6. 高级定制交易水平。现在,您可以单独启用/禁用持仓水平、挂单和止损/止盈水平的显示。



  7. 屏幕锁定。您可以设置PIN码或使用Face ID(面部识别)/Touch ID(指纹识别)来防止其他用户访问应用程序。如果其他人使用您的iPhone或iPad,您的交易账户仍然安全。要激活此功能,请在"设置/关于"窗口打开"屏幕锁定",并设置一个四位数的PIN码。如果应用程序待机时间超过一分钟,您将需要输入PIN码或使用Face ID(面部识别)/Touch ID(指纹识别)解锁应用程序。



  8. 改进聊天功能。内置通讯工具推出多项新功能,使MQL5.community成员之间能够进行交流:

    • 在个人聊天中屏蔽用户,并查看被屏蔽用户的列表。
    • 点击用户头像时显示用户数据。
    • 长按聊天信息即可举报。
    • 为不在好友列表中的用户创建的新聊天添加一个菜单。如果收到这样的聊天信息,您可以立即将该用户加为好友或屏蔽并举报他们。
    • 在应用程序设置的部分图标上显示未读信息的数量。





  9. 交易商监管文件链接。现在,您可以在移动应用程序的账户属性部分直接访问交易商提供的所有必要法律信息。链接是否可用取决于您的交易商。
  10. 多项改进和修正。在过去六个月里,我们已经推出数十项改进措施,以确保应用程序性能的稳定和迅捷。


安装最新版本的应用程序,解锁更多交易功能:

6 十一月 2023

MetaTrader 5 Android:新交易功能和分析功能

在过去六个月里,MetaTrader 5 Android移动应用程序推出了大量新功能。这些功能包括快速图表交易功能、额外时间周期、交易历史的可视化显示等。下文将详细介绍这些更新。

  1. 图表一键交易。现在,只需打开一个特殊面板,按下"买"或"卖",就可以进行交易。这意味着您可以立即抓住交易机会,而无需在标签之间切换上浪费宝贵的时间。



    快速操作的结果会立即以弹出通知的形式显示在图表上。如果您觉得通知没有必要,可以在应用设置中禁用。此外,通过设置,您还可以将交易面板置于图表上方或下方。

  2. 从图表下挂单。现在,您可以通过拖动挂单到图表上所需的水平,直观地下挂单。点击顶部面板上的按键,选择订单类型,设置价格,然后点击箭头确认参数。这种方法比通过交易对话框配置参数要快得多。您可以立即设置订单的止损和止盈。同样,您只需点击任何现有订单级别并设置新参数,就可对其进行修改。




  3. 通过图表管理持仓和订单。在图表上选择一个持仓或订单级别,图表底部就会出现一个控制面板。您可以在这个面板上平仓和删除订单,以及添加和移除止损和止盈水平。移动止损水平时,您将立即看到以点数和货币形式显示的潜在盈亏。



  4. 图表上的交易历史。现在,您可以直观地评估市场进出情况。如果在应用程序设置中启用历史显示,所有交易都将在图表上以箭头形式显示。交易方向用不同颜色表示:蓝色代表买入,红色代表卖出。进出交易用虚线连接。此外,您还可以在图表设置中选择显示未结持仓和有效挂单。



  5. 批量平仓和删除订单。应用程序现在支持对持仓和订单的批量操作。例如,在重要新闻发布时,您只需点击几下,就可以关闭所有未结持仓,从而迅速锁定利润。您还可以快速取消所有挂单,防止它们因价格剧烈波动而被触发。

    要进行批量操作,请点击持仓或订单部分的三个点,或打开特定操作的上下文菜单。



  6. 自适应交易量编辑。交易对话框中修改交易量的按键现在会自动调整为当前交易量值。交易量越大,每次点击按键时增加或减少的单位就越多。



  7. 支持21个时间周期。我们额外增加12个分钟和小时时间周期,为价格分析提供更多选择。要将您的常用时间周期添加到快速访问面板,请转到图表上方的时间周期菜单进行配置。



  8. 复制图表上的分析对象。新选项可加快图表标记速度。长按打开对象菜单并选择“复制”:



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



  10. 通过二维码连接账户。现在,您可以通过扫描二维码从桌面平台或其他设备转移账户。无需输入登录名和密码,即可立即连接账户。要访问二维码,请点击账户属性中的相应图标。




  11. 更新配色方案。整个界面经过重新设计,注重了颜色的选择,确保了舒适的工作环境。该应用程序现在支持暗主题,在设备上启用暗主题时会自动激活。此外,我们还添加自定义图表上所有线条颜色的设置。



  12. 交易商监管文件链接。现在,您可以在移动应用程序的账户属性部分直接访问交易商提供的所有必要法律信息。链接是否可用取决于您的交易商。
  13. 针对阿拉伯语和波斯语的调整。我们实施多个增强功能,以确保应用程序界面在使用从右向左脚本的语言时正确显示。
  14. 多项改进和修正。在过去六个月里,我们已经推出数百项改进措施,以确保应用程序性能的稳定和迅捷。


安装最新版本的应用程序,解锁更多交易功能:

Google Play Huawei App Gallery APK文件

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

修正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 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. 提高可视模式下测试速度开关的灵敏度。

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

12345678