下载MetaTrader 5

图表事件类型

使用预定函数OnChartEvent()能实现9种事件类型,自定义事件65535标识符在CHARTEVENT_CUSTOM 到 CHARTEVENT_CUSTOM_LAST 范围内浮动,为生成自定义事件,可以使用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参量值

参数常量值

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

移动图表对象名称

在编辑标签图表对象的进入访问完成文本编辑事件

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);
//---
   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

第二个额外鼠标键的状态

示例:

//+------------------------------------------------------------------+
//| 专家初始化函数                                                     |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- 启用 CHART_EVENT_MOUSE_MOVE 信息
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
  }
//+------------------------------------------------------------------+
//| 鼠标点选位置                                                       |
//+------------------------------------------------------------------+
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));
  }

另见

事件处理函数工作事件


更新: 2015.12.03