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

 
Rorschach :
Gerçek zamanlı çekirdek bir şekilde yardımcı olabilir mi?

Açıkça daha fazla çekirdek yükleyin ve durumu tek çekirdek indirmelerinin %100'üne getirmeyin.

Peri masallarına inanmayın, işlemciler ve iş parçacığı zamanlayıcılar hayal ettiğiniz gibi çalışmıyor.

 
Anton :

Son sürümlerde, bir kene akışı almak teorik olarak bile etkilemez. Pratikte, SymbolInfoTick zaten önbellekle çalışıyor , ancak bireysel vatandaşlar kara kedi aramaya devam ediyor.

Ve testte %80 bile yok. 4 çekirdek üzerinde 6 ajan var, yani. %100 garantilidir.

Tek soru, sisteminin görev zamanlayıcısının bu durumla nasıl başa çıktığıdır. Aynı zamanda, suçlanacak olanın terminalin uygulanması olduğu yönünde açıklamalar yapılıyor.

Onlar. bilgisayar ölçüsüzce yüklendiğinde, kelimenin tam anlamıyla her şey yavaşladığında yapay olarak bir durum yaratılır ve ardından "ah, bak, neden terminalin bazen orada geciktiği" tarzında ifadeler yapılır.

Gözlerimizi kapatalım, bu koşullarda bile "yaklaşık %0,01" - ayrıntıların canı cehenneme! "Hastanedeki ortalama sıcaklık kimseyi rahatsız etmiyor", "gecikmeler ticaret sırasında sorun yaratıyor" ve "HFT istiyoruz" demeniz yeterli.

Ayrıca, elbette, HFT'nin eski bir ofis masaüstünde veya ölü bir sanal makinede 20 uzmanın içinde olmasını istiyoruz.

Uygulamasında PS PositionSelectByTicket(), erişim senkronizasyonu ile koşulsuz olarak paylaşılan bir kaynağa erişime sahiptir. Ve her aramada pozisyonu seçmezseniz, eski fiyatı okuyorsunuz. SymbolInfoDouble aracılığıyla bir "anlık görüntü" yapmak daha kolaydı.

Teşekkür ederim

sorum ortaya çıktı çünkü yarım yıl önce kodu optimize ettim ve sistem işlevlerinin hızını test ettim, yarım yıl önce SymbolInfoDouble SymbolInfoTick'ten daha yavaştı

ama genel olarak, muhtemelen doğruyu söylüyorsunuz, bugün özellikle çok çekirdekli işlemcilerin önbelleği hakkında birkaç makaleyi google'da arattım (uzun zamandır bu bilgiyle ilgilenmiyordum),

işte kısa bir makale https://i2hard.ru/publications/25666/

Sonuç olarak, ALU'nun yalnızca çok küçük olan L1 önbelleğinden veri almasıdır ve işlemciyi sonuna kadar yüklerseniz, o zaman gerçekten - test bir işletim sistemi testi + hız testine dönüşecektir . işlemci önbelleği (yükler, tahminler L1 + L3 verileri), ancak kodun (uygulamanın) performans testinde değil

 

fxsaber , görev yöneticisinde aracılar için düşük bir öncelik ve MT5 için yüksek bir öncelik ayarlarsanız ne olur?

Tüm işletim sistemi programları / iş parçacıkları için belirli bir CPU iş parçacığı biçiminde bir kaynağın tahsisini engelleyecek bir yardımcı program bulamıyorum, aksi takdirde MT5 için bir iş parçacığı rezerve etmek ve diğer programlar için işgalini otomatik olarak engellemek mümkün olurdu, bu teorik olarak gecikmeleri azaltabilir.

 
Anton :

Son sürümlerde, bir kene akışı almak teorik olarak bile etkilemez. Pratikte, SymbolInfoTick zaten önbellekle çalışıyor , ancak bireysel vatandaşlar kara kedi aramaya devam ediyor.

Bireysel bir vatandaş aldı   geniş pantolonlardan   Aynı koşullar altında koltuk değneğinin standart işlevden daha hızlı çalıştığını gösteren paha biçilmez kargo MQL kodunun bir kopyası .

Ama işlevinizin iyi olduğunu iddia ediyorsunuz, sadece kullanım şartlarında kısıtlamalar var.

Ve testte %80 bile yok. 4 çekirdek üzerinde 6 ajan var, yani. %100 garantilidir.

Tek soru, sisteminin görev zamanlayıcısının bu durumla nasıl başa çıktığıdır. Aynı zamanda, suçlanacak olanın terminalin uygulanması olduğu yönünde açıklamalar yapılıyor.

Onlar. bilgisayar ölçüsüzce yüklendiğinde, kelimenin tam anlamıyla her şey yavaşladığında yapay olarak bir durum yaratılır ve ardından "ah, bak, neden terminalin bazen orada geciktiği" tarzında ifadeler yapılır.

6/8 - hiçbir şey yavaşlamaz. Tarayıcılar, derleme, hata ayıklama vb. herhangi bir fren ipucu olmadan paralel pulluk.

Ama şimdi Ajan'ın sadece 4/8'ini bırakarak her şeyi bilerek kapattım. İşlevinizin frenlerinde durum değişmedi.

Ayrıca, elbette, HFT'nin eski bir ofis masaüstünde veya ölü bir sanal makinede 20 uzmanın içinde olmasını istiyoruz.

Hızlı bir araba kullanıldı. Ve sadece 6 çizelge zaten fren yaptı.

Uygulamasında PS PositionSelectByTicket(), erişim senkronizasyonu ile koşulsuz olarak paylaşılan bir kaynağa erişime sahiptir. Ve her aramada pozisyonu seçmezseniz, eski fiyatı okuyorsunuz. SymbolInfoDouble aracılığıyla bir "anlık görüntü" yapmak daha kolaydı.

Ve bunu kullanıyorum.

 // Снепшот SymbolInfoTick для текущего символа.
bool SymbolInfoTick ( MqlTick &Tick )
{
   static MqlTick PrevTick = { 0 };
   static ulong PrevTime = 0 ;
  
   const ulong NewTime = GetMicrosecondCount ();
   const bool Res = (NewTime - PrevTime < 1000 ) || (:: SymbolInfoTick ( _Symbol , PrevTick) && ( bool )(PrevTime = NewTime));
  
  Tick = PrevTick;
  
   return (Res);
}
 

Terminalde sorunlar olduğunda muharebe performansında hangi hızdan bahsedebiliriz.

Uzman Danışman, tüm finansal araçları tarar ve belirli bir model arar.

Bir finansal araca çarpar ve sımsıkı sarılır!!!

Yardımdan gelen kod, sadece adımları, problemli fin aracını ve zamanlayıcıyı koydum:

 //+------------------------------------------------------------------+ 
//|                                              TestLoadHistory.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link        "https://www.mql5.com" 
#property version    "1.02" 
#property script_show_inputs 
//--- input parameters 
input string           InpLoadedSymbol= "RTSCHH1" ;   // Symbol to be load 
input ENUM_TIMEFRAMES InpLoadedPeriod= PERIOD_H1 ;   // Period to be load 
input datetime         InpStartDate= D'2006.01.01' ; // Start date 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart () 
  { 
   Print ( "Start load" ,InpLoadedSymbol+ "," +GetPeriodName(InpLoadedPeriod), "from" ,InpStartDate); 
//--- 
   int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate); 
   switch (res) 
     { 
       case - 1 : Print ( "Unknown symbol " ,InpLoadedSymbol);             break ; 
       case - 2 : Print ( "Requested bars more than max bars in chart " ); break ; 
       case - 3 : Print ( "Program was stopped " );                         break ; 
       case - 4 : Print ( "Indicator shouldn't load its own data " );       break ; 
       case - 5 : Print ( "Load failed " );                                 break ; 
       case    0 : Print ( "Loaded OK " );                                   break ; 
       case    1 : Print ( "Loaded previously " );                           break ; 
       case    2 : Print ( "Loaded previously and built " );                 break ; 
       default : Print ( "Unknown result " ); 
     } 
//--- 
   datetime first_date; 
   SeriesInfoInteger (InpLoadedSymbol,InpLoadedPeriod, SERIES_FIRSTDATE ,first_date); 
   int bars= Bars (InpLoadedSymbol,InpLoadedPeriod); 
   Print ( "First date " ,first_date, " - " ,bars, " bars" ); 
//--- 
  } 
//+------------------------------------------------------------------+ 
//|                                                                  | 
//+------------------------------------------------------------------+ 
int CheckLoadHistory( string symbol, ENUM_TIMEFRAMES period, datetime start_date) 
  { 
   Print ( " === 1 === " );
   datetime first_date= 0 ; 
   datetime times[ 100 ]; 
//--- check symbol & period 
   if (symbol== NULL || symbol== "" ) symbol= Symbol (); 
   if (period== PERIOD_CURRENT )     period= Period (); 
//--- check if symbol is selected in the MarketWatch 
   if (! SymbolInfoInteger (symbol, SYMBOL_SELECT )) 
     { 
       if ( GetLastError ()== ERR_MARKET_UNKNOWN_SYMBOL ) return (- 1 ); 
       SymbolSelect (symbol, true ); 
     } 
     
     ulong time = GetMicrosecondCount ();
     Print ( " === 2 === " ,first_date);
//--- check if data is present 
   bool date = SeriesInfoInteger (symbol,period, SERIES_FIRSTDATE ,first_date); 
   
   Print ( " === 2.1 === " ,(time - GetMicrosecondCount ()));
   
   if (first_date> 0 && first_date<=start_date) return ( 1 ); 
//--- don't ask for load of its own data if it is an indicator 

Print ( " === 2.2 === " );
   if ( MQL5InfoInteger ( MQL5_PROGRAM_TYPE )== PROGRAM_INDICATOR && Period ()==period && Symbol ()==symbol) 
       return (- 4 ); 
//--- second attempt 
Print ( " === 2.3 === " );
   if ( SeriesInfoInteger (symbol, PERIOD_M1 , SERIES_TERMINAL_FIRSTDATE ,first_date)) 
     { 
       //--- there is loaded data to build timeseries 
       Print ( " === 2.4 === " );
       if (first_date> 0 ) 
        { 
         //--- force timeseries build 
         CopyTime (symbol,period,first_date+ PeriodSeconds (period), 1 ,times); 
         //--- check date 
         Print ( " === 2.5 === " );
         if ( SeriesInfoInteger (symbol,period, SERIES_FIRSTDATE ,first_date)) 
             if (first_date> 0 && first_date<=start_date) return ( 2 ); 
        } 
     } 
     
     Print ( " === 3 === " );
     
//--- max bars in chart from terminal options 
   int max_bars= TerminalInfoInteger ( TERMINAL_MAXBARS ); 
//--- load symbol history info 
   datetime first_server_date= 0 ; 
   while (! SeriesInfoInteger (symbol, PERIOD_M1 , SERIES_SERVER_FIRSTDATE ,first_server_date) && ! IsStopped ()) 
       Sleep ( 5 ); 
//--- fix start date for loading 

Print ( " === 4 === " );


   if (first_server_date>start_date) start_date=first_server_date; 
   if (first_date> 0 && first_date<first_server_date) 
       Print ( "Warning: first server date " ,first_server_date, " for " ,symbol, 
             " does not match to first series date " ,first_date); 
//--- load data step by step 

Print ( " === 5 === " );

   int fail_cnt= 0 ; 
   while (! IsStopped ()) 
     { 
       //--- wait for timeseries build 
       while (! SeriesInfoInteger (symbol,period, SERIES_SYNCHRONIZED ) && ! IsStopped ()) 
         Sleep ( 5 ); 
       //--- ask for built bars 
       int bars= Bars (symbol,period); 
       if (bars> 0 ) 
        { 
         if (bars>=max_bars) return (- 2 ); 
         //--- ask for first date 
         if ( SeriesInfoInteger (symbol,period, SERIES_FIRSTDATE ,first_date)) 
             if (first_date> 0 && first_date<=start_date) return ( 0 ); 
        } 
       //--- copying of next part forces data loading 
       int copied= CopyTime (symbol,period,bars, 100 ,times); 
       if (copied> 0 ) 
        { 
         //--- check for data 
         if (times[ 0 ]<=start_date)   return ( 0 ); 
         if (bars+copied>=max_bars) return (- 2 ); 
         fail_cnt= 0 ; 
        } 
       else 
        { 
         //--- no more than 100 failed attempts 
         fail_cnt++; 
         if (fail_cnt>= 100 ) return (- 5 ); 
         Sleep ( 10 ); 
        } 
     } 
     
     Print ( " === 6 === " );
//--- stopped 
   return (- 3 ); 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает строкое значение периода                              | 
//+------------------------------------------------------------------+ 
string GetPeriodName( ENUM_TIMEFRAMES period) 
  { 
   if (period== PERIOD_CURRENT ) period= Period (); 
//--- 
   switch (period) 
     { 
       case PERIOD_M1 :   return ( "M1" ); 
       case PERIOD_M2 :   return ( "M2" ); 
       case PERIOD_M3 :   return ( "M3" ); 
       case PERIOD_M4 :   return ( "M4" ); 
       case PERIOD_M5 :   return ( "M5" ); 
       case PERIOD_M6 :   return ( "M6" ); 
       case PERIOD_M10 : return ( "M10" ); 
       case PERIOD_M12 : return ( "M12" ); 
       case PERIOD_M15 : return ( "M15" ); 
       case PERIOD_M20 : return ( "M20" ); 
       case PERIOD_M30 : return ( "M30" ); 
       case PERIOD_H1 :   return ( "H1" ); 
       case PERIOD_H2 :   return ( "H2" ); 
       case PERIOD_H3 :   return ( "H3" ); 
       case PERIOD_H4 :   return ( "H4" ); 
       case PERIOD_H6 :   return ( "H6" ); 
       case PERIOD_H8 :   return ( "H8" ); 
       case PERIOD_H12 : return ( "H12" ); 
       case PERIOD_D1 :   return ( "Daily" ); 
       case PERIOD_W1 :   return ( "Weekly" ); 
       case PERIOD_MN1 : return ( "Monthly" ); 
     } 
//--- 
   return ( "unknown period" ); 
  }

İşin sonucu:

 2020.10 . 28 11 : 18 : 08.067 Test (FUTBRNJAN21,M1)   Start loadRTSCHH1,H1from2006. 01.01 00 : 00 : 00
2020.10 . 28 11 : 18 : 08.067 Test (FUTBRNJAN21,M1)    === 1 === 
2020.10 . 28 11 : 18 : 08.067 Test (FUTBRNJAN21,M1)    === 2 === 1970.01 . 01 00 : 00 : 00
2020.10 . 28 11 : 22 : 01.741 Test (FUTBRNJAN21,M1)    === 2.1 === 18446744073475877138    Время выполнения SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date); 
2020.10 . 28 11 : 22 : 01.741 Test (FUTBRNJAN21,M1)    === 2.2 === 
2020.10 . 28 11 : 22 : 01.741 Test (FUTBRNJAN21,M1)    === 2.3 === 
2020.10 . 28 11 : 22 : 01.741 Test (FUTBRNJAN21,M1)    === 3 === 

Komut dosyasının yürütülmesinin sonunu beklemedim.

Terminalde bu tür hatalar olduğu sürece, herhangi bir savaş performansından söz edilemez !!!

Bir finansal araç piyasaya girdiğinde, en azından tüm özelliklerinin ve tarihin başlangıç tarihinin onun tarafından çekilmesi bekleniyordu. Sunucuda geçmiş yoksa, o zaman

 SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)

Anında NULL döndürmeli, yürütme süresi neden 18446744073475877138 ?


Belki ne bilmiyorum? CopyXXX işlevleri de 16-29 saniye donar!!!

Bir komisyoncunun 3000-6000 finansal enstrümanı olması normal değildir.

 
Vladimir Pastushak :

Belki ne bilmiyorum? CopyXXX işlevleri de 16-29 saniye donar!!!

Bir komisyoncunun 3000-6000 finansal enstrümanı olması normal değildir.

Barlar kötüdür. Bu nedenle, lütfen onlar hakkında başka bir başlıkta yayınlayın.

 
fxsaber :

Barlar kötüdür. Bu nedenle, lütfen onlar hakkında başka bir başlıkta yayınlayın.

Belki bir finansal enstrümanı programlı olarak nasıl seçeceğinizi ve yüzyıllarca takılıp kalmayacağınızı biliyorsunuzdur?

 
Vladimir Pastushak :

Belki bir finansal enstrümanı programlı olarak nasıl seçeceğinizi ve yüzyıllarca takılıp kalmayacağınızı biliyorsunuzdur?

Bu sorunla karşılaşmadım.

 
Aleksey Vyazmikin :

fxsaber , görev yöneticisinde aracılar için düşük bir öncelik ve MT5 için yüksek bir öncelik ayarlarsanız ne olur?

Tüm işletim sistemi programları / iş parçacıkları için belirli bir CPU iş parçacığı biçiminde bir kaynağın tahsisini engelleyecek bir yardımcı program bulamıyorum, aksi takdirde MT5 için bir iş parçacığı rezerve etmek ve diğer programlar için işgalini otomatik olarak engellemek mümkün olurdu, bu teorik olarak gecikmeleri azaltabilir.

Tüm Aracılar için en düşük önceliği ayarlayın.

yardımcı olmuyor


Tehdit Sonuç, çalışan danışman sayısından etkilenir.

 

Sevgili geliştiriciler, MQL_MEMORY_USED'in nasıl hesaplandığını bize anlatır mısınız?

Tüm EA değişkenlerinin kapladığı belleği hesapladım.

 MQL_MEMORY_USED = 60 MB , Virtual = 3.40 MB ( 5.7 %)

Bu %10'dan az. Doğru anlarsam, MQL_MEMORY_USED, Geçmiş önbelleğini ve CopyTicks önbelleğini içerir. Ama yine de çok daha az sürmelidir.

Aynı zamanda, paralel danışman birkaç kat daha az yer. Prensip aynı olmasına rağmen.

Genel olarak, bu değere neler dahildir?


Not: Şablonu danışmanla birlikte kaydettim ve aynı grafiğe uygulayarak yeniden başlatmaya neden oldum. Öyle oldu.

 MQL_MEMORY_USED = 7 MB , Virtual = 3.40 MB ( 48.6 %)

Bellek tüketimi neredeyse büyüklük sırasına göre değişti. Bunun ne anlama geldiğini açıklamak zor.