
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Как получить состояние включения/выключения кнопки?
Это следующая тема. Мы ее сегодня рассмотрим.
Добавлю, что элементы этого GUI рисованные, поэтому стандартный метод получения состояния ObjectGetInteger(0, "button1", OBJPROP_STATE); работать не будет.
Также, напомню что события элементов, в том числе кнопок, приходят в API файл.
Общий список тем для рассмотрения:
1. Ориентирование в списке интеллисенс и выбор функции нужного окна.
2. Программное открытие и закрытие окон.
3. Ориентирование в списке интеллисенс и выбор нужного элемента в нужном окне.
4. Ориентирование в списках индивидуальных свойств элементов.
5. Разбор названия функции обертки элемента и окна.
6. Возврат значения параметра выбранного элемента в переменную его типа. Рассмотрим три типа нескольких разных элементов.
7. Установка значений в параметры разных типов элементов. Посмотрим как значения будут появляться в окнах интерфейса этих элементов.
8. Возврат значений параметра одного элемента, изменение и пересылка этого значения в другой элемент. Рассмотрим разные типы элементов и значений, и проведем тест на пересылку между разными типами элементов в разных окнах.
9. Возврат предыдущего значения (_V_LAST). Когда и для каких случаев требуется последнее значение (не путать с текущим).
10. Протестируем устновку состояний ON/OFF/LOCK_ON/LOCK_OFF/LOCK/UNLOCK для различных типов элементов.
11. Попробуем связать и синхронизировать изменения значений элементов разных типов: например поля ввода с кнопками и слайдера. Допустим, чтобы при изменении значения одного элемента (ручного или программного), значение во втором элементе менялось соответствующе.
12. Попробуем программно переустановить границы диапазона слайдера и поля ввода с кнопками через функции обертки. Я не успел это протестировать, но что то подсказывает, что это получится. Впрочем, посмотрим.
13. Попробуем вернуть состояния элементов через функции обертки. Это заложено в функционал, но также, не успел протестировать. Поэтому посмотрим... Результат неизвестен.
14. Получим и установим цвета для текста и оснований элементов. Можно попытаться связать эти цвета с какими то незамысловатыми событиями или границами значений.
15. Расскажу подробнее как ориентироваться и читать новую распечатку файла API.
//------------------------------------------
Желтым цветом выделены темы которые уже рассмотрели.
Сегодня рассмотрим:
11. Синхронизация (связывание) изменения значений элементов разных типов: например поля ввода с кнопками и слайдера. Чтобы при изменении значения одного элемента (ручного или программного), значение во втором элементе менялось соответствующе.
12. Попробуем программно переустановить границы диапазона слайдера и поля ввода с кнопками через функции обертки. Я не успел это протестировать, но что то подсказывает, что это получится. Впрочем, посмотрим.
13. Попробуем вернуть состояния элементов через функции обертки. Это заложено в функционал, но также, не успел протестировать. Поэтому посмотрим... Результат неизвестен.
11. Связывание параметров элементов разных типов.
Наблюдательный человек замечал, что во многооконном графическом интерфейсе разные элементы часто связаны значениями параметров, свойствами и состояниями. Например:
//-------------------------------------------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------------------------------------------
Можно подумать, где то проходит невидимая связь элементов. И она действительно есть. Но невидима она только для стороннего наблюдателя. Для разработчика она вполне очевидна и сегодня рассмотрим ее подробно.
1. Связь элементов имеет две стороны:
Техническая реализация связей упрощается благодаря наличию графического движка.
Поясню:
В обычном советнике каждый параметр придумывает, называет, хранит и обрабатывает пользователь. Это рутинная работа которую нельзя обойти. Однако в случае использования графического движка, элементы созданные в конструкторе автоматически получают параметр вместе с местом хранения и функцией обработки/возврата. В довесок, пользователь получает их свойства, как тип, диапазон, прошлое значение и т.д. Это значительно упрощает труд. Теоретически, можно использовать готовые параметры элементов GUI как остальные пользовательские параметры, связав их напрямую с торговой логикой. Например лот, трейлинг стоп, тейк профит и другие, брать не из собственных переменных, а у полей настроек отвечающих за их значения.
Некоторые общие выводы:
1. Наличие графического элемента управления в программе = наличие готового программного параметра + его свойств + функции возврата/установки значения.
2. Чем больше элементов управления помещены в окна интерфейсной программы, тем больше параметров потециально участвуют в торговой логике и в вводе/выводе торговой информации.
3. Чем больше настроек и окон - тем выше контроль и шире полоса вывода рыночных данных (без ущерба автоматизации).
4. Чем выше контроль и шире полоса вывода рыночных данных - тем лучше осведомленность трейдера.
5. Осведомленность помноженная на автоматизацию и контроль = масштабирование трейдерских возможностей.
Добавлю, что часто автоматизацию противопостовляют мануальному контролю. Мол, наличие графического интерфейса означает ручную торговлю. Но это не так. Программный интерфейс не исключает, а расширяет автоматизацию, добавляя к ней "градиент" - открывает три варианта: ручное управление, полуавтоматическую торговлю и автономный режим.
Все что нужно трейдеру - выбрать опцию.
Благо, для этого легко создать окно.
//---------------------------------------------------------------------------------------------------
2. Перейдем к технической реализации связывания параметров элементов управления.
Рассмотрим несколько практических примеров:
1. Откроем знакомое окно настроек:
2. Откроем файл API и найдем элементы открытого окна внутри функции On_Gui_Event():
Напомню: Все события элементов управления приходят в функцию On_Gui_Event();
В связи с этим, часть связей параметров пропишем внутри этой функциии, а часть вне ее тела.
1. Установим связь между полем с кнопками (S_EDIT) "Spin the value" и слайдером (H_SLIDER) "Roll the value":
Результат: меняем значение в поле с кнопками, а слайдер двигается сам.
(*Важно - слайдер может двигаться только в своем диапазоне (в данном случае, от 0 до 100). В случае выхода за пределы, значение не меняется но выводится ошибка в журнал.)
//----------------------------------------------------------------------------------------------------------------
3. Сделаем реверс ролей. Слайдер будет управлять значением в поле ввода:
Результат: При перемещении ручки слайдера, поле с кнопками меняет значение синхронно.
//----------------------------------------------------------------------------------------------------------------
4. Пропишем взаимное управление слайдера и поля с кнопками друг другом:
Результат: Слайдер и поля ввода одновременно управляют друг другом.
//---------------------------------------------------------------------------------------------------
Завтра опубликую вторую часть этой темы с другими элементами.
Это потрясающий материал! Я планирую изучить эту тему более подробно, когда появится время. Я думал, что моя работа расширяет границы графического интерфейса mt4, но ваша работа - это новый уровень.
Это потрясающий материал! Я планирую изучить эту тему более подробно, когда появится время. Я думал, что моя работа расширяет границы графического интерфейса mt4, но ваша работа - это новый уровень.
Большое спасибо за добрые слова!
11. Связывание параметров элементов разных типов.
Продолжение темы.
Часть 2.
//--------------------------------------------------------------------------------------------------------------------------------
Посмотрим, можем ли мы применить показанный метод связывания к другим элементам. Например, к чекбоксам.
1. Сделаем так, чтобы верхний чекбокс запирал и отпирал чекбокс стоящий ниже:
Для этого:
1. Найдем чекбокс "Set an option" в файле API.
2. Пропишем вызов функции чекбокса "Set another option" который должен запираться/отпираться.
Результат: чекбокс запирается и отпирается как задумано:
//--------------------------------------------------------------------------------------------------------------------------------
2. Теперь, сделаем так, чтобы чекбокс запирал и отпирал два нижестоящих чекбокса:
Результат: чекбокс запирает и отпирает два нижестоящих чекбокса:
Так это происходило в динамике:
//--------------------------------------------------------------------------------------------------------------------------------
3. Теперь решим задачу изображенную на схеме ниже: чекбоксы должны запирать и отпирать выпадающие списки напротив них.
Для этого:
Результат: чекбоксы запирают выпадающие списки, а сами запираются главным чекбоксом:
//--------------------------------------------------------------------------------------------------------------------------------
4. Перейдем к решению следующей задачи: выпадающие списки должны траслировать выбранное пользователем значение в поле другого окна.
Для этого:
*Результат: оба выпадающих списка успешно посылают свои значения в поля ввода в противоположном окне:
//--------------------------------------------------------------------------------------------------------------------------------
5. Следующая задача показана на этой схеме: Необходимо, чтобы переключающиеся радиокнопки посылали свое имя в поля ввода напротив.
Для этого:
*Важная заметка: радиокнопки переключаются так как к ним был применен оператор SWITCH в KIB-коде. Поэтому, они имеют один общий параметр на всех и находятся в файле API в одном кейсе.
Результат: Переключение кнопок вызывает смену текста в поле ввода. *С этим вариантом имеется небольшая техническая проблема. Исправление в след.версии.
Вторая часть завершена.
В третьей части поработаем с таблицей.
Заключительная часть темы связывания параметров.
Передадим значения параметров элементов ячейкам таблицы.
Схема:
Решение:
Результат: значения благополучно занимают места в выбранных ячейках таблицы.
Как видно из приведенных примеров, разработано простое и удобное решение. Надеюсь, людям пригодится.
На этом тема связывания параметров элементов завершена.
Осталось рассмотреть следующие темы:
12. Программное получение/установка границ значений слайдера и поля с кнопками (_V_MIN, _V_MAX, _V_STEP, _DIGITS).
13. Запрос состояния элементов (_GET_STATE).
14. Связывание цвета текста и рамок с расставленными границами значений.
15. Ориентирование в файле API.
Добавлю тему:
16. Реализация программной логики появления окон сообщений и предупреждений.