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

MetaTrader 5新功能

4 八月 2022

程序端

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

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


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

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

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

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

MQL5

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

MetaEditor

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

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

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