Cómo hacer que los objetos dibujados por XY cambien suavemente (MT4 vs MT5) - página 3

 
Vitaliy Kuznetsov:

¿Es posible obtener información sobre herramientas (tooltips) de forma diferente cuando se pasa el ratón por encima de elementos gráficos individuales?

Estaba rastreando CHARTEVENT_MOUSE_MOVE y luego usando las coordenadas del cursor del ratón, que están representadas en Canvas por el conjunto de datos de cualquier gusto y color:

   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

Estaba calculando para qué objeto saldría una pista:

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:

Eso es lo que he dicho.
Sólo me pregunto: ¿puedes hacerlo tú mismo y no repetir mis consejos?
dos de ellos son fáciles de emitir...
Código, por favor.
Si no lo haces, lo escribiré yo mismo mañana cuando me despierte. Pero entonces llamaré idiota a Fedoseev. ))

¿Se ha filtrado Fedoseyev o algo así?
No quería ponerlo entre paréntesis.
Una de dos cosas: demasiada pseudoproudeza o muy poca inteligencia.
Lo sabía.
Me he puesto un nuevo apodo.
 
Vitaliy Kuznetsov:


Aquí está el camino más largo (no por mucho) del que hablé al principio sin mi biblioteca y al que Fedoseev intentó ceder.
Esta es la mejor solución para su situación:

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

Aquí está el camino más largo (no mucho más largo) del que hablé al principio sin mi biblioteca y al que Fedoseev intentó ceder.
Esta es la solución más correcta en su situación:

Pero hay que entender que el problema de la asincronía de las funciones ChartGet no se resuelve con esto.
Estas funciones no consumen ahora el 99,76%, sino un poco menos: el 99,1%.

Si no fueran asíncronos, entonces todo se movería junto con el gráfico, en lugar de quedarse un poco atrás.

 

Aún más impresionado con este lugar:

 double stp = -N*step_Pips;
   for(int i=-N; i<=20; i++, stp+=step_Pips)
Eso es mucha presunción. Pero ni siquiera sabrías cuál es el chiste de ese humor. Es vergonzoso.
 
Nikolai Semko:
¿Se ha fusionado Fedoseyev o qué?
No quería ponerlo fuera de los paréntesis.
Una de dos cosas: demasiada pseudoproudeza o muy poca inteligencia.
Lo sabía.
Se consiguió un nuevo apodo.

Vas a perder la bragueta, nena.

 
Vitaliy Kuznetsov:

Gracias por los ejemplos. Muy claro e informativo, y no menos rápido.

Todos los gráficos del ejemplo en el kanvas en las listas de objetos parecen un solo objeto.

¿Es posible obtener diferentes informaciones sobre herramientas (tooltips) al pasar el ratón por encima de elementos gráficos individuales?

¿O puedo crear un objeto de lienzo distinto para cada rectángulo? ¿No afectará a la velocidad?

Si tienes algo de tiempo, estoy esperando una respuesta, tal vez incluso una muestra de código.

Puede utilizar un lienzo para cada objeto en lugar de uno.
Incluso será un poco más rápido y el código no será mucho más grande. Al menos menos que con los objetos.
Kanvas es muy rápido. Los objetos también son buenos, siempre que no haya demasiados. El cuello de botella se produce cuando los objetos son varios cientos o miles.
Por cierto, es lo mismo en JavaScript. También hay lienzos y objetos (html y CVG). El lienzo siempre gana en velocidad y capacidades gráficas, pero pierde en la facilidad de control y gestión.
En JS, yo mismo he estado mezclando activamente objetos canvas y vectoriales (html, css, svg), aprovechando ambos.
Pero el verdadero problema más grande en el uso de lienzos en MQL5 (así como los objetos) es increíblemente aburrido de funciones ChartGet.
Pero esto es si se trata de enlazar con un gráfico de precios.
Si desactiva todo el gráfico y dibuja el suyo propio, no tendrá ese problema.

 
Dmitry Fedoseev:

Aún más impresionado por este lugar:

Eso es mucha presunción. Pero ni siquiera sabrás cuál es el chiste. Es vergonzoso.

Siempre me sorprende cuando eres un veterano local, siempre tratando de hacer algo inteligente de ti mismo.
Para que no sean dolorosos los años perdidos.
Pero por alguna razón sólo saca un pedo cada vez :))
 
Ihor Herasko:

Estaba rastreando CHARTEVENT_MOUSE_MOVE y luego usando las coordenadas del cursor del ratón, que están representadas en Canvas por todo el conjunto de datos para todos los gustos y colores:

calcular para qué objeto se debe mostrar una pista:

Nikolai Semko:

puede utilizar no un lienzo, sino uno para cada objeto.
Incluso será un poco más rápido y el código no será mucho más grande. Al menos menos que con los objetos.
Kanvas es muy rápido. Los objetos también son buenos, siempre que no haya demasiados. La ralentización se produce cuando los objetos se convierten en varios cientos o miles.

Gracias. Intentaré probar ambas variantes.

 
Vitaliy Kuznetsov:

Gracias. Intentaré comprobar ambas opciones.

Vitaly, ¿qué editor de vídeo utilizas para YouTube?
¡Muy chulo!
¿Adobe Premiere Pro?