MT4全局变量GlobalVariable详解:全局变量在MT4编程中有两层含义,一是编程领域中常规的全局变量含义,即独立于所有函数之外定义的变量,生命周期覆盖整个程序;还有一个就是MT4中独有的:在同一MT4客户端内,所有的指标、脚本和EA都可共享同一全局变量:
这里的 客户端全局变量 不要与MQL4程序中定义的 全局变量 混淆。
最后访问的 "客户端全局变量" 可以在客户端内保存4个星期,然后将自动删除。对于 "客户端全局变量" 的访问不仅仅是新值的设定,也可以对其进行读取。
在客户端启动的所有MQL4程序可以同时访问 "客户端全局变量"。
GlobalVariableCheck() – 检查全局变量是否存在
GlobalVariableDel() – 删除全局变量
GlobalVariableGet() – 获取全局变量的值
GlobalVariableName() – 获取指定索引的全局变量名
GlobalVariableSet() – 设置全局变量的值
GlobalVariableSetOnCondition() – 根据条件设置全局变量值
GlobalVariablesDeleteAll() – 删除全部全局变量
GlobalVariablesTotal() – 获取全局变量总数
GlobalVariableCheck() – 检查全局变量是否存在
bool GlobalVariableCheck(string name)
如果 "客户端全局变量" 存在,返回TRUE,否则,返回FALSE。
要获得详细的错误信息,查看 GetLastError() 函数。
参量:
name - 客户端全局变量名称。
示例:
// 使用前先检查变量 if(!GlobalVariableCheck("g1")) GlobalVariableSet("g1",1);
GlobalVariableDel() – 删除全局变量
bool GlobalVariableDel(string name)
删除 "客户端全局变量" 。如果执行成功,返回TRUE,否则,返回FALSE。
参量:
name - 客户端全局变量名称。
示例:
// 删除名称为 "gvar_1"的客户端全局变量 GlobalVariableDel("gvar_1");
GlobalVariableGet() – 获取全局变量的值
double GlobalVariableGet(string name)
返回现有的 "客户端全局变量" 的值,如果发生错误,返回0。
参量:
name - 客户端全局变量名称。
示例:
double v1=GlobalVariableGet("g1"); //---- 检查函数调用结果 if(GetLastError()!=0) return(false); //---- 继续程序
GlobalVariableName() – 获取指定索引的全局变量名
string GlobalVariableGet(int index)
本函数通过全局变量列表中索引号返回 "客户端全局变量" 的名称。
参量:
index - 全局变量列表中索引号,该索引号必须大于等于0,或者小于 GlobalVariablesTotal() 返回的值。
示例:
int var_total=GlobalVariablesTotal(); string name; for(int i=0;i<var_total;i++) { name=GlobalVariableName(i); Print(i,": 全局变量名称 - ",name); }
GlobalVariableSet() – 设置全局变量的值
datetime GlobalVariableSet(string name, double value)
设置 "客户端全局变量" 新的值。如果它不存在,系统将创建个新的全局变量。如果函数成功,其返回值将是最后存取时间,否则,返回值将是0。
参量:
name - 客户端全局变量名称。value - 新的数值
示例:
//---- 尝试设定新值 if(GlobalVariableSet("BarsTotal",Bars)==0) return(false); //---- 继续程序
GlobalVariableSetOnCondition() – 根据条件设置全局变量值
bool GlobalVariableSetOnCondition(string name, double value, double check_value)
如果 "客户端全局变量" 的当前值等于第三个参数check_value,就设置现有的全局变量的新值。如果全局变量不存在,函数将产生错误ERR_GLOBAL_VARIABLE_NOT_FOUND(4058) 并且返回FALSE;当函数执行成功,返回TRUE,否则,返回FALSE。
如果全局变量的当前值与check_value不同,函数将返回FALSE。
函数为 "客户端全局变量" 提供了强大的访问能力,这就是为什么在一个客户端内同时运行的几个智能交易程序用它作为通信信号进行相互通信的原因。
参量:
name - 客户端全局变量名称。value - 新的数值。check_value - 与当前全局变量的值相比较的值。
示例:
int init() { //---- 创建客户端全局变量 GlobalVariableSet("DATAFILE_SEM",0); //... } int start() { //---- 尝试锁住公共资源 while(!IsStopped()) { //---- 锁住 if(GlobalVariableSetOnCondition("DATAFILE_SEM",1,0)==true) break; //---- 可以删除变量吗? if(GetLastError()==ERR_GLOBAL_VARIABLE_NOT_FOUND) return(0); //---- 等待 Sleep(500); } //---- 资源被锁 // ...做些工作 //----解锁资源 GlobalVariableSet("DATAFILE_SEM",0); }
GlobalVariablesDeleteAll() – 删除全部全局变量
int GlobalVariablesDeleteAll(void prefix_name)
删除 "客户端全局变量"。如果全局变量名称的前缀没有指定,所有全局变量将被删除,否则,只有那些符合指定前缀开头的变量被删除。函数返回被删除的变量个数。
参量:
prefix_name - 要被删除的全局变量名称前缀。
示例:
Print(GlobalVariablesDeleteAll("test_")," test_为开头的变量被删除");
GlobalVariablesTotal() – 获取全局变量总数
int GlobalVariablesTotal()
获取 "客户端全局变量" 的总数。
示例:
Print(GlobalVariablesTotal(),"全局变量检测到");
GlobalVariable,这个概念类似于编程领域中的共享内存区域;下面简单介绍一下其用法。
首先是必须用到的三个函数:GlobalVariableSet()、GlobalVariableGet()、GlobalVariableDel()。顾名思义,这三个函数的作用分别是设置、获取和删除GlobalVariable。在任何一个指标、脚本和EA中,可用GlobalVariableSet来设置一个GlobalVariable,如:
GlobalVariableSet(“test”, 1.2345);
这就设置好了,把这个指标挂到任何一张图表之上后,在同一个MT4客户端下运行的任何指标、脚本和EA都能读取到这个GlobalVariable了,读取方法:
GlobalVariableGet(“Test”);
最后,如果我们不需要这个GlobalVariable了,就可以这样把它删除了:
GlobalVariableDel(“Test”);
需要注意:一是GlobalVariable只能是double类型的数据,不能把string、数组之类的赋给它,否则编译的时候虽然不会报错,但其实是无效的;二是GlobalVariable的生命周期是名符其实的“全局”,在设置了一个GlobalVariable后,如果不用GlobalVariableDel来删除它,它将会一直存在,无论设置它的指标、脚本和EA是否已被删除,甚至MT4关闭后也会存在,下次重新启动MT4时这个GlobalVariable仍然是可用的!善用这点,在设计交易程序的时候可说是如虎添翼,呵呵!
办理VIP会员联系QQ/微信:29996044 另代写MT4/MT5/通达信/同花顺/文华财经/大智慧等各种EA指标脚本