Yeni MetaTrader 5 yapısı 3620: Web Terminali iyileştirmeleri ve MQL5'te hızlı matris çarpımı ve ONNX desteği

MetaQuotes  

Güncellenen MetaTrader 5 platformunun yeni sürümü 10 Mart 2023 Cuma günü yayınlanacaktır.

Bu güncellemeyle Web Terminalinde bazı iyileştirmeler yapıldı. Web Terminali arayüzü için farklı renk şablonları eklendi ve sembol özellikleri penceresi geliştirildi.

Yeni MetaTrader 5 yapısı 3620: Web Terminali iyileştirmeleri ve MQL5'te hızlı matris çarpımı ve ONNX desteği

Ayrıca, MQL5 artık genel matris çarpımı (General Matrix Multiplication, GeMM) algoritmasını da desteklemektedir. Bu algoritma, hesaplamaların çoğu işlemcide önemli ölçüde hızlandırılmasına olanak sağlar. Yeni algoritma şu anda matrix::GeMM metodunda desteklenmektedir.

Ek olarak, MQL5'e ONNX modelleriyle çalışmak için de destek eklendi. Bu, Uzman Danışmanlarda sinir ağlarının kullanımını büyük ölçüde kolaylaştıracaktır.

Yeni sürüm aşağıdaki değişiklikleri içermektedir:


MetaTrader 5 Müşteri Terminali yapı 3620

  1. Terminal: Ticaret raporunda toplam kâr hesaplaması düzeltildi.
  2. Terminal: Ticaret enstrümanlarının Piyasa Gözlemi penceresinden erişilebilen temel verileri güncellendi.
  3. Terminal: Linux sistemlerinde Wine 7.0.1 aracılığıyla işlem platformunun başlatılması düzeltildi.
  4. Terminal: Piyasa Gözlemine arama çubuğu aracılığıyla sembol eklenmesi düzeltildi. Arama çubuğuyla bulunan sembole tıklandığında listeye eklenmiyordu.
  5. MQL5: Açık sinir ağı santrali (Open Neural Network eXchange, ONNX) modelleriyle çalışmak için destek eklendi.

    ONNX, makine öğrenimi modelleri için açık kaynaklı bir formattır. Bu format, Chainer, Caffee2 ve PyTorch gibi birçok platform tarafından desteklenmektedir. Özel araçları kullanarak bir ONNX modeli oluşturun, MQL5 uygulamanıza entegre edin ve ticaret kararları vermek için kullanın.

    Desteklenen tüm fonksiyonların açıklamaları dokümantasyonda mevcuttur. Bir ONNX modeli örneği, MetaEditor'daki herkese açık projelerde bulunmaktadır. Araç Kutusu \ Herkese Açık Projeler içerisinden ONNX.Price.Prediction projesini bulun ve içerik menüsünden Katılı seçin. Proje bilgisayarınıza indirilecek ve Kılavuzda görünecektir:


    Herkese açık projelerde ONNX modeliyle çalışma örneği


    Sonucu görmek için projeyi derleyin ve EURUSD H1 üzerinde çalıştırın.

    Model ve onu çalıştıran MQL5 koduna ek olarak, proje PricePredictionTraining.py Python komut dosyasını da içermektedir. Bu komut dosyası, kendi başınıza bir ONNX modelini nasıl oluşturacağınızı göstermektedir. Komut dosyasını çalıştırmak için bilgisayarınıza Python’ı ve komut satırından gerekli modülleri yükleyin:

    python.exe -m pip install --upgrade pip
    python -m pip install --upgrade tensorflow
    python -m pip install --upgrade pandas
    python -m pip install --upgrade scikit-learn
    python -m pip install --upgrade matplotlib
    python -m pip install --upgrade tqdm
    python -m pip install --upgrade metatrader5
    python -m pip install --upgrade onnx==1.12
    python -m pip install --upgrade tf2onnx
    ONNX'in nasıl kullanılacağına ilişkin ayrıntılı talimatlar dokümantasyonda mevcuttur.

  6. MQL5: Genel matris çarpımı (General Matrix Multiplication, GeMM) için destek eklendi. Görevlerin paralelleştirilmesi ve L1/L2/L3 önbelleklerinin daha doğru kullanımı sayesinde, hesaplamaların çoğu işlemcide önemli ölçüde hızlandırılmasına olanak sağlar. Hesaplama hızı, Math Kernel Library (MKL) ve OpenBLAS gibi popüler paketlerle karşılaştırılabilir düzeydedir. Ayrıntılı karşılaştırmalı testler yakında yayınlanacaktır.

    Yeni algoritma şu anda matrix::GeMM metodunda desteklenmektedir. İşlemciniz AVX ve FMA teknolojilerini destekliyorsa (2013'ten sonra piyasaya sürülen çoğu işlemci bu teknolojileri desteklemektedir), algoritma otomatik olarak etkinleştirilecektir.

  7. MQL5: Matrisleri ve vektörleri DLL'e aktarma özelliği eklendi. Bu veri türlerini kullanan fonksiyonlar artık harici kütüphanelerden içe aktarılabilir.

    Matrisler ve vektörler DLL'e arabellek işaretçisi olarak aktarılır. Örneğin, float türünde bir matrisin aktarılması için, DLL'den dışa aktarılan fonksiyonun ilgili parametresinin float türünde arabellek işaretçisi alması gerekir. Örneğin:

    MQL5
    #import "mmlib.dll"
    bool sgemm(uint flags,matrix<float> &C,const matrix<float> &A,const matrix<float> &B,ulong M,ulong N,ulong K,float alpha,float beta);
    #import
    C++
    extern "C" __declspec(dllexport) bool sgemm(UINT flags,float *C,const float *A,const float *B,UINT64 M,UINT64 N,UINT64 K,float alpha,float beta)
    Matrislerin ve vektörlerin düzgün bir şekilde işlenmesi adına, arabelleklere ek olarak büyüklüklerinin de aktarılması gerekir.

  8. MQL5: Senkronize zaman serilerini MqlRates'ten farklı dizilere kopyalamak için yeni CopySeries fonksiyonu eklendi.

    CopySeries fonksiyonu, tek bir çağrıyla yalnızca gerekli zaman serilerinin farklı dizilere alınmasına olanak sağlar ve bu sırada zaman serilerinin tamamı senkronize edilir. Bu, belirli bir N indeksi için elde edilen dizilerdeki tüm değerlerin belirtilen sembol / zaman dilimindeki aynı çubuğa ait olacağı anlamına gelir. Bu nedenle, programcının alınan zaman serilerini ayrıca çubuk açılış zamanına göre senkronize etmesine gerek yoktur.

    Zaman serilerinin tamamını bir MqlRates dizisi olarak geri döndüren CopyRates'in aksine, CopySeries fonksiyonu yalnızca gerekli zaman serilerinin farklı diziler halinde alınmasını mümkün kılar. Bu, istenen zaman serilerini belirtmek üzere bayrak kombinasyonu ayarlanarak yapılır. Fonksiyona iletilen dizilerin sırası, MqlRates yapısındaki alanların sırasıyla eşleşmelidir:

    struct MqlRates
      {
       datetime time;         // açılış zamanı
       double   open;         // açılış fiyatı
       double   high;         // yüksek fiyatı
       double   low;          // düşük fiyatı
       double   close;        // kapanış fiyatı
       long     tick_volume;  // tik hacmi
       int      spread;       // spread
       long     real_volume;  // gerçek hacim
      }

    Örneğin, mevcut sembol / zaman diliminde son 100 çubuk için time, close ve real_volume zaman serilerinin değerleri alınması gerekiyorsa, çağrı aşağıdaki gibi olmalıdır:

    datetime  time[];
    double    close[];
    long      volume[];
    CopySeries(NULL,0,0,100,COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_VOLUME_REAL,time,close,volume);
    

    Burada, time, close ve volume dizilerinin sırası önemlidir: MqlRates yapısındaki alanların sırasına karşılık gelmelidir. Ancak rates_mask içerisindeki değerlerin sırası önemli değildir. Maske şu şekilde olabilir:

    COPY_RATES_VOLUME_REAL|COPY_RATES_TIME|COPY_RATES_CLOSE

    Örnek

    //--- girdi parametreleri
    input datetime InpDateFrom=D'2022.01.01 00:00:00';
    input datetime InpDateTo  =D'2023.01.01 00:00:00';
    input uint     InpCount   =20;
    //+------------------------------------------------------------------+
    //| Komut dosyası başlatma fonksiyonu                                |
    //+------------------------------------------------------------------+
    void OnStart(void)
      {
    //--- MqlRates yapısından zaman serileri almak için diziler
       double   open[];
       double   close[];
       float    closef[];
       datetime time1[], time2[];
    //--- double türünde diziye kapanış fiyatlarını talep et
       ResetLastError();
       int res1=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE, time1, close);
       PrintFormat("1. CopySeries %d değer geri döndürdü. Hata kodu=%d", res1, GetLastError());
       ArrayPrint(close);
       
    
    //--- açılış fiyatlarını da talep et ve kapanış fiyatları için float türünü kullan
       ResetLastError();
       int res2=CopySeries(NULL, PERIOD_CURRENT, 0, InpCount,
                           COPY_RATES_TIME|COPY_RATES_CLOSE|COPY_RATES_OPEN, time2, open, closef);
       PrintFormat("2. CopySeries %d değer geri döndürdü. Hata kodu=%d", res2, GetLastError());
       ArrayPrint(closef);
    //--- alınan verileri karşılaştır
       if((res1==res2) && (time1[0]==time2[0]))
         {
          Print("  | Time             |    Open      | Close double | Close float |");
          for(int i=0; i<10; i++)
            {
             PrintFormat("%d | %s |   %.5f    |   %.5f    |   %.5f   |",
                         i, TimeToString(time1[i]), open[i], close[i], closef[i]);
            }
         }
    /*  Sonuç
            1. CopySeries 20 değer geri döndürdü. Hata kodu:0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
            2. CopySeries 20 değer geri döndürdü. Hata kodu:0
            [ 0] 1.06722 1.06733 1.06653 1.06520 1.06573 1.06649 1.06694 1.06675 1.06684 1.06604
            [10] 1.06514 1.06557 1.06456 1.06481 1.06414 1.06394 1.06364 1.06386 1.06239 1.06247
              | Time             |    Open      | Close double | Close float |
            0 | 2023.03.01 17:00 |   1.06660    |   1.06722    |   1.06722   |
            1 | 2023.03.01 18:00 |   1.06722    |   1.06733    |   1.06733   |
            2 | 2023.03.01 19:00 |   1.06734    |   1.06653    |   1.06653   |
            3 | 2023.03.01 20:00 |   1.06654    |   1.06520    |   1.06520   |
            4 | 2023.03.01 21:00 |   1.06520    |   1.06573    |   1.06573   |
            5 | 2023.03.01 22:00 |   1.06572    |   1.06649    |   1.06649   |
            6 | 2023.03.01 23:00 |   1.06649    |   1.06694    |   1.06694   |
            7 | 2023.03.02 00:00 |   1.06683    |   1.06675    |   1.06675   |
            8 | 2023.03.02 01:00 |   1.06675    |   1.06684    |   1.06684   |
            9 | 2023.03.02 02:00 |   1.06687    |   1.06604    |   1.06604   |
    */
      }
  9. MQL5: OrderSend fonksiyonunun çalışması düzeltildi. Aynı işlem hesabının aynı anda birden fazla platformda kullanılması durumunda fonksiyon yanlış bir emir fişi geri döndürebiliyordu.
  10. MQL5: EX5 kütüphanelerinin içe aktarılması düzeltildi. İçe aktarılan kütüphanenin adı, içine aktarıldığı dosyanın adıyla eşleşirse bir hata oluşuyordu.
  11. MetaEditor: Paylaşımlı proje katılımcıları için anlık bildirimler eklendi. Artık her katılımcı, projenin dosyalarındaki veya ayarlarındaki herhangi bir değişiklikten her zaman haberdar olacaktır. Anlık bildirimleri etkinleştirmek için, MQL5.community profilinizin Ayarlar\Güvenlik bölümüne giderek MetaQuotes ID'nizi belirtin.


    Projedeki değişiklikler hakkında anlık bildirimler


  12. MetaEditor: Kılavuzdaki dosya simgeleri güncellendi. Yeni, daha basit ifadeler onların anlaşılmasını kolaylaştıracaktır.
  13. Strateji Sınayıcı: Girdi dizgesi parametresinin “|” karakteri içermesi durumunda kesilmesine neden olan bir hata düzeltildi.
  14. Çökme kayıtlarında bildirilen hatalar düzeltildi.

MetaTrader 5 Web Terminali yapı 3620

  1. Web Terminali arayüzü için hazır renk şablonları eklendi. Şablonlar, grafikteki çubukların ve çizgilerin, Piyasa Gözlemindeki fiyatların ve işlem hesabının finansal sonuçlarının yer aldığı pencerelerdeki ifadelerin görünümü etkiler. Tasarım ekibimiz, önerilerinize ve geleneksel renk kombinasyonlarına dayalı olarak ön tanımlı renk şablonları hazırladı.


    Web Terminalinin yeni renk şablonları


  2. Sembol özellikleri penceresi yeniden tasarlandı. Ticaret enstrümanının verileri, daha kolay anlaşılması amacıyla mantıksal bloklar halinde yeniden düzenlendi.


    Ticaret enstrümanı özellikleri penceresi güncellendi


  3. Web Terminali üzerinden gerçek hesap açılışı düzeltildi. Bazı durumlarda, kayıt formu doldurulduktan sonra sunucu bir hata geri döndürebiliyordu.
  4. İşlem iletişim kutusundaki bir hata düzeltildi. Kullanıcı, pozisyonu değiştirme iletişim kutusu açıkken Araç Kutusu penceresindeki X düğmesine basarak pozisyonu kapattığında iletişim kutusu içeriği sıfırlanmıyordu. Güncellemeden sonra, böyle bir durumda iletişim kutusu artık otomatik olarak yeni emir yerleştirme moduna sıfırlanacaktır.
  5. Hesap yönetimi iletişim kutusundaki sunucu alanının görüntülenmesi düzeltildi.
  6. Araç çubuğunda mevcut zaman diliminin görüntülenmesi düzeltildi.
  7. İşlem iletişim kutusunda hacmin dayanak varlık cinsinden görüntülenmesi düzeltildi.
  8. Zararı durdur ve kârı al seviyelerinin değiştirilmesi düzeltildi. Bazı durumlarda, değerlerden birinin değiştirilmesi diğerini sıfırlayabiliyordu.
  9. Yatırım riski uyarılarının görüntülenmesi düzeltildi.

Güncelleme, Live Update sistemi aracılığıyla sunulacaktır.

Neden: