Diskussion zum Artikel "Matrix- und Vektoroperationen in MQL5"

 

Neuer Artikel Matrix- und Vektoroperationen in MQL5 :

Matrizen und Vektoren wurden in MQL5 für effiziente Operationen mit mathematischen Berechnungen eingeführt. Die neuen Typen bieten integrierte Methoden zur Erstellung von prägnantem und verständlichem Code, der der mathematischen Notation nahe kommt. Arrays bieten umfangreiche Möglichkeiten, aber es gibt viele Fälle, in denen Matrizen viel effizienter sind.

In den letzten Jahren haben wir viel getan, um fortschrittliche Technologien in die MQL5-Sprache einzuführen:


      Die MQL5-Sprache wird sich weiter entwickeln, wobei das maschinelle Lernen eine der wichtigsten Prioritäten ist. Wir haben große Pläne für die weitere Entwicklung. Bleiben Sie uns also treu, unterstützen Sie uns und lernen Sie weiterhin mit uns.

      Autor: MetaQuotes

       
      matrix corr_from_matrix=rates.CorrCoef(false);   // false bedeutet, dass Vektoren in Strings vorliegen матрицы

      Sind Sie sicher, dass es nicht in den Spalten steht?

       
          //--- Schließen der Preise in einen Vektor umwandeln
          if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
           {
            //--- Einfügen des Vektors in die Zeitreihenmatrix
            rates.Col(close, i);

      Leider hat diese einfache Art, die Matrix zu füllen, einen schwerwiegenden Fehler: Mehrwährungsbalken werden nicht synchronisiert.

      Vielleicht wäre es sinnvoll, die standardmäßige CopyRates-Methode auch für Matrizen zu verwenden, um so einfach korrekte Daten zu erhalten.

       
      Wir haben auf die einfache Befüllung von Vektoren mit Preisdaten geachtet. Es gibt aber auch Trades.
      vector::Deals( void* Filter );

      Dementsprechend ist es notwendig, den Abschnitt Statistik nicht nur mit mathematischen, sondern auch mit finanziellen Methoden zu füllen: Gain, MaxDD, PF, etc.

       
      fxsaber #:

      Sind Sie sicher, dass es nicht in den Spalten steht?

      Ja, das ist ein Tippfehler.

      Danke, das ist korrigiert.

       
      fxsaber CopyRates-Methode auch für Matrizen zu verwenden, um so einfach korrekte Daten zu erhalten.

      Hier ist die CopyRates-Methode und ein Beispiel in ihr

      //+------------------------------------------------------------------+
      //| Skript-Programmstartfunktion|
      //+------------------------------------------------------------------+
      void OnStart()
       {
      //--- Anführungszeichen in die Matrix übertragen
        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());
      //--- prüfen
        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());
      //--- Anführungszeichen in Vektor umwandeln = ungültiger Aufruf
        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());
      //--- die Schlusskurse in einen Vektor umwandeln
        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());
       };
      /*
       matrix rates:
       [[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 ist fehlgeschlagen. Fehler 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 #:

      Hier sind die Nägel der CopyRates-Methode und das Beispiel in ihr

      Offenbar habe ich das Problem nicht gut formuliert. Beim Füllen der Matrix zur Berechnung der Symbolkorrelation kann es passieren, dass EURUSD[5].BarTime nicht mit GBPUSD[5].BarTime übereinstimmt.Dies wird als Multi-Bar-Nichtsynchronisierung bezeichnet. Für eine solche Datenaufbereitung vor den Berechnungen müssen Sie ziemlich viel Zeit/Aufwand aufwenden. Wenn das Problem mit einer Zeile gelöst werden könnte, wäre das großartig.

       

      In dem Artikel heißt es:

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

      Ich möchte klären, wie diese Berechnung durchgeführt wird, d.h. werden die Zahlen auf double gebracht und dann erfolgt die Berechnung und Rückkonvertierung in den ursprünglichen Datentyp, was den Verlust an Genauigkeit verringern würde (oder liege ich falsch und es gibt keinen Unterschied?), oder sofort in den Datentyp, der da ist? Offensichtlich sparen verschiedene Typen Arbeitsspeicher, aber wenn ich Daten in Arrays berechne, bringe ich die Zahlen für Berechnungen auf double und dann wieder, sagen wir, auf float, um die Genauigkeit der Berechnungen zu erhalten. Sollte ich es optional, wie man Operationen auf Zahlen durchführen zu machen?
       
      Fantastische Erklärung. Sehr hilfreich.
       

      Die Anweisung enthält Folgendes

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

      frombuffer

      Erzeugt eine Matrix aus einem eindimensionalen Array


      aber tatsächlich funktioniert es nicht. Gibt es eine andere Möglichkeit, ein eindimensionales Array in eine Matrix zu kopieren?

       
      Es gibt sie, lesen Sie den Artikel.