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