Экспертная торговая панель MT4 — OBJ_RECTANGLE_LABEL

Советник MetaTrader4 для торговой панели.
Как связать несколько OBJ_RECTANGLE_LABEL для перемещения с другим отдельным объектом?


person Max-Enrik    schedule 03.10.2016    source источник


Ответы (2)


Свяжите их косвенно

Нет прямой поддержки связывания нескольких GUI-объектов для перемещения с другим.

Это не значит, что так работать нельзя.

В одном инструменте пользовательского интерфейса Augmented Trader мне нужно было, чтобы все компоненты графического интерфейса и некоторые вычисляемые значения вели себя в соответствии с некоторой схожей логикой (сохранение всех линий, прямоугольников, текстовых меток и цветов тепловой карты под некоторым общим элементом управления пользовательского интерфейса). логика). Вся оркестровка живого интерактивного графического интерфейса была привязана к нескольким разрешенным взаимодействиям пользователя с машиной, когда пользователь мог перемещаться с набором объектов управления пользовательским интерфейсом, некоторые из которых можно было свободно изменять, тогда как некоторые были ограничены ( с использованием контроллеров дополненной реальности) для перемещения только по вертикали или только по горизонтали или были просто заблокированы, чтобы начать как касательные от краев полос Боллинджера в таком месте, где вертикальная линия UI-объекта управления была перемещена пользователь и т.д.

Решение Live-interactive-GUI простое:

Помимо [ советника ] создать и запустить еще один процесс, [ скрипт ], который будет отвечать за Автоматизация GUI-объектов. В этом скрипте используйте некоторые доступные только для чтения значения объектов, скажем, синюю вертикальную линию, в качестве SENSOR_x1, входных данных для GUI-композиции.

Если кто-то или что-то переместит эту синюю вертикальную линию, ваш цикл отслеживания событий внутри скрипта обнаружит новое значение для SENSOR_x1
и
повторно обработает всю схему макета пользовательского интерфейса, добавление только что наблюдаемого / обнаруженного движения SENSOR_x1_delta = SENSOR_x1 - SENSOR_x1_previous;
Таким образом, можно обновить цикл детектора движения в [ скрипте ] , отслеживая все фактические значения SENSOR_* и продвигая обнаруженные SENSOR_*_delta-s на все объекты, которые используются в композиции GUI-макета.

Наконец, стоит выполнить обновление экрана с помощью нескольких принудительных инструкций WindowRedraw(); во время повторной обработки дополненной реальности в Live-interactive-GUI.

Код из PoC-демонстратора

введите здесь описание изображения

Можно заметить, что код находится в синтаксисе pre-New-MQL4.56789, с использованием некоторых разрешенных соглашений об именах переменных, которые теперь перестали быть разрешенными. Объем функции Event-Monitor (автономная функция, оптимизированная для максимальной скорости/минимальной задержки при обработке всех трех углов MVC-фреймворка (Модель — зависит от проекта Live-GUI) , Visual — это расширение Live-GUI, специфичное для расширения, Controller — гибкий и составленный как своего рода конечный автомат из основных строительных блоков, реализованный с помощью < strong>"object.method" вызывает в switch(){}. Частота дискретизации цикла отлично работает до нескольких десятков миллисекунд, поэтому Live-GUI является надежным и плавно плавает на столе трейдера.

person user3666197    schedule 04.10.2016
comment
Обновлено примером из PoC Live-GUI выше. - person user3666197; 04.10.2016
comment
До сих пор вы мне очень помогали, большое спасибо за это, я очень ценю это. Поэтому я много работаю для этого. - person Max-Enrik; 04.10.2016
comment
Специально (Wild Worlds of MQL4 & счастливая и успешная торговля) вы тоже - Мне очень понравился ваш комментарий. Я уже нажал, чтобы проголосовать. :) - конечно буду делать постоянно. - person Max-Enrik; 05.10.2016

Это не лучший способ, но схематично показывает, что нужно делать.

string      mainObjectNAME,
       dependantObjectNAME;                     // dependant - your obj label

void OnChartEvent( const int     id,
                   const long   &lparam,
                   const double &dparam,
                   const string &sparam
                   ){
   if (  id == CHARTEVENT_OBJECT_DRAG
      || id == CHARTEVENT_OBJECT_ENDEDIT
         ){
      if (  StringCompare( sparam, mainObjectNAME ) == 0 ){
            datetime time1  = (datetime) ObjectGetInteger( 0,      mainObjectNAME, OBJPROP_TIME1 );
            double   price1 =            ObjectGetDouble(  0, dependantObjectNAME, OBJPROP_PRICE1 );
            if ( !ObjectMove( 0, dependantObjectNAME, 0, time1, price1 ) )
                  Print( __LINE__,
                         "failed to move object ",
                         dependantObjectNAME
                         );
      }
      ChartRedraw();
   }
}

если вы измените mainObject любым из признанных способов (путем перетаскивания или передачи других параметров) - тогда зависимый объект (OBJ_RECT_LABEL в вашем случае) перемещается с помощью функций ObjectMove() или ObjectSet().

person Daniel Kniaz    schedule 04.10.2016
comment
Негативной стороной этого предложения является то, что оно безоговорочно перерисовывает всю GUI-композицию. Если графический интерфейс дополненной торговли состоит из множества зависимых объектов, некоторые из которых, возможно, пересчитываются на основе события изменения, весь цирк будет работать даже для объектов, которые не двигаются/не меняются, теряя при этом эффективность, что с точки зрения Live- интерактивный графический интерфейс означает, что основной цикл обработки событий теряет свою отзывчивость, а графический интерфейс начинает работать медленно и с задержкой в ​​(полностью) обновлении. Кроме того, это никогда не будет работать в [ Script ], поэтому самый критичный ко времени код будет ждать в EA. - person user3666197; 04.10.2016
comment
Спасибо чувак. Я попробую это как можно скорее. Я очень ценю это. - person Max-Enrik; 04.10.2016
comment
Да, я согласен. Если у вас на графике много объектов - он может потерять эффективность. - person Daniel Kniaz; 04.10.2016