229
События, отраженные на Рис. 58, в период t 0 - t 9 полностью совпадают с событиями,
отражёнными на Рис. 57. Согласно представленной диаграмме, в момент t 12 по
финансовому инструменту EUR/USD поступает третий тик, в результате чего при
исполнении специальной функции start() значение переменной Experts изменится и станет
равным 3. Это значит, что при выгрузке эксперта из окна EUR/USD, в результате
исполнения функции deinit() значение GV-переменной Quantity будет установлено равным
2, т.е. правильно отражающим количество экспертов, оставшихся в работе.
На основании этих рассуждений можно сделать вывод, что эксперт globalvar.mq4
составлен некорректно. Алгоритмическая ошибка в данном случае состоит в том, что для
анализа ситуации в функции deinit() используется значение переменной Experts, не
отражающей действительное количество одновременно работающих экспертов во всех без
исключения случаях. Для случая, показанного на Рис. 58, значение переменной Experts
оказывается справедливым, а для случая, представленного на Рис. 57, - нет. Таким
образом, общий результат работы эксперта находится в зависимости от случайных
событий, а именно, от последовательности прихода тиков по финансовым инструментам,
с которыми работает эксперт.
В данном случае исправить ошибку просто. Достаточно обновить значение переменной
Experts перед анализом (перед исполнением оператора if):
int deinit() // Спец. ф-ия deinit
{
Experts = GlobalVariableGet(Quantity); // Получим тек. знач.
if (Experts ==1) // Если эксперт один..
GlobalVariableDel(Quantity); //..удаляем GV-перемен
else // А иначе..
GlobalVariableSet(Quantity, Experts-1); //..уменьшаем на 1
Alert("Эксперт выгружен из окна ",Symbol()); // Сообщ. о выгрузке
return; // Выход из deinit()
}
Подобные алгоритмические ошибки опасны тем, что они не всегда очевидны, и их бывает
трудно обнаружить. Из этого вовсе не следует, что программисту нужно отказаться от
использования GV-переменных. Однако, это значит, что код любой программы должен
быть составлен корректно, с учётом всех событий, которые могут повлиять на
работоспособность программы.
Использование глобальных переменных в практической работе оказывается очень
полезным: например, можно передать информацию о критических событиях на другом