Наш последний советник обладает только одним недостатком. В блоке
init() имеется процедура открытия файла и чтения данных из него. При однократном прогоне в тестере это не страшно, но если мы захотим провести оптимизацию, то возникают две проблемы:
- падает скорость оптимизации, так как операции чтения из файлов на порядок (несколько порядков) медленнее, чем чтение из оперативной памяти;
- многократные операции открытия/закрытия файлов нежелательны для жесткого диска.
Программы в MQL-IV имеют глобальные переменные, объявленные в теле кода вне любой функции. Эти значения сохраняются в течение всей работы программы, и доступны из любой точки (функции) этой программы. Но для работы оптимизатора стратегий требуется некое иное решение, которое сохраняет значения переменных между запусками программ. В оптимизаторе мы многократно запускаем одну и ту же программу-советник, и иногда требуется помнить состояние некоторых переменных между отдельными запусками.
Для этих случаев существуют специальные переменные –
Global Variables. В отличие от глобальных переменных на уровне одного кода/программы, эти переменные являются глобальными на уровне терминала. Таким образом, мы можем создать некую глобальную переменную в скрипте и задать ее значение (
GlobalVariableSet()), а потом в индикаторе или советнике проверить это значение (
GlobalVariableGet()).
В отличие от остальных видов переменных, эти глобальные переменные сохраняются и при закрытии терминала(в течение 4 недель). Предположим, наш советник должен открывать только одну позицию в день, и если факт открытия мы будем хранить в обычной переменной, то при закрытии терминала или внезапной пропаже питания значение этой переменной (назовем ее
TradeOpen=
true) не сохранится. И тогда при новом запуске терминала переменная
TradeOpen примет значение по умолчанию (
false). И советник вновь автоматически откроет новую позицию, что запрещено алгоритмом. Применение по настоящему глобальной переменной решает эту задачу.
Для освоения методики применения глобальных переменных сначала создадим скрипт. Этот скрипт будет создавать глобальный массив значение.
Важно: глобальные переменные могут иметь только тип double. Не существует возможности создать массив глобальных переменных, но мы можем легко обойти это ограничение. Функции проверки и задания значений глобальных переменных оперируют именем этой переменной, заданной в текстовом формате. Поэтому, значение для массива по индексу мы можем задать как
Имя_массива+индекс.
Назовем скрипт
GlobalArray.mq4. Вместо глобального массива мы создадим массив глобальных переменных: