前面的文章中,写了一个比较简单的EA(专家),里面涉及了一些MT5中常用的方法,也展示了EA的大概框架。从这里开始将会以及那些内容为基础进行逐步细化,让你了解MQL5的细节内容。
回调函数以及机制
EA是不能独立运行的,它必须依赖图表,EA就像一个可以热插拔的插件一样被运行在某一个图表上。而图表上发生任何的变化,发生的任何操作等会通过特定的回调函数(或许可以称之为钩子)通知EA,这样EA就可以在特定的时机对特定的事件做出反应。下面介绍一些比较重要的回调函数以及相关机制:
初始化–OnInit
当初始化事件发生的时候,MT5就会调用OnInit函数通知EA,这里你可以完成一些程序级别的初始化操作,比如:初始化变量等等。这里所说的“初始化事件”可能包括:
1、EA被加载到图表中
2、EA在运行状态下,代码被重新编译
3、EA所运行的图表周期发生改变。(比如,从H1周期切换到H4周期 )等等
需要注意的是,以上三点是我在使用EA的过程中发现的,如果有遗漏也请大家给予补充。
个人习惯:我通常会在OnInit函数里做一些EA范围内的全局初始化工作,包括:
1、初始化(new)指针
2、检查参数设置是否符合标准
3、获取持久化数据(比如:配置文件数据),连接数据库等等
OnInit函数的原型如下所示:
int OnInit(){
}
从函数的定义可以知道,我们在完成初始化工作以后需要有一个整型的返回结果,用于指示MT5后续的处理。返回码包括:
1、INIT_SUCCEEDED:表示EA初始化是成功的。
2、INIT_FAILED:EA初始化失败。该错误表示初始化过程中发生了非常严重的错误,而无法继续执行
3、INIT_PARAMETERS_INCORRECT:EA的参数验证失败,这可能是EA的参数设置出了问题
4、INIT_AGENT_NOT_SUITABLE:这个错误表示EA本身并没有问题,但是MT5认为目前的系统环境不再适合EA继续运行,比如:内存不足等问题。
注意:EA初始化的返回值是程序员手工强制返回的,也就是说你认为初始化成功就成功。这样做会给正给EA带来很大的风险需要格外小心。如果,这个返回值被设定为非INIT_