EventChartCustom

该函数为指定图表生成自定义事件。

bool  EventChartCustom(
   long    chart_id,            // 接收图表事件的标识符
   ushort  custom_event_id,     // 事件标识符
   long    lparam,              // 长整型参量
   double  dparam,              // 双精度型参量
   string  sparam               // 事件的字符串参量
   );

参量

chart_id

[in] 图表标识符。 0 意味着当前图表。

custom_event_id

[in] 用户事件ID。这个标识符自动添加到CHARTEVENT_CUSTOM值中且转化成整数型。

lparam

[in] 传递到OnChartEvent函数的长整型事件参量。

dparam

[in] 传递到OnChartEvent函数的双精度型事件参量。

sparam

[in] 传递到OnChartEvent函数的字符串型事件参量。如果字符串超过63个字符,则会被删节。

返回值

如果一个自定义事件已经成功被放置在接收到事件的图表队列事件中,返回 true. 若成功返回true,否则false。调用函数GetLastError() 获得错误代码。

注释

附在指定图表的EA交易或者指标处理使用OnChartEvent函数(int event_id,long& lparam,double& dparam,string& sparam)的事件。

对于每一种事件类型,OnChartEvent()函数的输入参量有事件需要过程的定值。通过这个参量传递的事件和值列在以下表格中。

事件

id参量值

lparam 参量值

dparam 参量值

sparam 参量值

击键事件

CHARTEVENT_KEYDOWN

击键代码

重复计数(用户按住按键的重复击键次数)

描述键盘按键状态的位掩码的字符串值

鼠标事件 (if property CHART_EVENT_MOUSE_MOVE=true is set for the chart)

CHARTEVENT_MOUSE_MOVE

X 坐标

Y 坐标

描述鼠标按键状态的位掩码的字符串值

图解物件创建事件 (if CHART_EVENT_OBJECT_CREATE=true is set for the chart)

CHARTEVENT_OBJECT_CREATE

创建的图解物件名称

通过属性对话框改变物件属性事件

CHARTEVENT_OBJECT_CHANGE

更改的图解物件名称

图解物件删除事件 (if CHART_EVENT_OBJECT_DELETE=true is set for the chart)

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() 函数设置的值

示例:

//+------------------------------------------------------------------+
//|                                            ButtonClickExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| 专家初始化函数                                                     |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 创建按钮发送自定义事件
   ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,buttonID,OBJPROP_COLOR,clrWhite);
   ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,clrGray);
   ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
   ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
   ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
   ObjectSetString(0,buttonID,OBJPROP_TEXT,"Button");
   ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
   ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);
 
//--- 创建标签展示信息
   ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
   ObjectSetInteger(0,labelID,OBJPROP_COLOR,clrRed);
   ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
   ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
   ObjectSetString(0,labelID,OBJPROP_TEXT,"No information");
   ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
   ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);
 
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 专家无法初始化函数                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectDelete(0,buttonID);
   ObjectDelete(0,labelID);
  }
//+------------------------------------------------------------------+
//| 专家订单号函数                                                     |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- 通过按下鼠标键检测事件
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- 如果点击带有按键ID名的物件
      if(clickedChartObject==buttonID)
        {
         //--- 按键状态-按或者不按
         bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
         //--- 调试信息日志
         Print("Button pressed = ",selected);
         int customEventID; // 发送的自定义事件数
         string message;    // 事件中被发送的信息
         //--- 如果按下按键
         if(selected)
           {
            message="Button pressed";
            customEventID=CHARTEVENT_CUSTOM+1;
           }
         else // 不按按键
           {
            message="Button in not pressed";
            customEventID=CHARTEVENT_CUSTOM+999;
           }
         //--- 发送自定义事件“our”图表
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
         ///--- 发送信息到所有打开的图表
         BroadcastEvent(ChartID(),0,"Broadcast Message");
         //--- 调试信息
         Print("Sent an event with ID = ",customEventID);
        }
      ChartRedraw();// 强制重画所有图表物件
     }
 
//--- 检测属于用户事件的事件
   if(id>CHARTEVENT_CUSTOM)
     {
      if(id==broadcastEventID)
        {
         Print("Got broadcast message from a chart with id = "+lparam);
        }
      else
        {
         //--- 阅读事件中的文本信息
         string info=sparam;
         Print("Handle the user event with the ID = ",id);
         //--- 标签中展示信息
         ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
         ChartRedraw();// 强制重画所有图表物件
        }
     }
  }
//+------------------------------------------------------------------+
//| 发送广播事件到所有打开的图表                                         |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
  {
   int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
   long currChart=ChartFirst();
   int i=0;
   while(i<CHARTS_MAX)                 // 打开图表不能多于CHARTS_MAX 
     {
      EventChartCustom(currChart,eventID,lparam,dparam,sparam);
      currChart=ChartNext(currChart); // 从上一个接收新图表
      if(currChart==-1) break;        // 达到图表列表末端
      i++;                            // 不要忘记增加计数器
     }
  }
//+------------------------------------------------------------------+

另见

客户端事件事件处理程序函数