Discussion de l'article "Opérations sur les Matrices et les Vecteurs en MQL5"

 

Un nouvel article Opérations sur les Matrices et les Vecteurs en MQL5 a été publié :

Les matrices et les vecteurs ont été introduits en MQL5 pour améliorer les opérations mathématiques. De nouvelles méthodes sont intégrées avec ces nouveaux types pour créer un code concis et compréhensible, proche de la notation mathématique. Les tableaux offrent des possibilités étendues, mais il existe de nombreux cas dans lesquels les matrices sont beaucoup plus efficaces.

Au cours des dernières années, nous avons développé de nouvelles fonctionnalités pour introduire des technologies avancées dans le langage MQL5 :


      Le langage MQL5 va continuer à se développer. L’une des orientations prioritaires est l'apprentissage automatique. Nous avons de grands projets pour des développements futurs. Restez donc avec nous, soutenez-nous et continuez à apprendre avec nous.

      Auteur : MetaQuotes

      MetaQuotes
      • 2022.12.20
      • www.mql5.com
      Profil du trader
       
      matrix corr_from_matrix=rates.CorrCoef(false);   // false signifie que les vecteurs sont dans des chaînes de caractères матрицы

      Vous êtes sûr que ce n'est pas dans les colonnes ?

       
          //--- Obtenir les prix de clôture dans un vecteur
          if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
           {
            //--- insérer le vecteur dans la matrice des séries temporelles
            rates.Col(close, i);

      Malheureusement, cette façon simple de remplir la matrice présente un sérieux défaut : les barres multidevises ne sont pas synchronisées.

      Il serait peut-être judicieux d'appliquer la méthode standard CopyRates aux matrices également, afin d'obtenir des données correctes aussi facilement.

       
      Nous avons prêté attention au simple remplissage des vecteurs avec les données de prix. Cependant, il y a aussi des transactions.
      vector::Deals( void* Filter );

      Par conséquent, il est nécessaire de remplir la section Statistiques non seulement avec des méthodes mathématiques, mais aussi avec des méthodes financières : Gain, MaxDD, PF, etc.

       
      fxsaber #:

      Vous êtes sûr que ce n'est pas dans les colonnes ?

      Oui, c'est une faute de frappe.

      Merci, c'est corrigé.

       
      fxsaber CopyRates aux matrices également, afin d'obtenir des données correctes aussi facilement.

      Voici la méthode CopyRates et un exemple qui s'y rapporte

      //+------------------------------------------------------------------+
      //| Fonction de démarrage du programme de script|
      //+------------------------------------------------------------------+
      void OnStart()
       {
      //--- introduire les guillemets dans la 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());
      //--- vérifier
        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());
      //--- obtenir des guillemets pour le vecteur = appel non valide
        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());
      //--- obtenir les prix de clôture dans un vecteur
        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());
       };
      /* Taux de la 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 a échoué. Erreur 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 #:

      Voici les ongles de la méthode CopyRates et l'exemple qu'elle contient

      Apparemment, je n'ai pas bien formulé le problème. Lorsque l'on remplit la matrice pour calculer la corrélation des symboles, il peut arriver que EURUSD[5].BarTime ne corresponde pas à GBPUSD[5].BarTime. C'est ce qu'on appelle la non-synchronisation multi-barre. Vous devez consacrer beaucoup de temps et d'efforts à la préparation des données avant les calculs. Si cela pouvait être résolu en une seule ligne, ce serait formidable.

       

      L'article précise que

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

      J'aimerais savoir comment ce calcul est effectué, c'est-à-dire si les nombres sont portés en double, puis le calcul et la reconversion vers le type de données initial ont lieu, ce qui réduirait la perte de précision (ou est-ce que je me trompe et qu'il n'y a pas de différence ?), ou immédiatement dans le type de données qui existe ? Évidemment, les différents types économisent de la RAM, mais si je calcule des données dans des tableaux, je ramène les nombres à double pour les calculs, puis à nouveau, disons, à float pour préserver la précision des calculs. Devrais-je rendre facultative la manière d'effectuer des opérations sur les nombres ?
       
      Explication fantastique. Très utile.
       

      L'instruction contient ce qui suit

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

      frombuffer

      Crée une matrice à partir d'un tableau unidimensionnel


      mais en fait cela ne fonctionne pas. Existe-t-il un autre moyen de copier un tableau unidimensionnel dans une matrice ?

       
      Il y en a une, lisez l'article .