Các loại sự kiện biểu đồ
Có 11 loại sự kiện có thể được xử lý bằng hàm được định nghĩa sẵn OnChartEvent(). Đối với các sự kiện tùy chỉnh, 65535 định danh được cung cấp trong phạm vi từ CHARTEVENT_CUSTOM
đến CHARTEVENT_CUSTOM_LAST
bao gồm cả hai. Để tạo một sự kiện tùy chỉnh, hàm EventChartCustom() nên được sử dụng.
ENUM_CHART_EVENT
ID | Mô tả |
---|---|
CHARTEVENT_KEYDOWN | Nhấn phím |
CHARTEVENT_MOUSE_MOVE | Di chuyển chuột, nhấp chuột (nếu CHART_EVENT_MOUSE_MOVE=true được thiết lập cho biểu đồ) |
CHARTEVENT_MOUSE_WHEEL | Nhấn hoặc cuộn bánh xe chuột (nếu CHART_EVENT_MOUSE_WHEEL=True cho biểu đồ) |
CHARTEVENT_OBJECT_CREATE | Đối tượng đồ họa được tạo (nếu CHART_EVENT_OBJECT_CREATE=true được thiết lập cho biểu đồ) |
CHARTEVENT_OBJECT_CHANGE | Thuộc tính của đối tượng đồ họa thay đổi qua hộp thoại thuộc tính |
CHARTEVENT_OBJECT_DELETE | Đối tượng đồ họa bị xóa (nếu CHART_EVENT_OBJECT_DELETE=true được thiết lập cho biểu đồ) |
CHARTEVENT_CLICK | Nhấp vào biểu đồ |
CHARTEVENT_OBJECT_CLICK | Nhấp vào một đối tượng đồ họa |
CHARTEVENT_OBJECT_DRAG | Kéo và thả một đối tượng đồ họa |
CHARTEVENT_OBJECT_ENDEDIT | Kết thúc chỉnh sửa văn bản trong đối tượng đồ họa Edit |
CHARTEVENT_CHART_CHANGE | Thay đổi kích thước biểu đồ hoặc sửa đổi thuộc tính biểu đồ qua hộp thoại Thuộc tính |
CHARTEVENT_CUSTOM | Số đầu tiên của một sự kiện từ phạm vi các sự kiện tùy chỉnh |
CHARTEVENT_CUSTOM_LAST | Số cuối cùng của một sự kiện từ phạm vi các sự kiện tùy chỉnh |
Đối với mỗi loại sự kiện, các tham số đầu vào của hàm OnChartEvent()
có giá trị xác định cần thiết để xử lý sự kiện này. Các sự kiện và giá trị được truyền qua các tham số này được liệt kê trong bảng dưới đây.
Sự kiện | Giá trị của tham số id | Giá trị của tham số lparam | Giá trị của tham số dparam | Giá trị của tham số sparam |
---|---|---|---|---|
Sự kiện nhấn phím | CHARTEVENT_KEYDOWN | mã của phím được nhấn | Số lần lặp lại (số lần nhấn phím được lặp lại do người dùng giữ phím) | Giá trị chuỗi của mặt nạ bit mô tả trạng thái các nút bàn phím |
Sự kiện chuột (nếu CHART_EVENT_MOUSE_MOVE=true được thiết lập cho biểu đồ) | CHARTEVENT_MOUSE_MOVE | tọa độ X | tọa độ Y | Giá trị chuỗi của mặt nạ bit mô tả trạng thái các nút chuột |
Sự kiện bánh xe chuột (nếu CHART_EVENT_MOUSE_WHEEL=true cho biểu đồ) | CHARTEVENT_MOUSE_WHEEL | Cờ trạng thái của phím và nút chuột, tọa độ X và Y của con trỏ chuột. Xem mô tả trong ví dụ dưới đây | Giá trị Delta của cuộn bánh xe chuột | — |
Sự kiện tạo đối tượng đồ họa (nếu CHART_EVENT_OBJECT_CREATE=true được thiết lập cho biểu đồ) | CHARTEVENT_OBJECT_CREATE | — | — | Tên của đối tượng đồ họa được tạo |
Sự kiện thay đổi thuộc tính đối tượng qua hộp thoại thuộc tính | CHARTEVENT_OBJECT_CHANGE | — | — | Tên của đối tượng đồ họa được sửa đổi |
Sự kiện xóa đối tượng đồ họa (nếu CHART_EVENT_OBJECT_DELETE=true được thiết lập cho biểu đồ) | CHARTEVENT_OBJECT_DELETE | — | — | Tên của đối tượng đồ họa bị xóa |
Sự kiện nhấp chuột vào biểu đồ | CHARTEVENT_CLICK | tọa độ X | tọa độ Y | — |
Sự kiện nhấp chuột vào đối tượng đồ họa thuộc biểu đồ | CHARTEVENT_OBJECT_CLICK | tọa độ X | tọa độ Y | Tên của đối tượng đồ họa mà sự kiện xảy ra |
Sự kiện kéo đối tượng đồ họa bằng chuột | CHARTEVENT_OBJECT_DRAG | — | — | Tên của đối tượng đồ họa được di chuyển |
Sự kiện hoàn tất chỉnh sửa văn bản trong hộp nhập của đối tượng đồ họa LabelEdit | CHARTEVENT_OBJECT_ENDEDIT | — | — | Tên của đối tượng đồ họa LabelEdit mà việc chỉnh sửa văn bản đã hoàn tất |
Sự kiện thay đổi kích thước biểu đồ hoặc sửa đổi thuộc tính biểu đồ qua hộp thoại Thuộc tính | CHARTEVENT_CHART_CHANGE | — | — | — |
ID của sự kiện người dùng dưới số N | CHARTEVENT_CUSTOM+N | Giá trị được thiết lập bởi hàm EventChartCustom() | Giá trị được thiết lập bởi hàm EventChartCustom() | Giá trị được thiết lập bởi hàm EventChartCustom() |
Ví dụ:
#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
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("The expert with name ",MQL5InfoString(MQL5_PROGRAM_NAME)," is running");
//--- enable object create events
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_CREATE,true);
//--- enable object delete events
ChartSetInteger(ChartID(),CHART_EVENT_OBJECT_DELETE,true);
//--- forced updating of chart properties ensures readiness for event processing
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, // Event identifier
const long& lparam, // Event parameter of long type
const double& dparam, // Event parameter of double type
const string& sparam // Event parameter of string type
)
{
//--- the left mouse button has been pressed on the chart
if(id==CHARTEVENT_CLICK)
{
Print("The coordinates of the mouse click on the chart are: x = ",lparam," y = ",dparam);
}
//--- the mouse has been clicked on the graphic object
if(id==CHARTEVENT_OBJECT_CLICK)
{
Print("The mouse has been clicked on the object with name '"+sparam+"'");
}
//--- the key has been pressed
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();
}
//--- the object has been deleted
if(id==CHARTEVENT_OBJECT_DELETE)
{
Print("The object with name ",sparam," has been deleted");
}
//--- the object has been created
if(id==CHARTEVENT_OBJECT_CREATE)
{
Print("The object with name ",sparam," has been created");
}
//--- the object has been moved or its anchor point coordinates has been changed
if(id==CHARTEVENT_OBJECT_DRAG)
{
Print("The anchor point coordinates of the object with name ",sparam," has been changed");
}
//--- the text in the Edit of object has been changed
if(id==CHARTEVENT_OBJECT_ENDEDIT)
{
Print("The text in the Edit field of the object with name ",sparam," has been changed");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Đối với sự kiện CHARTEVENT_MOUSE_MOVE
, tham số chuỗi sparam
chứa thông tin về trạng thái của bàn phím và các nút chuột:
Bit | Mô tả |
---|---|
1 | Trạng thái của nút chuột trái |
2 | Trạng thái của nút chuột phải |
3 | Trạng thái của nút SHIFT |
4 | Trạng thái của nút CTRL |
5 | Trạng thái của nút chuột giữa |
6 | Trạng thái của nút chuột phụ thứ nhất |
7 | Trạng thái của nút chuột phụ thứ hai |
Ví dụ:
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
void OnInit()
{
//--- enable CHART_EVENT_MOUSE_MOVE messages
ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,1);
//--- disable the context menu of the chart (on the right)
ChartSetInteger(0,CHART_CONTEXT_MENU,0);
//--- disable the crosshair (by the middle button)
ChartSetInteger(0,CHART_CROSSHAIR_TOOL,0);
//--- forced updating of chart properties ensures readiness for event processing
ChartRedraw();
}
//+------------------------------------------------------------------+
//| MouseState |
//+------------------------------------------------------------------+
string MouseState(uint state)
{
string res;
res+="\nML: " +(((state& 1)== 1)?"DN":"UP"); // mouse left
res+="\nMR: " +(((state& 2)== 2)?"DN":"UP"); // mouse right
res+="\nMM: " +(((state&16)==16)?"DN":"UP"); // mouse middle
res+="\nMX: " +(((state&32)==32)?"DN":"UP"); // mouse first X key
res+="\nMY: " +(((state&64)==64)?"DN":"UP"); // mouse second X key
res+="\nSHIFT: "+(((state& 4)== 4)?"DN":"UP"); // shift key
res+="\nCTRL: " +(((state& 8)== 8)?"DN":"UP"); // control key
return(res);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
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));
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Đối với sự kiện CHARTEVENT_MOUSE_WHEEL
, các tham số lparam
và dparam
chứa thông tin về trạng thái của phím Ctrl
và Shift
, các nút chuột, tọa độ con trỏ và giá trị cuộn bánh xe chuột. Để hiểu rõ hơn, hãy chạy Expert Advisor này trên biểu đồ và cuộn bánh xe chuột, trong khi nhấn các nút khác nhau và giữ các phím được mô tả trong mã.
Ví dụ xử lý sự kiện CHARTEVENT_MOUSE_WHEEL
:
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Enabling mouse wheel scrolling messages
ChartSetInteger(0,CHART_EVENT_MOUSE_WHEEL,1);
//--- Forced updating of chart properties ensures readiness for event processing
ChartRedraw();
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
if(id==CHARTEVENT_MOUSE_WHEEL)
{
//--- Consider the state of mouse buttons and wheel for this event
int flg_keys = (int)(lparam>>32); // The flag of states of the Ctrl and Shift keys, and mouse buttons
int x_cursor = (int)((short)lparam); // the X coordinate where the mousse wheel event occurred
int y_cursor = (int)((short)(lparam>>16)); // the Y coordinate where the mousse wheel event occurred
int delta = (int)dparam; // the total value of mouse scroll, triggers when +120 or -120 is reached
//--- Processing the flag
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 */
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Xem thêm