Советник MetaTrader4 для торговой панели.
Как связать несколько OBJ_RECTANGLE_LABEL
для перемещения с другим отдельным объектом?
Экспертная торговая панель MT4 — OBJ_RECTANGLE_LABEL
Ответы (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 является надежным и плавно плавает на столе трейдера.
Это не лучший способ, но схематично показывает, что нужно делать.
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()
.