462
Аналогичные вычисления выполняются и для другого подокна - индикатора Momentum
(блоки 8 - 10). В конце функции Main() все имеющиеся графические объекты
перерисовываются в результате исполнения WindowRedraw().
Легко заметить, что программное управление графическими объектами в подокнах
предполагает использование глобальных переменных (можно также использовать static).
В подобных случаях при составлении программ необходимо внимательно следить за тем,
какие значения могут принимать глобальные переменные в различных случаях и какие
последствия это может повлечь. В рассматриваемой программе в функции init()
глобальные переменные обнуляются:
Win_RSI_old = 0; // Технический момент
Win_Mom_old = 0; // Технический момент
Необходимость включения в программу этих строк вызвана тем, что глобальные
переменные теряют свои значения, только если пользователь прекратил исполнение
прикладной программы в окне финансового инструмента. Если же пользователь выполнил
настройку внешних переменных или переключил таймфрейм, то программа проходит
деинициализацию и последующую инициализацию, однако значения глобальных
переменных при этом сохраняются.
Рассмотрим, как будет работать программа, в которой указанные строки отсутствуют.
Предположим, что на момент, когда пользователь переключил таймфрейм, в окне
финансового инструмента были установлены оба индикатора, с номерами подокон,
соответственно, 1 и 2. В рассматриваемом примере при деинициализации программы
происходит удаление графических объектов. При исполнении специальной функции init()
объекты создаются в нулевом окне. В дальнейшем, при исполнении функции Main(), в
блоках 7-8 и 9-10 выполняется сравнение найденного номера окна, в котором должны
быть установлены объекты, и номера окна, в котором объекты находились на предыдущем
тике. Фактически объекты установлены в нулевом окне, но значения глобальных
переменных будут свидетельствовать о другом: их номера будут 1 и 2. В результате
графические объекты будут оставаться в основном окне до тех пор, пока пользователь не
удалит и вновь не установит соответствующие индикаторы. Для того чтобы предотвратить
нежелательное развитие событий, в программе и предусмотрено обнуление глобальных
переменных при исполнении функции init(). Таким образом, значения этих переменных
поставлены в соответствие ситуации.