216
Обратите внимание, в период, когда открыто окно свойств эксперта и
пользователь принимает решение о значениях внешних переменных,
эксперт (или индикатор) не работает. Установив значения внешних
переменных и нажав ОК на панели настроек программы, пользователь
заново запускает её в работу.
При этом клиентский терминал последовательно запускает на исполнение специальную
функцию deinit(), потом специальную функцию init(), а после этого, в момент поступления
нового тика, запускает на исполнение специальную функцию start(). При исполнении
функции deinit(), завершающей программу, внешние переменные будут иметь значения,
полученные в предыдущем сеансе, т.е. те, которые были у них до открытия панели
настроек эксперта. Перед исполнением специальной функции init() внешние переменные
получат значения, установленные пользователем на панели настроек эксперта, и при
исполнении функции init() внешние переменные будут иметь уже новые, установленные
пользователем значения. Таким образом, новые значения внешних переменных вступают
в силу с момента нового сеанса (init - start - deinit) работы эксперта, начинающегося с
исполнения init().
Факт открытия окна настроек эксперта на значения глобальных переменных не влияет. В
течение всего времени, пока открыто окно настроек, и после его закрытия, глобальные
переменные сохраняют свои значения, имеющиеся на момент, предшествующий
открытию панели настроек эксперта.
В программе externvar.mq4 используются также две глобальные и одна локальная
переменные.
bool Fact_1 = false; // Глобальная перемен.
bool Fact_2 = false; // Глобальная перемен.
double Price = Bid; // Локальная перемен.
Алгоритмически решение задачи выглядит так. Идентифицируются два события: первое -
факт достижения ценой уровня Level, второе - факт того, что сообщение (о снижении
ниже уровня Level на n пунктов) уже выдано. Эти события находят своё отражение в
значениях переменных Fact_1 и Fact_2: если событие ещё не свершилось, то значение
соответствующей переменной равно false, а если свершилось - true. В строках:
if (NormalizeDouble(Price,Digits) >= NormalizeDouble(Level,Digits))
Fact_1 = true; // Произошло событие 1