事件处理

MQL5语言提供对特定预定义事件的处理。处理这些事件的函数应该在MQL5程序中定义:函数名、返回类型、一组参数(如果有),并且它们的类型应该严格地符合事件处理函数的描述。

客户端事件处理程序使用返回和参数类型来识别处理事件的函数。如果某个函数有一些参数或者返回类型与下面的描述不符,那么这样的函数就不可以被用于处理事件。

函数

描述

OnStart

Start事件发生时调用这个函数,来执行脚本中设定的操作

OnInit

Init事件发生时在指标和EA中调用这个函数,来初始化启动的MQL5程序

OnDeinit

Deinit事件发生时在指标和EA中调用这个函数,来去初始化启动的MQL5程序

OnTick

NewTick事件发生时在EA中调用这个函数,来处理一个新报价

OnCalculate

Calculate事件发生时在指标中调用这个函数,来处理价格数据的变化

OnTimer

Timer周期性事件在固定时间间隔内由程序端生成期间,在指标和EA中调用这个函数

OnTrade

Trade事件在交易服务器上交易操作结束时生成期间,在EA中调用这个函数

OnTradeTransaction

TradeTransaction事件发生时在EA中调用这个函数,来处理一个交易请求执行结果

OnBookEvent

BookEvent事件发生时在EA中调用这个函数,来处理市场深度中的变化

OnChartEvent

ChartEvent事件发生时在指标和EA中调用这个函数,来处理由用户或者MQL5程序所做的图表更改

OnTester

Tester事件发生时在EA中调用这个函数,以便在对历史数据测试EA之后执行必要的操作

OnTesterInit

TesterInit事件发生时在EA中调用这个函数,以便在策略测试优化之前执行必要的操作

OnTesterDeinit

在策略测试EA优化之后,当TesterDeinit事件发生时在EA中调用这个函数。

OnTesterPass

TesterPas事件发生时在EA中调用这个函数,以便在策略测试中处理EA优化期间到达的新数据框架

客户端将传入事件发送到相应的打开图表中。此外,事件也可以通过图表(图表事件)或mql5程序(自定义事件)来生成。通过设置CHART_EVENT_OBJECT_CREATECHART_EVENT_OBJECT_DELETE图表属性可以启用/禁用生成图形对象创建/删除事件。每个mql5应用程序和图表都有其自己的事件队列,所有新到达的事件也都包括其中。

一个程序只从其所运行的图表中获取事件。所有事件都按照它们的接收顺序来处理。如果这个队列已经包括NewTick事件,或者这个事件正在处理阶段,那么新的NewTick事件就不能添加到mql5应用程序队列中。同样,如果ChartEvent已在mql5程序序列或者这种事件正被处理,那么这种类型的新事件都不可放在队列之中。Timer事件处理也以相同的方式进行――如果Timer事件已在队列中或者正被处理中,那么队列中则不设置新的timer事件

事件队列具有一定限制但充足的规模,所以对于一个正确的开发程序来说,不可能出现队列溢出的情况。当队列溢出时,新事件会被舍弃,而不会将其设置为队列。

强烈建议不要使用无限循环来处理事件。可能的例外就是处理单独的Start事件的脚本。

程序库不处理任何事件。