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

 

Прежде чем продолжать тему реализации ступенчатой защиты границ параметров и предупреждений пользователя, следует упомянуть другую тему, которая ей прямо предшествует. А именно - предустановка параметров

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

Однако, остается прежняя необходимость задавать начальные значения параметрам программы на старте.

При наличии графического интерфейса нет смысла объявлять переменные типа input, ведь нам более не нужно штатное окно настроек, но суть остается прежней.  Вместо input переменных, мы должны задать начальные значения параметрам элементов управления.

На инциализации программы мы должны вызывать некую функцию, устанавливающую исходные значения в наши собственные окна, а не штатное окно. Как вариант, это можно сделать в KIB-конструкторе, на этапе сборки интерфейса, когда задаются значения V_CURRENT или состояния ON/OFF и и.д., но сейчас появилась возможность инициализировать элементы программым образом. Теперь можно совмещать инициализацию элементов в конструкторе и в программе.

Поэтому нужна специальная функция вызываемая из OnInit() и выполняющая эту работу. 

Что конкретно эта функция будет делать:

  • Открывать нужные окна на запуске программы.
  • Устанавливать значения в целевые элементы управления.

Как фунция будет называться?

Я бы назвал ее Initialize(), но каждый может придумать свой вариант.

Главное: эта функция обязана быть в любом интерфейсном советнике. Ее можно сравнить с функцией OnTick() эксперта, или OnCalculate() индикатора. Это важно понимать.


Какое значение будет возвращать функция?

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

*Важно учесть, что на данный момент концепт интерфейсных советников только формируется и многие открытия впереди.


Приведу пример инициализирующей функции интерфейсного советника в контексте текущего демо-проекта:

1. Вызов функции:

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int _OnInit()
  {
   //------------------------------------------------
   //Initializing program interface:
   //------------------------------------------------
   Initialize();
   //------------------------------------------------


2.  Реализация функции:

void Initialize()   
{
   //------------------------------------------------
   //Opening the windows:
   //------------------------------------------------
   //1. "Main Parameters". 

    w_14_Main_Parameters();
   //------------------------------------------------

   //------------------------------------------------
   //2. "Input parameters".

   w_10_Input_parameters();
   //------------------------------------------------

   //------------------------------------------------
   //3. "Setting example 1"

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


  //------------------------------------------------
  //Initializing the elements:
  //------------------------------------------------
  
   w6_d_p5_S_EDIT_Spin_the_value(55);

   w6_i_p3_H_SLIDER_Roll_the_value(55);

   w14_i_p3_V_SLIDER_Vertical_slider(55);

   w14_s_p4_EDIT_Max("100");

   w14_s_p4_EDIT_Min("0");

   w14_s_p4_EDIT_Selected("55");

   w15_i_p2_P_BAR_P1(55);

   w15_s_p4_VALUE_V1("55");
  //------------------------------------------------
}


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


Далее перейдем к основной теме: реализация ступенчатой защиты параметров.