Hatalar, hatalar, sorular - sayfa 2099

 
Vladimir Pastushak :
Arkadaşlar MT5'te android'de www.mql5.com'dan sürekli login ve password girmekten bıktım usandım
Neden sürekli düşüyorlar???

Ayrıca bana düzenli olarak soruyor, ancak giriş / şifremi girmiyorum, sadece Geri düğmesine basın ve giriş yapmış olduğu ortaya çıkıyor.

 
Nikolai Semko :

ChartXYToTimePrice() gibi çok kullanışlı bir işlev, yürütme süresi açısından neden bu kadar pahalıdır?

Bir fonksiyon yazdım - XYToTimePrice () 'nin bir analogu ve çok daha hızlı çalışıyor. Birkaç yüz kata kadar daha hızlı.

Yani orijinalde SubWindow_out ile ChartID_in de var. Tam bir analog yapın.

 
fxsaber :

Yani orijinalde SubWindow_out ile ChartID_in de var. Tam bir analog yapın.


ChartID_in ve SubWindow_out eklemek hiç de zor değil. Ama ben tam bir analog yaratma amacını gütmüyorum, bu fonksiyonu sadece ChartXYToTimePrice()'in yavaşlığını göstermek için yarattım.

 void XYToTimePrice( long chart_id, int x, int y, int & sub_window, datetime &time, double &price, int id)
  {
   static int left_bar; // номер самого левого бара на экране
   static int WidBar;
   static int Wid;
   static int Hei;
   static double y_min;
   static double y_max;
   static int PerSec= PeriodSeconds ();
   static bool ChartChange= true ;
   if (id== CHARTEVENT_CHART_CHANGE ) { ChartChange= true ; return ; } 
   if (ChartChange) // если было изменение чатра после последнего вычисления
     {
      left_bar=( int ) ChartGetInteger (chart_id, CHART_FIRST_VISIBLE_BAR , sub_window);         // номер самого левого бара на экране
      Wid=( int ) ChartGetInteger (chart_id, CHART_WIDTH_IN_PIXELS , sub_window);               // ширина экрана в пикселях
      WidBar=( int ) ChartGetInteger (chart_id, CHART_WIDTH_IN_BARS , sub_window);               // ширина экрана в барах
      Hei=( int ) ChartGetInteger (chart_id, CHART_HEIGHT_IN_PIXELS , sub_window);               // высота экрана в пикселях
      y_min= ChartGetDouble (chart_id, CHART_PRICE_MIN , sub_window);                         // макс. цена на экране
      y_max= ChartGetDouble (chart_id, CHART_PRICE_MAX , sub_window);                         // мин. цена на экране
     }
   if (x>Wid || x< 0 || y< 0 || y>Hei) return ;   // выходим если точка (x,y) за пределами экрана
   price=y_min+(Hei-y)*(y_max-y_min)/Hei;
   int NrBar=left_bar-( int )(( double )x/(( double )Wid/( double )WidBar)); 
   datetime T[ 1 ];
   if (NrBar>= 0 ) CopyTime ( NULL , 0 ,NrBar, 1 ,T);
   else { CopyTime ( NULL , 0 , 0 , 1 ,T); T[ 0 ]+= fabs (NrBar)*PerSec;}
   ChartChange= false ;
   time=T[ 0 ];
  }

ama gerçek şu ki, işlevim hala olayın ek bir parametre kimliğine ihtiyaç duyuyor. Ve bu işlev, bir piksel mum kalınlığında orijinal ile aşağı yukarı aynı şekilde çalışırken, ancak gerekirse değiştirebilirsiniz.

 
Nikolai Semko :

ChartID_in ve SubWindow_out eklemek hiç de zor değil. Ama ben tam bir analog yaratma amacını gütmüyorum, bu fonksiyonu sadece ChartXYToTimePrice()'in yavaşlığını göstermek için yarattım.

ama gerçek şu ki, işlevim hala olayın ek bir parametre kimliğine ihtiyaç duyuyor. Ve bu işlev, bir piksel mum kalınlığında orijinal ile aşağı yukarı aynı şekilde çalışırken, ancak gerekirse değiştirebilirsiniz.


Ayrıca ChartXYToTimePrice'ın garip bir özelliğini de fark ettim. Yürütme süresi, grafikteki çubukların sayısı ile doğru orantılıdır.

Bu, onu hesaplamak için kullanılan algoritmanın "garipliğini" gösterir. Yani, böyle bir problemin optimal çözümü için çok garip olan döngüsel toplama hakkında.

XYToTimePrice işlevinin hızı, çubuk sayısından bağımsız olarak aynıdır.

Ve gerçeği söylemek gerekirse, ChartGetInteger ve ChartGetDouble işlevlerinin yürütme hızı da açıkça inanılmaz derecede pahalıdır ve çok garip özelliklere sahiptir. Örneğin işlev

 ChartGetDouble ( 0 , CHART_PRICE_MAX );

işlevden 20-100 kat daha hızlı çalışır:

 ChartGetDouble ( 0 , CHART_PRICE_MIN );          

MAX, MIN'den sonra gelirse:

ama onları değiştirirseniz durum tersine döner.


onlar. mantıklı görünüyor - yeniden hesaplanan aynı işlev, önceki işlev çağrısından önceden hesaplanmış ve kaydedilmiş verileri kullanır. Ancak bu sadece, bazı çılgın hesaplamaların devam ettiği ve bir grup ara veri oluşturduğu ve hatta muhtemelen zaten bir değişkende olan grafiğin maksimum (veya minimum) fiyatının basit bir çift değerini hesaplamak için diziler oluşturduğu anlamına gelir. sadece almak gerekiyor.

Her ne kadar bu etkinin bir tür profil oluşturma özelliğinden kaynaklandığını ve sahte olduğunu hariç tutmuyorum. Ancak bu işlevlerin yavaşlığı sahte değil.

 
Nikolai Semko :

gerekirse değiştirebilirsiniz.

Sonuçları çakıştığında iki fonksiyonun hız özelliklerini karşılaştırmanın doğruluğundan bahsetmek muhtemelen hala meşrudur. İç lütfen.

 
Vladimir Pastushak :
Arkadaşlar MT5'te android'de www.mql5.com'dan sürekli login ve password girmekten bıktım usandım
Neden sürekli düşüyorlar???

Servis masasına yazın . Günlükleri ekleyin. Teşekkür ederim.

 
Zaten düzeltilmiş gibi görünüyor. 1730 yapısında, bu sorun artık benim için yeniden üretilmiyor.
 
Nikolai Semko :

Ayrıca ChartXYToTimePrice'ın garip bir özelliğini de fark ettim. Yürütme süresi, grafikteki çubukların sayısı ile doğru orantılıdır.

Bu, onu hesaplamak için kullanılan algoritmanın "garipliğini" gösterir. Yani, böyle bir problemin optimal çözümü için çok garip olan döngüsel toplama hakkında.

XYToTimePrice işlevinin hızı, çubuk sayısından bağımsız olarak aynıdır.

Ve gerçeği söylemek gerekirse, ChartGetInteger ve ChartGetDouble işlevlerinin yürütme hızı da açıkça inanılmaz derecede pahalıdır ve çok garip özelliklere sahiptir. Örneğin işlev

işlevden 20-100 kat daha hızlı çalışır:

MAX, MIN'den sonra gelirse:

ama onları değiştirirseniz durum tersine döner.


onlar. mantıklı görünüyor - yeniden hesaplanan aynı işlev, önceki işlev çağrısından önceden hesaplanmış ve kaydedilmiş verileri kullanır. Ancak bu sadece, bazı çılgın hesaplamaların devam ettiği ve bir grup ara veri oluşturduğu ve hatta muhtemelen zaten bir değişkende olan grafiğin maksimum (veya minimum) fiyatının basit bir çift değerini hesaplamak için diziler oluşturduğu anlamına gelir. sadece almak gerekiyor.

Her ne kadar bu etkinin bir tür profil oluşturma özelliğinden kaynaklandığını ve sahte olduğunu hariç tutmuyorum. Ancak bu işlevlerin yavaşlığı sahte değil.

Grafik hakkında veri isteme fonksiyonlarındaki yavaşlama, uygulamanın kendisinde değil, bilgi gönderme ve alma biçiminde yatmaktadır. Bu işlevlerin uygulanması ilkeldir ve grafikteki çubukların sayısına bağlı değildir.

Ancak grafik, bilgileri birçok kaynağa dağıtılan bir nesne olduğundan, tüm kontrol mesaj kuyruklarına dayanır. Bir önceki istek işlenmezken, bir sonraki istek bekliyor.

Ancak aynı programa arka arkaya birkaç isteğiniz varsa, bu sonraki istekler çok hızlı bir şekilde yürütülür. Çünkü kimse onlarla ilk istek arasına girmeyi başaramadı.

 
Slava :

Grafik hakkında veri isteme fonksiyonlarındaki yavaşlama, uygulamanın kendisinde değil, bilgi gönderme ve alma biçiminde yatmaktadır. Bu işlevlerin uygulanması ilkeldir ve grafikteki çubukların sayısına bağlı değildir.

Ancak grafik, bilgileri birçok kaynağa dağıtılan bir nesne olduğundan, tüm kontrol mesaj kuyruklarına dayanır. Bir önceki istek işlenmezken, bir sonraki istek bekliyor.

Ancak aynı programa arka arkaya birkaç isteğiniz varsa, bu sonraki istekler çok hızlı bir şekilde yürütülür. Çünkü kimse onlarla ilk istek arasına girmeyi başaramadı.


Bırak olsun. Ama bunu bilmek işleri kolaylaştırmıyor. Slava, iyi, basit bir programcıyı doğru anlayın. Önceki gönderilerdeki test göstergesi örneğim, ChartXYToTimePrice() isteği için ortalama yürütme süresinin 5000 - 10000 mikrosaniye olduğunu açıkça gösteriyor (bir FullHD ekranda MT'de 1 piksel mum kalınlığı ve standart bir pencere ile). Bu süre zarfında neler yapılabilir?

Eh, örneğin, bu süre zarfında, aynı ekranda 500 dolu daireden bir görüntü oluşturabilir ve bunları ekranda görüntüleyebilirsiniz:

Sıra olsa bile, neden sıraya girmek bu kadar uzun sürüyor?
Ölçeğin bir tarafında, ekranda görüntülenen 500 dairenin piksel piksel oluşumu, diğer tarafında iki basamak için basit bir istek. Ve aynı ağırlıkta.
Burada basit bir programcı oturuyor, şalgamını kaşıyor ve bulmacaları bir araya getiremiyor.

 
Nikolai Semko :

Bırak olsun. Ama bunu bilmek işleri kolaylaştırmıyor. Slava, iyi, basit bir programcıyı doğru anlıyor. Önceki gönderilerdeki test göstergesi örneğim, bir ChartXYToTimePrice() isteği için ortalama yürütme süresinin 5000 - 10000 mikrosaniye olduğunu açıkça gösteriyor (bir FullHD ekranda MT'de 1 piksel mum kalınlığı ve standart bir pencere ile). Bu süre zarfında neler yapılabilir?

Eh, örneğin, bu süre zarfında, aynı ekranda 500 dolu daireden bir görüntü oluşturabilir ve bunları ekranda görüntüleyebilirsiniz:

Sıra olsa bile, neden sıraya girmek bu kadar uzun sürüyor?
Ölçeğin bir tarafında, ekranda görüntülenen 500 dairenin piksel piksel oluşumu, diğer tarafında iki basamak için basit bir istek. Ve aynı ağırlıkta.
Burada basit bir programcı oturuyor, şalgamını kaşıyor ve bulmacaları bir araya getiremiyor.

Senkronize bir komut ile asenkron bir komut arasındaki farkı hissettiniz.

Neden: