Tìm kiếm đối tượng
Có ba hàm để tìm kiếm đối tượng trên biểu đồ. Hai hàm đầu tiên, ObjectsTotal
và ObjectName
, cho phép bạn sắp xếp qua các đối tượng theo tên, và sau đó, nếu cần, sử dụng tên của mỗi đối tượng để phân tích các thuộc tính khác của nó (chúng ta sẽ mô tả cách thực hiện điều này trong phần tiếp theo). Hàm thứ ba, ObjectFind
, cho phép bạn kiểm tra sự tồn tại của một đối tượng bằng tên đã biết. Điều này cũng có thể được thực hiện bằng cách yêu cầu một thuộc tính nào đó qua hàm ObjectGet
: nếu không có đối tượng với tên được truyền vào, chúng ta sẽ nhận được lỗi trong _LastError
, nhưng điều này ít tiện lợi hơn so với việc gọi ObjectFind
. Ngoài ra, hàm này ngay lập tức trả về số của cửa sổ nơi đối tượng được tìm thấy.
int ObjectsTotal(long chartId, int window = -1, int type = -1)
Hàm trả về số lượng đối tượng trên biểu đồ với định danh chartId
(0 nghĩa là biểu đồ hiện tại). Chỉ các đối tượng trong cửa sổ phụ với số window
được chỉ định mới được tính đến trong phép tính (0 đại diện cho cửa sổ chính, -1 đại diện cho cửa sổ chính và tất cả các cửa sổ phụ). Lưu ý rằng chỉ các đối tượng thuộc loại cụ thể được chỉ định trong tham số type
mới được tính đến (-1 biểu thị tất cả các loại theo mặc định). Giá trị của type
có thể là một phần tử từ liệt kê ENUM_OBJECT
.
Hàm được thực thi đồng bộ, tức là nó khóa việc thực thi chương trình MQL gọi cho đến khi nhận được kết quả.
string ObjectName(long chartId, int index, int window = -1, int type = -1)
Hàm trả về tên của đối tượng dưới số index
trên biểu đồ với định danh chartId
. Khi biên dịch danh sách nội bộ, trong đó đối tượng được tìm kiếm, số cửa sổ phụ được chỉ định (window
) và loại đối tượng (type
) được tính đến. Danh sách được sắp xếp theo tên đối tượng theo thứ tự từ điển, tức là, đặc biệt, theo bảng chữ cái, có phân biệt chữ hoa chữ thường.
Giống như ObjectsTotal
, trong quá trình thực thi, ObjectName
đợi toàn bộ hàng đợi lệnh biểu đồ được lấy, sau đó trả về tên của đối tượng từ danh sách đối tượng đã cập nhật.
Trong trường hợp có lỗi, một chuỗi rỗng sẽ được trả về, và mã lỗi OBJECT_NOT_FOUND (4202) sẽ được lưu trong _LastError
.
Để kiểm tra chức năng của hai hàm này, hãy tạo một script có tên ObjectFinder.mq5
ghi lại tất cả các đối tượng trên tất cả các biểu đồ. Nó sử dụng các hàm lặp qua biểu đồ (ChartFirst
và ChartNext
), cũng như các hàm để lấy thuộc tính biểu đồ (ChartSymbol
, ChartPeriod
, và ChartGetInteger
).
#include <MQL5Book/Periods.mqh>
void OnStart()
{
int count = 0;
long id = ChartFirst();
// lặp qua các biểu đồ
while(id != -1)
{
PrintFormat("%s %s (%lld)", ChartSymbol(id), PeriodToString(ChartPeriod(id)), id);
const int win = (int)ChartGetInteger(id, CHART_WINDOWS_TOTAL);
// lặp qua các cửa sổ
for(int k = 0; k < win; ++k)
{
PrintFormat(" Window %d", k);
const int n = ObjectsTotal(id, k);
// lặp qua các đối tượng
for(int i = 0; i < n; ++i)
{
const string name = ObjectName(id, i, k);
const ENUM_OBJECT type = (ENUM_OBJECT)ObjectGetInteger(id, name, OBJPROP_TYPE);
PrintFormat(" %s %s", EnumToString(type), name);
++count;
}
}
id = ChartNext(id);
}
PrintFormat("%d objects found", count);
}
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
Đối với mỗi biểu đồ, chúng ta xác định số lượng cửa sổ phụ (ChartGetInteger(id, CHART_WINDOWS_TOTAL)
), gọi ObjectsTotal
cho mỗi cửa sổ phụ, và gọi ObjectName
trong vòng lặp bên trong. Tiếp theo, theo tên, chúng ta tìm loại đối tượng và hiển thị chúng cùng nhau trong nhật ký.
Dưới đây là phiên bản của kết quả có thể có từ script (với các phần rút gọn).
EURUSD H1 (132358585987782873)
Window 0
OBJ_FIBO H1 Fibo 58513
OBJ_TEXT H1 Text 40688
OBJ_TREND H1 Trendline 3291
OBJ_VLINE H1 Vertical Line 28732
OBJ_VLINE H1 Vertical Line 33752
OBJ_VLINE H1 Vertical Line 35549
Window 1
Window 2
EURUSD D1 (132360375330772909)
Window 0
EURUSD M15 (132544239145024745)
Window 0
OBJ_VLINE H1 Vertical Line 27032
...
XAUUSD D1 (132544239145024746)
Window 0
OBJ_EVENT ObjShow-2021.11.25 00:00:00
OBJ_TEXT ObjShow-2021.11.26 00:00:00
OBJ_ARROW_SELL ObjShow-2021.11.29 00:00:00
OBJ_ARROW_BUY ObjShow-2021.11.30 00:00:00
OBJ_ARROW_RIGHT_PRICE ObjShow-2021.12.01 00:00:00
OBJ_ARROW_LEFT_PRICE ObjShow-2021.12.02 00:00:00
OBJ_ARROW_CHECK ObjShow-2021.12.03 00:00:00
OBJ_ARROW_STOP ObjShow-2021.12.06 00:00:00
OBJ_ARROW_DOWN ObjShow-2021.12.07 00:00:00
OBJ_ARROW_UP ObjShow-2021.12.08 00:00:00
OBJ_ARROW_THUMB_DOWN ObjShow-2021.12.09 00:00:00
OBJ_ARROW_THUMB_UP ObjShow-2021.12.10 00:00:00
OBJ_HLINE ObjShow-2021.12.13 00:00:00
OBJ_VLINE ObjShow-2021.12.14 00:00:00
...
35 objects found
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
Ở đây, đặc biệt, bạn có thể thấy rằng trên biểu đồ XAUUSD, D1 có các đối tượng được tạo bởi script ObjectSimpleShowcase.mq5
. Một số biểu đồ và một số cửa sổ phụ không có đối tượng.
int ObjectFind(long chartId, const string name)
Hàm tìm kiếm một đối tượng theo tên trên biểu đồ được chỉ định bởi định danh và, nếu thành công, trả về số của cửa sổ nơi nó được tìm thấy.
Nếu không tìm thấy đối tượng, hàm trả về một số âm. Giống như các hàm trước trong phần này, hàm ObjectFind
sử dụng cuộc gọi đồng bộ.
Chúng ta sẽ thấy ví dụ về việc sử dụng hàm này trong script ObjectCopy.mq5
trong phần tiếp theo.