跳至内容

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_MOVEX坐标Y坐标描述鼠标按钮状态的位掩码的字符串值
图形对象创建事件(如果图表设置了CHART_EVENT_OBJECT_CREATE=true)CHARTEVENT_OBJECT_CREATE创建的图形对象的名称
通过属性对话框更改对象属性的事件CHARTEVENT_OBJECT_CHANGE被修改的图形对象的名称
图形对象删除事件(如果图表设置了CHART_EVENT_OBJECT_DELETE=true)CHARTEVENT_OBJECT_DELETE被删除的图形对象的名称
图表上鼠标点击事件CHARTEVENT_CLICKX坐标Y坐标
属于图表的图形对象上的鼠标点击事件CHARTEVENT_OBJECT_CLICKX坐标Y坐标发生事件的图形对象的名称
使用鼠标拖动图形对象的事件CHARTEVENT_OBJECT_DRAG被移动的图形对象的名称
LabelEdit图形对象的输入框中文本编辑结束的事件CHARTEVENT_OBJECT_ENDEDIT文本编辑完成的LabelEdit图形对象的名称
通过属性对话框更改图表大小或修改图表属性的事件CHARTEVENT_CHART_CHANGE
用户事件编号N下的IDCHARTEVENT_CUSTOM+NEventChartCustom()函数设置的值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右鼠标按钮的状态
3SHIFT按钮的状态
4CTRL按钮的状态
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));
  }

另请参阅

事件处理函数事件处理

最后更新于