"MQL5'te matrisler ve vektörlerle çalışma" makalesi için tartışma

 

Yeni makale MQL5'te matrisler ve vektörlerle çalışma yayınlandı:

Matematik problemlerinin verimli bir şekilde çözülebilmesi adına MQL5’e matrisler ve vektörler eklendi. Yeni türler, matematiksel gösterime yakın, öz ve anlaşılır kodlar yazmak için yerleşik metotlar sağlar. Diziler iyidir, ancak matrisler çok daha iyidir çünkü matrislerin çok daha verimli olduğu birçok durum vardır.

Geçtiğimiz yıllarda, gelişmiş teknolojileri MQL5 diline dahil etmek için çok şey yaptık:

      MQL5 dili gelişmeye devam ederken, en öncelikli yönlerden biri de makine öğrenimi olacaktır. Daha fazla gelişmek için büyük planlarımız var. Bu yüzden bizimle kalın, bizi destekleyin ve bizimle birlikte öğrenmeye devam edin.

      Yazar: MetaQuotes

       
      matrix corr_from_matrix=rates.CorrCoef(false);   // false vektörlerin dizeler halinde olduğu anlamına gelir матрицы

      Sütunlarda olmadığına emin misin?

       
          //--- Kapanış fiyatlarını vektör haline getirin
          if(close.CopyRates(symbols[i], InTF, COPY_RATES_CLOSE, 1, InBars))
           {
            //--- vektörü zaman serisi matrisine yerleştirin
            rates.Col(close, i);

      Ne yazık ki, matrisi doldurmanın bu basit yolunun ciddi bir kusuru vardır: çoklu para birimi çubukları senkronize edilmez.

      Belki de doğru verileri kolayca elde etmek için standart CopyRates yöntemini matrisler için de yapmak mantıklıdır.

       
      Vektörlerin fiyat verileriyle basit bir şekilde doldurulmasına dikkat ettik. Bununla birlikte, takaslar da söz konusudur.
      vector::Deals( void* Filter );

      Buna göre, İstatistik bölümünü sadece matematiksel yöntemlerle değil, aynı zamanda finansal yöntemlerle de doldurmak gerekir: Kazanç, MaxDD, PF, vb.

       
      fxsaber #:

      Sütunlarda olmadığına emin misin?

      Evet, bir yazım hatası.

      Teşekkürler, düzelttim.

       
      fxsaber CopyRates yöntemini matrisler için de yapmak mantıklıdır.

      İşte CopyRates yöntemi ve içindeki bir örnek

      //+------------------------------------------------------------------+
      //| Komut dosyası programı başlatma işlevi|
      //+------------------------------------------------------------------+
      void OnStart()
       {
      //--- tırnak işaretlerini matrise al
        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());
      //--- kontrol et
        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());
      //--- tırnak işaretlerini vektöre al = geçersiz çağrı
        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());
      //--- kapanış fiyatlarını bir vektör haline getirin
        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());
       };
      /*
       matris oranları:
       [[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 başarısız oldu. Hata 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 #:

      İşte CopyRates yönteminin tırnakları ve içindeki örnek

      Görünüşe göre sorunu iyi formüle edememişim. Sembol korelasyonunu hesaplamak için matrisi doldururken, EURUSD[5].BarTime, GBPUSD[5].BarTime ile eşleşmeyebilir.Buna çoklu çubuk senkronizasyonsuzluğu denir. Hesaplamalardan önce bu tür veri hazırlığına oldukça fazla zaman/çaba ayırmanız gerekir. Tek bir satırla çözülebilseydi harika olurdu.

       

      Makale şöyle diyor:

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

      Bu hesaplamanın nasıl yapıldığını açıklığa kavuşturmak istiyorum, yani sayılar double'a getiriliyor ve daha sonra hesaplama ve hassasiyet kaybını azaltacak olan ilk veri türüne geri dönüştürme mi gerçekleşiyor (yoksa yanılıyor muyum ve fark yok mu?), yoksa hemen orada bulunan veri türünde mi? Açıkçası, farklı türler RAM'den tasarruf sağlar, ancak verileri dizilerde hesaplarsam, hesaplamalar için sayıları double'a ve ardından hesaplamaların doğruluğunu korumak için tekrar diyelim ki float'a getiririm. Sayılar üzerinde nasıl işlem yapılacağını isteğe bağlı mı yapmalıyım?
       
      Harika bir açıklama. Çok yardımcı oldu.
       

      Talimat aşağıdakileri içerir

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

      frombuffer

      Tek boyutlu bir diziden matris oluşturur


      ama aslında çalışmıyor. Tek boyutlu bir diziyi bir matrise kopyalamanın başka bir yolu var mı?

       
      Var, makaleyi okuyun.