Одновременное перемещение двух точек трендовой линии

 

Уважаемые коллеги!

Столкнулся вроде с простой задачей, но не могу найти оптимальное решение. Необходимо чтобы при перемещении точки 1 трендовой линии, параллельно двигалась точка 2, т.е. трендовая линия всегда должна быть горизонтальной. CHARTEVENT_OBJECT_DRAG не подходит, так как перемещение 2-й точки происходит после окончания перемещения первой. Пробовал через  CHARTEVENT_OBJECT_CLICK получить название линии и сохранить ее в глобальной переменной, а в CHARTEVENT_MOUSE_MOVE если ЛКМ нажата перемещать вторую точку этой линии. Данный вариант работает, но если на графике несколько линий, при нажатии на вторую линию в глобальной переменной не успевает обновиться название второй линии и перемещается точка первой линии. Пробовал в CHARTEVENT_MOUSE_MOVE запускать цикл определяя какая линия сейчас находится под курсором (преобразовывал координату y курсора в цену и сравнивал с ценой линии), при резком смещении 1-й точки не всегда верно определяется линия. Подскажите пожалуйста как сделать правильно, думаю есть легкое решение, которое мне никак в голову не приходит)


Вертикальное перемещение трендовой линии

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Существуют 11 видов событий, которые можно обрабатывать с помощью функции предопределенной функции OnChartEvent(). Для пользовательских событий предусмотрено 65535 идентификаторов в диапазоне от CHARTEVENT_CUSTOM до CHARTEVENT_CUSTOM_LAST включительно. Для генерации пользовательского события необходимо использовать функцию EventChartCustom...
 

Разве обязательно нужно, чтобы горизонтальность сохранялась во время перемещения? По-моему, вполне достаточно делать корректировку уже после перемещения линии.

https://www.mql5.com/ru/code/25467

HorizontalTrendLines
HorizontalTrendLines
  • www.mql5.com
Стандартный графический объект "Трендовая линия" часто используется для проведения горизонтальных отрезков. Другой графический объект "Горизонтальная линия", который можно было бы использовать для подобных целей, не подходит, т. к. является прямой, а не отрезком. С другой стороны у объекта "Трендовая линия" есть один существенный недостаток...
 
Ihor Herasko:

Разве обязательно нужно, чтобы горизонтальность сохранялась во время перемещения? По-моему, вполне достаточно делать корректировку уже после перемещения линии.

https://www.mql5.com/ru/code/25467

Да, нужна горизонтальность именно в момент перемещения, так сразу визуально видно уровень (1-й скрин). На 2-м скрине если делать корректировку после перемещения.

1 3

 
ilfat85:

Да, нужна горизонтальность именно в момент перемещения, так сразу визуально видно уровень (1-й скрин). На 2-м скрине если делать корректировку после перемещения.

Если речь о ручном перемещении, таскайте за центральный узел

 
Igor Zakharov:

Если речь о ручном перемещении, таскайте за центральный узел

Спасибо, но этот вариант не подходит
 
ilfat85:
Спасибо, но этот вариант не подходит

Почему?

Перетаскивая один узел, можно создавать временную линию, потому удалять ее после отпускания основной линии
 
ilfat85:

Уважаемые коллеги!

Столкнулся вроде с простой задачей, но не могу найти оптимальное решение. Необходимо чтобы при перемещении точки 1 трендовой линии, параллельно двигалась точка 2, т.е. трендовая линия всегда должна быть горизонтальной. CHARTEVENT_OBJECT_DRAG не подходит, так как перемещение 2-й точки происходит после окончания перемещения первой. Пробовал через  CHARTEVENT_OBJECT_CLICK получить название линии и сохранить ее в глобальной переменной, а в CHARTEVENT_MOUSE_MOVE если ЛКМ нажата перемещать вторую точку этой линии. Данный вариант работает, но если на графике несколько линий, при нажатии на вторую линию в глобальной переменной не успевает обновиться название второй линии и перемещается точка первой линии. Пробовал в CHARTEVENT_MOUSE_MOVE запускать цикл определяя какая линия сейчас находится под курсором (преобразовывал координату y курсора в цену и сравнивал с ценой линии), при резком смещении 1-й точки не всегда верно определяется линия. Подскажите пожалуйста как сделать правильно, думаю есть легкое решение, которое мне никак в голову не приходит)



Если нужна горизонтальная линия, то и создавать нужно горизонтальную, а не трендовую.

 

Пока одна координата трендовой зажата, свойства линии недоступны для изменения. Поэтому никак это не получится.

НО... Если по событию перемещения мыши двигать линию которая выделена, то вполне выполнимая задача.

ps; Поколдовал я чуток. Вот что получилось. Достаточно линию выделить и перемещать крыску с не нажатыми клавишами.
Файлы:
 
Dmitry Fedoseev:

Почему?

Перетаскивая один узел, можно создавать временную линию, потому удалять ее после отпускания основной линии
Ну в общем то да, можно как вариант. А как правильно определить что узел зажат, и название линии.  В CHARTEVENT_OBJECT_CLICK название появляется только после отпускания мыши.
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Типы событий графика
  • www.mql5.com
Существуют 11 видов событий, которые можно обрабатывать с помощью функции предопределенной функции OnChartEvent(). Для пользовательских событий предусмотрено 65535 идентификаторов в диапазоне от CHARTEVENT_CUSTOM до CHARTEVENT_CUSTOM_LAST включительно. Для генерации пользовательского события необходимо использовать функцию EventChartCustom...
 
Alexey Viktorov:

Пока одна координата трендовой зажата, свойства линии недоступны для изменения. Поэтому никак это не получится.

НО... Если по событию перемещения мыши двигать линию которая выделена, то вполне выполнимая задача.

ps; Поколдовал я чуток. Вот что получилось. Достаточно линию выделить и перемещать крыску с не нажатыми клавишами.
Спасибо! Это будет запасным вариантом)
 
ilfat85:
Ну в общем то да, можно как вариант. А как правильно определить что узел зажат, и название линии .  В CHARTEVENT_OBJECT_CLICK название появляется только после отпускания мыши.

Почти никак, разве что по таймеру проверять координаты точек.