Discussão do artigo "Operações com Matrizes e Vetores em MQL5"

 

Novo artigo Operações com Matrizes e Vetores em MQL5 foi publicado:

Matrizes e vetores foram introduzidos na MQL5 para operações eficientes com soluções matemáticas. Os novos tipos oferecem métodos integrados para a criação de código conciso e compreensível que se aproxima da notação matemática. Os arrays fornecem recursos extensos, mas há muitos casos em que as matrizes são muito mais eficientes.

Nos últimos anos, nós fizemos muito para introduzir tecnologias avançadas na linguagem MQL5:




      A linguagem MQL5 continuará a se desenvolver, enquanto uma das direções prioritárias é o aprendizado de máquina. Temos grandes planos para um maior desenvolvimento. Portanto, fique conosco, apoie-nos e continue aprendendo conosco.

      Autor: MetaQuotes

       
      matrix corr_from_matrix=rates.CorrCoef(false);   // falso significa que os vetores estão em cadeias de caracteres матрицы

      Tem certeza de que não está nas colunas?

       
          //--- obter preços de fechamento em um vetor
          if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
           {
            //--- inserir o vetor na matriz de séries temporais
            rates.Col(close, i);

      Infelizmente, essa maneira simples de preencher a matriz tem uma falha grave: as barras de várias moedas não são sincronizadas.

      Talvez faça sentido criar o método CopyRates padrão para matrizes também, a fim de obter dados corretos com a mesma facilidade.

       
      Prestamos atenção ao simples preenchimento de vetores com dados de preços. No entanto, também há negociações.
      vector::Deals( void* Filter );

      Portanto, é necessário preencher a seção Estatísticas não apenas com métodos matemáticos, mas também com métodos financeiros: Ganho, MaxDD, PF etc.

       
      fxsaber #:

      Tem certeza de que não está nas colunas?

      Sim, é um erro de digitação.

      Obrigado, já está corrigido.

       
      fxsaber CopyRates padrão para matrizes também, a fim de obter dados corretos com a mesma facilidade.

      Aqui está o método CopyRates e um exemplo dele

      //+------------------------------------------------------------------+
      //| Função de início do programa de script|
      //+------------------------------------------------------------------+
      void OnStart()
       {
      //--- obter citações na 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());
      //--- verificação
        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());
      //--- obter aspas no vetor = chamada 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());
      //--- obter os preços de fechamento em um vetor
        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());
       };
      /*
       taxas de matriz:
       [[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 falhou. Erro 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 #:

      Aqui estão os pregos do método CopyRates e o exemplo nele contido

      Aparentemente, não formulei bem o problema. Ao preencher a matriz para calcular a correlação de símbolos, pode acontecer que EURUSD[5].BarTime não corresponda a GBPUSD[5].BarTime. Isso é chamado de não sincronização de várias barras. Você precisa dedicar bastante tempo/esforço à preparação desses dados antes dos cálculos. Se isso pudesse ser resolvido com uma linha, seria ótimo.

       

      O artigo afirma:

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

      Gostaria de esclarecer como esse cálculo é feito, ou seja, os números são trazidos para double e, em seguida, ocorre o cálculo e a conversão de volta para o tipo de dados inicial, o que reduziria a perda de precisão (ou estou errado e não há diferença?), ou imediatamente no tipo de dados que existe? Obviamente, tipos diferentes economizam RAM, mas, se eu calcular dados em matrizes, transformo os números em double para cálculos e, depois, novamente, digamos, em float para preservar a precisão dos cálculos. Devo tornar opcional a forma de realizar operações em números?
       
      Explicação fantástica. Muito útil.
       

      A instrução contém o seguinte

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

      frombuffer

      Cria uma matriz a partir de uma matriz unidimensional


      mas, na verdade, isso não funciona. Existe outra maneira de copiar uma matriz unidimensional em uma matriz?

       
      Há sim, leia o artigo.