Wie man Objekte, die von XY gezeichnet werden, reibungslos ändern kann (MT4 vs MT5) - Seite 3

 
Vitaliy Kuznetsov:

Ist es möglich, beim Überfahren einzelner Grafikelemente mit der Maus andere Tooltips (Werkzeughinweise) zu erhalten?

Ich verfolgte CHARTEVENT_MOUSE_MOVE und benutzte dann die Koordinaten des Mauszeigers, die in Canvas durch einen ganzen Satz von Daten beliebigen Geschmacks und Farbe dargestellt werden:

   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

Ich habe berechnet, für welches Objekt ein Hinweis ausgegeben werden würde:

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:

Das habe ich auch gesagt.
Ich frage mich nur - können Sie es selbst tun und nicht nur meinen Rat wiederholen?
zwei von ihnen sind leicht auszugeben...
Code, bitte.
Wenn nicht, schreibe ich ihn morgen nach dem Aufwachen selbst. Aber dann werde ich Fedoseev einen Idioten nennen. ))

Hat Fedoseyev gerade ein Leck oder so etwas?
Ich wollte es nicht in Klammern setzen.
Es gibt zwei Möglichkeiten: zu viel Pseudo-Stolz oder zu wenig Intelligenz.
Ich wusste es.
Ich habe mir einen neuen Spitznamen zugelegt.
 
Vitaliy Kuznetsov:


Hier ist der längere Weg (nicht viel), von dem ich anfangs ohne meine Bibliothek gesprochen habe und dem Fedoseev nachgeben wollte.
Dies ist die bessere Lösung für Ihre 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:

Hier ist der längere Weg (nicht viel länger), über den ich anfangs ohne meine Bibliothek gesprochen habe und dem Fedoseev nachzugeben versuchte.
Dies ist in Ihrer Situation die bessere Lösung:

Aber Sie müssen verstehen, dass das Problem mit der Asynchronität der ChartGet-Funktionen dadurch nicht gelöst wird.
Diese Funktionen verbrauchen jetzt nicht 99,76 %, sondern etwas weniger - 99,1 %.

Wären sie nicht asynchron, würde sich alles mit dem Diagramm mitbewegen, anstatt ein wenig hinterherzuhinken.

 

Noch mehr beeindruckt von diesem Ort:

 double stp = -N*step_Pips;
   for(int i=-N; i<=20; i++, stp+=step_Pips)
Das ist eine Menge Einbildung. Aber Sie wüssten nicht einmal, worin der Witz dieses Humors besteht. Es ist peinlich.
 
Nikolai Semko:
Hat Fedoseyev fusioniert oder was?
Ich wollte es nicht aus der Klammer nehmen.
Es gibt zwei Möglichkeiten: zu viel Pseudo-Stolz oder zu wenig Intelligenz.
Ich wusste es.
Er hat sich einen neuen Spitznamen zugelegt.

Du wirst deinen Hosenstall verlieren, Baby.

 
Vitaliy Kuznetsov:

Vielen Dank für die Beispiele! Sehr übersichtlich und informativ, und nicht zuletzt schnell.

Alle Grafiken aus dem Beispiel auf der Leinwand in den Objektlisten sehen wie ein einziges Objekt aus.

Ist es möglich, verschiedene Tooltips zu erhalten, wenn man mit der Maus über einzelne Grafikelemente fährt?

Oder kann ich für jedes Rechteck ein eigenes Leinwandobjekt erstellen? Beeinträchtigt das nicht die Geschwindigkeit?

Wenn Sie etwas Zeit haben, warte ich auf eine Antwort, vielleicht sogar auf ein Codebeispiel.

Sie können für jedes Objekt eine Leinwand statt einer verwenden.
Es wird sogar ein bisschen schneller sein und der Code wird nicht viel größer sein. Zumindest weniger als bei Gegenständen.
Kanvas ist sehr schnell. Objekte sind auch gut, solange es nicht zu viele von ihnen gibt. Der Engpass tritt auf, wenn es sich um mehrere hundert oder tausend Objekte handelt.
Übrigens ist es in JavaScript genauso. Außerdem gibt es Canvas und Objekte (html und CVG). Canvas gewinnt immer bei der Geschwindigkeit und den grafischen Möglichkeiten, verliert aber bei der Benutzerfreundlichkeit der Steuerung und Verwaltung.
In JS habe ich selbst aktiv Canvas- und Vektorobjekte (html, css, svg) gemischt und die Vorteile beider genutzt.
Aber das wirklich größte Problem bei der Verwendung von Canvas in MQL5 (ebenso wie bei Objekten) ist die unglaubliche Stumpfheit der ChartGet-Funktionen.
Aber nur, wenn Sie versuchen, sich an ein Preisdiagramm zu binden.
Wenn Sie das gesamte Diagramm deaktivieren und Ihr eigenes Diagramm zeichnen, haben Sie dieses Problem nicht.

 
Dmitry Fedoseev:

Noch mehr beeindruckt von diesem Ort:

Das ist eine Menge Einbildung. Aber Sie wüssten nicht einmal, worin der Witz des Humors besteht. Es ist peinlich.

Es erstaunt mich immer wieder, wenn man als einheimischer Oldtimer versucht, etwas Gescheites aus sich zu machen.
Um die ziellosen Jahre nicht schmerzhaft zu machen.
Aber aus irgendeinem Grund quetscht er jedes Mal nur einen Furz heraus :))
 
Ihor Herasko:

Ich habe CHARTEVENT_MOUSE_MOVE verfolgt und dann die Koordinaten des Mauszeigers verwendet, die in Canvas durch den gesamten Datensatz für alle Geschmacksrichtungen und Farben dargestellt werden:

berechnen, für welches Objekt ein Hinweis angezeigt werden soll:

Nikolai Semko:

können Sie nicht nur einen Canvas, sondern einen für jedes Objekt verwenden.
Es wird sogar ein bisschen schneller sein und der Code wird nicht viel größer sein. Zumindest weniger als bei Gegenständen.
Kanvas ist sehr schnell. Objekte sind auch gut, solange es nicht zu viele von ihnen gibt. Die Verlangsamung tritt ein, wenn die Objekte mehrere hundert oder tausend werden.

Ich danke Ihnen. Ich werde versuchen, beide Varianten zu testen.

 
Vitaliy Kuznetsov:

Ich danke Ihnen. Ich werde versuchen, beide Optionen zu prüfen.

Vitaly, welchen Videoeditor benutzt du für YouTube?
Sehr cool!
Adobe Premiere Pro?