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

 
hini #:
Потому что в тестере он не вызывает OnChartEvent

Совершенно верно. Но при такой же ситуации в МТ4 были возможны варианты. Один из них я удачно реализовал. Интерфейс работал у советника запущенного в обычном режиме, но он мог управлять своей копией запущенной в тестере. Связь была реализована через ресурсы. В советник на графике приходили все данные в процессе тестирования. С МТ5, возможно, ситуация сложнее. Не уверен что удасться наладить "общение" двух копий через ресурс. Это вопрос требует отдельного исследования.

 
Перейдем к следующей теме:

4. Ориентирование в списках индивидуальных свойств элементов.

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

Напомню список тем для рассмотрения:

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.

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

Желтым цветом выделены темы которые уже рассмотрели.

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

  • Удачно реализована концепция разделения свойств по спискам, по признаку "родственности" элементов.  
  • В итоге реализации, были составлены 7 уникальных списков свойств для всех типов элементов
  • Каждому списку назначен специальный индентификатор. Это префикс р (сокращенние от property) и порядковый номер. 
  • В итоге, каждый список можно найти в интеллисенс по семи префиксам: р1, р2, р3, р4, р5, р6, и р7.
  • Для удобства и во избежания путаницы, префиксы списков свойств впечатаны в названия функций оберток:

  • При введении префикса возникает список индивидуальных свойств. Специально подчеркнул слово "индивидуальных", так как этот момент имеет ключевое значение.
  • Для возврата и установки значений свойств, функции обертки принимают названия свойств ТОЛЬКО с префиксом прописанным в их собственном названии:


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


  • Для чекбокса доступны ТОЛЬКО эти свойства из списка. Однако, сам список принадлежит не только чекбоксу, но и некоторым другим элементам.

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


  • Элемент C_LIST пока не имеет особых свойств в своем списке. Только действия которые может совершать обертка (кроме возврата V_LAST - последнего значения).

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


  • В отличии от C_LIST, слайдер имеет большой лист доступных свойств и действий.

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


  • Элемент S_ЕDIT принадлежит широкий набор доступных свойств и действий:


Подчеркну:

Каждая функция обертка принимает свойства только с префиксом прописанным в ее названии.


Так выглядит работа со списками на практике (скобки ставить в конце, потому что внутри скобок функций оберток интеллисенс не работает):

Гиф немного ускорен.


В результате вызовов показанных на гифе, функции обертки возвращают значения указанных свойств.

Перед вызовом необходимо объявить переменную для сохранения значения свойства или результата исполнения функции. Подробнее об этом в разборе следующих тем.

 

5. Разбор названия функции обертки элемента и окна:


1. Название функции обертки элемента:

Рассмотрим на примере функции элемента текстовое поле ввода EDIT: w7_s_p4_EDIT_Comment_1();

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

  • w7     -  номер окна 7 
      //-------------------------------------------------------------
  • s        -  Тип возвращаемого значения этой функции обертки string .
      //-------------------------------------------------------------
  • р4     -  Префикс списка свойств этого типа элемента.
      //-------------------------------------------------------------
  • EDIT  -  Тип элемента. 

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

  • Comment_1 -  Имя конкретного элемента. 

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


2. Название функции обертки окна:

Рассмотрим на примере другой функции: w_15_Processing_the_data();

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

  • w_15     -  номер окна 15 
      Обратите внимание, что номер идет не сразу после w, а через черточку _. Это важно. )
      //-------------------------------------------------------------
  • Processing_the_data        -  Название данного окна ( у окон предупреждений название может не совпадать с Caption - текстом что стоит в шапке окна).

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

Cтоит обратить внимание, что функция окна пока не имеет префикс для открытия списка свойств. Эта возможность обязательно появится. Будет сформирован специальный список свойств окна для возврата/установки, и назначен префикс. Также функция окна пока не содержит букву возвращаемого типа. 

На данный момент функция может лишь открывать или закрывать окно.


Эти недоработки будут исправлены в следующем релизе.


 
Рекомендуется обобщить эту обучающую информацию один раз в частном порядке и отдельно, иначе в будущем она заполонит комментарии
 
hini #:
Рекомендуется обобщить эту обучающую информацию один раз в частном порядке и отдельно, иначе в будущем она заполонит комментарии
Конечно, эта информация будет обобщена и упорядочена как положено.
 
В текущий период времени, порядок инструкций, пояснений и комментариев, только формируется. Содержание будущей документации гармонично накапливается в процессе разработки и общения с пользователями. В следствии этого, справочная информация излагается частями. Получение обратной связи необходимо и это важный этап повышающий качество технических решений. Программное обеспечение проходит этап формирования и сможет достичь полной функциональности благодаря активному соучастию публики. В результате, получится законченная программа с подробной документацией.  
 

6. Возврат значения параметра или свойства в переменную нужного типа:


Тип параметра элемента (intdouble или string) определяет тип функции элемента.

Известно, что функции элементов возвращают значение параметра одним из трех типов: int, double или string.

Однако функции также возвращают значения свойств...

Возникает ситуация, когда тип значения параметра может не совпадать с типом свойств, которые всегда int. Получается, функции возвращают значения свойств неверным типом, например double или string вместо intЭто вынужденное неудобство - цена за универсальность функций.

Задача пользователя - привести полученное значение к нужному типу самостоятельно.


Подчеркну: главным типом всех свойств элемента является int


Рассмотрим подробнее на примерах вопрос-ответ:

  •  - Вопрос:  Как функция вернет значение свойства типа int, если тип функции string?
  •  - Ответ:   Функция вернет значение int типом string
  •  - Вопрос: А как функция вернет значение int, если тип функции double
  •  - Ответ:  Функция вернет значение int типом double.
  •  - Вопрос: Как функция вернет значение double, если тип функции int?
  •  - Ответ:  Свойства элементов типа double не существуют. Типом double могут обладать свойства параметра элемента. В этом случае, функция сама будет иметь тип double


Тип значения параметра определяет тип функции элемента.

Не существуют свойства элемента типа double. Только int. Но существуют свойства параметра принимающие типы double, string или int. Например V_CURRENT, V_LAST, V_MAX, V_MIN, V_STEP могут либо int, либо double. В обоих случаях, функция элемента тоже станет int или double. Но функция не может стать int, если свойства параметра, или сам параметр, не int. И если функция слайдера возвращает тип int, значит на этапе создания элемента пользователь сам назначил его параметру или его свойствам целые числа, - например, поместил диапазон слайдера или поля ввода с кнопками внутри целых значений.   


Вывод: Задача пользователя - привести получаемые значения к нужному типу.

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

1.

   //------------------------------------------------
   //Текстовое поле ввода EDIT. Тип функции - string.
   //Получение и установка цвета текста и основания:
   //------------------------------------------------
   
   //1. Устанавливаем любой текст в пустое поле ввода:
   w7_s_p4_EDIT_Comment_1("Some random text");
   //------------------------------------------------

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

2.

   //------------------------------------------------
   //2. Получаем цвет основания поля ввода:
   uint Comment_1_base_color =  (uint)w7_s_p4_EDIT_Comment_1(get_s,p4_COLOR_base); 
   //------------------------------------------------
   //Выводим результат в журнал:
   Print("Comment_1_base_color  ",Comment_1_base_color);
   //------------------------------------------------

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

3.

   //------------------------------------------------
   //3. Назначаем основанию новый цвет:
   w7_s_p4_EDIT_Comment_1((uint)clrWheat,p4_COLOR_base); 
   //------------------------------------------------

Смотрим результат:


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

4.

   //------------------------------------------------
   //4. Получаем цвет текста поля ввода: 
   uint Comment_1_text_color =  (uint)w7_s_p4_EDIT_Comment_1(get_s,p4_COLOR_text); 
   //------------------------------------------------
   //Выводим результат в журнал:
   Print("Comment_1_text_color  ",Comment_1_text_color); 
   //------------------------------------------------


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

5. 

   //------------------------------------------------
   //5. Устанавливаем другой цвет тексту:
   w7_s_p4_EDIT_Comment_1((uint)clrRed,p4_COLOR_text); 
   //------------------------------------------------

Смотрим результат:




Далее протестируем получение и установку других свойств элемента и параметра. Также попробуем поработать с типом double.

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

Я следовал коду и тестировал его, и обнаружил неожиданную вещь, которая не автоскрывается, когда длина случайной строки слишком велика

w7_s_p4_EDIT_Comment_1("Some random text AAAAAAAA");


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