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

 
Vitaliy Kuznetsov :

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

CHARTEVENT_MOUSE_MOVE ve ardından fare imlecinin koordinatlarını takip ettim ve bunlar Kanvas'ta her zevk ve renk için bir dizi veri ile temsil ediliyor:

   int                MouseX;       // coordinate X of the current position of the mouse pointer
   int                MouseY;       // coordinate Y of the current position of the mouse pointer
   double             MouseBar;     // the current bar position of the mouse pointer
   double             MousePrice;   // the current price of the mouse pointer
   datetime           MouseTime;   // the current time of the mouse pointer

, hangi nesnenin ipucu görüntüleneceğini hesapladı:

 input uint                     i_uFontSize                = 14 ;                                     // Размер шрифта в подсказках


#define   TOOLTIP_BGCOLOR                                             color ( C'255,255,225' ) 

int g_nTooltipWidth = <ширина блока в пикселах>;
int g_nTooltipHeight = <высота блока в пикселах>;
int nY = <расчет положения левого верхнего угла для подсказки>;


         Canvas.FillRectangle(W.MouseX, nY, W.MouseX + g_nTooltipWidth, nY + g_nTooltipHeight, ColorToARGB (TOOLTIP_BGCOLOR));
         Canvas.Rectangle(W.MouseX, nY, W.MouseX + g_nTooltipWidth, nY + g_nTooltipHeight, ColorToARGB ( clrBlack ));
         Canvas.TextPosition(W.MouseX + 5 , nY + 2 );
         Canvas.CurentFont( "Arial" , i_uFontSize, i_uFontSize + 2 , clrBlack );
         Canvas.Comm( "<первая строка подсказки>" );
         Canvas.Comm( "<вторая строка подсказки>" );
         Canvas.Comm( "<третья строка подсказки>" );
 
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. ))

Fedoseev birleşti mi yoksa ne?
Parantezleri çıkarmak istemedim.
İki şeyden biri: çok fazla sahte gurur veya çok az zeka.
Biliyordum.
Yeni bir sürücü kazandı.
 
Vitaliy Kuznetsov :


İşte daha en başta kitaplığım olmadan bahsettiğim ve Fedoseev'in yankılanmaya çalıştığı daha uzun bir yol (fazla değil).
Bu, sizin durumunuzda daha doğru bir çözümdür:

 #property indicator_chart_window
#define width 50
#define height 10
#define N 20

#property indicator_buffers 0
#property indicator_plots    0


string obj_name = "Asd_" ;
double max = 0 ;
double min = 0 ;
double w = 0 ;
double h = 0 ;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit () {
   return ( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate ( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[]) {
   if (prev_calculated != rates_total) {
      DrawObj();
   }
   return (rates_total);
}
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent ( const int id,
                   const long &lparam,
                   const double &dparam,
                   const string &sparam) {
   if (id == CHARTEVENT_CHART_CHANGE ) {
       w = ( int ) ChartGetInteger ( 0 , CHART_WIDTH_IN_PIXELS );
      h = ( int ) ChartGetInteger ( 0 , CHART_HEIGHT_IN_PIXELS );
      min = ChartGetDouble ( 0 , CHART_PRICE_MIN );
      max = ChartGetDouble ( 0 , CHART_PRICE_MAX );
      DrawObj();
   }
}
//+------------------------------------------------------------------+
//| Выводим на график                                                |
//+------------------------------------------------------------------+
void DrawObj() {
   string GenName = obj_name;
   double startPricePos = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
   double step_Pips = 50 * _Point ;
   double stp = -N*step_Pips;
   for ( int i=-N; i<= 20 ; i++, stp+=step_Pips) 
      RectLabelCreate(GenName+ "UP_" + IntegerToString (i),startPricePos + stp);
   ChartRedraw ( 0 );
}
//+------------------------------------------------------------------+
//| Создает прямоугольную метку                                      |
//+------------------------------------------------------------------+
void RectLabelCreate( string name,   // имя метки
                     double price   // цена
                    ) {
   if (max==min) return ;
   const long              chart_ID= 0 ;               // ID графика
   int               sub_window= 0 ;                   // номер подокна
   int               x= int (w/ 2 );                     // координата по оси X
   int               y= int (h*(max-price)/(max-min)); // координата по оси Y

   const color             back_clr= C'236,233,216' ;   // цвет фона
   const ENUM_BORDER_TYPE border= BORDER_SUNKEN ;     // тип границы
   const ENUM_BASE_CORNER corner= CORNER_LEFT_UPPER ; // угол графика для привязки
   const color             clr= clrRed ;               // цвет плоской границы (Flat)
   const ENUM_LINE_STYLE   style= STYLE_SOLID ;         // стиль плоской границы
   const int               line_width= 1 ;             // толщина плоской границы
   const bool              back= false ;               // на заднем плане
   const bool              selection= false ;           // выделить для перемещений
   const bool              hidden= true ;               // скрыт в списке объектов
   const long              z_order= 0 ;                 // приоритет на нажатие мышью
   if ( ObjectCreate (chart_ID,name, OBJ_RECTANGLE_LABEL ,sub_window, 0 , 0 )) {
       ObjectSetInteger (chart_ID,name, OBJPROP_XDISTANCE ,x);
       ObjectSetInteger (chart_ID,name, OBJPROP_YDISTANCE ,y);
       ObjectSetInteger (chart_ID,name, OBJPROP_XSIZE ,width);
       ObjectSetInteger (chart_ID,name, OBJPROP_YSIZE ,height);
       ObjectSetInteger (chart_ID,name, OBJPROP_BGCOLOR ,back_clr);
       ObjectSetInteger (chart_ID,name, OBJPROP_BORDER_TYPE ,border);
       ObjectSetInteger (chart_ID,name, OBJPROP_CORNER ,corner);
       ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
       ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
       ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,line_width);
       ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
       ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
       ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
       ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
   } else Print ( "Error - " + string ( _LastError ));
}

Как сделать плавность изменения объектов, нарисованных по XY (MT4 vs MT5)
Как сделать плавность изменения объектов, нарисованных по XY (MT4 vs MT5)
  • 2021.07.19
  • www.mql5.com
Помогите решить проблему на терминале МТ5. Решил перевести свой продукт из mql4 в mql5...
 
Nikolai Semko :

İşte daha en başta kitaplığım olmadan bahsettiğim ve Fedoseev'in yankılanmaya çalıştığı daha uzun bir yol (fazla değil).
Bu, sizin durumunuzda daha doğru bir çözümdür:

ancak ChartGet işlevlerinin uyumsuzluğuyla ilgili sorunun bununla çözülmediğini anlamalısınız.
Şimdi bu işlevlerin çalışması artık %99,76 değil, biraz daha az - %99,1

Asenkron olmasaydı, her şey programa göre hareket eder ve biraz geride kalmazdı.

 

Bu yerden daha da etkilendim:

 double stp = -N*step_Pips;
   for ( int i=-N; i<= 20 ; i++, stp+=step_Pips )
Ne kadar kibir için. Ama bu mizahın şakasının ne olduğunu bile anlamayacaksın. Utanç inanılmaz.
 
Nikolai Semko :
Fedoseev birleşti mi yoksa ne?
Parantezleri çıkarmak istemedim.
İki şeyden biri: çok fazla sahte gurur veya çok az zeka.
Biliyordum.
Yeni bir sürücü kazandı.

Sineği sürdü bebeğim.

 
Vitaliy Kuznetsov :

Ö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.

birden fazla tuval kullanabilirsiniz, ancak her nesne için bir tane.
Hatta biraz daha hızlı olacak ve çok fazla kod olmayacak. Her durumda, nesnelerden daha az.
Tuval çok hızlı. Çok fazla olmadığı sürece nesneler de iyidir. Birkaç yüz veya bin sonra nesnelerde frenleme meydana gelir.
Bu arada - JavaScript ile aynı durum. Ayrıca tuval ve nesneler (html ve CVG) vardır. Kanvas, hız ve grafik yetenekleri açısından her zaman kazanır, ancak kontrol ve yönetim kolaylığı açısından kaybeder.
JS'de, her birinden yararlanarak tuval ve vektör nesnelerini (html, css, svg) aktif olarak karıştırıyorum.
Ancak MQL5'te tuval kullanmanın (tıpkı nesneler gibi) gerçekten büyük sorunu, ChartGet işlevlerinin inanılmaz aptallığıdır.
Ancak bu, fiyat grafiğine bağlı kalmaya çalışıyorsanız.
Grafiğin tamamını kapatır ve kendi grafiğinizi çizerseniz, böyle bir sorun olmayacaktır.

 
Dmitry Fedoseev :

Bu yerden daha da etkilendim:

Ne kadar kibir için. Ama bu mizahın şakasının ne olduğunu bile anlamayacaksın. Utanç inanılmaz.

Her zaman yerel yaşlı osuruklardan etkilenirim, her zaman kendilerinden akıllıca bir şeyler çıkarmaya çalışırım.
Böylece amaçsızca yaşanmış yıllar için dayanılmaz derecede acı verici olmayacaktı.
Ama nedense her seferinde sadece bir demet sıkılıyor :))
 
Ihor Herasko :

CHARTEVENT_MOUSE_MOVE ve ardından fare imlecinin koordinatlarını takip ettim ve bunlar Kanvas'ta her zevk ve renk için bir dizi veri ile temsil ediliyor:

, hangi nesnenin ipucu görüntüleneceğini hesapladı:

Nikolay Semko :

birden fazla tuval kullanabilirsiniz, ancak her nesne için bir tane.
Hatta biraz daha hızlı olacak ve çok fazla kod olmayacak. Her durumda, nesnelerden daha az.
Tuval çok hızlı. Çok fazla olmadığı sürece nesneler de iyidir. Birkaç yüz veya bin sonra nesnelerde frenleme meydana gelir.

Teşekkür ederim. Her iki seçeneği de test etmeye çalışacağım.

 
Vitaliy Kuznetsov :

Teşekkür ederim. Her iki seçeneği de test etmeye çalışacağım.

Vitaly, YouTube için hangi video düzenleyiciyi kullanıyorsun?
Çok onurlu!
Adobe Premier Pro?

Neden: