MQL4编程语言提供了一些预定义事件的处理机制。在MQL4程序中,必须定义用于处理这些事件的函数。函数名、返回类型、参数组成(如果有)及其类型必须严格符合事件处理函数的描述。
客户端终端的事件处理器通过返回值类型和参数类型识别处理某事件的函数。如果为相应函数指定了与下文描述不符的其他参数,或者为其指示了另一个返回类型,那么该函数将不会被作为事件处理器使用。
以下,我们将详细介绍几个常见的事件处理函数:
OnStart函数
OnStart函数是Start事件处理器,仅针对运行脚本自动生成。它必须是void类型,没有参数:
void OnStart();
对于OnStart函数,可以指定int类型的返回值。
OnInit函数
OnInit函数是Init事件处理器。它必须是void或int类型,没有参数:
void OnInit();
Init事件在下载专家顾问或指标后立即生成;OnInit函数用于初始化。如果OnInit具有int类型的返回值,非零返回代码意味着初始化失败,并生成具有REASON_INITFAILED原因代码的Deinit事件。
只有当程序已经使用#property strict编译时,终端的运行时子系统才会分析OnInit函数执行结果。
在优化专家顾问的输入参数时,建议使用ENUM_INIT_RETCODE枚举的值作为返回代码。在测试开始之前的专家顾问初始化期间,您可以使用TerminalInfoInteger()函数请求有关配置和资源的信息。
以下是关于ENUM_INIT_RETCODE枚举的描述:
- INIT_SUCCEEDED:成功初始化,可以继续测试专家顾问。
- INIT_FAILED:初始化失败,由于致命错误无法继续测试。例如,未能创建专家顾问工作所需的指标。
- INIT_PARAMETERS_INCORRECT:输入参数集合不正确。在一般优化表中,包含此返回代码的结果字符串将以红色高亮显示。
OnDeinit函数
OnDeinit函数在去初始化过程中调用,是Deinit事件处理器。它必须声明为void类型,并应有一个包含去初始化原因代码的const int类型参数。如果声明了其他类型,编译器会生成警告,但不会调用该函数。
void OnDeinit(const int reason);
OnTick函数
NewTick事件只在接收到专家顾问所附加的图表的一个新标记时为专家顾问生成。在自定义指标或脚本中定义OnTick函数是无用的,因为它们不会为它们生成NewTick事件。
void OnTick();
OnTimer函数
OnTimer函数在发生Timer事件时调用,该事件由系统定时器仅为专家顾问和指标生成,不能在脚本中使用。订阅接收此事件的通知的频率由EventSetTimer函数设置。
void OnTimer();
OnTester函数
OnTester函数是Tester事件的处理器,它在选定间隔的专家顾问的历史测试结束后自动生成。该函数必须定义为double类型,没有参数:
double OnTester();
OnChartEvent函数
OnChartEvent是一组ChartEvent事件的处理器,它只能在专家顾问和指标中调用。该函数应为void类型,有4个参数:
void OnChartEvent(const int id,
const long& lparam,
const double& dparam,
const string& sparam
);
总的来说,MQL4的事件处理函数为我们处理预定义事件提供了强大的工具。通过正确地使用这些函数,我们可以使我们的MQL4程序对各种事件做出响应,从而更好地满足我们的编程需求。