大家好!今天我们来聊聊一个非常实用的EA示例——“Test_ChartEvent.mq4”。这个专家顾问展示了多种图表事件的应用,包括键盘事件、鼠标点击和移动事件,以及自定义事件。你可以按下'H'键获取帮助信息,按'M'键进入鼠标移动事件模式。
这个源代码同时兼容MetaTrader 4和MetaTrader 5,适合各位交易者使用。
功能原型
- bool Obj_Create()
- bool Obj_Delete()
- bool Obj_Move(int hSens,int vSens) - 移动一个对象。
- void Print_Info() - 打印对象信息。
- int MouseMove(int aXX,int aYY,string sState) - 处理鼠标移动事件。
全局变量
- int gChartNo=0
- int gSubWinNo=0
- string gsObj_Name_selected="" - 当前选中对象的名称。
自定义事件
定义了三种自定义事件:
- #define cMyEvent_1 0
- #define cMyEvent_2 1
- #define cMyEvent_3_broadcast 2
OnTimer() 函数
这个函数定期创建自定义图表事件,并随机生成这三种自定义事件(cMyEvent_1、cMyEvent_2和cMyEvent_3_broadcast)。特别是,cMyEvent_3_broadcast事件会在所有打开的图表窗口中生成。
类的示例
我们创建了一个类“CObjectMan”,用于处理图表上对象的功能。定义了两个类实例(变量):gObjectMan1和gObjectMan2。
与这两个实例相关的图形对象名称分别为:“绿色按钮”和“黄色按钮”。
事件处理
void OnChartEvent():
“CHARTEVENT_KEYDOWN”事件:
- 使用四个方向键(箭头键)或数字面板上的四个方向键来移动选中的对象。
- ‘H’:打印帮助信息(在专家日志窗口中)。
- ‘I’:打印两个对象的位置情况。
- ‘M’:激活鼠标移动事件。
自定义事件
打印这些事件的信息,尤其是MyEvent_3_broadcast事件。
对象事件
- CHARTEVENT_OBJECT_CHANGE、CHARTEVENT_OBJECT_DRAG、CHARTEVENT_OBJECT_DELETE - 打印相应对象的名称。
- CHARTEVENT_OBJECT_CLICK - 打印被点击对象的名称,并使用方向键选择其名称进行移动。
鼠标事件
- CHARTEVENT_CLICK - 打印被点击柱的相关信息:价格(开盘、收盘)和柱时间。
- CHARTEVENT_MOUSE_MOVE - 打印覆盖区域的信息:柱的数量、价格变动。

演示
你可以进行以下测试:
- 点击两个对象(按钮)之一进行选择,然后使用箭头键移动选中的对象。
- 点击图形柱,查看日志标签中的柱信息(消息)。
- 按'M'键进入鼠标移动事件模式。按Ctrl+F显示十字准星,然后进行拖放操作。如果未见日志消息,请更改输入参数:“iLogLevel”。