Types of Chart Events
图表事件的类型
有9种事件可以使用预定义的函数OnChartEvent()进行处理。对于自定义事件,提供了从CHARTEVENT_CUSTOM到CHARTEVENT_CUSTOM_LAST的65535个标识符,包括这两个数值。要生成自定义事件,应使用EventChartCustom()函数。
ENUM_CHART_EVENT
| ID | 描述 |
|---|---|
| CHARTEVENT_KEYDOWN | 按键事件 |
| CHARTEVENT_MOUSE_MOVE | 鼠标移动、鼠标点击(如果图表设置了CHART_EVENT_MOUSE_MOVE=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_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 | — | — | 被移动的图形对象的名称 |
| LabelEdit图形对象的输入框中文本编辑结束的事件 | CHARTEVENT_OBJECT_ENDEDIT | — | — | 文本编辑完成的LabelEdit图形对象的名称 |
| 通过属性对话框更改图表大小或修改图表属性的事件 | CHARTEVENT_CHART_CHANGE | — | — | — |
| 用户事件编号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
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("The Expert Advisor with name ",MQLInfoString(MQL_PROGRAM_NAME)," is running");
//--- enable object create events
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- enable object delete events
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // Event identifier
const long& lparam, // Event parameter of long type
const double& dparam, // Event parameter of double type
const string& sparam) // Event parameter of string type
{
//--- the left mouse button has been pressed on the chart
if(id==CHARTEVENT_CLICK)
{
Print("The coordinates of the mouse click on the chart are: x = ",lparam," y = ",dparam);
}
//--- the mouse has been clicked on the graphic object
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("The mouse has been clicked on the object with name '"+sparam+"'");
}
//--- the key has been pressed
if(id==CHARTEVENT_KEYDOWN)
{
switch(int(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();
}
//--- the object has been deleted
if(id==CHARTEVENT_OBJECT_DELETE)
{
Print("The object with name ",sparam," has been deleted");
}
//--- the object has been created
if(id==CHARTEVENT_OBJECT_CREATE)
{
Print("The object with name ",sparam," has been created");
}
//--- the object has been moved or its anchor point coordinates has been changed
if(id==CHARTEVENT_OBJECT_DRAG)
{
Print("The anchor point coordinates of the object with name ",sparam," has been changed");
}
//--- the text in the Edit of object 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字符串参数包含有关键盘和鼠标按钮状态的信息:
| 位 | 描述 |
|---|---|
| 1 | 左鼠标按钮的状态 |
| 2 | 右鼠标按钮的状态 |
| 3 | SHIFT按钮的状态 |
| 4 | CTRL按钮的状态 |
| 5 | 中间鼠标按钮的状态 |
| 6 | 第一个额外鼠标按钮的状态 |
| 7 | 第二个额外鼠标按钮的状态 |
示例:
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- enable CHART_EVENT_MOUSE_MOVE messages
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse left
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse right
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse middle
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse first X key
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse second X key
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // shift key
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // control key
return(res);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
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));
}另请参阅
最后更新于