Торговая панель эксперта MT4 — «OBJ_RECTANGLE_LABEL»

#algorithmic-trading #mql4 #metatrader4

#алгоритмическая торговля #mql4 #metatrader4

Вопрос:

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

Ответ №1:

Косвенно связать их

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

Это не означает, что это невозможно, чтобы это работало так.

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

Решение с интерактивным графическим интерфейсом простое:

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

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

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

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

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

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

Комментарии:

1. Обновлено с помощью примера из PoC с живым графическим интерфейсом выше.

2. До сих пор вы мне очень помогали, большое спасибо за это, я очень ценю это. Так что я усердно работаю для этого.

3. Особенно («Дикие миры MQL4» и счастливой и успешной торговли) вы тоже — мне действительно понравился ваш комментарий. Я уже нажал на голосование. 🙂 — конечно, я буду делать это постоянно.

Ответ №2:

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

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

void OnChartEvent( const int     id,
                   const long   amp;lparam,
                   const double amp;dparam,
                   const string amp;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() помощью функций или.

Комментарии:

1. Отрицательной стороной этого предложения является то, что оно безоговорочно перерисовывает всю графическую композицию. Если расширенный торговый графический интерфейс состоит из множества зависимых объектов, некоторые из которых, возможно, пересчитываются на основе события изменения, весь цирк будет выполняться даже для объектов, которые не перемещаются / изменяются, что приводит к потере эффективности, что с точки зрения Live-interactive-GUI означает основной цикл событийтеряет свою отзывчивость, и графический интерфейс начинает замедляться и задерживаться при (полном) обновлении. Кроме того, это никогда не сработает в [Script], поэтому наиболее критичный по времени код придется подождать в EA

2. Спасибо, чувак. Я попробую это как можно скорее. Я высоко ценю это.

3. да, я согласен. Если у вас много объектов на графике — это может снизить эффективность.