图表事件类型

使用预定函数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事件,参数lparamdparam 包含CtrlShift键,鼠标按键,光标坐标的状态信息和鼠标滚轮滚动值。为了更好的理解,请在图表上运行这个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  */

另见

事件处理函数工作事件