事件处理函数 OnChartEvent

如果代码中包含具有以下原型的 OnChartEvent函数,指标或 EA 交易可以从终端接收交互事件。

void OnChartEvent(const int event, const long &lparam, const double &dparam, const string &sparam)

当用户执行操作时,或在通过 EventChartCustom生成“用户事件”的情况下,终端会调用该函数。

event参数中,事件标识符(即事件类型)以将 ENUM_CHART_EVENT 枚举值的形式传递(见下表)。

标识符

说明

CHARTEVENT_KEYDOWN

键盘操作

CHARTEVENT_MOUSE_MOVE

移动鼠标和点击鼠标按钮(如果为图表设置了 CHART_EVENT_MOUSE_MOVE 特性)

CHARTEVENT_MOUSE_WHEEL

点击或滚动鼠标滚轮(如果为图表设置了 CHART_EVENT_MOUSE_WHEEL 特性)

CHARTEVENT_CLICK

鼠标点击图表

CHARTEVENT_OBJECT_CREATE

创建图形对象(如果为图表设置了 CHART_EVENT_OBJECT_CREATE 特性)

CHARTEVENT_OBJECT_CHANGE

通过特性对话框修改图形对象

CHARTEVENT_OBJECT_DELETE

删除图形对象(如果为图表设置了 CHART_EVENT_OBJECT_DELETE 特性)

CHARTEVENT_OBJECT_CLICK

鼠标点击图形对象

CHARTEVENT_OBJECT_DRAG

拖动图形对象

CHARTEVENT_OBJECT_ENDEDIT

完成“输入字段”图形对象中的文本编辑

CHARTEVENT_CHART_CHANGE

更改图表尺寸或特性(通过特性对话框、工具栏或上下文菜单)

CHARTEVENT_CUSTOM

自定义事件范围的起始编号

CHARTEVENT_CUSTOM_LAST

自定义事件范围的结束编号

lparamdparamsparam 参数的用途根据事件类型的不同而不同。通常,这些参数包含处理特定事件所需的其他数据。后续章节将针对每种类型提供详细说明。

注意!OnChartEvent函数仅对直接加载在图表上的指标和 EA 交易生效。如果使用 iCustomIndicatorCreate 以编程方式创建任何指标,则 OnChartEvent事件不会传递给该指标。
 
此外,OnChartEvent处理程序在 测试程序中不会被调用,即使在可视化模式下。

首次演示 OnChartEvent处理程序时,我们将使用一个无缓冲区指标 EventAll.mq5,它可以拦截并记录所有事件。

void OnChartEvent(const int id,
   const long &lparamconst double &dparamconst string &sparam)
{
   ENUM_CHART_EVENT evt = (ENUM_CHART_EVENT)id;
   PrintFormat("%s %lld %f '%s'"EnumToString(evt), lparamdparamsparam);
}

默认情况下,图表上可以生成所有类型的事件,但有四种批量事件除外,如上表所示,这些事件需要通过图表的特殊特性启用。在下一节中,我们将为该指标添加设置,以便根据需要包含特定类型的事件。

在包含现有对象的图表上运行该指标,或在该指标运行时创建新对象。

更改图表的尺寸或设置,进行鼠标点击操作,并编辑对象的特性。日志中将出现以下条目。

CHARTEVENT_CHART_CHANGE 0 0.000000 ''
CHARTEVENT_CLICK 149 144.000000 ''
CHARTEVENT_OBJECT_CLICK 112 105.000000 'Daily Rectangle 53404'
CHARTEVENT_CLICK 112 105.000000 ''
CHARTEVENT_KEYDOWN 46 1.000000 '339'
CHARTEVENT_CLICK 13 252.000000 ''
CHARTEVENT_OBJECT_DRAG 0 0.000000 'Daily Button 61349'
CHARTEVENT_OBJECT_CLICK 145 104.000000 'Daily Button 61349'
CHARTEVENT_CLICK 145 104.000000 ''
CHARTEVENT_CHART_CHANGE 0 0.000000 ''
CHARTEVENT_OBJECT_DRAG 0 0.000000 'Daily Vertical Line 22641'
CHARTEVENT_OBJECT_DRAG 0 0.000000 'Daily Vertical Line 22641'
CHARTEVENT_OBJECT_CLICK 177 206.000000 'Daily Vertical Line 22641'
CHARTEVENT_CLICK 177 206.000000 ''
CHARTEVENT_OBJECT_CHANGE 0 0.000000 'Daily Rectangle 37930'
CHARTEVENT_CHART_CHANGE 0 0.000000 ''
CHARTEVENT_CLICK 152 118.000000 ''

在此处我们将看到各种类型的事件,阅读后续章节后便可以知晓其参数的含义。