Я пишу индикатор для отображения риска на Мт5. И значения отображаются прямо на линиях.
Как эти значения перенести в право? С лева не удобно. А если использовать текстовые метки или например кнопки и в них зашить эти значния то тогда при перемещении линии они перерисовываются и происходит запаздывание, чего ни очень бы хотелось.
Кто знает как это решить. помогите пожалуйста, я уже все перерыл и не нашел нужного мне способа.
Есть правда один индикатор но он на мт4 а нужен именно на мт 5, и вот в нем все работает просто отлично как надо. НЕ знаю будет ли нарушением озвучивать его. поэтому не пишу его тут. Но раз есть такая возможность на мт4 то и на мт5 на верняка такое должно быть
Добрый день! Проблема с "запаздыванием" при использовании объектов и перемещении линий знакома многим. В MT5 это решается немного иначе, чем в MT4, но тоже достаточно просто.
Самый надежный и "гладкий" способ — использовать буфер индикатора для отображения текста как графической метки (OBJ_LABEL) через свойства PLOT_DRAW_TYPE или, что еще лучше, встроенные функции для работы с объектами, но с обязательным обновлением позиций в обработчике OnChartEvent() .
Вот пошаговое решение, как это можно реализовать, чтобы текст всегда "прилипал" к линии и перемещался без задержек:
-
Создайте объекты-метки (OBJ_LABEL) для каждого значения. В функции OnInit() или один раз при появлении нового значения линии.
-
Главный секрет: Не привязывайтесь к цене напрямую через OBJ_TEXT или OBJ_ARROW, если хотите идеального позиционирования справа. Используйте OBJ_LABEL — это объект, который привязывается не к графику, а к окну графика (координаты в пикселях).
-
В функции OnChartEvent() обрабатывайте событие CHARTEVENT_CHART_CHANGE (изменение графика) и CHARTEVENT_OBJECT_DRAG (если линии можно двигать). В обработчике пересчитывайте позицию линии в пиксели и сдвигайте текст.
Примерная логика в коде:
//+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { // Если произошло изменение графика (скролл, зум) или движение линии if(id == CHARTEVENT_CHART_CHANGE || id == CHARTEVENT_OBJECT_DRAG) { UpdateLabelsPosition(); // Твоя функция обновления координат } } //+------------------------------------------------------------------+ //| Обновление позиций текста справа | //+------------------------------------------------------------------+ void UpdateLabelsPosition() { // 1. Получаем текущую цену линии (например, цену объекта "Line1") double line_price = ObjectGetDouble(0, "Line1", OBJPROP_PRICE, 0); // 2. Конвертируем цену в Y-координату (пиксели) для окна графика int y = (int)ChartPriceToY(0, line_price, 0); // 3. Получаем X-координату для правого края (ширина окна минус отступ) int x = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) - 20; // Отступ 20px справа // 4. Устанавливаем новые координаты для объекта-текста ObjectSetInteger(0, "TextLabel_Line1", OBJPROP_XDISTANCE, x); ObjectSetInteger(0, "TextLabel_Line1", OBJPROP_YDISTANCE, y); }
Почему это лучше других способов:
-
Нет запаздывания. Координаты пересчитываются и применяются мгновенно при любом движении линии или масштабировании графика.
-
Всегда справа. Текст будет строго привязан к правой границе окна на уровне цены линии.
-
Работает в MT5. В MT5 таймсерии и работа с графикой немного отличаются от MT4, но ChartPriceToY() и ChartGetInteger() решают проблему привязки.
Насчет индикатора из MT4, который вы видел — скорее всего, там использовалась похожая логика с объектами OBJ_LABEL или динамическое обновление текстовых меток через TextSet в связке с событиями графика. В MT5 это делается аналогично, но через объекты и обработку событий.
Добрый день! Проблема с "запаздыванием" при использовании объектов и перемещении линий знакома многим. В MT5 это решается немного иначе, чем в MT4, но тоже достаточно просто.
Самый надежный и "гладкий" способ — использовать буфер индикатора для отображения текста как графической метки (OBJ_LABEL) через свойства PLOT_DRAW_TYPE или, что еще лучше, встроенные функции для работы с объектами, но с обязательным обновлением позиций в обработчике OnChartEvent() .
Вот пошаговое решение, как это можно реализовать, чтобы текст всегда "прилипал" к линии и перемещался без задержек:
-
Создайте объекты-метки (OBJ_LABEL) для каждого значения. В функции OnInit() или один раз при появлении нового значения линии.
-
Главный секрет: Не привязывайтесь к цене напрямую через OBJ_TEXT или OBJ_ARROW, если хотите идеального позиционирования справа. Используйте OBJ_LABEL — это объект, который привязывается не к графику, а к окну графика (координаты в пикселях).
-
В функции OnChartEvent() обрабатывайте событие CHARTEVENT_CHART_CHANGE (изменение графика) и CHARTEVENT_OBJECT_DRAG (если линии можно двигать). В обработчике пересчитывайте позицию линии в пиксели и сдвигайте текст.
Примерная логика в коде:
Почему это лучше других способов:
-
Нет запаздывания. Координаты пересчитываются и применяются мгновенно при любом движении линии или масштабировании графика.
-
Всегда справа. Текст будет строго привязан к правой границе окна на уровне цены линии.
-
Работает в MT5. В MT5 таймсерии и работа с графикой немного отличаются от MT4, но ChartPriceToY() и ChartGetInteger() решают проблему привязки.
Насчет индикатора из MT4, который вы видел — скорее всего, там использовалась похожая логика с объектами OBJ_LABEL или динамическое обновление текстовых меток через TextSet в связке с событиями графика. В MT5 это делается аналогично, но через объекты и обработку событий.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Я пишу индикатор для отображения риска на Мт5. И значения отображаются прямо на линиях.
Как эти значения перенести в право? С лева не удобно. А если использовать текстовые метки или например кнопки и в них зашить эти значния то тогда при перемещении линии они перерисовываются и происходит запаздывание, чего ни очень бы хотелось.
Кто знает как это решить. помогите пожалуйста, я уже все перерыл и не нашел нужного мне способа.
Есть правда один индикатор но он на мт4 а нужен именно на мт 5, и вот в нем все работает просто отлично как надо. НЕ знаю будет ли нарушением озвучивать его. поэтому не пишу его тут. Но раз есть такая возможность на мт4 то и на мт5 на верняка такое должно быть