Discussione sull’articolo "Operazioni con matrici e vettori in MQL5"

 

Il nuovo articolo Operazioni con matrici e vettori in MQL5 è stato pubblicato:

Le matrici e i vettori sono stati introdotti in MQL5 per un’operatività efficiente con soluzioni matematiche. I nuovi tipi offrono metodi integrati per creare codice conciso e comprensibile, vicino alla notazione matematica. Gli array offrono ampie possibilità, ma ci sono molti casi in cui le matrici sono molto più efficienti.

Negli ultimi anni abbiamo fatto molto per introdurre tecnologie avanzate nel linguaggio MQL5:

  • Convertendo la libreria di metodi numerici ALGLIB a MQL5
  • Implementando una libreria matematica con logica fuzzy e metodi statistici
  • Introducendo la libreria grafica, analoga della funzione plot
  • Integrando con Python, per eseguire script Python direttamente nel terminale
  • Aggiungendo funzioni DirectX per creare grafica 3D
  • Implementando supporto nativo per SQLite per le operazioni con i database
  • Aggiungendo nuovi tipi di dati: matrici e vettori, con tutti i metodi necessari.


      Il linguaggio MQL5 continuerà a svilupparsi, mentre una delle principali priorità è l'apprendimento automatico. Abbiamo grandi progetti di sviluppo. Quindi, restate con noi, sosteneteci e continuate ad imparare con noi.

      Autore: MetaQuotes

       
      matrix corr_from_matrix=rates.CorrCoef(false);   // falso significa che i vettori sono in stringhe матрицы

      Sicuro che non sia nelle colonne?

       
          //--- ottenere i prezzi di chiusura in un vettore
          if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
           {
            //--- inserire il vettore nella matrice delle serie temporali
            rates.Col(close, i);

      Purtroppo, questo semplice modo di riempire la matrice ha un grave difetto: le barre multicurrency non sono sincronizzate.

      Forse avrebbe senso rendere il metodo standard CopyRates anche per le matrici, in modo da ottenere i dati corretti con la stessa facilità.

       
      Abbiamo prestato attenzione al semplice riempimento dei vettori con i dati di prezzo. Tuttavia, esistono anche gli scambi.
      vector::Deals( void* Filter );

      Di conseguenza, è necessario riempire la sezione Statistiche non solo con metodi matematici, ma anche con metodi finanziari: Gain, MaxDD, PF, ecc.

       
      fxsaber #:

      Sicuro che non sia nelle colonne?

      Sì, è un errore di battitura.

      Grazie, è stato corretto.

       
      fxsaber CopyRates anche per le matrici, in modo da ottenere i dati corretti con la stessa facilità.

      Ecco il metodo CopyRates e un esempio che lo contiene

      //+------------------------------------------------------------------+
      //| Funzione di avvio del programma di script|
      //+------------------------------------------------------------------+
      void OnStart()
       {
      //--- inserire le citazioni nella matrice
        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());
      //--- controllo
        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());
      //--- ottenere le virgolette al vettore = chiamata non valida
        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());
      //--- ottenere i prezzi di chiusura in un vettore
        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());
       };
      /* Tassi della matrice
      :
       [[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 non è riuscito. Errore 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 #:

      Ecco i chiodi del metodo CopyRates e l'esempio in esso contenuto

      A quanto pare non ho formulato bene il problema. Quando si riempie la matrice per calcolare la correlazione dei simboli, può accadere che EURUSD[5].BarTime non corrisponda a GBPUSD[5].BarTime. Si tratta della cosiddetta non sincronizzazione multi-bar. È necessario dedicare molto tempo/sforzo alla preparazione dei dati prima dei calcoli. Se si potesse risolvere il problema con una sola riga, sarebbe fantastico.

       

      L'articolo afferma che:

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

      Vorrei chiarire come viene effettuato questo calcolo, cioè i numeri vengono portati a double e poi avviene il calcolo e la riconversione nel tipo di dati iniziale, che ridurrebbe la perdita di precisione (o mi sbaglio e non c'è differenza?), oppure immediatamente nel tipo di dati che c'è? Ovviamente, tipi diversi risparmiano RAM, ma se calcolo i dati in array, porto i numeri a double per i calcoli, e poi di nuovo, diciamo, a float per preservare la precisione dei calcoli. Devo rendere facoltativa la modalità di esecuzione delle operazioni sui numeri?
       
      Spiegazione fantastica. Molto utile.
       

      L'istruzione contiene quanto segue

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

      frombuffer

      Crea una matrice da una matrice monodimensionale


      ma in realtà non funziona. Esiste un altro modo per copiare un array monodimensionale in una matrice?

       
      C'è, leggi l'articolo .