如何使XY绘制的对象平稳变化(MT4 vs MT5) - 页 3

 
Vitaliy Kuznetsov:

当把鼠标悬停在个别图形元素 上时,是否有可能以不同方式获得工具提示(tooltips)?

我在追踪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:

谢谢你提供的例子!非常清晰,信息量大,而且不乏快速。

对象列表中Kanvas上的例子的所有图形看起来都是一个单一的对象。

当把鼠标悬停在不同的图形项目 上时,是否可以得到不同的工具提示(tooltips)?

还是我可以为每个矩形创建一个单独的画布对象?这不会影响速度吗?

如果你有时间,我在等待你的回答,甚至是一个代码样本。

你可以为每个对象使用一个画布,而不是一个。
它甚至会更快一点,代码也不会大很多。至少比用物体要少。
Kanvas的速度非常快。物体也很好,只要不是太多。当对象是几百或一千时,就会出现瓶颈。
顺便说一下,在JavaScript中也是如此。还有画布和对象(html和CVG)。Canvas总是在速度和图形能力方面胜出,但在控制和管理的可用性方面却输了。
在JS中,我自己一直在积极混合画布和矢量对象(html、css、svg),利用两者的优势。
但在MQL5中使用画布(以及对象)的真正最大问题是ChartGet函数令人难以置信的枯燥。
但这只是在你试图与价格图表绑定的情况下。
如果你禁用整个图表并绘制你自己的图表,你就不会有这样的问题。

 
Dmitry Fedoseev:

对这个地方印象更加深刻。

这是一个很大的自负。但你甚至不会知道这个笑话是什么。这很令人尴尬。

当你是一个当地的老前辈时,总是试图让自己变得聪明起来,这总是让我感到惊讶。
以免因虚度年华而痛不欲生。
但由于某些原因,它每次都只挤出一个屁:))
 
Ihor Herasko:

我在跟踪CHARTEVENT_MOUSE_MOVE,然后使用鼠标光标的坐标,这些坐标在Canvas中由所有口味和颜色的整套数据表示。

,计算应该为哪个对象显示一个提示。

Nikolai Semko:

你可以不使用一个Canvas,而是为每个对象使用一个。
它甚至会更快一点,代码也不会大很多。至少比用物体要少。
Kanvas的速度非常快。物体也很好,只要不是太多。当对象变成几百或一千时,速度就会减慢。

谢谢你。我将尝试测试这两种变体。

 
Vitaliy Kuznetsov:

谢谢你。我将尝试检查这两个选项。

维塔利,你在YouTube上使用什么视频编辑器?
非常酷!
Adobe Premiere Pro?