Люди добрые. Подскажите как это сделать!

 

Я пишу индикатор для отображения риска на Мт5. И значения отображаются прямо на линиях. 

Как эти значения перенести в право? С лева не удобно. А если использовать текстовые метки или например кнопки и в них зашить эти значния то тогда при перемещении линии они перерисовываются и происходит запаздывание, чего ни очень бы хотелось. 

Кто знает как это решить. помогите пожалуйста, я уже все перерыл и не нашел нужного мне способа. 

Есть правда один индикатор но он на мт4 а нужен именно на мт 5, и вот в нем все работает просто отлично как надо. НЕ знаю будет ли нарушением озвучивать его. поэтому не пишу его тут. Но раз есть такая возможность на мт4 то и на мт5 на верняка такое должно быть 

Файлы:
Screenshot_1.jpg  102 kb
 
Mikhail Ostashov:

Я пишу индикатор для отображения риска на Мт5. И значения отображаются прямо на линиях. 

Как эти значения перенести в право? С лева не удобно. А если использовать текстовые метки или например кнопки и в них зашить эти значния то тогда при перемещении линии они перерисовываются и происходит запаздывание, чего ни очень бы хотелось. 

Кто знает как это решить. помогите пожалуйста, я уже все перерыл и не нашел нужного мне способа. 

Есть правда один индикатор но он на мт4 а нужен именно на мт 5, и вот в нем все работает просто отлично как надо. НЕ знаю будет ли нарушением озвучивать его. поэтому не пишу его тут. Но раз есть такая возможность на мт4 то и на мт5 на верняка такое должно быть

Добрый день! Проблема с "запаздыванием" при использовании объектов и перемещении линий знакома многим. В MT5 это решается немного иначе, чем в MT4, но тоже достаточно просто.

Самый надежный и "гладкий" способ — использовать буфер индикатора для отображения текста как графической метки (OBJ_LABEL) через свойства  PLOT_DRAW_TYPE  или, что еще лучше, встроенные функции для работы с объектами, но с обязательным обновлением позиций в обработчике  OnChartEvent() .

Вот пошаговое решение, как это можно реализовать, чтобы текст всегда "прилипал" к линии и перемещался без задержек:

  1. Создайте объекты-метки (OBJ_LABEL) для каждого значения. В функции  OnInit()  или один раз при появлении нового значения линии.

  2. Главный секрет: Не привязывайтесь к цене напрямую через OBJ_TEXT или OBJ_ARROW, если хотите идеального позиционирования справа. Используйте OBJ_LABEL — это объект, который привязывается не к графику, а к окну графика (координаты в пикселях).

  3. В функции  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 это делается аналогично, но через объекты и обработку событий.

 
Maksim Novikov #:

Добрый день! Проблема с "запаздыванием" при использовании объектов и перемещении линий знакома многим. В MT5 это решается немного иначе, чем в MT4, но тоже достаточно просто.

Самый надежный и "гладкий" способ — использовать буфер индикатора для отображения текста как графической метки (OBJ_LABEL) через свойства  PLOT_DRAW_TYPE  или, что еще лучше, встроенные функции для работы с объектами, но с обязательным обновлением позиций в обработчике  OnChartEvent() .

Вот пошаговое решение, как это можно реализовать, чтобы текст всегда "прилипал" к линии и перемещался без задержек:

  1. Создайте объекты-метки (OBJ_LABEL) для каждого значения. В функции  OnInit()  или один раз при появлении нового значения линии.

  2. Главный секрет: Не привязывайтесь к цене напрямую через OBJ_TEXT или OBJ_ARROW, если хотите идеального позиционирования справа. Используйте OBJ_LABEL — это объект, который привязывается не к графику, а к окну графика (координаты в пикселях).

  3. В функции  OnChartEvent()  обрабатывайте событие  CHARTEVENT_CHART_CHANGE  (изменение графика) и  CHARTEVENT_OBJECT_DRAG  (если линии можно двигать). В обработчике пересчитывайте позицию линии в пиксели и сдвигайте текст.

Примерная логика в коде:

Почему это лучше других способов:

  • Нет запаздывания. Координаты пересчитываются и применяются мгновенно при любом движении линии или масштабировании графика.

  • Всегда справа. Текст будет строго привязан к правой границе окна на уровне цены линии.

  • Работает в MT5. В MT5 таймсерии и работа с графикой немного отличаются от MT4, но  ChartPriceToY()  и  ChartGetInteger()  решают проблему привязки.

Насчет индикатора из MT4, который вы видел — скорее всего, там использовалась похожая логика с объектами  OBJ_LABEL  или динамическое обновление текстовых меток через  TextSet  в связке с событиями графика. В MT5 это делается аналогично, но через объекты и обработку событий.

Супер! Сейчас с запаздыванием прям очень сократилось. Оно есть но прям очень минимальное! Лучше того что было у меня. Спасибо вам большое!!!!