Удаление глобальных переменных

При необходимости MQL-программа может удалить ставшую ненужной глобальную переменную или их группу. Список глобальных переменных потребляет некоторые ресурсы компьютера, а хороший стиль программирования предполагает, что ресурсы следует по возможности освобождать.

bool GlobalVariableDel(const string name)

Функция удаляет глобальную переменную с именем name. При успешном выполнении функция возвращает true, иначе — false.

int GlobalVariablesDeleteAll(const string prefix = NULL, datetime limit = 0)

Функция удаляет глобальные переменные с указанным префиксом в имени и более старым временем использования, чем значение в параметре limit.

Если указан префикс NULL (по умолчанию) или пустая строка, то под критерий удаления попадают все глобальные переменные, соответствующие также и критерию удаления по дате (если он задан).

Если параметр limit равен нулю (по умолчанию), то удаляются глобальные переменные с любой датой, с учетом префикса.

Если указаны оба параметра, то удаляются глобальные переменные, соответствующие одновременно и префиксу, и критерию по времени.

Будьте осторожны: вызов GlobalVariablesDeleteAll без параметров приведет к удалению всех переменных.

Функция возвращает количество удаленных переменных.

Рассмотрим скрипт GlobalsDelete.mq5, эксплуатирующий две новых функции.

void OnStart()
{
   PRTF(GlobalVariableDel("#123%"));
   PRTF(GlobalVariablesDeleteAll("#123%"));
   ...

В начале делается попытка удалить несуществующие глобальные переменные по точному имени и префиксу. Обе не оказывают эффекта на существующие переменные.

Вызов GlobalVariablesDeleteAll с фильтром по времени в прошлом (больше 4 недель назад) также имеет нулевой результат, потому что столь "древние" переменные терминал удаляет сам автоматически (такие переменные не могут существовать).

   PRTF(GlobalVariablesDeleteAll(NULLD'2021.01.01'));

Далее для тестирования создается переменная с именем "abracadabra" (если её не было) и тут же удаляется. Эти вызовы должны закончиться успешно.

   PRTF(GlobalVariableSet(abracadabra0));
   PRTF(GlobalVariableDel(abracadabra));

Наконец, удалим переменные, начинающиеся с префикса "GlobalsRun": они должны были быть созданы тестовыми скриптами из двух предыдущих разделов по именам файлов (соответственно, "GlobalsRunCount.mq5" и "GlobalsRunCheck.mq5").

   PRTF(GlobalVariablesDeleteAll("GlobalsRun"));
   PRTF(GlobalVariablesTotal());
}

Скрипт должен вывести в журнал примерно следующее (некоторые показатели зависят от внешних условий и времени запуска).

GlobalVariableDel(#123%)=false / GLOBALVARIABLE_NOT_FOUND(4501)
GlobalVariablesDeleteAll(#123%)=0 / ok
GlobalVariablesDeleteAll(NULL,D'2021.01.01')=0 / ok
GlobalVariableSet(abracadabra,0)=2021.08.30 14:02:32 / ok
GlobalVariableDel(abracadabra)=true / ok
GlobalVariablesDeleteAll(GlobalsRun)=2 / ok
GlobalVariablesTotal()=0 / ok

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