文章 "MQL5 中的矩阵和向量操作"

 

新文章 MQL5 中的矩阵和向量操作已发布:

MQL5 中引入了矩阵和向量,用于实现数学解决方案的高效操作。 新类型提供了内置方法,能够创建接近数学标记符号的简洁易懂的代码。 数组提供了广泛的功能,但在很多情况下,矩阵的效率要高得多。

MQL5 在机器学习中的未来

在过去的几年里,我们已在 MQL5 语言里引入先进技术方面做了很多工作:

  • ALGLIB 数值方法库植入 MQL5
  • 实现了一个运用模糊逻辑和统计方法的数学库
  • 引入图形库,类似于绘图功能
  • 集成 Python,并可直接在终端中运行 Python 脚本
  • 添加 DirectX 函数来创建 3D 图形
  • 实现原生 SQLite 支持,从而支持数据库的操作
  • 添加新的数据类型:=矩阵和向量,以及所有必要的方法

      MQL5 语言还将继续发展,而机器学习是重中之重。 我们已制定了进一步发展的大计划。 故此,继续关注我们,支持我们,我们一起不断进取。

      作者:MetaQuotes

       
      matrix corr_from_matrix=rates.CorrCoef(false);   // false 表示向量以字符串 表示 матрицы

      确定不在专栏里?

       
          //--- 将收盘价输入矢量
          if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
           {
            //--- 将矢量插入时间序列矩阵中
            rates.Col(close, i);

      遗憾的是,这种简单的矩阵填充方法有一个严重缺陷:多币种条形图不同步。

      也许应该将标准的CopyRates 方法也用于矩阵,以便更容易获得正确的数据。

       
      我们关注的是用价格数据简单填充向量。但是,也有交易。
      vector::Deals( void* Filter );

      因此,统计部分不仅需要数学方法,还需要金融方法:Gain、MaxDD、PF 等。

       
      fxsaber #:

      确定不在专栏里?

      是的,打错了。

      谢谢,修好了

       
      fxsaber CopyRates 方法也用于矩阵,这样就能轻松获得正确的数据。

      下面是CopyRates 方法及其示例

      //+------------------------------------------------------------------+
      //| 脚本程序启动功能|
      //+------------------------------------------------------------------+
      void OnStart()
       {
      //--- 将引号输入矩阵
        matrix matrix_rates;
        if(matrix_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_OHLCT, 1, 10))
          Print("matrix rates: \n", matrix_rates);
        else
          Print("matrix_rates.CopyRates failed. Error ", GetLastError());
      //--- 检查
        MqlRates mql_rates[];
        if(CopyRates(Symbol(), PERIOD_CURRENT, 1, 10, mql_rates)>0)
         {
          Print("mql_rates array:");
          ArrayPrint(mql_rates);
         }
        else
          Print("CopyRates(Symbol(), PERIOD_CURRENT,1, 10, mql_rates). Error ", GetLastError());
      //--- 获取引号到矢量 = 无效调用
        vector vector_rates;
        if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_OHLC, 1, 15))
          Print("vector_rates COPY_RATES_OHLC: \n", vector_rates);
        else
          Print("vector_rates.CopyRates COPY_RATES_OHLC failed. Error ", GetLastError());
      //--- 将收盘价转换成矢量
        if(vector_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_CLOSE, 1, 15))
          Print("vector_rates COPY_RATES_CLOSE: \n", vector_rates);
        else
          Print("vector_rates.CopyRates failed. Error ", GetLastError());
       };
      /*
       矩阵率:
       [[0.99686,0.99638,0.99588,0.99441,0.99464,0.99594,0.99698,0.99758,0.99581,0.9952800000000001]
       [0.99708,0.99643,0.99591,0.9955000000000001,0.99652,0.99795,0.99865,0.99764,0.99604,0.9957]
       [0.9961100000000001,0.99491,0.99426,0.99441,0.99448,0.99494,0.9964499999999999,0.99472,0.9936,0.9922]
       [0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
       [1662436800,1662440400,1662444000,1662447600,1662451200,1662454800,1662458400,1662462000,1662465600,1662469200]]
       mql_rates array:
       [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2022.09.06 04:00:00 0.99686 0.99708 0.99611 0.99641 44630 0
       [1] 2022.09.06 05:00:00 0.99638 0.99643 0.99491 0.99588 45190 0
       [2] 2022.09.06 06:00:00 0.99588 0.99591 0.99426 0.99441 30600 0
       [3] 2022.09.06 07:00:00 0.99441 0.99550 0.99441 0.99464 38670 0
       [4] 2022.09.06 08:00:00 0.99464 0.99652 0.99448 0.99594 52800 0
       [5] 2022.09.06 09:00:00 0.99594 0.99795 0.99494 0.99697 72270 0
       [6] 2022.09.06 10:00:00 0.99698 0.99865 0.99645 0.99758 101300 0
       [7] 2022.09.06 11:00:00 0.99758 0.99764 0.99472 0.99581 70120 0
       [8] 2022.09.06 12:00:00 0.99581 0.99604 0.99360 0.99528 61660 0
       [9] 2022.09.06 13:00:00 0.99528 0.99570 0.99220 0.99259 69500 0
       vector_rates.CopyRates COPY_RATES_OHLC 失败。Error 4003
       vector_rates COPY_RATES_CLOSE:
       [0.9931,0.99293,0.99417,0.99504,0.9968399999999999,0.99641,0.99588,0.99441,0.99464,0.99594,0.99697,0.99758,0.99581,0.9952800000000001,0.99259]
      */
      Документация по MQL5: Методы матриц и векторов / Инициализация / CopyRates
      Документация по MQL5: Методы матриц и векторов / Инициализация / CopyRates
      • www.mql5.com
      CopyRates - Инициализация - Методы матриц и векторов - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
       
      Rashid Umarov #:

      下面是CopyRates 方法和其中示例的钉子

      显然我没有很好地表述问题。在填充矩阵计算符号相关性时,可能会出现 EURUSD[5].BarTime 与 GBPUSD[5].BarTime 不一致的情况。这就是所谓的多条杠时间不同步。在计算之前,您必须花费大量时间/精力来准备此类数据。如果能用一行代码解决这个问题,那就太好了。

       

      文章指出

      Над матрицами и векторами можно поэлементно производить математические операции — сложение, вычитание, умножение и деление. Для этого оба объекта должны быть одного и того же типа и должны иметь одинаковые размеры. Каждый член матрицы/вектора оперирует с соответствующим элементом второй матрицы/вектора.

      我想弄清楚这种计算是如何进行的,即是先将数字转换为 double,然后再进行计算,最后再转换为初始数据类型,这样可以减少精度损失(还是我错了,没有区别?显然,不同类型的数据可以节省 RAM,但如果我在数组中计算数据,我就会将数字转换为双倍数进行计算,然后再转换为浮点数以保持计算精度。我是否应该选择如何对数字进行运算?
       
      精彩的解释。非常有帮助。
       

      该指令包含以下内容

      void matrix.FromBuffer(const int rows, const int cols, const scalar array[], const int count=-1, const int offset=0)

      frombuffer

      从一维数组创建矩阵


      但事实上它不起作用。是否有其他方法将一维数组复制到矩阵中?

       
      有的,请阅读文章 。