Xác định điểm neo trên đối tượng
Một số loại đối tượng cho phép bạn chọn điểm neo. Các loại thuộc danh mục này bao gồm nhãn văn bản (OBJ_TEXT
) và hình ảnh bitmap (OBJ_BITMAP
) được liên kết với báo giá, cũng như chú thích (OBJ_LABEL
) và bảng với hình ảnh (OBJ_BITMAP_LABEL
), được định vị trong tọa độ màn hình.
Để đọc và thiết lập điểm neo, sử dụng các hàm ObjectGetInteger
và ObjectSetInteger
với thuộc tính OBJPROP_ANCHOR
.
Tất cả các tùy chọn chọn điểm được tập hợp trong liệt kê ENUM_ANCHOR_POINT
.
Định danh | Vị trí điểm neo |
---|---|
ANCHOR_LEFT_UPPER | Ở góc trên bên trái |
ANCHOR_LEFT | Trung tâm bên trái |
ANCHOR_LEFT_LOWER | Ở góc dưới bên trái |
ANCHOR_LOWER | Trung tâm phía dưới |
ANCHOR_RIGHT_LOWER | Ở góc dưới bên phải |
ANCHOR_RIGHT | Trung tâm bên phải |
ANCHOR_RIGHT_UPPER | Ở góc trên bên phải |
ANCHOR_UPPER | Trung tâm phía trên |
ANCHOR_CENTER | Chính xác ở trung tâm của đối tượng |
Các điểm được hiển thị rõ ràng trong hình ảnh dưới đây, nơi nhiều đối tượng nhãn được áp dụng lên biểu đồ.
Các đối tượng văn bản OBJ_LABEL với các điểm neo khác nhau
Nhóm trên cùng gồm bốn nhãn có cùng cặp tọa độ (X, Y), tuy nhiên, do neo vào các góc khác nhau của đối tượng, chúng nằm ở các phía khác nhau của điểm. Tình huống tương tự xảy ra ở nhóm thứ hai gồm bốn nhãn văn bản, tuy nhiên, ở đó việc neo được thực hiện vào các điểm giữa của các cạnh khác nhau của đối tượng. Cuối cùng, chú thích được hiển thị riêng ở phía dưới, neo ở trung tâm của nó, sao cho điểm nằm bên trong đối tượng.
Nút (OBJ_BUTTON
), bảng hình chữ nhật (OBJ_RECTANGLE_LABEL
), trường nhập (OBJ_EDIT
) và đối tượng biểu đồ (OBJ_CHART
) có điểm neo cố định ở góc trên bên trái (ANCHOR_LEFT_UPPER
).
Một số đối tượng đồ họa của nhóm đánh dấu giá đơn lẻ (OBJ_ARROW
, OBJ_ARROW_THUMB_UP
, OBJ_ARROW_THUMB_DOWN
, OBJ_ARROW_UP
, OBJ_ARROW_DOWN
, OBJ_ARROW_STOP
, OBJ_ARROW_CHECK
) có hai cách neo tọa độ của chúng, được chỉ định bởi các định danh của liệt kê khác ENUM_ARROW_ANCHOR
.
Định danh | Vị trí điểm neo |
---|---|
ANCHOR_TOP | Trung tâm phía trên |
ANCHOR_BOTTOM | Trung tâm phía dưới |
Các đối tượng còn lại trong nhóm này có điểm neo được xác định trước: mũi tên mua (OBJ_ARROW_BUY
) và bán (OBJ_ARROW_SELL
) lần lượt ở giữa cạnh trên và dưới, và nhãn giá (OBJ_ARROW_RIGHT_PRICE
, OBJ_ARROW_LEFT_PRICE
) ở bên trái và bên phải.
Tương tự như script ObjectCornerLabel.mq5
từ phần trước, chúng ta hãy tạo script ObjectAnchorLabel.mq5
. Trong phiên bản mới, ngoài việc di chuyển dòng chữ, chúng ta sẽ thay đổi ngẫu nhiên điểm neo trên đó.
Góc của cửa sổ để neo sẽ được chọn, như trước đây, bởi người dùng khi script được khởi chạy.
input ENUM_BASE_CORNER Corner = CORNER_LEFT_UPPER;
Chúng ta sẽ hiển thị tên của góc trên biểu đồ dưới dạng bình luận.
void OnStart()
{
Comment(EnumToString(Corner));
...
2
3
4
Trong một vòng lặp vô hạn, một trong 9 giá trị điểm neo có thể được tạo ra vào những thời điểm được chọn.
ENUM_ANCHOR_POINT anchor = 0;
for( ;!IsStopped(); ++pass)
{
if(pass % 50 == 0)
{
...
anchor = (ENUM_ANCHOR_POINT)(rand() * 9 / 32768);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor);
}
...
2
3
4
5
6
7
8
9
10
Tên của điểm neo trở thành nội dung văn bản của nhãn, cùng với tọa độ hiện tại.
ObjectSetString(0, name, OBJPROP_TEXT, EnumToString(anchor)
+ "[" + (string)x + "," + (string)y + "]");
2
Phần còn lại của các đoạn mã hầu như không thay đổi.
Sau khi biên dịch và chạy script, hãy chú ý cách dòng chữ thay đổi vị trí của nó so với tọa độ hiện tại (x, y) tùy thuộc vào điểm neo được chọn.
Hiện tại, chúng ta kiểm soát và ngăn điểm neo bản thân nó ra ngoài cửa sổ. Tuy nhiên, đối tượng có một số kích thước, và do đó có thể xảy ra trường hợp phần lớn dòng chữ bị cắt bỏ. Trong tương lai, sau khi nghiên cứu các thuộc tính liên quan, chúng ta sẽ giải quyết vấn đề này (xem ví dụ ObjectSizeLabel.mq5
trong phần Xác định chiều rộng và chiều cao của đối tượng).