Как сделать плавность изменения объектов, нарисованных по XY (MT4 vs MT5) - страница 3

 
Vitaliy Kuznetsov:

Возможно ли получать тултипы (всплывающие подсказки) различные при наведении мыши на отдельные элементы графики?

У себя делал отслеживание CHARTEVENT_MOUSE_MOVE и потом по координатам курсора мыши, а они представлены в Canvas целым набором данных на любой вкус и цвет:

   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

, вычислял, для какого объекта выводить подсказку:

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:

Ну я об этом говорил.
Мне просто интересно - сам то сможешь это сделать, а не только повторять за мной советы?
две то выводятся легко...
Код в студию, короче. 
Не сбросишь, тогда сам напишу завтра как проснусь. Но тогда буду называть Федосеева порожняком. ))

Федосеев слился что-ли?
Не захотел за скобки выносить.
Одно из двух: слишком много псевдогордости или слишком мало ума.
Так и знал.
Заработал себе новое погоняло.
 
Vitaliy Kuznetsov:


вот более длинный способ (не намного), о котором я говорил в самом начале без моей библиотеки и о чем пытался поддакивать Федосеев.
Это более правильное решение в вашей ситуации:

#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:

вот более длинный способ (не намного), о котором я говорил в самом начале без моей библиотеки и о чем пытался поддакивать Федосеев.
Это более правильное решение в вашей ситуации:

но нужно понимать что проблема с асинхронностью ChartGet функций этим не решается.
Сейчас на работу этих функций уходит уже не 99.76%, а чуть поменьше - 99.1 %

Были бы они были не асинхронные, тогда бы все двигалось вместе с графиком, а не отставало чуть.

 

Еще более впечатлен вот этим местом:

 double stp = -N*step_Pips;
   for(int i=-N; i<=20; i++, stp+=step_Pips)
За то сколько самомнения. Но ты даже и не поймешь в чем шутка этого юмора. Позорище же невероятное.
 
Nikolai Semko:
Федосеев слился что-ли?
Не захотел за скобки выносить.
Одно из двух: слишком много псевдогордости или слишком мало ума.
Так и знал.
Заработал себе новое погоняло.

Спили мушку, крошка.

 
Vitaliy Kuznetsov:

Спасибо за примеры! Очень наглядно и познавательно, что не маловажно - быстроработающе.

Вся графика из примера по канвасу в списках объектов выглядит, как один объект.

Возможно ли получать тултипы (всплывающие подсказки) различные при наведении мыши на отдельные элементы графики?

Или для каждого отдельного прямоугольника городить свой объект канваса? Тогда не повлияет ли это на скорость?

Если будет время, то жду ответа, а может и пример кода.

можно использовать и не один канвас, а по одному на каждый объект.
Будет даже чуть быстрее и кода будет не намного больше. Во всяком случае меньше, чем с объектами.
Канвас работает очень быстро. Объекты тоже годятся, пока их не слишком много. Торможение наступает у объектов после нескольких сотен или тысячи.
Кстати - такая же ситуация с JavaScript. Там тоже есть канвас и объеты (html и CVG). Канвас всегда выигрывает при скорости и графическим возможностям, но проигрывает в удобстве контроля и управления.
В JS я сам активно смешиваю canvas и векторные объекты(html, css, svg), используя преимущества кандого из них.
Но реально большая проблема использования канваса в MQL5(ровно как и объектов) - это невероятная тупость ChartGet функций.
Но это - если вы пытаетесь привязываться к графику цены. 
Если же вы отключаете весь график и рисуете свой собственный, то такой проблемы не будет.

 
Dmitry Fedoseev:

Еще более впечатлен вот этим местом:

За то сколько самомнения. Но ты даже и не поймешь в чем шутка этого юмора. Позорище же невероятное.

Меня всегда умиляют местные старперы, вечно пытающиеся выдавить из себя что-то умное.
Чтобы не было мучительно больно за бесцельно прожитые годы.
Но почему-то каждый раз выдавливается только пук :))
 
Ihor Herasko:

У себя делал отслеживание CHARTEVENT_MOUSE_MOVE и потом по координатам курсора мыши, а они представлены в Canvas целым набором данных на любой вкус и цвет:

, вычислял, для какого объекта выводить подсказку:

Nikolai Semko:

можно использовать и не один канвас, а по одному на каждый объект.
Будет даже чуть быстрее и кода будет не намного больше. Во всяком случае меньше, чем с объектами.
Канвас работает очень быстро. Объекты тоже годятся, пока их не слишком много. Торможение наступает у объектов после нескольких сотен или тысячи.

Спасибо. Попробую проверить оба варианта.

 
Vitaliy Kuznetsov:

Спасибо. Попробую проверить оба варианта.

Виталий, какой видеоредактор используете для Ютуба? 
Очень зачётно!
Adobe  Premiere Pro?

Причина обращения: