---
title: "MetaTrader 5 build 3620：网页端改进，ONNX支持和MQL5快速矩阵乘法 - 更新历史"
description: "添加对ONNX模型（开放式神经网络交换）操作的支持。 ONNX是一种机器学习模型的开源格式。 - 更新历史"
image: "https://www.metatrader5.com/c/17/1/public-project.png"
url: "https://www.metatrader5.com/zh/releasenotes/terminal/2278"
---

# MetaTrader 5 build 3620：网页端改进，ONNX支持和MQL5快速矩阵乘法

## 添加对ONNX模型（开放式神经网络交换）操作的支持。 ONNX是一种机器学习模型的开源格式。

10 三月 2023

### 程序端

1. 修正[交易报告](https://www.metatrader5.com/zh/releasenotes/terminal/2251)中的总利润计算的问题。
2. 更新通过市场报价窗口获取的交易品种的[基本数据](https://www.metatrader5.com/zh/terminal/help/trading/market_watch#fundamental)。
3. 修正交易品种在[Linux系统](https://www.metatrader5.com/zh/terminal/help/start_advanced/install_linux)中Wine 7.0.1下启动的问题。
4. 修正通过搜索栏将交易品种添加到市场深度中的问题。通过描述找到的交易品种无法通过点击其行来添加到列表中。

### MQL5

1.  添加对[ONNX](https://en.wikipedia.org/wiki/ONNX)模型（开放式神经网络交换）操作的支持。 ONNX是一种机器学习模型的开源格式。许多平台支持这种格式，包括[Chainer](https://www.mql5.com/go?link=https://chainer.org/), [Caffee2](https://www.mql5.com/go?link=https://caffe2.ai/)和[PyTorch](https://www.mql5.com/go?link=https://pytorch.org/)。使用专门的工具创建ONNX模型，将其整合到您的MQL5应用程序，并使用它来做出交易决策。 所有支持的功能描述都在[文件](https://www.mql5.com/zh/docs/onnx)中提供。在MetaEditor[公共项目](https://www.metatrader5.com/zh/metaeditor/help/mql5storage/projects#public)中提供了一个测试ONNX模型的示例。在“工具箱/公共项目”中找到ONNX.Price.Prediction项目，在快捷菜单中选择加入。该项目将下载到您的计算机，并显示在导航器中：

   ![在公共项目中使用ONNX模型的示例](https://www.metatrader5.com/c/17/1/public-project.png)

   编译该项目并在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的说明可在[文件](https://www.mql5.com/zh/docs/onnx)中获得。
2. 添加对[一般矩阵乘法](https://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms#Level_3)(GeMM)的支持。该算法通过并行化任务和优化使用L1/L2/L3缓存来加速某些处理器类型的计算。计算速度可与广受欢迎的软件包相媲美，如[Math Kernel Library](https://en.wikipedia.org/wiki/Math_Kernel_Library) (MKL)和[OpenBLAS](https://en.wikipedia.org/wiki/OpenBLAS)。详细的对比测试即将公布。[matrix::GeMM](https://www.mql5.com/zh/docs/matrix/matrix_products/matrix_gemm)方法目前支持新算法。如果您的处理器支持[AVX](https://en.wikipedia.org/wiki/Advanced_Vector_Extensions)和[FMA](https://en.wikipedia.org/wiki/FMA_instruction_set)指令（2013年后发布的大多数处理器都支持这些指令），该算法将被自动启用。
3.  添加将矩阵和向量传输到DLL的功能。这使得能够从外部变量[导入使用相关类型的函数](https://www.mql5.com/zh/docs/basis/preprosessor/import) 。 矩阵和向量作为指向缓冲区的指针传递给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](https://www.mql5.com/zh/docs/series/copyseries)函数，用于将同步时间周期从[MqlRates](https://www.mql5.com/zh/docs/constants/structures/mqlrates)复制到单独的数组中。

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

   与将完整的时间周期集作为MqlRates数组返回的CopyRates不同，CopySeries函数允许将特定的所需时间周期获取到单独的数组中。这可以通过指定一个标识组合来选择时间序列的类型来实现。传递到函数的数组顺序必须与[MqlRates](https://www.mql5.com/zh/docs/constants/structures/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](https://www.mql5.com/zh/docs/constants/structures/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](https://www.mql5.com/zh/docs/trading/ordersend)函数的操作。如果在多个平台上同时使用同一个账户，该函数请求可能会返回错误的订单。
6. 修正EX5程序库的导入。如果导入程序库的名称与导入的文件名称一致，则发生错误。

### MetaEditor

1.  添加向[共享项目](https://www.metatrader5.com/zh/metaeditor/help/mql5storage/projects#shared)成员发送推送通知的功能。新选项可以通知用户有关项目设置和文件的更改。要启用通知，请在您的[MQL5.community](https://www.mql5.com/)个人资料的“设置\安全”部分输入您的[MetaQuotes ID](https://www.mql5.com/zh/articles/476)。

   ![关于项目更新的推送通知](https://www.metatrader5.com/c/17/1/notification__iphone.jpg)
2. 更新导航器中的文件图标。全新、简单的隐喻将使它们更容易理解。

### Tester

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

### **MetaTrader 5网页端build 3620**

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

   ![新网页端颜色模板](https://www.metatrader5.com/c/17/1/web-color-scheme.jpg)
2.  重新设计交易品种规格窗口。为了便于查看，交易品种数据已重新排列成逻辑块。

   ![更新交易品种规格窗口](https://www.metatrader5.com/c/17/1/web-specification.jpg)
3. 修正通过网页端开设真实账户的问题。服务器可能会在填写注册表后返回错误。
4. 修正交易对话框中的错误。如果用户在持仓修改对话框打开时通过按下工具箱窗口中的X按键关闭持仓，则对话框内容不会重置。更新后，在这种情况下对话框将自动重置为新的下单模式。
5. 修正账户管理对话框中服务器字段的显示。
6. 修正工具栏上当前时间周期的显示。
7. 修正在交易对话框中基础资产单位的交易量显示。
8. 修正持仓止损和止盈水平的修改。修改在某些情况下其中一个值可能会重置第二个值。
9. 修正投资风险提示的显示。

**请参阅前面的新闻：**

- [MetaTrader 5 iPhone/iPad：改进图表交易和分析功能](https://www.metatrader5.com/zh/releasenotes/terminal/2277)
- [MetaTrader 5 build 3550：改进和修复](https://www.metatrader5.com/zh/releasenotes/terminal/2265)
- [MetaTrader 5 build 3540：2FA/TOTP身份验证和改善网页端的市场报价](https://www.metatrader5.com/zh/releasenotes/terminal/2264)
- [MetaTrader 5 build 3520：使用Google Authenticator进行2FA/TOTP身份验证](https://www.metatrader5.com/zh/releasenotes/terminal/2262)
- [MetaTrader 5 build 3510：网页端的改进](https://www.metatrader5.com/zh/releasenotes/terminal/2261)
