É 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 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
Eu estava calculando para qual objeto uma dica seria emitida:
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("<третья строка подсказки>");
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.
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_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));
}
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.
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.
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 :))
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.
É 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:
Eu estava calculando para qual objeto uma dica seria emitida:
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. ))
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:
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:
Isso é muita vaidade. Mas você nem saberia qual é a piada desse humor. É embaraçoso.Fedoseyev fundiu-se ou o quê?
Você vai perder sua mosca, querida.
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.
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.
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:
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.
Obrigado. Vou tentar verificar as duas opções.
Vitaly, que editor de vídeo você usa para o YouTube?
Muito legal!
Adobe Premiere Pro?