Как получить имя Trendline на низком уровне?

 

Приветствую всех.

В общем проблема следующая:

Есть график, пользователь рисует на ней трендовую линию, затем кликает на ней правой кнопкой мыши чтобы вывести Popup меню (см. скриншот)

Dollar Difference line 

В Popup встроена дополнительная менюшка (в самом низу), для задания доп. параметров Trendline сторонним приложением.

Дополнительные параметры задаются по имени трендовой линии. То есть при выборе пункта меню Dollar Difference Line уже вроде как нужно знать имя линии.

Пока выкрутился следующим образом: При выборе Dollar Difference Line вызываю сначала пункт Свойства Trendline..., затем выдираю оттуда имя линии, закрываю Popup и передаю имя в свое окно.

Однако при таком подходе окно со стандартными свойствами промаргивает на экране, то есть появляется и исчезает.

DDL2 

Хочется от этого избавиться. И, в связи с этим, вопрос - как узнать имя трендовой линии чтобы не вызывать окно стандартных свойств.

Может быть кто-то копал в эту сторону терминал? Полагаю, что при формировании Popup где-то в памяти хранится имя линии, так как Popup уже знает что это TrendLine.

Спасибо. 

 
elugovoy:

... Полагаю, что при формировании Popup где-то в памяти хранится имя линии, так как Popup уже знает что это TrendLine.

OnChartEvent() в помощь. Если конкретнее то нажатие правой кнопкой на объекте формирует событие CHARTEVENT_OBJECT_CLICK. Из справки:

Событие

Значение параметра id

Значение параметра lparam

Значение параметра dparam

Значение параметра  sparam

Событие щелчка мыши на графическом объекте

CHARTEVENT_OBJECT_CLICK

X координата

Y координата

Имя графического объекта, на котором произошло событие

 
MigVRN:

OnChartEvent() в помощь. Если конкретнее то нажатие правой кнопкой на объекте формирует событие CHARTEVENT_OBJECT_CLICK. Из справки:

Событие

Значение параметра id

Значение параметра lparam

Значение параметра dparam

Значение параметра  sparam

Событие щелчка мыши на графическом объекте

CHARTEVENT_OBJECT_CLICK

X координата

Y координата

Имя графического объекта, на котором произошло событие

Ну в справке-то все верно, только не указано что событие генерируется только для левой кнопки мыши.

Ни для средней, ни для правой событие OnChartEvent() не поступает (MT4 Build 745).

 

Да и в MT5 проверил - только левая кнопка мыши обрабатывается.

Но в MT5 есть прогресс, там из Popup можно имя вытащить:

Имя Trendline 

Вот чувствую что достучаться и в MT4 можно до имени... видимо придется опытным путем дампить участки памяти по сегментам... и по ним искать... блииин.

 
Для пятёрки было расширение функционала:

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Нужна ли возможность настраивать контекстное меню графика?

tol64, 2014.10.22 11:13

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

Это мне в Сервисдеске подсказали:

Может и для четверки проверить?
 
barabashkakvn:
Для пятёрки было расширение функционала:

О, это прогресс, однако для ПКМ в 4-ке всегда DN. даже если зажать ПКМ  и водить мышу по чарту. Открывается попап и события MOVE не поступают.

А остальное вроде работает.

Проверил. На 5-ке работает. Заметил разницу между MT4 и MT5.

В MT5 при нажатии ПКМ Popup меню появляется на событии WM_RBUTTONUP, то есть когда кнопа отпускается.

А в MT4 - появляется на событии  WM_RBUTTONDOWN, то есть когда кнопа нажимается, но еще не отжата.

Похоже поэтому появившийся Popup не позволяет передать состояние кноп, фокус уже в нем.

Это баг или фича? ))

 

Хотя мне было бы проще видеть в попапе MT4 имя объекта типа как в MT5 (Свойства H1 Trendline 28508).

Можно даже без таймфрейма... 

 
elugovoy:


Хм... Вы правы. Думал что нажатие правой кнопкой также обрабатываются.  Сам только левую юзал. Тогда не знаю как быть :(

Можно определить факт нажатия + X и Y. А вот что под этими X и Y находится - это уже посложнее задачка.

Файлик для экспериментов:

Файлы:
 
elugovoy:

О, это прогресс, однако для ПКМ в 4-ке всегда DN. даже если зажать ПКМ  и водить мышу по чарту. Открывается попап и события MOVE не поступают.

А остальное вроде работает.

Проверил. На 5-ке работает. Заметил разницу между MT4 и MT5.

В MT5 при нажатии ПКМ Popup меню появляется на событии WM_RBUTTONUP, то есть когда кнопа отпускается.

А в MT4 - появляется на событии  WM_RBUTTONDOWN, то есть когда кнопа нажимается, но еще не отжата.

Похоже поэтому появившийся Popup не позволяет передать состояние кноп, фокус уже в нем.

Это баг или фича? ))

В сервис деск напишите
 
MigVRN:

Хм... Вы правы. Думал что нажатие правой кнопкой также обрабатываются.  Сам только левую юзал. Тогда не знаю как быть :(

Можно определить факт нажатия + X и Y. А вот что под этими X и Y находится - это уже посложнее задачка.

Файлик для экспериментов:

Ох, у меня этих файликов с экспериментами как у дурака фантиков )) Но все равно спасибо.

Кстати для пятерки ПКМ можно определить, barabashkakvn правильное направление задал. (Это не я, это tol64 спасибо. Тут был барабашка).

X+Y в окне я получить могу средствами Winapi, но там и наложение линий может быть, то есть тут больше головной боли при распознавании.

Может попросить сервисдеск сделать в 4-ке аналогичный вызов... только тогда штатным способом программно можно выявить будет и в MT4 нажатие и имя линии.

 
elugovoy:

Ох, у меня этих файликов с экспериментами как у дурака фантиков )) Но все равно спасибо.

Кстати для пятерки ПКМ можно определить, Володя (barabashkakvn) правильное направление задал.

X+Y в окне я получить могу средствами Winapi, но там и наложение линий может быть, то есть тут больше головной боли при распознавании.

Может попросить сервисдеск сделать в 4-ке аналогичный вызов... только тогда штатным способом программно можно выявить будет и в MT4 нажатие и имя линии.

Ну, пока как вариант могу посоветовать:

1) снимать выделение со всех объектов на чарте:

   а) при рисовании нового

   б) при выделении старого.

В один момент времени только один выделенный объект на чарте.

2) Если нажата правая кнопка мыши на чарте - имя объекта как раз соответствует выделенному.

В цикле перебираем все и смотрим какой из них выделен.

ЗЫ - если хочется оставить выделение нескольких линий - то только выпадающий список с именами линий в окне с параметрами.