Возможно ли получать тултипы (всплывающие подсказки) различные при наведении мыши на отдельные элементы графики?
У себя делал отслеживание CHARTEVENT_MOUSE_MOVE и потом по координатам курсора мыши, а они представлены в Canvas целым набором данных на любой вкус и цвет:
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
, вычислял, для какого объекта выводить подсказку:
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("<третья строка подсказки>");
Ну я об этом говорил. Мне просто интересно - сам то сможешь это сделать, а не только повторять за мной советы? две то выводятся легко... Код в студию, короче. Не сбросишь, тогда сам напишу завтра как проснусь. Но тогда буду называть Федосеева порожняком. ))
Федосеев слился что-ли?
Не захотел за скобки выносить.
Одно из двух: слишком много псевдогордости или слишком мало ума.
вот более длинный способ (не намного), о котором я говорил в самом начале без моей библиотеки и о чем пытался поддакивать Федосеев. Это более правильное решение в вашей ситуации:
#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));
}
вот более длинный способ (не намного), о котором я говорил в самом начале без моей библиотеки и о чем пытался поддакивать Федосеев. Это более правильное решение в вашей ситуации:
но нужно понимать что проблема с асинхронностью ChartGet функций этим не решается. Сейчас на работу этих функций уходит уже не 99.76%, а чуть поменьше - 99.1 %
Были бы они были не асинхронные, тогда бы все двигалось вместе с графиком, а не отставало чуть.
Спасибо за примеры! Очень наглядно и познавательно, что не маловажно - быстроработающе.
Вся графика из примера по канвасу в списках объектов выглядит, как один объект.
Возможно ли получать тултипы (всплывающие подсказки) различные при наведении мыши на отдельные элементы графики?
Или для каждого отдельного прямоугольника городить свой объект канваса? Тогда не повлияет ли это на скорость?
Если будет время, то жду ответа, а может и пример кода.
можно использовать и не один канвас, а по одному на каждый объект. Будет даже чуть быстрее и кода будет не намного больше. Во всяком случае меньше, чем с объектами. Канвас работает очень быстро. Объекты тоже годятся, пока их не слишком много. Торможение наступает у объектов после нескольких сотен или тысячи. Кстати - такая же ситуация с JavaScript. Там тоже есть канвас и объеты (html и CVG). Канвас всегда выигрывает при скорости и графическим возможностям, но проигрывает в удобстве контроля и управления. В JS я сам активно смешиваю canvas и векторные объекты(html, css, svg), используя преимущества кандого из них. Но реально большая проблема использования канваса в MQL5(ровно как и объектов) - это невероятная тупость ChartGet функций. Но это - если вы пытаетесь привязываться к графику цены. Если же вы отключаете весь график и рисуете свой собственный, то такой проблемы не будет.
У себя делал отслеживание CHARTEVENT_MOUSE_MOVE и потом по координатам курсора мыши, а они представлены в Canvas целым набором данных на любой вкус и цвет:
, вычислял, для какого объекта выводить подсказку:
Nikolai Semko:
можно использовать и не один канвас, а по одному на каждый объект. Будет даже чуть быстрее и кода будет не намного больше. Во всяком случае меньше, чем с объектами. Канвас работает очень быстро. Объекты тоже годятся, пока их не слишком много. Торможение наступает у объектов после нескольких сотен или тысячи.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Возможно ли получать тултипы (всплывающие подсказки) различные при наведении мыши на отдельные элементы графики?
У себя делал отслеживание CHARTEVENT_MOUSE_MOVE и потом по координатам курсора мыши, а они представлены в Canvas целым набором данных на любой вкус и цвет:
, вычислял, для какого объекта выводить подсказку:
Ну я об этом говорил.
Мне просто интересно - сам то сможешь это сделать, а не только повторять за мной советы?
две то выводятся легко...
Код в студию, короче.
Не сбросишь, тогда сам напишу завтра как проснусь. Но тогда буду называть Федосеева порожняком. ))
вот более длинный способ (не намного), о котором я говорил в самом начале без моей библиотеки и о чем пытался поддакивать Федосеев.
Это более правильное решение в вашей ситуации:
вот более длинный способ (не намного), о котором я говорил в самом начале без моей библиотеки и о чем пытался поддакивать Федосеев.
Это более правильное решение в вашей ситуации:
но нужно понимать что проблема с асинхронностью ChartGet функций этим не решается.
Сейчас на работу этих функций уходит уже не 99.76%, а чуть поменьше - 99.1 %
Были бы они были не асинхронные, тогда бы все двигалось вместе с графиком, а не отставало чуть.
Еще более впечатлен вот этим местом:
За то сколько самомнения. Но ты даже и не поймешь в чем шутка этого юмора. Позорище же невероятное.Федосеев слился что-ли?
Спили мушку, крошка.
Спасибо за примеры! Очень наглядно и познавательно, что не маловажно - быстроработающе.
Вся графика из примера по канвасу в списках объектов выглядит, как один объект.
Возможно ли получать тултипы (всплывающие подсказки) различные при наведении мыши на отдельные элементы графики?
Или для каждого отдельного прямоугольника городить свой объект канваса? Тогда не повлияет ли это на скорость?
Если будет время, то жду ответа, а может и пример кода.
можно использовать и не один канвас, а по одному на каждый объект.
Будет даже чуть быстрее и кода будет не намного больше. Во всяком случае меньше, чем с объектами.
Канвас работает очень быстро. Объекты тоже годятся, пока их не слишком много. Торможение наступает у объектов после нескольких сотен или тысячи.
Кстати - такая же ситуация с JavaScript. Там тоже есть канвас и объеты (html и CVG). Канвас всегда выигрывает при скорости и графическим возможностям, но проигрывает в удобстве контроля и управления.
В JS я сам активно смешиваю canvas и векторные объекты(html, css, svg), используя преимущества кандого из них.
Но реально большая проблема использования канваса в MQL5(ровно как и объектов) - это невероятная тупость ChartGet функций.
Но это - если вы пытаетесь привязываться к графику цены.
Если же вы отключаете весь график и рисуете свой собственный, то такой проблемы не будет.
Еще более впечатлен вот этим местом:
За то сколько самомнения. Но ты даже и не поймешь в чем шутка этого юмора. Позорище же невероятное.Меня всегда умиляют местные старперы, вечно пытающиеся выдавить из себя что-то умное.
Чтобы не было мучительно больно за бесцельно прожитые годы.
У себя делал отслеживание CHARTEVENT_MOUSE_MOVE и потом по координатам курсора мыши, а они представлены в Canvas целым набором данных на любой вкус и цвет:
, вычислял, для какого объекта выводить подсказку:
можно использовать и не один канвас, а по одному на каждый объект.
Будет даже чуть быстрее и кода будет не намного больше. Во всяком случае меньше, чем с объектами.
Канвас работает очень быстро. Объекты тоже годятся, пока их не слишком много. Торможение наступает у объектов после нескольких сотен или тысячи.
Спасибо. Попробую проверить оба варианта.
Спасибо. Попробую проверить оба варианта.
Виталий, какой видеоредактор используете для Ютуба?
Очень зачётно!
Adobe Premiere Pro?