Comment faire en sorte que les objets dessinés par XY changent en douceur (MT4 vs MT5) - page 3

 
Vitaliy Kuznetsov:

Est-il possible d'obtenir des infobulles (tooltips) différentes lorsque l'on passe la souris sur des éléments graphiques individuels ?

Je suivais le mouvement du CHARTEVENT_MOUSE_MOVE et j'utilisais ensuite les coordonnées du curseur de la souris, qui sont représentées dans Canvas par l'ensemble des données de n'importe quel goût et couleur :

   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

Je calculais pour quel objet un indice serait émis :

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:

C'est ce que j'ai dit.
Je me demande juste - pouvez-vous le faire vous-même, et ne pas simplement répéter mes conseils ?
deux d'entre eux sont faciles à sortir...
Code, s'il vous plaît.
Si vous ne le faites pas, je l'écrirai moi-même demain à mon réveil. Mais alors je traiterai Fedoseev d'idiot. ))

Est-ce que Fedoseyev vient de fuir ou quelque chose comme ça ?
Je ne voulais pas le mettre entre parenthèses.
De deux choses l'une : trop de pseudo-fierté ou trop peu d'intelligence.
Je le savais.
Je me suis trouvé un nouveau surnom.
 
Vitaliy Kuznetsov:


Voici le chemin le plus long (pas de beaucoup) dont j'ai parlé au début sans ma bibliothèque et auquel Fedoseev a essayé de céder.
C'est la meilleure solution pour votre situation :

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

Voici la voie la plus longue (pas beaucoup plus longue) dont j'ai parlé au début sans ma bibliothèque et à laquelle Fedoseev a essayé de céder.
C'est une solution plus correcte dans votre situation :

Mais vous devez comprendre que le problème de l'asynchronisme des fonctions ChartGet n'est pas résolu par cette solution.
Ces fonctions consomment désormais non pas 99,76 % mais un peu moins - 99,1 %.

S'ils n'étaient pas asynchrones, tout évoluerait en même temps que le graphique, au lieu d'être un peu à la traîne.

 

Encore plus impressionné par cet endroit :

 double stp = -N*step_Pips;
   for(int i=-N; i<=20; i++, stp+=step_Pips)
C'est beaucoup de vanité. Mais vous ne sauriez même pas quelle est la blague de cet humour. C'est embarrassant.
 
Nikolai Semko:
Fedoseyev a fusionné ou quoi ?
Je ne voulais pas le mettre entre parenthèses.
De deux choses l'une : trop de pseudo-fierté ou trop peu d'intelligence.
Je le savais.
Il s'est trouvé un nouveau surnom.

Tu vas perdre ta braguette, bébé.

 
Vitaliy Kuznetsov:

Merci pour les exemples ! Très clair et informatif, et surtout rapide.

Tous les graphiques de l'exemple sur le kanvas dans les listes d'objets ressemblent à un seul objet.

Est-il possible d'obtenir des infobulles (tooltips) différentes lorsque l'on passe la souris sur des éléments graphiques individuels ?

Ou dois-je créer un objet de toile distinct pour chaque rectangle ? Cela ne va-t-il pas affecter la vitesse ?

Si vous avez un peu de temps, j'attends une réponse, peut-être même un exemple de code.

Vous pouvez utiliser un canevas pour chaque objet au lieu d'un seul.
Il sera même un peu plus rapide et le code ne sera pas beaucoup plus gros. En tout cas moins qu'avec des objets.
Kanvas est très rapide. Les objets sont bons aussi, à condition qu'ils ne soient pas trop nombreux. Le goulot d'étranglement se produit lorsque les objets sont plusieurs centaines ou un millier.
D'ailleurs, c'est la même chose en JavaScript. Il existe également des canevas et des objets (html et CVG). Canvas gagne toujours en vitesse et en capacités graphiques, mais perd en convivialité de contrôle et de gestion.
En JS, j'ai moi-même mélangé activement les objets canevas et vectoriels (html, css, svg), en tirant parti des deux.
Mais le véritable problème majeur de l'utilisation des canevas dans MQL5 (ainsi que des objets) est l'incroyable fadeur des fonctions ChartGet.
Mais cela n'est possible que si vous essayez de vous lier à un graphique de prix.
Si vous désactivez l'ensemble du graphique et dessinez votre propre graphique, vous n'aurez pas ce problème.

 
Dmitry Fedoseev:

Encore plus impressionné par cet endroit :

C'est beaucoup de vanité. Mais vous ne sauriez même pas quelle est la blague de l'humour. C'est embarrassant.

Je suis toujours étonné de voir que tu es un vieux de la vieille, qui essaie toujours de faire quelque chose d'intelligent.
Afin de ne pas être douloureux pour les années gâchées.
Mais pour une raison quelconque, il ne sort qu'un pet à chaque fois :))
 
Ihor Herasko:

Je suivais le mouvement du CHARTEVENT_MOUSE_MOVE, puis j'utilisais les coordonnées du curseur de la souris, qui sont représentées dans Canvas par l'ensemble des données, selon les goûts et les couleurs :

calculer pour quel objet une indication doit être affichée :

Nikolai Semko:

vous pouvez utiliser non pas un seul Canvas, mais un pour chaque objet.
Il sera même un peu plus rapide et le code ne sera pas beaucoup plus gros. En tout cas moins qu'avec des objets.
Kanvas est très rapide. Les objets sont bons aussi, à condition qu'ils ne soient pas trop nombreux. Le ralentissement se produit lorsque les objets deviennent plusieurs centaines ou milliers.

Merci. Je vais essayer de tester les deux variantes.

 
Vitaliy Kuznetsov:

Merci. Je vais essayer de vérifier les deux options.

Vitaly, quel éditeur vidéo utilisez-vous pour YouTube ?
Très bien !
Adobe Premiere Pro ?