MT5 ve iş başında hız - sayfa 35

 
fxsaber :

Zadol Anlık görüntülerde hata ayıklamaktan bıktınız. Sonunda bunu mükemmel bir şekilde yaptı. Bir danışman - barış ve sessizlik. İki harika. 20 - felaket: CPU %100'ün altında. HistorySelect, birçok milisaniye boyunca gecikiyor.

Görünüşe göre MT5, çok sayıda robotun eşzamanlı çalışması için tasarlanmamıştır.

Bir stres testi mi yazıyorsunuz yoksa uzmanların olağan çalışmaları mı?

Büyük olasılıkla, tek bir veritabanında çok iş parçacıklı bir stres testidir. Bu yüzden tekrar ediyorum:

Ticaret, otomatik ticaret sistemleri ve ticaret stratejilerinin test edilmesi hakkında forum

MT5 ve iş başında hız

Renat Fatkhullin , 2020.09.16 12:47

Doğru anladıysam, her sembolün üzerinde bir danışman değil, bir stres test cihazı var . Bu, işleri tamamen değiştirir. Ve başlangıç koşullarının gizlendiğini gösterir.

Yani, bir 8(4+HT) çekirdek işlemcide, kesintisiz modda ve gecikme olmaksızın 16 iş parçacığı (paralel olarak +N terminal işçi iş parçacığı) bir senkronize sembol temel nesnesine bölünür. Tıklamalar sürekli olarak kaydedildiğinden Okuma / Yazma kilitleri karıştırılır.

Genellikle böyle bir profilde, işlemcinin soğukluğuna ve iş parçacığı zamanlayıcısına bağlı olarak, her iş parçacığı zamanın %60 ila %80'ini beklemekle geçirebilir.

Ve görevlerin türünden bağımsız olarak.

Aslında, 20 iş parçacığında bir kaynak için kesintisiz bir savaş düzenlerseniz, birkaç seçenek vardır:

  1. mantıksal olarak erişimi çöz ve bir stres testi ile uğraşma
  2. kendi önbelleklerinize gidin (1. paragraf seçeneği)
  3. donanım yükseltmesi (i7 2600k'nin iyi olduğuna aldanmayın - kötü)


Ek'i dikkatlice okuyun. N iş parçacığı bir senkronizasyon nesnesine çarpıyorsa, boş bekleme %60-80 düzeyinde olacaktır.

Ve çok iş parçacıklı verimliliğin sınırı, 8-12 iş parçacığı düzeyinde bir yerde olacaktır. İş parçacığı sayısı arttıkça, örnekleme oranı azalacaktır. 2600k'da verimlilik sınırı daha da düşüktür.

 
Renat Fatkhullin :

Bir stres testi mi yazıyorsunuz yoksa uzmanların olağan çalışmaları mı?

Olağan

Büyük olasılıkla, tek bir veritabanında çok iş parçacıklı bir stres testidir. Bu yüzden tekrar ediyorum:

Aslında, 20 iş parçacığında bir kaynak için kesintisiz bir savaş düzenlerseniz, birkaç seçenek vardır:

  1. mantıksal olarak erişimi çöz ve bir stres testi ile uğraşma
  2. kendi önbelleklerinize gidin (1. paragraf seçeneği)
  3. donanım yükseltmesi (i7 2600k'nin iyi olduğuna aldanmayın - kötü)


Ek'i dikkatlice okuyun. N iş parçacığı bir senkronizasyon nesnesine çarpıyorsa, boş bekleme %60-80 düzeyinde olacaktır.

Ve çok iş parçacıklı verimliliğin sınırı, 8-12 iş parçacığı düzeyinde bir yerde olacaktır. İş parçacığı sayısı arttıkça, örnekleme oranı azalacaktır. 2600k'da verimlilik sınırı daha da düşüktür.

Tam önbellek geçmişi. Ancak bu bile HistorySelect(0, INT_MAX) çağrılmasını gerektirir.

Bir deney olarak, ticaret mantığı için gerekli olan tüm geçmiş referansları kestim. CPU üzerindeki yük büyük ölçüde azaltılmıştır.


Genel olarak, 20 robot varsa, o zaman onlarda tarihe dönmek, tek bir Terminal ile bir felakete neden olur. Birkaç Terminal hakkında konuşmaya bile gerek yok.

Ve senkro-nesnenin sadece tarih olmadığına dair bir his var. SymbolInfoTick, CopyTicks ve başka bir şey gibi görünüyor.

Genel olarak, her birinde on robot bulunan beş Terminal bile başlatamıyorum.

Fren profil oluşturucuyu görüntüleyin - bummer .

 
fxsaber :

Olağan

Tam önbellek geçmişi. Ancak bu bile HistorySelect(0, INT_MAX) çağrılmasını gerektirir.

Bir deney olarak, ticaret mantığı için gerekli olan tüm geçmiş referansları kestim. CPU üzerindeki yük büyük ölçüde azaltılmıştır.


Genel olarak, 20 robot varsa, o zaman onlarda tarihe dönmek, tek bir Terminal ile bir felakete neden olur. Birkaç Terminal hakkında konuşmaya bile gerek yok.

Ve öyle görünüyor ki senkro-nesne sadece tarih değil. SymbolInfoTick, CopyTicks ve başka bir şey gibi görünüyor.

Genel olarak, her birinde on robot bulunan beş Terminal bile başlatamıyorum.

Fren profil oluşturucuyu görüntüleyin - bummer .

Sayısal verilerin yanı sıra hiçbir kanıt yoktur.

1) Her Uzman Danışman saniyede kaç kez HistorySelect sorgusu yapar?

2) Hangi işlevler yavaşlar?

3) Günlükler?

4) Robotların çalışma prensibi nedir?

 
fxsaber :

Genel olarak, 20 robot varsa, o zaman onlarda tarihe dönmek, tek bir Terminal ile bir felakete neden olur. Birkaç Terminal hakkında konuşmaya bile gerek yok.

Belki tam tersine, her terminal kendi senkronizasyon nesnesini destekleyecek ve bunun için 20 Uzman Danışman kuyruğu olmayacak mı?

1 robotu 1 terminalde çalıştırmayı deneyin, sonucu görmek ilginç.

 
Andrey Khatimlianskii :

Belki tam tersine, her terminal kendi senkronizasyon nesnesini destekleyecek ve bunun için 20 Uzman Danışman kuyruğu olmayacak mı?

1 robotu 1 terminalde çalıştırmayı deneyin, sonucu görmek ilginç.

Ne yazık ki, bu deneyin sonucu ne yapmalı sorusuna cevap vermeyecektir.

 
fxsaber :

Ne yazık ki, bu deneyin sonucu ne yapmalı sorusuna cevap vermeyecektir.

Ticaret robotu kavramını yeniden gözden geçirin

Katma

Çalıştığım 3 terminal + 1 demom var

Her terminalde 3 ila 4 karakter arasında OnBoorEvent kullanan 42 robot bulunur,

artı her 0,5 saniyede bir. zamanlayıcı tetiklenir + her robot terminalin global değişkenlerine erişir,

32 GB RAM'den 8.34 GB kullanılır ve CPU - %6.7

Ve alım satım seanslarının başındaki TM5 sunucusu dışında hiçbir şey yavaşlamıyor.

 
Renat Fatkhullin :

Sayısal verilerin yanı sıra hiçbir kanıt yoktur.

1) Her Uzman Danışman saniyede kaç kez HistorySelect isteğinde bulunuyor?

2) Hangi işlevler yavaşlar?

3) Günlükler?

4) Robotların çalışma prensibi nedir?

Bu soruları cevaplamak benim için çok zor çünkü ben bile çözemiyorum, bu da beni yavaşlatıyor. Profil oluşturucu çalışmaz bile. Gecikme CPU'dan geldiği için ölçümlerini aldatıyorlar. Anlık görüntüler ve önbelleğe alma yoluyla ortam işlevlerine erişimin azaltılması ne yazık ki beklenen etkiyi vermedi. EA'yı derleyebilecek bir profil oluşturucu bekliyorum.


Bu arada, uğraşıyordum, Tester'da ticaret geçmişi olan böyle bir pislik buldum.

 void OnTick ()
{
   static bool FirstRun = true ;
    
   if (FirstRun)
  {
     MqlTick Tick;

     if ( SymbolInfoTick ( _Symbol , Tick) && Tick.ask)
    {
       MqlTradeRequest Request = { 0 };
       MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_PENDING ;
      Request.type = ORDER_TYPE_BUY_LIMIT ;
      Request.symbol = _Symbol ;
      Request.volume = 1 ;
      Request.price = Tick.ask - 10000 * _Point ;

       if ( OrderSend (Request, Result)) // Выставили отложку.
      {
        Request.action = TRADE_ACTION_DEAL ;      
        Request.type = ORDER_TYPE_BUY ;
        Request.price = Tick.ask;
        
        FirstRun = ! OrderSend (Request, Result); // Открыли позицию.
      }
    }
  }

   HistorySelect ( 0 , INT_MAX ); // Результат зависит от этой строки.  
}

// Проверяет наличие ордера в истории торгов.
bool CheckTicket( const long Ticket )
{
   return ( HistoryOrderGetInteger (Ticket, ORDER_TICKET ) == Ticket);
}

#define PRINT(A) Print ( #A + " = " + ( string )(A))

void OnDeinit ( const int )
{
   if ( HistorySelect ( 0 , INT_MAX ))
  {
    PRINT(CheckTicket( 4 )); // true
    PRINT(CheckTicket( 3 )); // true
    PRINT(CheckTicket( 2 )); // false
  }  
}


Sonuç

        AUDCAD : real ticks begin from 2020.07 . 15 00 : 00 : 00
         2020.07 . 15 00 : 01 : 09    buy limit 1 AUDCAD at 0.84993 ( 0.94914 / 0.94993 )
         2020.07 . 15 00 : 01 : 09    market buy 1 AUDCAD ( 0.94914 / 0.94993 )
         2020.07 . 15 00 : 01 : 09    deal # 2 buy 1 AUDCAD at 0.94993 done (based on order # 3 )
         2020.07 . 15 00 : 01 : 09    deal performed [ # 2 buy 1 AUDCAD at 0.94993 ]
         2020.07 . 15 00 : 01 : 09    order performed buy 1 at 0.94993 [ # 3 buy 1 AUDCAD at 0.94993 ]
         2020.07 . 15 23 : 59 : 58    position closed due end of test at 0.94646 [ # 3 buy 1 AUDCAD 0.94993 ]
         2020.07 . 15 23 : 59 : 58    deal # 3 sell 1 AUDCAD at 0.94646 done (based on order # 4 )
         2020.07 . 15 23 : 59 : 58    deal performed [ # 3 sell 1 AUDCAD at 0.94646 ]
         2020.07 . 15 23 : 59 : 58    order performed sell 1 at 0.94646 [ # 4 sell 1 AUDCAD at 0.94646 ]
         2020.07 . 15 23 : 59 : 58    order canceled due end of test [ # 2 buy limit 1 AUDCAD at 0.84993 ]
         final balance 99999653.00 pips
         2020.07 . 15 23 : 59 : 58    CheckTicket( 4 ) = true
         2020.07 . 15 23 : 59 : 58    CheckTicket( 3 ) = true
         2020.07 . 15 23 : 59 : 58    CheckTicket( 2 ) = false


Bu hatayı pek fark etmedim ve bir reprodüksiyon yazmak için bir saatten fazla harcadım. Kod aptalca, ancak sorunu gösteriyor. Test Cihazında değil, Terminalde benzer bir şey olup olmadığı - bilmiyorum.

Arama dizisi : Oshibka 013.


PS b2626 - düzeltildi.

 
prostotrader :

Ticaret robotu kavramını yeniden gözden geçirin

Tüm sembolleri takas eden tek bir robot mu?

 
fxsaber :

Tüm sembolleri takas eden tek bir robot mu?

Farklı robotlar, ancak hepsi yaklaşık olarak aynı şekilde inşa edilmiş.

Aynı zamanda, bir terminalde 42 iş var ve üç - 126'da bu yaklaşık 400 karakter

Katma

tekrar ediyorum (benim için)

Her robot 3 - 4 karakterden OnBoorEvent kullanır,

artı her 0,5 saniyede bir. zamanlayıcı tetiklenir + her robot arar   küresel değişkenler   terminal,

32 GB RAM'den 8.34 GB kullanılır ve CPU - %6.7

Ve işlem seanslarının başında TM5 sunucusu (veya Açıcının donanımı) dışında hiçbir şey yavaşlamıyor.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
prostotrader :

Farklı robotlar, ancak hepsi yaklaşık olarak aynı şekilde inşa edilmiş.

Aynı zamanda, bir terminalde 42 iş var ve üç - 126'da bu yaklaşık 400 karakter

Katma

tekrar ediyorum (benim için)

Her robot 3 - 4 karakterden OnBoorEvent kullanır,

artı her 0,5 saniyede bir. zamanlayıcı tetiklenir + her robot arar   küresel değişkenler   terminal,

32 GB RAM'den 8.34 GB kullanılır ve CPU - %6.7

Ve işlem seanslarının başında TM5 sunucusu (veya Açıcının donanımı) dışında hiçbir şey yavaşlamıyor.

Garip, benim için tam tersi.

4 terminal, Expert Advisors sayısını yaklaşık 200'e düşürdü, OnBook her şeyi attı, OnTick'e geri döndü, donanımı güncelledi, ancak sorunlar hala fxsaber'ınkilerle aynı.

Ancak Otkritie'de sabahları uzun süredir fren yok. Ve onlar neydi! 75 saniyeye kadar bazen ulaşılır :)