Come fare in modo che gli oggetti disegnati da XY cambino in modo fluido (MT4 vs MT5) - pagina 3

 
Vitaliy Kuznetsov:

È possibile ottenere tooltip (suggerimenti) in modo diverso quando si passa il mouse su singoli elementi grafici?

Stavo tracciando CHARTEVENT_MOUSE_MOVE e poi usando le coordinate del cursore del mouse, che sono rappresentate in Canvas dall'insieme di dati di qualsiasi gusto e colore:

   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

Stavo calcolando per quale oggetto sarebbe stato emesso un suggerimento:

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:

Questo è quello che ho detto.
Mi sto solo chiedendo - puoi farlo tu stesso, e non solo ripetere i miei consigli?
due di loro sono facili da produrre...
Codice, per favore.
Se non lo fai, lo scriverò io stesso domani quando mi sveglio. Ma allora chiamerò Fedoseev un idiota. ))

Fedoseyev ha appena fatto una soffiata o qualcosa del genere?
Non volevo metterlo tra parentesi.
Una delle due cose: troppa pseudoprofessionalità o troppo poca intelligenza.
Lo sapevo.
Mi sono trovato un nuovo soprannome.
 
Vitaliy Kuznetsov:


ecco la via più lunga (non di molto) di cui ho parlato all'inizio senza la mia biblioteca e a cui Fedoseev ha cercato di cedere.
Questa è la soluzione migliore per la tua situazione:

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

ecco la via più lunga (non di molto) di cui ho parlato all'inizio senza la mia biblioteca e a cui Fedoseev ha cercato di cedere.
Questa è la soluzione più corretta nella vostra situazione:

ma dovete capire che il problema dell'asincronia delle funzioni ChartGet non è risolto da questo.
Queste funzioni ora non consumano il 99,76% ma un po' meno, il 99,1%.

Se non fossero asincrone, allora tutto si muoverebbe insieme al grafico, invece di rimanere un po' indietro.

 

Ancora più impressionato da questo posto:

 double stp = -N*step_Pips;
   for(int i=-N; i<=20; i++, stp+=step_Pips)
C'è molta presunzione. Ma non sapresti nemmeno quale sia la battuta di questo umorismo. È imbarazzante.
 
Nikolai Semko:
Fedoseyev ha fatto una fusione o cosa?
Non volevo metterlo fuori dalle parentesi.
Una delle due cose: troppa pseudoprofessionalità o troppo poca intelligenza.
Lo sapevo.
Si è trovato un nuovo soprannome.

Perderai la tua mosca, piccola.

 
Vitaliy Kuznetsov:

Grazie per gli esempi! Molto chiaro e informativo, e non da ultimo veloce.

Tutti i grafici dell'esempio sul kanvas nelle liste di oggetti sembrano un unico oggetto.

È possibile ottenere diversi tooltip (suggerimenti) quando si passa il mouse su elementi grafici separati?

O posso creare un oggetto canvas separato per ogni rettangolo? Non influenzerà la velocità?

Se hai un po' di tempo, sto aspettando una risposta, forse anche un esempio di codice.

Potete usare una tela per ogni oggetto invece di una.
Sarà anche un po' più veloce e il codice non sarà molto più grande. Almeno meno che con gli oggetti.
Kanvas è molto veloce. Anche gli oggetti vanno bene, purché non ce ne siano troppi. Il collo di bottiglia si verifica quando gli oggetti sono diverse centinaia o migliaia.
A proposito, è lo stesso in JavaScript. Ci sono anche canvas e oggetti (html e CVG). Canvas vince sempre in velocità e capacità grafiche, ma perde in usabilità di controllo e gestione.
In JS, io stesso ho mescolato attivamente canvas e oggetti vettoriali (html, css, svg), traendo vantaggio da entrambi.
Ma il vero problema più grande nell'uso del canvas in MQL5 (così come degli oggetti) è l'incredibile ottusità delle funzioni ChartGet.
Ma questo è se stai cercando di legarti a un grafico di prezzo.
Se disabiliti l'intero grafico e ne disegni uno tuo, non avrai questo problema.

 
Dmitry Fedoseev:

Ancora più impressionato da questo posto:

C'è molta presunzione. Ma non sapresti nemmeno quale sia la battuta dell'umorismo. È imbarazzante.

Mi stupisce sempre quando sei un vecchio locale che cerca sempre di fare qualcosa di intelligente.
Per non essere doloroso per gli anni sprecati.
Ma per qualche motivo spreme solo una scoreggia ogni volta :))
 
Ihor Herasko:

Stavo tracciando CHARTEVENT_MOUSE_MOVE e poi usando le coordinate del cursore del mouse, che sono rappresentate in Canvas da tutta la serie di dati a qualsiasi gusto e colore:

, calcolare per quale oggetto dovrebbe essere visualizzato un suggerimento:

Nikolai Semko:

potete usare non un solo Canvas, ma uno per ogni oggetto.
Sarà anche un po' più veloce e il codice non sarà molto più grande. Almeno meno che con gli oggetti.
Kanvas è molto veloce. Anche gli oggetti vanno bene, purché non ce ne siano troppi. Il rallentamento avviene quando gli oggetti diventano diverse centinaia o migliaia.

Grazie. Proverò a testare entrambe le varianti.

 
Vitaliy Kuznetsov:

Grazie. Cercherò di controllare entrambe le opzioni.

Vitaly, che editor video usi per YouTube?
Molto bello!
Adobe Premiere Pro?