MetaTrader 5 build 3620:网页端改进,ONNX支持和MQL5快速矩阵乘法

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

10 三月 2023

程序端

  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. 修正投资风险提示的显示。