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

 
Andrey Khatimlianskii :

Hayır, CentOS'ta dönen sanal makinelerim var. Ama bu diyaloğu sürdürmek için yetkin değilim.

Hala çift sanallaştırma.

CentOS -> VirtualBox -> Windows 7


İşlemci 8 olduğunda 2 çekirdeğe yapılan bir başka azalma, iş parçacığı zamanlayıcısının davranışını ve tahsis edilen kaynaklarını kökten değiştirir.

Bu 2 çekirdek, Windows 7'nin kesintiye uğramasıyla bile kaçınılmaz 1000 iş parçacığına dağıtılmalıdır. Böylece terminalin gecikme süresinin artması garanti edilir.

 
Renat Fatkhullin :

Pekala, korelasyon ve makullük üzerinde herhangi bir kontrolünüz olmadan stres testleri yapmakta ustasınız.

Elbette mikrosaniye ölçümü, kaynakların bir milisaniyeden 1000 kat daha az aralıkları ölçebilmesini gerektirir.

Periyodik olarak aralıkları çok doğru bir şekilde ölçmeniz gerekiyorsa, mikrosaniye kullanın. Ve size 0 mikrosaniyeye mal olacak.

Tam olarak yavaşladıklarında mikrosaniye nasıl kullanılır?! Burada toplam 20 arama var. Çeşitli pratik görevler için bu kadar saçma sayıda çağrıda çeyrek milisaniye.

 2020.10 . 06 00 : 50 : 44.491 Alert : Time[Test6.mq5 15 : for (inti= 0 ;i< 20 ;i++) GetMicrosecondCount ();] = 254 mсs.
2020.10 . 06 00 : 50 : 44.491 Alert : Time[Test6.mq5 20 : for (inti= 0 ;i< 20 ;i++) GetTickCount ();] = 19 mсs.

Boğulmuş bir VPS'de, sistem zamanlayıcısının timeBeginPeriod boyunca hız aşırtması doludur. Sadece CPU'nun maliyetini artıracaksınız:

Aksi takdirde, işletim sisteminde uzun zaman önce GetTickCount/GetTickCount64'ü doğru yaparlardı ve ücretsiz doğrulukla sevinirlerdi. Ama hayır, bu zamanlayıcının doğruluğu için ödeme yapmanız gerekecek.


GetTickCount hızından daha düşük değil. GetMicrosecondsCount yerine yavaş VPS'de kullanmaya geçildi. Canlı ticarette %50'den indirme %2'ye düştü.

 2020.10 . 06 00 : 50 : 44.491 Alert : Time[Test6.mq5 26 : for (inti= 0 ;i< 20 ;i++) winmm::timeGetTime() ;] = 13 mсs.
 
fxsaber :

Tam olarak yavaşladıklarında mikrosaniye nasıl kullanılır?! Burada toplam 20 arama var. Çeşitli pratik görevler için bu kadar saçma sayıda çağrıda çeyrek milisaniye.

Ve şu 20 çağrım var:

   ulong ticks=GetMicrosecondCount();
   for(int i=0; i<20; i++)
      GetMicrosecondCount();
   Print("GetMicrosecondCount: ",GetMicrosecondCount()-ticks);

   ticks=GetMicrosecondCount();
   for(int i=0; i<20; i++)
      GetTickCount();
   Print("GetTickCount: ",GetMicrosecondCount()-ticks);


2020.10 . 06 01 : 04 : 44.068 5555 (CAT.NYSE,M5)       GetMicrosecondCount : 1
2020.10 . 06 01 : 04 : 44.068 5555 (CAT.NYSE,M5)       GetTickCount : 0


GetTickCount hızından daha düşük değil. GetMicrosecondsCount yerine yavaş VPS'de kullanmaya geçildi. Canlı ticarette %50'den indirme %2'ye düştü.

GetMicrosecondsCount -> GetTickCount'u değiştirmenin gerçek bir programda çalışacağına inanmıyorum. Hem teorik hem de pratik olarak hiçbir kanıt yoktur.

Bu iki fonksiyon üzerinde bir stres testinde bunu kolayca çizebilirsiniz. CPU üzerindeki yükün %48'inin mikrosaniye ölçülerek yapıldığı sonucuna varıyor musunuz? Ve bu bir stres testi değil mi? Tabii ki o en iyisidir.


Multimedya zamanlayıcının hızlanması hakkında - bu, performansın genel bozulmasına bakılmaksızın yine stres testleridir. Görev zamanlayıcının hız aşırtması, işletim sisteminin sistem yükünü artırır.

 
Renat Fatkhullin :

Hala çift sanallaştırma.

CentOS -> VirtualBox -> Windows 7


İşlemci 8 olduğunda 2 çekirdeğe yapılan bir başka azalma, iş parçacığı zamanlayıcısının davranışını ve tahsis edilen kaynaklarını kökten değiştirir.

Bu 2 çekirdek, Windows 7'nin kesintiye uğramasıyla bile kaçınılmaz 1000 iş parçacığına dağıtılmalıdır. Böylece terminalin gecikme süresinin artması garanti edilir.

Aynı sonuca vardım, onay için teşekkürler. VirtualBox kötüdür.
Ve özellikle VPS'ye dikkat etmeniz gerekiyor, böyle bir dağıtımda birçoğu var.
Donanımda yalnızca temiz bir işletim sistemi ve Linux daha iyidir.
Şarap yoluyla olmasına rağmen, aynı sanallaştırma, ancak GUI terminali tek bir gecikme olmadan uçar.
Ve GetMicrosecondsCount gecikmeden döner.  

 
Renat Fatkhullin :

Ve şu 20 çağrım var:

Ve bende sıfır mikrosaniye var! Sadece ev makinesinde.

GetMicrosecondsCount -> GetTickCount değiştirmenin gerçek bir programda vereceğine inanmıyorum. Hem teorik hem de pratik olarak hiçbir kanıt yoktur.

Bu iki fonksiyon üzerinde bir stres testinde bunu kolayca çizebilirsiniz. CPU üzerindeki yükün %48'inin mikrosaniye ölçülerek yapıldığı sonucuna varıyor musunuz? Ve bu bir stres testi değil mi? Tabii ki o en iyisidir.

Bu iş parçacığı, kaynağa bir hız testi yerleştirebilmeniz için bir Benchmark kitaplığı yazmamı istedi. Ve bundan oldukça geniş bir şekilde yararlandı, birçok kötü şeyi belirleyip ortadan kaldırdı.

Böylece, danışman bu şekilde yaladı (daha doğrusu, paralel olarak 20 parça) ev bilgisayarını% 1.5 oranında yükler. Ama VPS %50+. Kazmaya başladım ve mikrosaniye zamanlayıcının yavaşladığını gördüm. Buna göre ev makinesinde uyarıların çalışmadığı yerlerde VPS'ye yağmur yağdı.


Ama bu bile yeterli değil. Bu dal sayesinde, temeli bu olan bir anlık görüntü mekanizması geliştirildi.

   ulong Snapshot( const uint &RefreshTime, const MAGIC_TYPE &Magic, bool HistoryInit = false )
  {
     if ( SNAPSHOT::SnapshotLifeTime() < RefreshTime )
       return ( 0 );
// ....

   ulong SnapshotLifeTime( void ) const
  {
     static const bool IsTester = :: MQLInfoInteger ( MQL_TESTER );

     return (IsTester ? ULONG_MAX : ( :: GetMicrosecondCount () - this .TimeData)); // Обязуем любой вызов снепшота в Тестере делать полноценным.
  }

Bu, herhangi bir anlık görüntünün temelidir: son anlık görüntüden bu yana belirtilen süreden daha az zaman geçmişse, hiçbir şey yapmayız. Kaynaklardan önemli ölçüde tasarruf etmenizi sağlayan bu yaklaşımdır.

Elbette güncelleme süresi kısadır - varsayılan olarak bir milisaniyedir. Bu nedenle, bir mikrosaniye zamanlayıcı kullanılır.


Yani, bu zamanlayıcının frenleri nedeniyle, anlık görüntü mekanizması yok edildi, çünkü. tam teşekküllü bir anlık görüntü, tam teşekküllü bir makineden daha sık / iki büyüklük sırası yapıldı.


Bunlar mikrosaniye zamanlayıcının frenlerinden gelen turtalar. Ancak milisaniyeye geçtiğimde (16 ms değil), her şey bir fren VPS'sinde bile uçmaya başladı.

Multimedya zamanlayıcının hızlanması hakkında - bu, performansın genel bozulmasına bakılmaksızın yine stres testleridir. Görev zamanlayıcının hız aşırtması, işletim sisteminin sistem yükünü artırır.

Evet, pratikte büyük bir kazanç varsa, bu teorileri umursamayın. Belki bazı oyunları etkiler. Ancak bir VPS'de, bu bir tasarruf samanıydı.

 
fxsaber :

Ve bende sıfır mikrosaniye var! Sadece ev makinesinde.

Bu iş parçacığı, kaynağa bir hız testi yerleştirebilmeniz için bir Benchmark kitaplığı yazmamı istedi. Ve bundan oldukça geniş bir şekilde yararlandı, birçok kötü şeyi belirleyip ortadan kaldırdı.

Böylece, danışman bu şekilde yaladı (daha doğrusu, paralel olarak 20 parça) ev bilgisayarını% 1.5 oranında yükler. Ama VPS %50+. Kazmaya başladım ve mikrosaniye zamanlayıcının yavaşladığını gördüm. Buna göre ev makinesinde uyarıların çalışmadığı yerlerde VPS'ye yağmur yağdı.


Ama bu bile yeterli değil. Bu dal sayesinde, temeli bu olan bir anlık görüntü mekanizması geliştirildi.

Bu, herhangi bir anlık görüntünün temelidir: son anlık görüntünün üzerinden belirtilen süreden daha az zaman geçmişse, hiçbir şey yapmayız. Kaynaklardan önemli ölçüde tasarruf etmenizi sağlayan bu yaklaşımdır.

Elbette güncelleme süresi kısadır - varsayılan olarak bir milisaniyedir. Bu nedenle, bir mikrosaniye zamanlayıcı kullanılır.


Yani, bu zamanlayıcının frenleri nedeniyle, anlık görüntü mekanizması yok edildi, çünkü. tam teşekküllü bir anlık görüntü, tam teşekküllü bir makineden daha sık bir büyüklük sırası yapıldı.


Bunlar mikrosaniye zamanlayıcının frenlerinden gelen turtalar. Ancak milisaniyeye geçtiğimde (16 ms değil), her şey bir fren VPS'sinde bile uçmaya başladı.

Evet, pratikte büyük bir kazanç varsa, bu teorileri umursamayın. Belki bazı oyunları etkiler. Ancak bir VPS'de, bu bir tasarruf samanıydı.

Bak ne güzel söylemiş:

GetMicrosecondsCount yerine yavaş VPS'de kullanmaya geçildi. Canlı ticarette %50'den indirme %2'ye düştü.

Sonuç, "hepsi mikrosaniye ölçümünün frenleri yüzünden, hızlanma budur" idi.

Ve aniden ortaya çıktı "Ben kendim, mantıksal bir hata nedeniyle, hesaplamaları bir büyüklük sırası daha yaptım." Ve GetMicrosecondsCount bu hatanın yalnızca tetikleyicisiydi.

GetTickCount'taki değişiklik, bu hata için bir düzeltme/koltuk değneğidir ve düzeltme kodu gösterilmemiştir. Çünkü sadece bir yedek GetMicrosecondsCount -> GetTickCount yok mu?

Neden hemen söylemedin?


Mantığa göre, hızlanma, muhasebenin açık bir şekilde kabalaştırılması (mikrosaniyeden milisaniyeye bir sıçrama) ve anlık görüntülerin oluşturulmasında çoklu bir azalma nedeniyle elde edildi.
 
Bununla daha az karşılaşmak için hala bir SymbolInfoTick anlık görüntüsünün uygunluğunu düşünüyorum.
 2020.10 . 05 12 : 52 : 35.963          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 599 mсs.
2020.10 . 05 12 : 52 : 45.904          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 245 mсs.
2020.10 . 05 12 : 52 : 45.904          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 470 mсs.
2020.10 . 05 12 : 52 : 45.904          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 722 mсs.
2020.10 . 05 12 : 52 : 45.904          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 901 mсs.
2020.10 . 05 12 : 52 : 45.905          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 1726 mсs.
2020.10 . 05 12 : 53 : 00.123          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 864 mсs.
2020.10 . 05 12 : 53 : 03.218          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 112 mсs.
2020.10 . 05 12 : 53 : 04.493          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 2134 mсs.
2020.10 . 05 12 : 53 : 10.013          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 1826 mсs.
2020.10 . 05 12 : 53 : 13.119          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 114 mсs.
2020.10 . 05 12 : 53 : 18.008          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 116 mсs.
2020.10 . 05 12 : 53 : 20.010          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 1095 mсs.
2020.10 . 05 12 : 55 : 55.033          Alert : Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 359 mсs.

Bu, 20 EA'yı %1,5 CPU ile öğüten bir makinede. Hangi LatencyMon her şeyin yolunda olduğunu gösterir.

MT5 mimarisindeki bir şey, aynı anda çalışan tüm Uzman Danışmanlara bu tür gecikmeler veriyor. Ve hiçbirim.

 
Renat Fatkhullin :

GetTickCount'taki değişiklik, bu hata için bir düzeltme/koltuk değneğidir ve düzeltme kodu gösterilmemiştir. Çünkü sadece bir yedek GetMicrosecondsCount -> GetTickCount yok mu?

Neden hemen söylemedin?

Benimle yapılan tartışmalar, gösterilecek olanın varlığıyla hala ayırt ediliyor. Hiçbir şey gizli değil, aksine açıkça yayınlanıyor .

Kesinlikle bir stres testi var. Bunu açıkça göstermenin başka yolu yoktu.


Bir oyuncak bebek şeklinde bir işlev hayal edin. Dış matryoshka ölçülür. Aynı zamanda, iç matruşkalardan da ölçümler yapılır. Sonuç olarak, mikrosaniyelik frenler nedeniyle, harici matryoshka'lar yürütme süresi açısından vahşi sayılar gösterir ve bu da aynı tür Uyarıların telaşına neden olur. Açıkçası, GetMicrosecondsCount'a yapılan çağrı başına 10 mikrosaniye çok pahalıdır. Bu yüzden uyarılar gönderdi.


Serbest kaba milisaniye zamanlayıcı 0 µs veya 1000 µs veya 2000 µs vermeye başladı. Bu, Uyarıların sayısını büyük ölçüde azalttı ve zamanlayıcı işlevlerine yapılan çağrılarda frenleri azalttı.


Mantığa göre, hızlanma, muhasebenin açık bir şekilde kabalaştırılması (mikrosaniyeden milisaniyeye bir sıçrama) ve anlık görüntülerin oluşturulmasında çoklu bir azalma nedeniyle elde edildi.


Anlık görüntülerle genellikle harika. Ev makinesiyle karşılaştırıldığında (mikrosaniyeler vardır) kabalaşma güçlü değildir. Ancak, cennet ve dünya gibi VPS'de olanlarla karşılaştırıldığında.


PS Şimdi MQL'de ne yazık ki mevcut olmayan bir milisaniye zamanlayıcıya sahip olmanın uygunluğundan bahsediyoruz. Onsuz, VPS'ye anlık görüntü almak imkansızdır.

 
fxsaber :
Bununla daha az karşılaşmak için hala bir SymbolInfoTick anlık görüntüsünün uygunluğunu düşünüyorum.

Bu, 20 EA'yı %1,5 CPU ile öğüten bir makinede. Hangi LatencyMon her şeyin yolunda olduğunu gösterir.

MT5 mimarisindeki bir şey, aynı anda çalışan tüm Uzman Danışmanlara bu tür gecikmeler veriyor. Ve hiçbirim.

İşte kodum ve kararlı yürütme sürem: paralel olarak 20 grafikte yüzlerce ve binlerce mikrosaniye yok

   MqlTick Tick;
   ulong    ticks= GetMicrosecondCount ();
   
   SymbolInfoTick ( _Symbol ,Tick);
   Print (" SymbolInfoTick : ", GetMicrosecondCount ()-ticks);


2020.10.06 02:14:18.234	5555 (CADJPY,H1)	SymbolInfoTick: 2
2020.10.06 02:14:18.765	5555 (EURNZD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:19.063	5555 (EURNZD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:19.180	5555 (CADJPY,H1)	SymbolInfoTick: 2
2020.10.06 02:14:19.180	5555 (EURCAD,H1)	SymbolInfoTick: 1
2020.10.06 02:14:19.245	5555 (EURNZD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:19.523	5555 (CHFJPY,H1)	SymbolInfoTick: 1
2020.10.06 02:14:19.659	5555 (EURNZD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:20.037	5555 (CADCHF,H1)	SymbolInfoTick: 2
2020.10.06 02:14:20.037	5555 (EURNZD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:20.137	5555 (EURMXN,H1)	SymbolInfoTick: 2
2020.10.06 02:14:20.138	5555 (EURNOK,H1)	SymbolInfoTick: 2
2020.10.06 02:14:20.226	5555 (EURNZD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:20.227	5555 (CHFJPY,H1)	SymbolInfoTick: 2
2020.10.06 02:14:20.525	5555 (AUDNZD,H1)	SymbolInfoTick: 1
2020.10.06 02:14:20.645	5555 (EURNZD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:20.919	5555 (EURNZD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:21.123	5555 (EURNZD,H1)	SymbolInfoTick: 1
2020.10.06 02:14:21.129	5555 (EURAUD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:21.234	5555 (EURNOK,H1)	SymbolInfoTick: 1
2020.10.06 02:14:21.441	5555 (EURAUD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:22.299	5555 (EURNZD,H1)	SymbolInfoTick: 2
2020.10.06 02:14:22.383	5555 (AUDNZD,H1)	SymbolInfoTick: 2


Kaç çekirdek ve hangi işlemci var? i7-2600?

Milyonlarca paralel istekle tekrar gizli stres testi mi?


Şeffaf olun. Birkaç basit _B çağrısı göndermiş olmanız, diğer iddialarınızın kanıtı değil. Tuhaf açıklamalar yapar yapmaz, kodu ve koşulların gerçek tanımını aniden unutuyorsunuz.

Aklınızda herhangi bir şey hayal etmenize gerek yok - gerçekten ne aradığınızı ve test ettiğinizi söyleyin ve gösterin. Yırtık sonuç "bilinmeyen bir stres testi başlattı ve dünyaya göstermek için bir uyarı bekliyor" değil, testin tam kodu.

Ölçüm kitaplığının kendisi hakkında da sorular var. Birdenbire, gereksiz şeyler, tepegöz de dahil olmak üzere berbat durumda.

 
fxsaber :

PS Şimdi MQL'de maalesef mevcut olmayan bir milisaniye zamanlayıcıya sahip olmanın uygunluğundan bahsediyoruz. Onsuz, VPS'ye anlık görüntü almak imkansızdır.

Milisaniye zamanlayıcı uzun süredir var: EventSetMillisecondTimer()

Документация по MQL5: Работа с событиями / EventSetMillisecondTimer
Документация по MQL5: Работа с событиями / EventSetMillisecondTimer
  • www.mql5.com
Указывает клиентскому терминалу, что для данного эксперта или индикатора необходимо генерировать события таймера с периодичностью менее одной секунды. нужно получать события таймера чаще, чем один раз в секунду. Если вам достаточно обычного таймера с периодом более 1 секунды, то используйте EventSetTimer(). В тестере стратегий используется...