Yeni MetaTrader 5 platformu yapısı 3490: Mobil Web Terminali sürümü ve MQL5'te yeni matris metotları

 

MetaTrader 5 platformu güncellemesi 4 Kasım 2022 Cuma günü yayınlanacaktır.

Güncelleme, mobil cihazlar için tam desteğe sahip yeni Web Terminalini içerir. Artık Web Terminalinin arayüzü, kullanıcının ekran boyutuna otomatik olarak uyum sağlamaktadır.

Ek olarak, tüketilen kaynakların daha doğru bir şekilde izlenmesi adına görev yöneticisini geliştirdik ve mevcut cihazların yönetilmesi için de OpenCL yöneticisi ekledik. Yeni OpenCL yöneticisi, daha hızlı hesaplamalar amacıyla kullanılacak cihazların açıkça belirtilmesine olanak sağlar.

MQL5’te matrisler ve vektörlerle çalışma konusunda platformun yeteneklerini genişletmeye de devam ediyoruz. Fiyat tikleriyle çalışma ve matrisler ve vektörler arasında veri alışverişi için yeni fonksiyonlar eklendi. Atama metotlarının yetenekleri de genişletildi.


Ek olarak, tüm platform bileşenlerine birçok düzeltme ve iyileştirme de uyguladık. Tüm yeni özellikler, düzeltmeler ve performans iyileştirmeleri aşağıda ayrıntılı olarak açıklanmaktadır.


Web platformunun mobil versiyonu

Yeni Web Terminali, mobil cihazlar için tam destek sağlar. Artık Web Terminalinin arayüzü, ekran boyutuna otomatik olarak uyum sağlayarak, iOS ve Android telefonlar ve tabletlerde platform üzerinde rahatça çalışılmasına olanak tanır:


Ayrıca, Web Terminaline birçok düzeltme ve iyileştirme de uygulandı.

Yeni MetaTrader 5 Web Terminali, yatırımcıların ihtiyaç duyduğu tüm özellikleri destekler. Aşağıdakilerin gerçekleştirilmesini mümkün kılar:

  • Demo ve gerçek hesaplarla çalışma
  • Herhangi bir finansal enstrümanın fiyatlarını alma
  • Herhangi bir piyasada ticaret yapma
  • 30'dan fazla gösterge ve 20 grafik nesnesi kullanarak fiyatları analiz etme
  • Ekonomik Takvim verilerini analiz etme


MetaTrader 5 müşteri terminali yapı 3490

  1. Terminal: Görev yöneticisinin özellikleri geliştirildi. Artık tüketilen kaynakların daha doğru bir şekilde izlenmesine olanak sağlar.

    • İş parçacıkları için yığın boyutunun görüntülenmesi eklendi.
    • İçerik değiştirmelerin sayısının görüntülenmesi eklendi.
    • Sistem ve üçüncü taraf DLL iş parçacıklarının tanınması eklendi.
    • Çekirdek modunda çalışma süresinin görüntülenmesi eklendi. Kullanıcı modunda harcanan süreye kıyasla bu ölçümde bir artış varlığı, sistem düzeyinde sorunlara işaret edebilir: sürücülere ilişkin sorunlar, donanım hataları veya yavaş donanım. Daha fazla ayrıntı için lütfen Microsoft Dokümantasyonunu okuyun.
    • Kullanıcı modunda çalışma süresinin görüntülenmesi eklendi.




  2. Terminal: Mevcut cihazların yönetilmesi için terminal ayarlarında yeni OpenCL sekmesi. Yeni OpenCL yöneticisi, daha hızlı hesaplamalar amacıyla kullanılacak cihazların açıkça belirtilmesine olanak sağlar.




  3. Terminal: FIFO modunda çalışan işlem hesapları için Piyasa Derinliğinde Zararı Durdur ve Kârı Al seviyelerinin görüntülenmesi eklendi (FIFO modu, broker tarafında etkinleştirilebilir).

    FIFO kuralı, her enstrüman için pozisyonların sadece açıldıkları sırayla kapatılabileceğini ifade eder. Durma seviyeleriyle pozisyonların kapatılmasının her zaman FIFO kuralına uygun olmasını sağlamak için, müşteri terminali tarafında aşağıdaki mantık uygulanır:

    Aynı enstrüman için birden fazla pozisyon varsa, pozisyonlardan herhangi biri için durma seviyelerinin yerleştirilmesi, diğer tüm pozisyonlar için de aynı seviyelerin yerleştirilmesine neden olur. Eğer bir durma seviyesi tetiklenirse, tüm pozisyonlar FIFO kuralına uygun sırayla kapatılacaktır.

    Artık, açık pozisyonları olan bir enstrüman için Piyasa Derinliği açıldığında, ilgili pozisyonların varsa durma seviyeleri, Zararı Durdur ve Kârı Al alanlarında otomatik olarak belirtilecektir.

  4. Terminal: Araç Kutusu \ İşlem penceresindeki X düğmeleri kullanılarak Zararı Durdur ve Kârı Al seviyelerinin kaldırılması düzeltildi. Hata, hızlı ticaret işlevi devre dışı bırakıldığında meydana geliyordu. Artık düğmeye tıklandığında, ilgili durma seviyesinin boş değeriyle bir işlem iletişim kutusu açılacaktır.

  5. Terminal: Ticaret raporunda grafik başlıkları ve nihai komisyon hesaplamaları düzeltildi. Varlık ve bakiye grafiği araç ipuçlarında ve rapor istatistiklerinde yanlış değerler gösterilebilmekteydi.

  6. MQL5: CopyTicks ve CopyTicksRange vektör ve matris metotları eklendi. Tik verileri dizilerinin vektörlere ve matrislere kolayca kopyalanmasına olanak tanırlar.
    bool matrix::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    bool vector::CopyTicks(string symbol,uint flags,ulong from_msc,uint count);
    
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    bool matrix::CopyTicksRange(string symbol,uint flags,ulong from_msc,ulong to_msc);
    Kopyalanacak verilerin türü, ENUM_COPY_RATES numaralandırması kullanılarak flags parametresinde belirtilir. Şu değerler kullanılabilir:
    COPY_TICKS_INFO    = 1,       // Alış ve/veya Satış fiyatı değişikliklerinden kaynaklanan tikler
    COPY_TICKS_TRADE   = 2,       // Son fiyatı ve hacim değişikliklerinden kaynaklanan tikler
    COPY_TICKS_ALL     = 3,       // tüm tikler
    COPY_TICKS_TIME_MS = 1<<8,    // milisaniye cinsinden zaman
    COPY_TICKS_BID     = 1<<9,    // Satış fiyatı
    COPY_TICKS_ASK     = 1<<10,   // Alış fiyatı
    COPY_TICKS_LAST    = 1<<11,   // Son fiyatı
    COPY_TICKS_VOLUME  = 1<<12,   // hacim
    COPY_TICKS_FLAGS   = 1<<13,   // tik bayrakları
    Birden fazla veri türü seçildiğinde (yalnızca matrisler için kullanılabilir), matristeki satırların sırası, numaralandırmadaki değerlerin sırasıyla eşleşecektir.

  7. MQL5: matrix::Assign ve vector::Assign metotlarının yetenekleri genişletildi.

    Artık matrise tek boyutlu bir dizi veya vektör atanabilir:
    bool matrix::Assign(const vector &vec);
    Sonuç, tek satırlı bir matris olacaktır.

    Ayrıca, artık vektöre bir matris de atanabilir (matris yumuşatma gerçekleştirilecektir):
    bool vector::Assign(const matrix &mat);
  8. MQL5: Vektörler ve matrisler için Swap metotları eklendi.
    bool vector::Swap(vector &vec);
    bool vector::Swap(matrix &vec);
    bool vector::Swap(double &arr[]);
    bool matrix::Swap(vector &vec);
    bool matrix::Swap(matrix &vec);
    bool matrix::Swap(double &arr[]);
    Her dizi, vektör veya matris, o nesnenin öğelerini içeren bir bellek arabelleğine başvurur. Swap metodu aslında öğeleri belleğe yazmadan işaretçileri bu arabelleklere değiştirir. Dolayısıyla, matris matris olarak kalır ve vektör de vektör olarak kalır. Matris ve vektörün değiştirilmesi, düz temsilde, vektör öğelerine sahip tek satırlı bir matris ve matris öğelerine sahip bir vektör ile sonuçlanacaktır (daha fazla ayrıntı için Flat metodu bölümüne bakabilirsiniz).
    //+------------------------------------------------------------------+
    //| Komut dosyasını başlatma fonksiyonu                               |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //---
      matrix a= {{1, 2, 3}, {4, 5, 6}};
      Print("Değiştirme öncesi a: \n", a);
      matrix b= {{5, 10, 15, 20}, {25, 30, 35, 40}, {45, 50, 55, 60}};
      Print("Değiştirme öncesi b: \n", b);  
    //--- işaretçileri değiştir
      a.Swap(b);
      Print("Değiştirme sonrası a: \n", a);
      Print("Değiştirme sonrası b: \n", b);
      /*
      Değiştirme öncesi a:
      [[1,2,3]
      [4,5,6]]
      Değiştirme öncesi b:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      
      Değiştirme sonrası a:
      [[5,10,15,20]
      [25,30,35,40]
      [45,50,55,60]]
      Değiştirme sonrası b:
      [[1,2,3]
      [4,5,6]]
      */
      vector v=vector::Full(10, 7);
      Print("Değiştirme öncesi v: \n", v);
      Print("Değiştirme öncesi b: \n", b);
      v.Swap(b);
      Print("Değiştirme sonrası v: \n", v);
      Print("Değiştirme sonrası b: \n", b);
      /*
      Değiştirme öncesi v:
      [7,7,7,7,7,7,7,7,7,7]
      Değiştirme öncesi b:
      [[1,2,3]
      [4,5,6]]
      
      Değiştirme sonrası v:
      [1,2,3,4,5,6]
      Değiştirme sonrası b:
      [[7,7,7,7,7,7,7,7,7,7]]
      */
     }
    Swap metodu ayrıca dinamik dizilerle çalışılmasına da olanak sağlar (statik dizilerin geçişi parametre olarak yapılamaz). Dizi herhangi bir büyüklükte olabilir, ancak bu büyüklük kararlaştırılmış olmalıdır. Yani, matrisin veya vektörün toplam büyüklüğü dizinin sıfır boyutunun bir katı olması gerekir. Dizinin sıfır boyutu, ilk indekste bulunan öğe sayısıdır. Örneğin, dinamik bir üç boyutlu dizi 'double array[][2][3]' için sıfır boyutu, ikinci ve üçüncü boyutların büyüklüklerinin çarpımıdır: 2x3=6. Bu, böyle bir dizinin Swap metodunda yalnızca toplam büyüklüğü 6'nın katı olan matrisler ve vektörlerle kullanılabileceği anlamına gelir: 6, 12, 18, 24, vb.

    Bunu aşağıdaki örnekte görebilirsiniz:
    //+------------------------------------------------------------------+
    //| Komut dosyasını başlatma fonksiyonu                               |
    //+------------------------------------------------------------------+
    void OnStart()
     {
    //--- 1x10 matrisini 7.0 değeriyle doldur
      matrix m= matrix::Full(1, 10, 7.0);
      Print("Değiştirme öncesi matris:\n", m);
    //--- matris ve diziyi değiştirmeyi dene
      double array_small[2][5]= {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
      Print("Değiştirme öncesi array_small:");
      ArrayPrint(array_small);
      if(m.Swap(array_small))
       {
        Print("Değiştirme sonrası array_small:");
        ArrayPrint(array_small);
        Print("Değiştirme sonrası matris: \n", m);
       }
      else // matrisin büyüklüğü, dizinin sıfır boyutunun bir katı değildir
       {
        Print("m.Swap(array_small) başarısız oldu. Hata: ", GetLastError());
       }
      /*
      Değiştirme öncesi matris:
      [[7,7,7,7,7,7,7,7,7,7]]
      Değiştirme öncesi array_small:
               [,0]     [,1]     [,2]     [,3]     [,4]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000
      [1,]  6.00000  7.00000  8.00000  9.00000 10.00000
      m.Swap(array_small) başarısız oldu. Hata: 4006
      */
    //--- daha büyük bir matris kullan ve değiştirme işlemini yeniden dene
      double array_static[3][10]= {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
         {2, 4, 6, 8, 10, 12, 14, 16, 18, 20},
         {3, 6, 9, 12, 15, 18, 21, 24, 27, 30}
       };
      Print("Değiştirme öncesi array_static:");
      ArrayPrint(array_static);
      if(m.Swap(array_static))
       {
        Print("Değiştirme sonrası array_static:");
        ArrayPrint(array_static);
        Print("Değiştirme sonrası matris: \n", m);
       }
      else // statik bir dizi, matrisle değiştirme için kullanılamaz
       {
        Print("m.Swap(array_static) başarısız oldu. Hata: ", GetLastError());
       }
      /*
      Değiştirme öncesi array_static:
             [,0]     [,1]     [,2]     [,3]     [,4]     [,5]     [,6]     [,7]     [,8]     [,9]
      [0,]  1.00000  2.00000  3.00000  4.00000  5.00000  6.00000  7.00000  8.00000  9.00000 10.00000
      [1,]  2.00000  4.00000  6.00000  8.00000 10.00000 12.00000 14.00000 16.00000 18.00000 20.00000
      [2,]  3.00000  6.00000  9.00000 12.00000 15.00000 18.00000 21.00000 24.00000 27.00000 30.00000
      m.Swap(array_static) başarısız oldu. Hata: 4006
      */
    //--- diziyi ve matrisi değiştirmek için başka bir girişim
      double array_dynamic[][10];    // dinamik dizi
      ArrayResize(array_dynamic, 3); // birinci boyutun büyüklüğünü ayarla
      ArrayCopy(array_dynamic, array_static);
    //--- şimdi değiştirme için dinamik bir dizi kullan
      if(m.Swap(array_dynamic))
       {
        Print("Değiştirme sonrası array_dynamic:");
        ArrayPrint(array_dynamic);
        Print("Değiştirme sonrası matris: \n", m);
       }
      else //  hata yok
       {
        Print("m.Swap(array_dynamic) başarısız oldu. Hata: ", GetLastError());
       }
      /*
      Değiştirme sonrası array_dynamic:
            [,0]    [,1]    [,2]    [,3]    [,4]    [,5]    [,6]    [,7]    [,8]    [,9]
      [0,] 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000 7.00000
      Değiştirme sonrası matris:
      [[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30]]
      */
     }
  9. MQL5: Vektörler ve matrisler için LossGradient metodu eklendi. Bu metot, öngörülen değerler üzerinde kayıp fonksiyonunun kısmi türevlerinin vektörünü veya matrisini hesaplar. Lineer cebirde böyle bir vektör gradyan olarak adlandırılır ve makine öğreniminde kullanılır.
    vector vector::LossGradient(const vector &expected,ENUM_LOSS_FUNCTION loss) const;
    matrix matrix::LossGradient(const matrix &expected,ENUM_LOSS_FUNCTION loss) const;
  10. MQL5: SQL sorgularında tablolar arasında ilişkilerin zorlanması için SQLite'da yabancı anahtarların kullanımı etkinleştirildi.   Örnek:
    CREATE TABLE sanatçı(
      sanatçıkimliği    INTEGER PRIMARY KEY, 
      sanatçıadı  TEXT
    );
    
    CREATE TABLE parça(
      parçakimliği     INTEGER, 
      parçaadı   TEXT, 
      parçasanatçı INTEGER,
      FOREIGN KEY(parçasanatçı) REFERENCES sanatçı(sanatçıkimliği)
    );

  11. MQL5: Metot ve nesne sabitliğine bağlı olarak uygun sınıf metodunun seçimi düzeltildi.

  12. MetaEditor: MQL5 Depoya değişiklikleri uygularken izin verilen yorum uzunluğu artırıldı. Değişiklikleri depoya uygularken yapılan ayrıntılı yorumlar, büyük projelerle çalışırken iyi bir pratik olarak kabul edilir. Ancak öncesinde yorum uzunluğu 128 karakterle sınırlıydı. İzin verilen uzunluk artık 260 karaktere kadardır.
  13. MetaTester: Görsel modda test hızı anahtarının hassasiyeti artırıldı.
  14. Çökme kayıtlarında bildirilen hatalar düzeltildi.


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

Neden: