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++;                            // 不要忘记增加计数器

     }

  }

//+------------------------------------------------------------------+

另见

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