Como fazer os objetos desenhados por XY mudarem suavemente (MT4 vs MT5) - página 3

 
Vitaliy Kuznetsov:

É possível obter pontas de ferramentas (tooltips) de maneira diferente quando se passa o mouse sobre elementos gráficos individuais?

Eu estava rastreando CHARTEVENT_MOUSE_MOVE e depois usando as coordenadas do cursor do mouse, que são representadas em Tela por todo o conjunto de dados de qualquer gosto e cor:

   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

Eu estava calculando para qual objeto uma dica seria emitida:

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:

Isso foi o que eu disse.
Estou apenas me perguntando - você mesmo pode fazer isso, e não apenas repetir meu conselho?
dois deles são fáceis de produzir...
Código, por favor.
Se não o fizer, eu mesmo o escreverei amanhã, quando acordar. Mas então eu chamarei Fedoseev de idiota. ))

Fedoseyev acabou de vazar ou algo assim?
Não quis colocá-lo entre parênteses.
Uma de duas coisas: muita pseudo-proudição ou pouca inteligência.
Eu sabia.
Consegui um novo apelido.
 
Vitaliy Kuznetsov:


aqui está o caminho mais longo (não muito) de que falei no início sem minha biblioteca e ao qual Fedoseev tentou ceder.
Esta é a melhor solução para a sua situação:

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

aqui está o caminho mais longo (não muito mais longo) de que falei no início sem minha biblioteca e ao qual Fedoseev tentou ceder.
Esta é a solução mais correta em sua situação:

Mas é preciso entender que o problema com o ChartGet funciona de forma assíncrona e não é resolvido por isso.
Estas funções agora não consomem 99,76%, mas um pouco menos - 99,1%.

Se não fossem assíncronos, então tudo se moveria junto com o gráfico, em vez de ficar um pouco para trás.

 

Ainda mais impressionado com este lugar:

 double stp = -N*step_Pips;
   for(int i=-N; i<=20; i++, stp+=step_Pips)
Isso é muita vaidade. Mas você nem saberia qual é a piada desse humor. É embaraçoso.
 
Nikolai Semko:
Fedoseyev fundiu-se ou o quê?
Não queria tirá-lo de parênteses.
Uma de duas coisas: muita pseudo-proudição ou pouca inteligência.
Eu sabia.
Ganhou um novo apelido.

Você vai perder sua mosca, querida.

 
Vitaliy Kuznetsov:

Obrigado pelos exemplos! Muito claro e informativo, e não menos rápido.

Todos os gráficos do exemplo nas listas de objetos parecem ser um único objeto.

É possível obter diferentes pontas de ferramentas (pontas de ferramentas) quando se passa o mouse sobre itens gráficos individuais?

Ou posso criar um objeto de lona separado para cada retângulo? Isso não afetará a velocidade?

Se você tiver algum tempo, estou esperando por uma resposta, talvez até mesmo uma amostra de código.

Você pode usar uma lona para cada objeto em vez de uma.
Será até um pouco mais rápido e o código não será muito maior. Pelo menos menos menos menos do que com objetos.
Kanvas é muito rápido. Os objetos também são bons, desde que não sejam em demasia. O gargalo ocorre quando os objetos são várias centenas ou mil.
A propósito, é o mesmo em JavaScript. Há também telas e objetos (html e CVG). A tela sempre ganha em velocidade e capacidade gráfica, mas perde em usabilidade de controle e gerenciamento.
No JS, eu mesmo tenho misturado ativamente telas e objetos vetoriais (html, css, svg), tirando proveito de ambos.
Mas o verdadeiro maior problema no uso de telas em MQL5 (assim como objetos) é a inacreditável estupidez das funções ChartGet.
Mas isto só se você estiver tentando se vincular a uma tabela de preços.
Se você desativar a tabela inteira e desenhar a sua própria, não terá tal problema.

 
Dmitry Fedoseev:

Ainda mais impressionado com este lugar:

Isso é muita vaidade. Mas você nem saberia qual é a piada do humor. É embaraçoso.

Sempre me surpreende quando você é um veterano local, sempre tentando fazer algo inteligente de si mesmo.
Para não ser dolorosamente doloroso durante os anos desperdiçados.
Mas por alguma razão ele só aperta um peido toda vez :))
 
Ihor Herasko:

Eu estava rastreando CHARTEVENT_MOUSE_MOVE e depois usando as coordenadas do cursor do mouse, que são representadas em Tela por todo o conjunto de dados a qualquer gosto e cor:

calcular para qual objeto uma dica deve ser exibida:

Nikolai Semko:

você pode usar não uma Tela, mas uma para cada objeto.
Será até um pouco mais rápido e o código não será muito maior. Pelo menos menos menos menos do que com objetos.
Kanvas é muito rápido. Os objetos também são bons, desde que não sejam em demasia. A desaceleração ocorre quando os objetos se tornam várias centenas ou mil.

Obrigado. Vou tentar testar as duas variantes.

 
Vitaliy Kuznetsov:

Obrigado. Vou tentar verificar as duas opções.

Vitaly, que editor de vídeo você usa para o YouTube?
Muito legal!
Adobe Premiere Pro?

Razão: