删除全局变量

如果必要,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 程序或由用户创建,则你的结果可能不同。