Discusión sobre el artículo "Trabajamos con matrices y vectores en MQL5"

 

Artículo publicado Trabajamos con matrices y vectores en MQL5:

Para resolver problemas matemáticos, se han añadido a MQL5 matrices y vectores. Los nuevos tipos tienen métodos incorporados para escribir un código conciso y fácilmente comprensible que se acerque a una notación matemática. Los arrays son algo bueno, pero las matrices, en muchos casos, resultan mejores.

En los últimos años, hemos hecho mucho por incorporar tecnología avanzada al lenguaje MQL5:

  • Hemos implementado la migración de la biblioteca de métodos numéricos ALGLIB a MQL5
  • Hemos añadido una biblioteca matemática con funciones de lógica difusa y estadística
  • Hemos implementado una librería gráfica como análogo de la función plot
  • Hemos realizado la integración con Python, ahora es posible ejecutar scripts de Python directamente en el terminal
  • Hemos añadido funciones de DirectX para crear gráficos en 3D
  • Hemos introducido la compatibilidad nativa con SQLite para trabajar con bases de datos
  • Hemos añadido nuevos tipos de datos — matrices y vectores — con la implementación de todos los métodos necesarios


      El lenguaje MQL5 seguirá evolucionando y el aprendizaje automático supone una prioridad. Tenemos grandes planes, y no nos conformaremos con las metas alcanzadas. Quédese con nosotros, apóyenos y aprenda cosas nuevas con nosotros.

      Autor: MetaQuotes

       
      matrix corr_from_matrix=rates.CorrCoef(false);   // false significa que los vectores están en cadenas матрицы

      ¿Seguro que no está en las columnas?

       
          //--- obtener los precios de cierre en el vector
          if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
           {
            //--- inserta el vector en la matriz de series temporales
            rates.Col(close, i);

      Desafortunadamente, esta sencilla forma de rellenar la matriz tiene un grave defecto: las barras multidivisa no están sincronizadas.

      Tal vez tenga sentido hacer el método estándar CopyRates para matrices también, con el fin de obtener datos correctos con la misma facilidad.

       
      Hemos prestado atención al simple relleno de vectores con datos de precios. Sin embargo, también hay operaciones.
      vector::Deals( void* Filter );

      En consecuencia, es necesario llenar la sección Estadísticas no sólo con métodos matemáticos, sino también financieros: Gain, MaxDD, PF, etc.

       
      fxsaber #:

      ¿Seguro que no está en las columnas?

      Sí, es un error tipográfico.

      Gracias, ya está arreglado.

       
      fxsaber CopyRates también para matrices, con el fin de obtener datos correctos con la misma facilidad.

      Aquí está el método CopyRates y un ejemplo en él

      //+------------------------------------------------------------------+
      //| Función de inicio del programa de script|
      //+------------------------------------------------------------------+
      void OnStart()
       {
      //--- introduce las comillas en la matriz
        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());
      //--- comprobar
        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());
      //--- get quotes to vector = llamada inválida
        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());
      //--- obtener los precios de cierre en un vector
        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());
       };
      /*
       matriz tasas:
       [[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 ha fallado. 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 #:

      Aquí están los clavos el método CopyRates y el ejemplo en él

      Parece que no he formulado bien el problema. Al rellenar la matriz para calcular la correlación de símbolos, puede ocurrir que EURUSD[5].BarTime no coincida con GBPUSD[5].BarTime. Esto se llama no sincronización multibarra. Hay que dedicar bastante tiempo/esfuerzo a esa preparación de los datos antes de los cálculos. Si se pudiera resolver con una línea, sería estupendo.

       

      Dice el artículo:

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

      Me gustaría aclarar cómo se realiza este cálculo, es decir, ¿se llevan los números a double y luego se realiza el cálculo y la conversión de vuelta al tipo de datos inicial, lo que reduciría la pérdida de precisión (¿o me equivoco y no hay diferencia?), o inmediatamente en el tipo de datos que hay? Obviamente, los diferentes tipos de ahorrar memoria RAM, pero si calculo los datos en matrices, llevar los números a doble para los cálculos, y luego otra vez, digamos, a flotante para preservar la precisión de los cálculos. ¿Debería hacer opcional la forma de realizar operaciones con números?
       
      Fantástica explicación. Muy útil.
       

      La instrucción contiene lo siguiente

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

      frombuffer

      Crea una matriz a partir de un array unidimensional


      pero en realidad no funciona. ¿Hay alguna otra forma de copiar un array unidimensional en una matriz?

       
      Lo hay, lea el artículo .