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

 
Donanıma bağlı olduğunu anlıyorum.
 
Alexsandr San :
Donanıma bağlı olduğunu anlıyorum.

Hiçbir şey böyle değil!

 2020.05 . 29 15 : 08 : 44.938 Terminal        Windows 7 Service Pack 1 build 7601 , Intel Core i7- 6850 K  @ 3.60 GHz, 23 / 31 Gb memory, 43 / 226 Gb disk, IE 11 , UAC, Admin, GMT+ 3
 
Alexsandr San :
Donanıma bağlı olduğunu anlıyorum.

Ve bence - hayır)))

Ve bilgisayarın iş yükünden bile değil ...

 
prostotrader :

Hiçbir şey böyle değil!

Evet! bir aparatın var ve bir önceki - sonuç farklı - bu yanılıyorum demek, güçten değil demek

 
Aleksey Mavrin :

OnMine nedir? Her bir olay sırayı işlemek için çevrimiçi çağrı yapıyorsa, çevrimiçi olarak sıraya alınmış birden fazla olay nasıl olabilir?

OnMain bir fonksiyondur. Bu gerçek kod değil, özel bir durumdur - " OnMain işlevinin yürütülmesi sırasında mevcut gerçek kuyruğun durumunu bilmenin bir yolu yoktur " iddiasının yanıtıdır. Bu, hesaplamaların kendilerine farklı bir yaklaşımdır.

 
A100 :

OnMain bir fonksiyondur. Bu gerçek kod değil, özel bir durumdur - " OnMain işlevinin yürütülmesi sırasında mevcut gerçek kuyruğun durumunu bilmenin bir yolu yoktur " iddiasının yanıtıdır. Bu, hesaplamaların kendilerine farklı bir yaklaşımdır.

Yani, her ihtimale karşı, OnMain...

:) ;)
 
fxsaber :


Savaş danışmanlarında, şüpheli yerlerde her yerde _B(FuncName(...), AlertTime) işlevleri giydim. İşte en son girişlerden kısa bir günlük özeti.

Zaman sütunu, donmaların ne sıklıkla meydana geldiğini gösterir.

Kavramları değiştiriyorsun.

İşte orijinal ifadeniz:

Ne yazık ki, böyle bir HistorySelect çağrısı 5-30 milisaniye sürer (Bunu Release-EX5'te kendim ölçtüm). OnTick'teki Expert Advisor'da bu tür birkaç güncelleme yapıldığında (iyi bir şekilde, herhangi bir duraklamadan sonra yapılmalıdır. Örneğin, her OrderSend'den sonra), o zaman her şey delicesine pahalı / uzun olur. HistorySelect, bir OnTick'te toplamda birkaç saniye yiyebilir.

Terminalinizde bile, arama başına ortalama 0,2 ms'lik süre, orijinal ifadede belirtilen değerlerden önemli ölçüde daha azdır.

Şimdi, bazen bir işlevin yürütme süresinin ortalamadan belirgin şekilde daha uzun olabileceğini söylüyorsunuz. Bu farklı bir konu.

Herhangi bir HistorySelect() isteği, eşzamanlayıcılar altındaki uçbirim tabanlarına yapılan tam kapsamlı bir çağrıdır. Bu kaçınılmaz. Evet, erişim senkronizasyonunun mevcudiyeti göz önüne alındığında, bu işlev için çok kısa bir yürütme süresi garanti etmek imkansızdır.

HistoryDealsSelect() ve HistoryOrdersSelect() işlevlerini ekleyerek önerilen çözüm bu anlamda hiçbir şeyi değiştirmez.

Maksimum ve ortalama süreyi kontrol etmek için komut dosyası:

 void OnStart ()
  {
   MqlTick Tick;
   SymbolInfoTick ( _Symbol , Tick);
//---
   ulong start,end,max_time= 0 ,avr_time= 0 ;
   int    count= 100000 ;
   for ( int i= 0 ; i<count; i++)
     {
      start= GetMicrosecondCount ();
       HistorySelect (Tick.time, INT_MAX );
      end= GetMicrosecondCount ()-start;
       //--- >1 ms
       if (end> 1000 )
         Print ( " > 1 ms for one HistorySelect: " , DoubleToString (end/ 1000.0 , 2 ), " ms" );
       //---
       if (end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print ( "Last tick time. Selected orders: " , HistoryOrdersTotal (), "; max time: " , DoubleToString (max_time/ 1000.0 , 3 ), " ms; avr time: " , DoubleToString (avr_time/ 1000.0 /count, 3 ), " ms; " ,count, " iterations" );
//---
   Tick.time=(Tick.time/ 86400 )* 86400 ;
   max_time= 0 ;
   for ( int i= 0 ; i<count; i++)
     {
      start= GetMicrosecondCount ();
       HistorySelect (Tick.time, INT_MAX );
      end= GetMicrosecondCount ()-start;
       //--- >1 ms
       if (end> 1000 )
         Print ( " > 1 ms for one last day HistorySelect: " , DoubleToString (end/ 1000.0 , 2 ), " ms" );
       //---
       if (end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print ( "Last day. Selected orders: " , HistoryOrdersTotal (), "; max time: " , DoubleToString (max_time/ 1000.0 , 3 ), " ms; avr time: " , DoubleToString (avr_time/ 1000.0 /count, 3 ), " ms; " ,count, " iterations" );
//---
   HistorySelect ( 0 , INT_MAX );
   Print ( "Orders total: " , HistoryOrdersTotal ());
  }
 2020.05 . 29 17 : 22 : 04.195 TestHistorySelect (EURJPY,H1)   Last tick time. Selected orders: 0 ; max time: 0.034 ms; avr time: 0.001 ms; 100000 iterations
2020.05 . 29 17 : 22 : 06.771 TestHistorySelect (EURJPY,H1)   Last day. Selected orders: 141 ; max time: 0.101 ms; avr time: 0.027 ms; 100000 iterations
2020.05 . 29 17 : 22 : 08.039 TestHistorySelect (EURJPY,H1)   Orders total: 31448
 
Anton :

Maksimum ve ortalama süreyi kontrol etmek için komut dosyası:

Alıntılanandan önce fikriniz hakkında yorum yapmayacağım. İşte betiğinizi çalıştırmanın sonucu.

Daha doğrusu bitmesini bekleyemedim, bu yüzden yineleme sayısını 100K'dan 1K'ya değiştirdim.

        Last tick time. Selected orders: 0 ; max time: 3.880 ms; avr time: 1.315 ms; 1000 iterations
        Last day. Selected orders: 2061 ; max time: 7.131 ms; avr time: 4.309 ms; 1000 iterations
        Orders total: 50113

Tatmin edici bir derecelendirmeye bile layık mı?

Durumun saçmalığına bakarsınız. Fırsatların sayısını aptalca öğrenmek için HistorySelect'i aramanız gerekir! Bu, en hafif tabirle rasyonel değil.


Tehdit Her tıklamada, en fazla, yalnızca HistorySelect nedeniyle toplam onlarca milisaniye harcıyorum.

 
A100 :

En basit haliyle:

Sadece hesaplamalara yönelik yaklaşımı değiştirmeniz gerekir (görev gerektirdiği sıklıkta bir ara dönüş yapın). Ancak zorsa, 1. aşamada OnMain'in sizin için olmadığını düşünün (ana kodu OnMain'e değil, OnTrade2XX'e aktarırsınız), böylece OnMain'de hiçbir şey öğrenmenize gerek kalmaz

Teşekkür ederim, başlangıçta tam olarak böyle anladım ve bu nedenle tam olarak anlamadığımı ifade ettim. Örnek olarak basit bir senaryo kullanacağım.


Bir OrderSend yapıyorsun. OrderSend'in bitiminden HEMEN sonra, belirli bir pozisyon bir alımla kapatılmadıysa, o zaman başka bir OrderSend yaparsınız. Programlanması gereken tüm mantık budur. Zaman uyumsuz kullanılmaz.


Şimdi robotumuz için olan durum. Bir OrderSend gönderdiniz ve yürütülürken limit limiti tetiklendi ve bundan sonra yukarıda bahsettiğimiz pozisyonumuzu alma tetiklendi.


Robotun şematik olarak uygulanması nedir? Bunu, HistorySelect freni veya kodun herhangi bir yerinde tüm işlem geçmişine erişim sağlayan OnTradeTransaction casus koltuk değneği olmadan nasıl uygulayacağımı bilmiyorum. Olay kuyruğuna erişim mekanizması uygulanmış olsaydı, yukarıdaki örnek temel olarak çözülürdü.


Geliştiriciler de dahil olmak üzere MT5'teki tüm güçlüler, lütfen bunun nasıl uygulanacağını gösterin (yukarıdaki iki kalın satır) basit (karmaşık olanlardan bahsetmeye bile korkuyorum) ticaret mantığı.

 
A100 :

OnMain bir fonksiyondur. Bu gerçek kod değil, özel bir durumdur - " OnMain işlevinin yürütülmesi sırasında mevcut gerçek kuyruğun durumunu bilmenin bir yolu yoktur " iddiasının cevabı. Bu, hesaplamaların kendilerine farklı bir yaklaşımdır.

İşte böyle. Ve adamlar bunun hakkında konuşuyorlardı. Bunu uygulamak için, MQL programlarının yürütme yapısını ya a) en az iki iş parçacıklı bir yapıyla değiştirmeniz veya b) kuyruğa erişmek ve onun işlenmesini yönetmek için bir mekanizma eklemeniz gerekir.

Mevcut yapı ile önerilen şema sizin tarafınızdan uygulanamaz.