Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Прежде чем продолжать тему реализации ступенчатой защиты границ параметров и предупреждений пользователя, следует упомянуть другую тему, которая ей прямо предшествует. А именно - предустановка параметров.
Начну с общеизвестного: большинство MQL-программ имеет переменные категории input. Они объявляются на глобальном уровне и видимы в едином окне настроек. Окно появляется при запуске программы и внутри него пользователь может менять исходные значения "внешних" переменных, если такая необходимость возникает. А перед этим, пользователь инициализирует внешние переменные внутри программы. Дело в том, что программные предустановки не универсальны, и поэтому выделена категория переменных требующих возможности настройки на каждом запуске. Также известно, что любая попытка ручного доступа к внешним переменным во время исполнения программы невозможна, и требует перезагрузки. При наличии графического интерфейса, эта необходимость отпадает. Настройки программы можно открывать во время исполнения.
Однако, остается прежняя необходимость задавать начальные значения параметрам программы на старте.
При наличии графического интерфейса нет смысла объявлять переменные типа input, ведь нам более не нужно штатное окно настроек, но суть остается прежней. Вместо input переменных, мы должны задать начальные значения параметрам элементов управления.
На инциализации программы мы должны вызывать некую функцию, устанавливающую исходные значения в наши собственные окна, а не штатное окно. Как вариант, это можно сделать в KIB-конструкторе, на этапе сборки интерфейса, когда задаются значения V_CURRENT или состояния ON/OFF и и.д., но сейчас появилась возможность инициализировать элементы программым образом. Теперь можно совмещать инициализацию элементов в конструкторе и в программе.
Поэтому нужна специальная функция вызываемая из OnInit() и выполняющая эту работу.
Что конкретно эта функция будет делать:
Как фунция будет называться?
Я бы назвал ее Initialize(), но каждый может придумать свой вариант.
Главное: эта функция обязана быть в любом интерфейсном советнике. Ее можно сравнить с функцией OnTick() эксперта, или OnCalculate() индикатора. Это важно понимать.
Какое значение будет возвращать функция?
Функция будет иметь тип void. Нет необходимости в возврате значения. При вызове откроет нужные окна, инициализирует параметры элементов, и возможно предустановит какие то свойства. По большому счету все. Теоретически, в ней можно задавать исходные границы параметров, но считаю что контроль значений будет реализован в отдельной функции, вызываемой на событиях элементов из файла API и из таймера. Вероятно, пропишу распечатку вызовов контроля в следующей версии.
*Важно учесть, что на данный момент концепт интерфейсных советников только формируется и многие открытия впереди.
Приведу пример инициализирующей функции интерфейсного советника в контексте текущего демо-проекта:
1. Вызов функции:
2. Реализация функции:
Пока что, структура функции мне видится такой. Очень простая функция. Открывает окна и посылает нужные значения в параметры элементов. Можно поменять инциализацию элементов и открытие окон местами, потому что открывающиеся окна сразу явят нужные значения элементов без дополнительной перерисовки. Впрочем, это мелочи.
Далее перейдем к основной теме: реализация ступенчатой защиты параметров.
14. Реализация ступенчатой защиты границ параметров:
//------------------------------------------------------------------------------------------------------------
Написание логики контроля настроек в предустановленных границах, и создание системы предупреждений:
//-----------------------------------------------------------------------------
Приступим:
1. Установим начальные значения параметров выбранных элементов и откроем нужные окна. Для этого напишем функцию Initialize() и поставим ее вызов в функции _OnInit().
Результат: Открыты нужные окна и установлены исходные значения в целевые элементы.
2. Откроем файл API и пропишем соединение элементов. В кейсе каждого элемента пропишем вызовы и передачу значения остальным целевым элементам в цепочке:
3. Протестируем соединение:
Результат: значения элементов связаны как задумано.
4. Пишем функцию контроля параметров нашей группы элементов: void Risk_management_group_1().
Вызываем функцию Risk_management_group_1() из функции _OnInit():
Результат: работает как задумано, но при вводе значение в поле ввода, окно предупреждения не сбрасывает введенное значение при появлении (требуется доработка).
(*Также - установка цвета рамок добавлена в обновление, но в текущей версии отсутствует.)
Cледующая задача - рассмотреть отмену введенных параметров нажатием на кнопку "Cancel".
Это очень непростая задача, но уже была мною частично реализована. Попробую восстановить прежний функционал.
В прошлом разборе я показал, как на пересечении установленных границ параметров применять цветовую индикацию риска и открывать блокирующие окна. Однако обнаружились две проблемы, которые не ожидал.
1. Функция рискменеджмента открывает первое окно предупреждения при пересечении опасного уровня, но если в этот момент не отрывать нажатый курсор от элемента, значение продолжает расти и доходит до следующего условного уровня. - Критического.
2. При пересечении критического значения открывается окно последнего предупреждения, однако, оно тоже не останавливает изменения значения если пользователь продолжает держать левую кнопку мышки.
3. Если пользователь отпускает кнопку мышки и хочет закрыть окна предупреждения, то сделать это он не может. Точнее, не мог. Причина в том, что два блокирующих окна начинают блокировать друг друга. Когда открыто одно из блокирующих окон, оно легко закрывается, но когда открыты два окна одновременно, ничего более в интерфейсе работать не может. Программа входит в ступор, хотя и работает.
На изображении ниже показано как это происходило:
Затем, я исправил проблемы взаимной блокировки окон настроек и теперь окна не мешают друг другу. Они совместно выполняют функцию блокировки не конфликтуя между собой.
Теперь нужно сделать так, чтобы появление окна предупреждения автоматически останавливало изменения значения параметра, даже при нажатой левой кнопки мышки и активном воздействии на элемент.
Вы можете это понять.