图表事件类型

使用预定函数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参量值 参数常量值 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  */

另见

事件处理函数工作事件