图表事件类型
图表事件类型
使用预定函数OnChartEvent()能实现11种事件类型,自定义事件65535标识符在CHARTEVENT_CUSTOM 到 CHARTEVENT_CUSTOM_LAST 范围内浮动,为生成自定义事件,可以使用EventChartCustom()函数。
ENUM_CHART_EVENT
| ID | 说明 |
|---|---|
| CHARTEVENT_KEYDOWN | 打键次数 |
| CHARTEVENT_MOUSE_MOVE | 鼠标移动,鼠标点击 (如果 CHART_EVENT_MOUSE_MOVE=true 为图表设置) |
| CHARTEVENT_MOUSE_WHEEL | 按下或滚动鼠标滚轮(如果CHART_EVENT_MOUSE_WHEEL=True为图表设置) |
| CHARTEVENT_OBJECT_CREATE | 图解对象 创建 (如果 CHART_EVENT_OBJECT_CREATE=true 为图表设置) |
| CHARTEVENT_OBJECT_CHANGE | 图解对象 通过属性对话改变性质 |
| CHARTEVENT_OBJECT_DELETE | 图解对象 删除 (如果 CHART_EVENT_OBJECT_DELETE=true 为图表设置) |
| CHARTEVENT_CLICK | 点击一个图表 |
| CHARTEVENT_OBJECT_CLICK | 点击 图解对象 |
| CHARTEVENT_OBJECT_DRAG | 拖放 图解对象 |
| CHARTEVENT_OBJECT_ENDEDIT | 在图表对象编辑里进行文本末尾编辑 |
| CHARTEVENT_CHART_CHANGE | 通过属性对话框改变图表大小或更改图表属性 |
| CHARTEVENT_CUSTOM | 事件的首写字符在自定义事件中 |
| CHARTEVENT_CUSTOM_LAST | 事件的最后一个字符在自定义事件中 |
对于每个事件类型,OnChartEvent()函数的输入参数都有固定值,这在此事件处理过程中是必须的,事件和值通过参量传递并列举在如下表格中
| 事件 | ID参量值 | lparam 参数值 | dparam 参数值 | sparam 参数值 |
|---|---|---|---|---|
| 按键事件 | CHARTEVENT_KEYDOWN | 按键代码 | 重复计数(用户按住按键的重复击键次数) | 描述键盘按键状态的位掩码的字符串值 |
| 鼠标事件 (如果CHART_EVENT_MOUSE_MOVE=true 为图表设置) | CHARTEVENT_MOUSE_MOVE | X坐标 | Y坐标 | 描述鼠标按键状态的位掩码的字符串值 |
| 鼠标滚轮事件(如果CHART_EVENT_MOUSE_WHEEL=true为图表设置) | CHARTEVENT_MOUSE_WHEEL | 键盘按键和鼠标按键的状态标识,鼠标指针的X和Y坐标。在以下示例查阅描述 | 鼠标滚轮滚动的Delta值 | — |
| 图解对象创建事件 (如果 CHART_EVENT_OBJECT_CREATE=true 为图表设置) | CHARTEVENT_OBJECT_CREATE | — | — | 创建的图表对象的名称 |
| 通过性质对话转变对象性质事件 | CHARTEVENT_OBJECT_CHANGE | — | — | 修改的图表对象的名称 |
| 图解对象删除事件 (如果CHART_EVENT_OBJECT_DELETE=true为图表设置) | CHARTEVENT_OBJECT_DELETE | — | — | 删除图表对象的名称 |
| 鼠标点击图表事件 | CHARTEVENT_CLICK | X坐标 | Y坐标 | — |
| 鼠标点击属于图表的对象事件 | CHARTEVENT_OBJECT_CLICK | X坐标 | Y坐标 | 事件发生时图表对象的名称 |
| 使用鼠标拖动图解对象事件 | CHARTEVENT_OBJECT_DRAG | — | — | 移动图表对象名称 |
| 在编辑标签图表对象的进入访问完成文本编辑事件 | CHARTEVENT_OBJECT_ENDEDIT | — | — | 在文本编辑完成后编辑标签图表对象名称 |
| 在N数字下用户使用ID事件 | CHARTEVENT_CUSTOM+N | EventChartCustom() 函数的值 | EventChartCustom() 函数的值 | EventChartCustom() 函数的值 |
示例:
#define KEY_NUMPAD_5 12
#define KEY_LEFT 37
#define KEY_UP 38
#define KEY_RIGHT 39
#define KEY_DOWN 40
#define KEY_NUMLOCK_DOWN 98
#define KEY_NUMLOCK_LEFT 100
#define KEY_NUMLOCK_5 101
#define KEY_NUMLOCK_RIGHT 102
#define KEY_NUMLOCK_UP 104
//+------------------------------------------------------------------+
//| 专家初始化函数 |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("The expert with name ",MQL5InfoString(MQL5_PROGRAM_NAME)," is running");
//--- 启用对象创建事件
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- 启用对象删除事件
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- 强制更新图表属性确保做好事件处理的准备
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| ChartEvent 函数 |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // 事件标识符
const long& lparam, // 事件长整型参量
const double& dparam, // 事件双精度型参量
const string& sparam // 事件字符串型参量
)
{
//--- 鼠标左键点击图表
if(id==CHARTEVENT_CLICK)
{
Print("The coordinates of the mouse click on the chart are: x = ",lparam," y = ",dparam);
}
//--- 鼠标点击图形物件
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("The mouse has been clicked on the object with name '"+sparam+"'");
}
//--- 按下密钥
if(id==CHARTEVENT_KEYDOWN)
{
switch(lparam)
{
case KEY_NUMLOCK_LEFT: Print("The KEY_NUMLOCK_LEFT has been pressed"); break;
case KEY_LEFT: Print("The KEY_LEFT has been pressed"); break;
case KEY_NUMLOCK_UP: Print("The KEY_NUMLOCK_UP has been pressed"); break;
case KEY_UP: Print("The KEY_UP has been pressed"); break;
case KEY_NUMLOCK_RIGHT: Print("The KEY_NUMLOCK_RIGHT has been pressed"); break;
case KEY_RIGHT: Print("The KEY_RIGHT has been pressed"); break;
case KEY_NUMLOCK_DOWN: Print("The KEY_NUMLOCK_DOWN has been pressed"); break;
case KEY_DOWN: Print("The KEY_DOWN has been pressed"); break;
case KEY_NUMPAD_5: Print("The KEY_NUMPAD_5 has been pressed"); break;
case KEY_NUMLOCK_5: Print("The KEY_NUMLOCK_5 has been pressed"); break;
default: Print("Some not listed key has been pressed");
}
ChartRedraw();
}
//--- 物件被删除了
if(id==CHARTEVENT_OBJECT_DELETE)
{
Print("The object with name ",sparam," has been deleted");
}
//--- 物件被创建了
if(id==CHARTEVENT_OBJECT_CREATE)
{
Print("The object with name ",sparam," has been created");
}
//--- 移动物件或者更改定位点坐标
if(id==CHARTEVENT_OBJECT_DRAG)
{
Print("The anchor point coordinates of the object with name ",sparam," has been changed");
}
//--- 物件编辑文本被更改
if(id==CHARTEVENT_OBJECT_ENDEDIT)
{
Print("The text in the Edit field of the object with name ",sparam," has been changed");
}
}对于CHARTEVENT_MOUSE_MOVE 事件 sparam 字符串参数包含有关键盘和鼠标按钮的状态信息:
| Bit | 描述 |
|---|---|
| 1 | 鼠标左按键状态 |
| 2 | 鼠标右按键状态 |
| 3 | SHIFT 按钮状态 |
| 4 | CTRL 按钮状态 |
| 5 | 鼠标中按键状态 |
| 6 | 第一个额外鼠标键的状态 |
| 7 | 第二个额外鼠标键的状态 |
示例:
//+------------------------------------------------------------------+
//| EA初始化函数 |
//+------------------------------------------------------------------+
void OnInit()
{
//--- 启用 CHART_EVENT_MOUSE_MOVE 信息
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
//--- 禁用图表的上下文菜单(在右侧)
ChartSetInteger(0,CHART_CONTEXT_MENU,0);
//--- 禁用十字准线(通过中间按钮)
ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0);
//--- 强制更新图表属性确保做好事件处理的准备
ChartRedraw();
}
//+------------------------------------------------------------------+
//| 鼠标点选位置 |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // 鼠标左按键
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // 鼠标右按键
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // 鼠标中按键
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // 鼠标第一个 X 键
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // 鼠标第二个 X 键
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // shift 键
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // control 键
return(res);
}
//+------------------------------------------------------------------+
//| ChartEvent 函数 |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_MOUSE_MOVE)
Comment("POINT: ",(int)lparam,",",(int)dparam,"\n",MouseState((uint)sparam));
}对于CHARTEVENT_MOUSE_WHEEL事件,参数lparam 和dparam 包含Ctrl和 Shift键,鼠标按键,光标坐标的状态信息和鼠标滚轮滚动值。为了更好的理解,请在图表上运行这个EA交易并滚动鼠标滚轮,同时按下不同的按键并按住代码中所描述的按键。
CHARTEVENT_MOUSE_WHEEL 事件处理示例:
//+------------------------------------------------------------------+
//| EA交易初始化函数 |
//+------------------------------------------------------------------+
init OnInit()
{
//--- 启用鼠标滚轮来滚动信息
ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- 强制更新图表属性确保做好事件处理的准备
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| ChartEvent 函数 |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_MOUSE_WHEEL)
{
//--- 考虑这个事件的鼠标按键和滚轮的状态
int flg_keys = (int)(lparam>>32); // Ctrl 和 Shift 键,鼠标按键的状态标识
int x_cursor = (int)(short)lparam; // 鼠标滚轮事件发生的X坐标
int y_cursor = (int)(short)(lparam>>16); // 鼠标滚轮事件发生的Y坐标
int delta = (int)dparam; // 鼠标滚动的总值,到达 +120 或 -120 时触发
//--- 处理标识
string str_keys="";
if((flg_keys&0x0001)!=0) str_keys+="LMOUSE ";
if((flg_keys&0x0002)!=0) str_keys+="RMOUSE ";
if((flg_keys&0x0004)!=0) str_keys+="SHIFT ";
if((flg_keys&0x0008)!=0) str_keys+="CTRL ";
if((flg_keys&0x0010)!=0) str_keys+="MMOUSE ";
if((flg_keys&0x0020)!=0) str_keys+="X1MOUSE ";
if((flg_keys&0x0040)!=0) str_keys+="X2MOUSE ";
if(str_keys!="")
str_keys=", keys='"+StringSubstr(str_keys,0,StringLen(str_keys)-1) + "'";
PrintFormat("%s: X=%d, Y=%d, delta=%d%s",EnumToString(CHARTEVENT_MOUSE_WHEEL),x_cursor,y_cursor,delta,str_keys);
}
}
//+------------------------------------------------------------------+ /*
Example of the output
CHARTEVENT_MOUSE_WHEEL: Ctrl pressed: X=193, Y=445, delta=-120
CHARTEVENT_MOUSE_WHEEL: Shift pressed: X=186, Y=446, delta=120
CHARTEVENT_MOUSE_WHEEL: X=178, Y=447, delta=-120
CHARTEVENT_MOUSE_WHEEL: X=231, Y=449, delta=120
CHARTEVENT_MOUSE_WHEEL: MiddleButton pressed: X=231, Y=449, delta=120
CHARTEVENT_MOUSE_WHEEL: LeftButton pressed: X=279, Y=320, delta=-120
CHARTEVENT_MOUSE_WHEEL: RightButton pressed: X=253, Y=330, delta=120 */另见