È 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 pointerint MouseY; // coordinate Y of the current position of the mouse pointerdouble MouseBar; // the current bar position of the mouse pointerdouble MousePrice; // the current price of the mouse pointerdatetime MouseTime; // the current time of the mouse pointer
Stavo calcolando per quale oggetto sarebbe stato emesso un suggerimento:
inputuint 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("<третья строка подсказки>");
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.
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_buffers0#property indicator_plots0string obj_name = "Asd_";
double max = 0;
double min = 0;
double w = 0;
double h = 0;//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit() {
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[]) {
if(prev_calculated != rates_total) {
DrawObj();
}
return(rates_total);
}
//+------------------------------------------------------------------+//| ChartEvent function |//+------------------------------------------------------------------+voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &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;
constlong chart_ID=0; // ID графикаint sub_window=0; // номер подокнаint x=int(w/2); // координата по оси Xint y=int(h*(max-price)/(max-min)); // координата по оси Yconstcolor back_clr=C'236,233,216'; // цвет фонаconstENUM_BORDER_TYPE border=BORDER_SUNKEN; // тип границыconstENUM_BASE_CORNER corner=CORNER_LEFT_UPPER; // угол графика для привязкиconstcolor clr=clrRed; // цвет плоской границы (Flat)constENUM_LINE_STYLE style=STYLE_SOLID; // стиль плоской границыconstint line_width=1; // толщина плоской границыconstbool back=false; // на заднем планеconstbool selection=false; // выделить для перемещенийconstbool hidden=true; // скрыт в списке объектовconstlong 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);
} elsePrint("Error - " + string(_LastError));
}
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.
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.
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.
È 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:
Stavo calcolando per quale oggetto sarebbe stato emesso un suggerimento:
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. ))
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:
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:
C'è molta presunzione. Ma non sapresti nemmeno quale sia la battuta di questo umorismo. È imbarazzante.Fedoseyev ha fatto una fusione o cosa?
Perderai la tua mosca, piccola.
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.
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.
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:
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.
Grazie. Cercherò di controllare entrambe le opzioni.
Vitaly, che editor video usi per YouTube?
Molto bello!
Adobe Premiere Pro?