Tạo đối tượng
Để tạo một đối tượng, cần một tập hợp tối thiểu các thuộc tính chung cho tất cả các loại. Các thuộc tính bổ sung đặc thù cho từng loại có thể được thiết lập hoặc thay đổi sau trên một đối tượng đã tồn tại. Các thuộc tính bắt buộc bao gồm định danh của biểu đồ nơi đối tượng sẽ được tạo, tên của đối tượng, số của cửa sổ/cửa sổ phụ, và hai tọa độ cho điểm neo đầu tiên: thời gian và giá.
Mặc dù có một nhóm đối tượng được định vị theo tọa độ màn hình, việc tạo chúng vẫn yêu cầu truyền hai giá trị, thường là số không vì chúng không được sử dụng.
Nói chung, nguyên mẫu của hàm ObjectCreate
trông như sau:
bool ObjectCreate(long chartId, const string name, ENUM_OBJECT type, int window,
datetime time1, double price1, datetime time2 = 0, double price2 = 0, ...)
2
Giá trị 0 cho chartId
ngụ ý biểu đồ hiện tại. Tham số name
phải là duy nhất trong toàn bộ biểu đồ, bao gồm các cửa sổ phụ, và không được vượt quá 63 ký tự.
Chúng ta đã đưa ra các loại đối tượng cho tham số type
trong các phần trước: đây là các phần tử của liệt kê ENUM_OBJECT
.
Như chúng ta biết, việc đánh số cửa sổ/cửa sổ phụ cho tham số window
bắt đầu từ 0, nghĩa là cửa sổ biểu đồ chính. Nếu chỉ định một chỉ số lớn hơn cho cửa sổ phụ, nó phải tồn tại, nếu không hàm sẽ kết thúc với lỗi và trả về false
.
Nhắc lại, cờ thành công được trả về (true
) chỉ cho biết lệnh tạo đối tượng đã được đặt thành công vào hàng đợi. Kết quả thực thi của nó không được biết ngay lập tức. Đây là mặt trái của cuộc gọi không đồng bộ, được sử dụng để nâng cao hiệu suất.
Để kiểm tra kết quả thực thi, bạn có thể sử dụng hàm ObjectFind
hoặc bất kỳ hàm ObjectGet nào, dùng để truy vấn thuộc tính của một đối tượng. Nhưng bạn nên nhớ rằng các hàm như vậy đợi thực thi toàn bộ hàng đợi lệnh biểu đồ và chỉ sau đó trả về kết quả thực tế (trạng thái của đối tượng). Quá trình này có thể mất một chút thời gian, trong đó mã chương trình MQL sẽ bị tạm dừng. Nói cách khác, các hàm kiểm tra trạng thái của đối tượng là đồng bộ, không giống các hàm tạo và sửa đổi đối tượng.
Các điểm neo bổ sung, bắt đầu từ điểm thứ hai, là tùy chọn. Số lượng điểm neo tối đa cho phép, lên đến 30, được cung cấp để sử dụng trong tương lai, và hiện tại không có loại đối tượng nào sử dụng quá 5 điểm.
Điều quan trọng cần lưu ý là việc gọi hàm ObjectCreate
với tên của một đối tượng đã tồn tại chỉ đơn giản là thay đổi (các) điểm neo (nếu tọa độ đã thay đổi kể từ lần gọi trước). Điều này thuận tiện để viết mã thống nhất mà không cần phân nhánh thành các điều kiện dựa trên sự hiện diện hay vắng mặt của đối tượng. Nói cách khác, một lệnh gọi ObjectCreate
vô điều kiện đảm bảo sự tồn tại của đối tượng, nếu chúng ta không quan tâm liệu nó có tồn tại trước đó hay không. Tuy nhiên, có một sắc thái. Nếu khi gọi ObjectCreate
, loại đối tượng hoặc chỉ số cửa sổ phụ khác với đối tượng đã tồn tại, dữ liệu liên quan vẫn giữ nguyên, trong khi không có lỗi xảy ra.
Khi gọi ObjectCreate
, bạn có thể để tất cả các điểm neo với giá trị mặc định (không), miễn là các hàm ObjectSet
với các thuộc tính OBJPROP_TIME
và OBJPROP_PRICE
thích hợp được gọi sau lệnh này.
Thứ tự chỉ định các điểm neo có thể quan trọng đối với một số loại đối tượng. Đối với các kênh như
OBJ_REGRESSION
(Kênh Hồi quy Tuyến tính) vàOBJ_STDDEVCHANNEL
(Kênh Độ lệch Chuẩn), điều kiệntime1<time2
là bắt buộc phải được đáp ứng. Nếu không, kênh sẽ không được xây dựng bình thường, mặc dù đối tượng sẽ được tạo mà không có lỗi.
Ví dụ về hàm, hãy xem script ObjectSimpleShowcase.mq5
tạo ra một số đối tượng thuộc các loại khác nhau trên các thanh cuối cùng của biểu đồ, yêu cầu một điểm neo duy nhất.
Tất cả các ví dụ làm việc với đối tượng sẽ sử dụng tệp tiêu đề ObjectPrefix.mqh
, chứa định nghĩa chuỗi với tiền tố chung cho tên đối tượng. Do đó, sẽ thuận tiện hơn cho chúng ta, nếu cần, để xóa các đối tượng "của riêng mình" khỏi biểu đồ.
const string ObjNamePrefix = "ObjShow-";
Trong hàm OnStart
, một mảng được định nghĩa chứa các loại đối tượng.
void OnStart()
{
ENUM_OBJECT types[] =
{
// đường thẳng
OBJ_VLINE, OBJ_HLINE,
// nhãn (mũi tên và các dấu hiệu khác)
OBJ_ARROW_THUMB_UP, OBJ_ARROW_THUMB_DOWN,
OBJ_ARROW_UP, OBJ_ARROW_DOWN,
OBJ_ARROW_STOP, OBJ_ARROW_CHECK,
OBJ_ARROW_LEFT_PRICE, OBJ_ARROW_RIGHT_PRICE,
OBJ_ARROW_BUY, OBJ_ARROW_SELL,
// OBJ_ARROW, // xem ví dụ ObjectWingdings.mq5
// văn bản
OBJ_TEXT,
// cờ sự kiện (như trong lịch) ở dưới cùng của cửa sổ
OBJ_EVENT,
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Tiếp theo, trong vòng lặp qua các phần tử của nó, chúng ta tạo các đối tượng trong cửa sổ chính, truyền thời gian và giá đóng cửa của thanh thứ i.
const int n = ArraySize(types);
for(int i = 0; i < n; ++i)
{
ObjectCreate(0, ObjNamePrefix + (string)iTime(_Symbol, _Period, i), types[i],
0, iTime(_Symbol, _Period, i), iClose(_Symbol, _Period, i));
}
PrintFormat("%d objects of various types created", n);
}
2
3
4
5
6
7
8
9
Dưới đây là kết quả có thể có từ việc chạy script.
Các đối tượng loại đơn giản tại các điểm đóng của các thanh cuối cùng
Việc vẽ các đường theo giá Close
và hiển thị lưới được bật trong ví dụ này. Chúng ta sẽ tìm hiểu cách điều chỉnh kích thước, màu sắc và các thuộc tính khác của đối tượng sau. Đặc biệt, các điểm neo của hầu hết các biểu tượng mặc định nằm ở giữa cạnh trên, vì vậy chúng bị lệch trực quan dưới đường thẳng. Tuy nhiên, biểu tượng bán nằm trên đường vì điểm neo luôn ở giữa cạnh dưới.
Vui lòng lưu ý rằng các đối tượng được tạo bằng lập trình không được hiển thị mặc định trong danh sách đối tượng trong hộp thoại cùng tên. Để xem chúng ở đó, nhấp vào nút
All
.