Глобальные переменные терминала

В предыдущей главе мы изучили функции MQL5 для работы с файлами. Они предоставляют широкие, гибкие возможности по записи и чтению произвольных данных. Однако иногда MQL-программе требуется более простой способ сохранить и восстановить состояние какого-либо атрибута между запусками.

Например, мы хотим подсчитывать некую статистику — сколько раз была запущена программа, сколько её копий выполняется параллельно на разных графиках и т.д. Накапливать эту информацию внутри самой программы невозможно. Это должно быть некое внешнее долговременное "хранилище". Но создавать ради этого файл было бы накладно, хотя, конечно, возможно.

Кроме того, многие программы проектируются с расчетом на взаимодействие друг с другом, то есть они должны как-то обмениваться информацией. Если речь об интеграции с программой, внешней по отношению к терминалу, или о передаче большого объема данных, то здесь без файлов, действительно трудно обойтись. Однако, когда пересылаемых данных мало, а все программы написаны на MQL5 и выполняются внутри MetaTrader 5, использование файлов кажется избыточным. Ведь в терминале на этот случай реализована более простая технология: глобальные переменные.

Глобальная переменная — это именованная ячейка в общей памяти терминала. Она может создаваться, модифицироваться, удаляться любой MQL-программой, но не будет принадлежать исключительно ей и доступна всем другим MQL-программам. Имя глобальной переменной — это любая уникальная (среди всех переменных) строка длиной не более 63 символов. Эта строка не обязана отвечать требованиям идентификаторов переменных в MQL5, поскольку глобальные переменные терминала не являются переменными в привычном понимании. Программист не определяет их в исходном коде в соответствии с синтаксисом, который мы изучали в главе Переменные, они не являются составной частью MQL-программы, и любое действие с ними выполняется только через вызов одной из специальных функций, которые мы опишем в этой главе.

Глобальные переменные терминала позволяют хранить только значения типа double. При необходимости вы можете упаковать/конвертировать значения других типов в double или использовать часть имени переменной (например, после определенного префикса) для хранения строк.

Пока терминал работает, глобальные переменные хранятся в оперативной памяти и доступны практически моментально: единственные накладные расходы связанны с вызовом функций. Это выгодно отличает глобальные переменные от использования файлов, в случае которых получение дескриптора — относительно медленный процесс, да и сам дескриптор потребляет некоторые дополнительные ресурсы.

При завершении рабочей сессии терминала глобальные переменные выгружаются в специальный файл (gvariables.dat) и затем восстанавливаются из него при следующем запуске терминала.

Конкретная глобальная переменная автоматически уничтожается терминалом, если она не была востребована в течение 4 недель. Такое поведение основывается на отслеживании и сохранении времени последнего использования переменной, причем под использованием понимается установка нового значения или чтение старого (но не проверка на существование или получение времени последнего использования).

Обратите внимание, что глобальные переменные не привязаны ни к счету, ни к профилю, ни к каким-либо еще характеристикам торговой среды. Поэтому, если в них предполагается хранить нечто, относящееся к окружению (например, некие общие лимиты для конкретного счета), имена переменных следует конструировать с учетом всех факторов, которые влияют на алгоритм и принятие решений. Для различения глобальных переменных нескольких экземпляров одного и того же эксперта может потребоваться добавить в имя рабочий инструмент, таймфрейм или "магическое число" из настроек эксперта.

Кроме MQL-программ глобальные переменные может вручную создавать и пользователь. Список существующих глобальных переменных, а также средства интерактивного управления ими находятся в диалоге, открываемом в терминале по команде Сервис -> Глобальные переменные (F3).

С помощью соответствующих кнопок здесь можно Добавить и Удалить глобальную переменную, а двойной щелчок мыши в колонках Переменная или Значение позволяет редактировать имя или величину конкретной переменной. Для работы с клавиатуры действуют следующие горячие клавиши: F2 — редактирование имени, F3 — редактирование значения, Ins — добавление новой переменной, Del — удаление выбранной переменной.

Чуть позже мы изучим два основных типа MQL-программ — эксперты и индикаторы. Их отличает способность запускаться в тестере, где функции для глобальных переменных также работают. Однако там глобальные переменные создаются, хранятся и управляются агентом тестирования. Иными словами, списки глобальных переменных терминала недоступны в тестере, а те переменные, которые создаются тестируемой программой, принадлежат конкретному агенту и время их жизни ограничено одним тестовым проходом. То есть, глобальные переменные агента не видны из других агентов и будут удалены по окончании теста. В частности, если эксперт оптимизируется на нескольких агентах, он может манипулировать глобальными переменными для "общения" с индикаторами, используемыми им в контексте того же агента, поскольку они выполняются там совместно, но на параллельно работающих агентах другими копиями эксперта будут формироваться собственные списки переменных.

Обмен данными между MQL-программ с помощью глобальных переменных — не единственный и не всегда самый подходящий способ. В частности, эксперты и индикаторы являются интерактивными типами MQL-программ, способными генерировать и принимать события на графиках. В параметрах событий можно передавать информацию различных типов. Кроме того, массивы расчетных данных могут подготавливаться и предоставляться другим MQL-программам в виде буферов индикаторов. MQL-программы, располагающиеся на графиках, могут использовать для передачи и хранения информации интерфейсные графические объекты.

Чисто технически максимальное количество глобальных переменных ограничено лишь ресурсами операционной системы. Однако для большого количества элементов  рекомендуется использовать более подходящие средства: файлы или базы данных.