MQL5'te birlikte öğrenme ve yazma - sayfa 14

 

Merakımdan kontrol ettim. Elde edilen sonuç

 2011.04 . 15 15 : 50 : 34      123 (EURUSD,D1) time for 'd = a + b + c' = 84453 milliseconds, i = 10000000
2011.04 . 15 15 : 51 : 54      123 (EURUSD,D1) time for 'StringAdd()' = 80906 milliseconds, i = 10000000
2011.04 . 15 15 : 53 : 22      123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 87359 milliseconds, i = 10000000
2011.04 . 15 15 : 55 : 11      123 (EURUSD,D1) time for 'd = a + b + c' = 83266 milliseconds, i = 10000000
2011.04 . 15 15 : 56 : 39      123 (EURUSD,D1) time for 'StringAdd()' = 88390 milliseconds, i = 10000000
2011.04 . 15 15 : 58 : 12      123 (EURUSD,D1) time for 'StringConcatenate(d,a,b,c)' = 93391 milliseconds, i = 10000000

Ama bana öyle geliyor ki burada bir tür söve var (bir doğrulama algoritmam var) ...

 

Yedelkin :

StringConcatenate'in , toplama işlemlerini kullanarak dizeleri birleştirmekten daha yavaş olduğu ortaya çıktı. Amaç ne?

Satır özelliği.
İlk geçiş için, toplama ve dize dönüşümlerinin sonucunu depolamak için gerekli arabellek boyutunu alırsınız, yani. d,( string )b ve ( string )c dizileri için arabelleklerin yeniden konumlandırılması yoktur.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы ввода/вывода / Использование кодовой страницы - Документация по MQL5
 
mql5 :
Dize özelliği.
İlk geçiş için, toplama ve dize dönüşümlerinin sonucunu depolamak için gerekli arabellek boyutunu alırsınız, yani. d,( string )b ve ( string )c dizileri için arabelleklerin yeniden konumlandırılması gerçekleşmez.

Farklı karşılaştırma varyantları denendi - istenen sonuç elde edilmedi. Bu koda ulaştım:

   uint    start,stop;
   long    i,length= 1000000 ;
   string a1[ 1000000 ]; for (i= 0 ;i<length;i++) a1[i]= "Пример" ;
   string a2[ 1000000 ]; for (i= 0 ;i<length;i++) a2[i]= "Пример" ;
   string a3[ 1000000 ]; for (i= 0 ;i<length;i++) a3[i]= "Пример" ;

   double b1[ 1000000 ]; ArrayInitialize (b1, 1.26 );
   double b2[ 1000000 ]; ArrayInitialize (b2, 1.26 );
   double b3[ 1000000 ]; ArrayInitialize (b3, 1.26 );

   double c1[ 1000000 ]; ArrayInitialize (c1, 1.27 );
   double c2[ 1000000 ]; ArrayInitialize (c2, 1.27 );
   double c3[ 1000000 ]; ArrayInitialize (c3, 1.27 );

   string d1[ 1000000 ]; for (i= 0 ;i<length;i++) d1[i]= NULL ;
   string d2[ 1000000 ]; for (i= 0 ;i<length;i++) d2[i]= NULL ;
   string d3[ 1000000 ]; for (i= 0 ;i<length;i++) d3[i]= NULL ;


////////////////////////////////////////////////////////////////////////////////
//----------------------------------------------------------------------------//
//Work variables
//----------------------------------------------------------------------------//
   start= GetTickCount ();
   for (i= 0 ;i<length;i++)
     {
      d1[i]=a1[i]+( string )b1[i]+( string )c1[i];
     }
   stop= GetTickCount ();
   Print ( "time for 'd = a + b + c' = " ,(stop-start), " milliseconds, i = " ,i);

//Второй способ
   start= GetTickCount ();
   for (i= 0 ;i<length;i++)
     {
       StringAdd (d2[i],a2[i]);
       StringAdd (d2[i],( string )b2[i]);
       StringAdd (d2[i],( string )c2[i]);
     }
   stop= GetTickCount ();
   Print ( "time for 'StringAdd()' = " ,(stop-start), " milliseconds, i = " ,i);

//Третий способ
   start= GetTickCount ();
   for (i= 0 ;i<length;i++)
     {
       StringConcatenate (d3[i],a3[i],b3[i],c3[i]);
     }
   stop= GetTickCount ();
   Print ( "time for 'StringConcatenate(d,a,b,c)' = " ,(stop-start), " milliseconds, i = " ,i);

Sonuçlar:

KL  0  DoubleToString (EURGBP,M1)       23 : 53 : 01         time for 'd = a + b + c' = 15766 milliseconds, i = 1000000
HD  0  DoubleToString (EURGBP,M1)       23 : 53 : 26         time for 'StringAdd()' = 25390 milliseconds, i = 1000000
FK  0  DoubleToString (EURGBP,M1)       23 : 54 : 03         time for 'StringConcatenate(d,a,b,c)' = 36516 milliseconds, i = 1000000
KS  0  DoubleToString (EURGBP,M1)       23 : 54 : 56         time for 'd = a + b + c' = 15781 milliseconds, i = 1000000
FL  0  DoubleToString (EURGBP,M1)       23 : 55 : 21         time for 'StringAdd()' = 25375 milliseconds, i = 1000000
OR  0  DoubleToString (EURGBP,M1)       23 : 55 : 57         time for 'StringConcatenate(d,a,b,c)' = 35828 milliseconds, i = 1000000
 
Soru. OrdersTotal () işlevi, bir ticaret hesabı için toplam aktif emir sayısını döndürür. Belirli bir sembol için aktif siparişlerin sayısını almanın kolay bir yolu var mı?
 
Yedelkin :
Soru. OrdersTotal () işlevi, bir ticaret hesabı için toplam aktif emir sayısını döndürür. Belirli bir sembol için aktif siparişlerin sayısını almanın kolay bir yolu var mı?
Tüm hikayeyi alın ve bir seçim yapın.
 
Urain :
Tüm hikayeyi alın ve bir seçim yapın.
TAMAM. Yani kolay bir yolu yok.
 

Soru. HistorySelect() ve HistorySelectByPosition() işlevleri, siparişlerin geçmişini ve anlaşmaların geçmişini sorgular. Anlaşma listesinin artan düzende sıralandığı Rehber'den açıklayıcı bir komut dosyası başlattım. Bu bir tesadüf mü, yoksa HistorySelect() ve HistorySelectByPosition() işlevleri, listeleri artan sırada döndürmek üzere programlanmış mı?

 
Yedelkin :

Soru. HistorySelect() ve HistorySelectByPosition() işlevleri, siparişlerin geçmişini ve anlaşmaların geçmişini sorgular. Anlaşma listesinin artan düzende sıralandığı Rehber'den açıklayıcı bir komut dosyası başlattım. Bu bir tesadüf mü, yoksa HistorySelect() ve HistorySelectByPosition() işlevleri, listeleri artan sırada döndürmek üzere programlanmış mı?

Sonuç kaç denemediyse, liste belirli bir şekilde sıralı olarak döndürülür.

Hatta bir keresinde, kayıtların tam olarak nasıl sıralanması gerektiğini belirten ek bir parametrenin yapılması için bir istek yazmak istedim.

Ama sonra iyi düşündüm ve buna değmeyeceğine karar verdim (kendin halledersin diye cevap verebilirler ve tüm bunlar), boşuna yazmamış olsam da ...

 
Interesting :

... kendini ve hepsini sırala

Sadece önceden yüklenmiş bir zorunlu sıralama varsa, bu bir şeydir, ancak manuel olarak ek bir sıralama oluşturmak başka bir şeydir.
 
Yedelkin :
Sadece önceden yüklenmiş bir zorunlu sıralama varsa, bu bir şeydir, ancak manuel olarak ek bir sıralama oluşturmak başka bir şeydir.

Sadece MT4'te manuel olarak sıraladım (ve ayrıca filtreledim), yanılmıyorsam "kabarcıklar" ile sıralama yaptım.

Sıralama kodunu yerel veritabanından aldım, böylece bu açıklığa kavuşturulabilir.

Ancak MQL5'te en iyi nasıl sıralanacağına henüz karar vermedim, çünkü anladığım kadarıyla geçmiş sorguları artık "geçmiş" sekmesine bağlı değil (sıralama ve içerik, kullanıcının sekmede ne yaptığına bağlı değil).