Галерея UI написанных на MQL - страница 64

 
hini #:

Как получить состояние включения/выключения кнопки?

Это следующая тема. Мы ее сегодня рассмотрим.

Добавлю, что элементы этого 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. Попробуем вернуть состояния элементов через функции обертки. Это заложено в функционал, но также, не успел протестировать. Поэтому посмотрим... Результат неизвестен.

Документация по MQL5: Основы языка / Операторы / Оператор возврата return
Документация по MQL5: Основы языка / Операторы / Оператор возврата return
  • www.mql5.com
Оператор return прекращает выполнение текущей функции и возвращает управление вызвавшей программе. Результат вычисления выражения возвращается...
 
Тема большая, много гифов и картинок. Занимает время...
 

11. Связывание параметров элементов разных типов.

Наблюдательный человек замечал, что во многооконном графическом интерфейсе разные элементы часто связаны значениями параметров, свойствами и состояниями. Например:

//-------------------------------------------------------------------------------------------------------------------------

  • Введенный текст внезапно возникает в элементах других окон. 
  • Настройка регулируемая кнопками +/- меняет положение слайдера или цифры в поле. 
  • Текстовое поле транслирует символьную строку в ячейку таблицы другого окна.
  • Опция выпадающего списка переиначивает цвет или шрифт элементов.
  • Нажатый чекбокс запирает группу радиокнопок.
  • и т.д.

//-------------------------------------------------------------------------------------------------------------------------

Можно подумать, где то проходит невидимая связь элементов. И она действительно есть. Но невидима она только для стороннего наблюдателя. Для разработчика она вполне очевидна и сегодня рассмотрим ее подробно.

1. Связь элементов имеет две стороны: 

  • Логическую   - любая программа имеет парамеры, значения которых прямо или косвенно зависят и переопределяют друг друга. У программ с графическим интерфейсом связь прослеживается визуально.
  • Техническую - все параметры связываются внутренними программными алгоритмами. 

Техническая реализация связей упрощается благодаря наличию графического движка. 

Поясню:

В обычном советнике каждый параметр придумывает, называет, хранит и обрабатывает пользователь. Это рутинная работа которую нельзя обойти. Однако в случае использования графического движка, элементы созданные в конструкторе автоматически получают параметр вместе с местом хранения и функцией обработки/возврата. В довесок, пользователь получает их свойства, как тип, диапазон, прошлое значение и т.д. Это значительно упрощает труд. Теоретически, можно использовать готовые параметры элементов GUI как остальные пользовательские параметры, связав их напрямую с торговой логикой. Например лот, трейлинг стоп, тейк профит и другие, брать не из собственных переменных, а у полей настроек отвечающих за их значения.  

Некоторые общие выводы:

1. Наличие графического элемента управления в программе = наличие готового программного параметра + его свойств + функции возврата/установки значения.

2. Чем больше элементов управления помещены в окна интерфейсной программы, тем больше параметров потециально участвуют в торговой логике и в вводе/выводе торговой информации.

3. Чем больше настроек и окон - тем выше контроль и  шире полоса вывода рыночных данных (без ущерба автоматизации).

4. Чем выше контроль и шире полоса вывода рыночных данных - тем лучше осведомленность трейдера.

5. Осведомленность помноженная на автоматизацию и контроль = масштабирование трейдерских возможностей.

Добавлю, что часто автоматизацию противопостовляют мануальному контролю. Мол, наличие графического интерфейса означает ручную торговлю. Но это не так. Программный интерфейс не исключает, а расширяет автоматизацию, добавляя к ней "градиент" - открывает три варианта: ручное управление, полуавтоматическую торговлю и автономный режим.

Все что нужно трейдеру - выбрать опцию.

Благо, для этого легко создать окно.

//---------------------------------------------------------------------------------------------------


2. Перейдем к технической реализации связывания параметров элементов управления.

Рассмотрим несколько практических примеров:

1. Откроем знакомое окно настроек:

   //------------------------------------------------
   //Open the window "Settings example 1".

   w_6_Settings_example_1();
   //------------------------------------------------



2. Откроем файл API и найдем элементы открытого окна внутри функции On_Gui_Event():




Напомню:   Все события элементов управления приходят в функцию On_Gui_Event();

В связи с этим, часть связей параметров пропишем внутри этой функциии, а часть вне ее тела


1. Установим связь между полем с кнопками (S_EDIT) "Spin the value" и слайдером (H_SLIDER) "Roll the value":

  • Находим поле с кнопками "Spin the value" в файле API.
  • Прописываем отсылку значения в слайдер "Roll the value".

*(важная заметка. функции элементов и окон нужно перенести из файла UIDATA в низ файла API, чтобы работал интеллисенс. в след.версии они будут печататься там.)
case Settings_example_1___Spin_the_value:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when the value is set?
               //------------------------------------------------------------------------------------------------------
               //Min value:  NOT SET  |   Max value:  NOT SET  |   V_step:  1.7  |   Default value:  468.99  |  Digits: 3
               //------------------------------------------------------------------------------------------------------
               w6_i_p3_H_SLIDER_Roll_the_value((int)value);
               
                 
               Alert("S_EDIT Spin_the_value    value entered: ",value);
               //------------------------------------------------------------------------------------------------------
               //Your comment: Send the value to Slider.
               //------------------------------------------------------------------------------------------------------
               break;

Результат: меняем значение в поле с кнопками, а слайдер двигается сам.

(*Важно - слайдер может двигаться только в своем диапазоне (в данном случае, от 0 до 100). В случае выхода за пределы, значение не меняется но выводится ошибка в журнал.)


//----------------------------------------------------------------------------------------------------------------

3. Сделаем реверс ролей. Слайдер будет управлять значением в поле ввода:

  • Находим слайдер "Roll the value" в файле API.
  • Прописываем отсылку значения в поле с кнопками "Spin the value".
case Settings_example_1___Roll_the_value:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when the slider's handle is moved?
               //------------------------------------------------------------------------------------------------------
               //Min value:  0  |   Max value:  100  |   V_step:  1  |   Default value:  75  |  Digits: Integer value
               //------------------------------------------------------------------------------------------------------
               w6_d_p5_S_EDIT_Spin_the_value((double)value);
               
               //Alert("H_SLIDER Roll_the_value    value entered: ",value);
               //------------------------------------------------------------------------------------------------------
               //Your comment: Send the value to Spin edit.
               //------------------------------------------------------------------------------------------------------
               break;

Результат: При перемещении ручки слайдера, поле с кнопками меняет значение синхронно.


//----------------------------------------------------------------------------------------------------------------


4. Пропишем взаимное управление слайдера и поля с кнопками друг другом:

  • Находим оба элемента в файле API.
  • Прописываем отсылку значения. Поле с кнопками посылает свое значение слайдеру, слайдер посылает свое значение полю с кнопками.

case Settings_example_1___Spin_the_value:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when the value is set?
               //------------------------------------------------------------------------------------------------------
               //Min value:  NOT SET  |   Max value:  NOT SET  |   V_step:  1.7  |   Default value:  468.99  |  Digits: 3
               //------------------------------------------------------------------------------------------------------
               w6_i_p3_H_SLIDER_Roll_the_value((int)value);
               
                 
               Alert("S_EDIT Spin_the_value    value entered: ",value);
               //------------------------------------------------------------------------------------------------------
               //Your comment: Send the value to Slider.
               //------------------------------------------------------------------------------------------------------
               break;





case Settings_example_1___Roll_the_value:
  
               //------------------------------------------------------------------------------------------------------
               //What to do when the slider's handle is moved?
               //------------------------------------------------------------------------------------------------------
               //Min value:  0  |   Max value:  100  |   V_step:  1  |   Default value:  75  |  Digits: Integer value
               //------------------------------------------------------------------------------------------------------
               w6_d_p5_S_EDIT_Spin_the_value((double)value);
               
               Alert("H_SLIDER Roll_the_value    value entered: ",value);
               //------------------------------------------------------------------------------------------------------
               //Your comment: Send the value to Spin edit.
               //------------------------------------------------------------------------------------------------------
               break;

Результат: Слайдер и поля ввода одновременно управляют друг другом.

//---------------------------------------------------------------------------------------------------


Завтра опубликую вторую часть этой темы с другими элементами.

 

Это потрясающий материал! Я планирую изучить эту тему более подробно, когда появится время. Я думал, что моя работа расширяет границы графического интерфейса mt4, но ваша работа - это новый уровень.


 
Dennis Jorgenson #:

Это потрясающий материал! Я планирую изучить эту тему более подробно, когда появится время. Я думал, что моя работа расширяет границы графического интерфейса mt4, но ваша работа - это новый уровень.


Большое спасибо за добрые слова!