XY'de çizilen nesneler nasıl pürüzsüz hale getirilir (MT4 - MT5) - sayfa 2

 
Vitaliy Kuznetsov :

Sorunu bu şekilde çözdüğünüz için teşekkürler. Gerçekten de, oluşturma hızı arttı. Görünüşe göre kütüphaneyi öğrenmem gerekecek.

Aşağıdaki nüansı açıklığa kavuşturmak istiyorum. Bu formülasyon bir uyarı ile derlenir:

Ve bununla uyarı olmadan, ancak hız biraz düşüyor

Hangisi daha iyi?)

ve evet, int koymayı unuttum. Kitaplık çift koordinatlar için keskinleştirilmiştir.
Hız düşemez. (int) pratikte ücretsizdir. Bir nanosaniyeden daha az.
Bunu şöyle koyabilirsiniz:

y = Round(Canvas.Y(price));

hız da etkilenmeyecektir (+ ~ 1 ns), ancak konumlandırmada biraz daha doğru olacaktır.

iCanvas'ın yerleşik Round işlevi bir int döndürür ve normal round() işlevinden çok daha hızlıdır, ancak x çift argümanı bir int içinde olmalıdır (-2 147 483 648 <= x <= 2 147 483 647)

 int Ceil ( double x) { return (x-( int )x> 0 )?( int )x+ 1 :( int )x; }
int Round( double x) { return (x> 0 )?( int )(x+ 0.5 ):( int )(x- 0.5 );}
int Floor( double x) { return (x> 0 )?( int )x:(( int )x-x> 0 )?( int )x- 1 :( int )x; }
int Fabs( int x) { if (x< 0 ) return -x; else return x;}
 
Vitaliy Kuznetsov :
Ne tür bir Canvas.Y(fiyat);

ne tür döner

iCanvas'ın içine bakın ve soru kaybolacak:

   double             X( double bar){ return (( double )W.Left_bar-bar)*W.dx_pix;}; //The X coordinate by the bar number. The bar number must be of type double, otherwise, the bar will be interpreted as time.
   double             X( datetime Time)                                         //The X coordinate by the time.
     { if (tester) return X(( double ) iBarShift ( _Symbol , _Period ,Time));
       else return X(wBarShift(Time,W.time, _Period ));}
   double             Y( double Price) { if (W.dy_pix== 0 ) W.dy_pix= 1 ; return ((W.Y_max-Price)/W.dy_pix); }; //The Y coordinate by the price.
   double             Price( int y)     { return (W.Y_max-y*(W.Y_max-W.Y_min)/W.Height);};                 // Price by the Y coordinate
   double             Bar( double x) { return (( double )W.Left_bar+ 1 -x/( double )W.dx_pix);};                 // bar number by coordinate X                                                                      
   datetime           TimePos( double x)                                                                 // time by coordinate X 
     {
       double B=Bar(x);
       if (tester || W.BarsInWind == 0 ) iT[ 0 ]= iTime ( _Symbol , _Period ,( int )B);
       else { if (B< 0 ) iT[ 0 ]= datetime (W.time[W.BarsInWind- 1 ]-( long )B* PeriodSeconds ());
       else if (B<W.Right_bar || B>W.Left_bar) iT[ 0 ]= iTime ( _Symbol , _Period ,( int )B);
       else iT[ 0 ]=W.time[W.BarsInWind-Floor(B)- 1 +( int )W.Right_bar];}
       return iT[ 0 ]+ int (( double ) PeriodSeconds ()*( 1 -B+( int )B));
     };
 
Sudaki balık gibi :)
 
Vitaliy Kuznetsov :

Yine de Canvas ile çalışmak çok daha keyifli, şeffaflık uygulayabilirsiniz, daha hızlıdır ve kod daha az yer kaplar))):

 #property indicator_chart_window
#include <Canvas\iCanvas.mqh> // https://www.mql5.com/ru/code/22164
#define width 50                  
#define height 10

#property indicator_buffers 0
#property indicator_plots    0

//+------------------------------------------------------------------+
int OnInit () {
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double & price[]) {
   if (rates_total!=prev_calculated) DrawObj();
   return (rates_total);
}
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam) {
   if (id == CHARTEVENT_CHART_CHANGE ) DrawObj();
}
//+------------------------------------------------------------------+
void DrawObj() {

   double startPricePos = SymbolInfoDouble ( _Symbol , SYMBOL_BID );
   int step_Pips = 50 ;
   Canvas.Erase( 0x00FFFFFF );
   int x1 = W.Width/ 2 ;
   Canvas.CurentFont( "Arial" , 10 );
   for ( int i=- 19 ; i<= 20 ; i++) {
       double stp = step_Pips*i* _Point ;
       int y1 = ( int )Canvas.Y(startPricePos + stp);
      Canvas.FillRectangle(x1,y1,x1+width, y1+ height, 0xA0ECE9D8 );
      Canvas.Rectangle(x1,y1,x1+width, y1+ height, 0xDD807870 );
      _CommXY(x1+ 5 , y1, string (startPricePos + stp));
   }
   Canvas.Update();
}
//+------------------------------------------------------------------+



 
Vitaliy Kuznetsov :

Sorunu bu şekilde çözdüğünüz için teşekkürler. Gerçekten de, oluşturma hızı arttı. Görünüşe göre kütüphaneyi öğrenmem gerekecek.

Aşağıdaki nüansı açıklığa kavuşturmak istiyorum. Bu formülasyon bir uyarı ile derlenir:

Ve bununla uyarı olmadan, ancak hız biraz düşüyor

Hangisi daha iyi?)

Bu kodu döngüden çıkarın, böylece döngüden önceki her redraw olayında bir kez çağrılır:

 x=( int )( ChartGetInteger (chart_ID, CHART_WIDTH_IN_PIXELS ,sub_window)/ 2 );
   ChartXYToTimePrice (chart_ID,x,y,sub_window,time_pos_X_centr,price_pos_Y_tmp);         
         
   ChartTimePriceToXY (chart_ID,sub_window,time_pos_X_centr,price,x,y);

Bazı kütüphaneleri öğrenmekten gerçekten daha mı zor?

 
Aleksei Stepanenko :
Sudaki balık gibi :)

PNB2))

 
Dmitry Fedoseev :

Bu kodu döngüden çıkarın, böylece döngüden önceki her redraw olayında bir kez çağrılır:

Bazı kütüphaneleri öğrenmekten gerçekten daha mı zor?

Neyse bahsettim .
Merak ediyorum - kendin yapabilir misin ve benden sonra tavsiyeyi tekrarlamaz mısın?
ikisi kolayca çıkar...
Stüdyodaki kod daha kısadır.
Eğer düşürmezsen, yarın uyandığımda kendim yazarım. Ama sonra Fedoseev'e boş bir adam diyeceğim. ))

 
Nikolai Semko :

Neyse bahsettim .
Merak ediyorum - kendin yapabilir misin ve benden sonra tavsiyeyi tekrarlamaz mısın?
ikisi kolayca çıkar...
Stüdyodaki kod daha kısadır.
Eğer düşürmezsen, yarın uyandığımda kendim yazarım. Ama sonra Fedoseev'e boş bir adam diyeceğim. ))

Benimle ilgili fikirlerinizden inanılmaz derecede etkilendim))

 
Dmitry Fedoseev :

Benimle ilgili fikirlerinizden inanılmaz derecede etkilendim))

Daha az konuş, daha çok çalış

 

Örnekler için teşekkürler! Önemsiz olmayan çok görsel ve bilgilendirici - hızlı.

Nesne listelerindeki tuval örneğindeki tüm grafikler tek bir nesne gibi görünür.

Fareyi tek tek grafik öğelerinin üzerine getirdiğinizde farklı araç ipuçları (araç ipuçları) elde etmek mümkün müdür?

Veya her bir dikdörtgenin kendi tuval nesnesini çitle çevirmesi için mi? O zaman hızı etkiler mi?

Zaman varsa, o zaman bir cevap ve belki bir kod örneği bekliyorum.