Lấy tọa độ thả chương trình MQL trên biểu đồ
Người dùng thường kéo các chương trình MQL lên biểu đồ bằng chuột. Ngoài việc tiện lợi, điều này còn cho phép thiết lập một số ngữ cảnh cho thuật toán. Ví dụ, một chỉ báo có thể được áp dụng trong các cửa sổ phụ khác nhau, hoặc một script có thể đặt lệnh chờ tại mức giá mà người dùng đã đặt trên biểu đồ. Nhóm hàm tiếp theo được thiết kế để lấy tọa độ của điểm mà chương trình được kéo và thả.
int ChartWindowOnDropped()
Hàm này trả về số của cửa sổ phụ biểu đồ mà Expert Advisor, script hoặc chỉ báo hiện tại được thả bằng chuột. Cửa sổ chính, như chúng ta biết, được đánh số 0, và các cửa sổ phụ được đánh số bắt đầu từ 1. Số của một cửa sổ phụ không phụ thuộc vào việc có các cửa sổ phụ ẩn phía trên nó hay không, vì chỉ số của chúng vẫn được gán cho chúng. Nói cách khác, số cửa sổ phụ hiển thị có thể khác với chỉ số thực của nó nếu có cửa sổ phụ ẩn.
double ChartPriceOnDropped()
datetime ChartTimeOnDropped()
Cặp hàm này trả về tọa độ điểm thả chương trình theo đơn vị giá và thời gian. Lưu ý rằng dữ liệu bất kỳ có thể được hiển thị trong các cửa sổ phụ, không chỉ là giá, mặc dù tên hàm ChartPriceOnDropped
bao gồm 'Price'.
Chú ý! Thời gian của điểm mục tiêu không được làm tròn theo kích thước khung thời gian của biểu đồ, vì vậy ngay cả trên biểu đồ H1 và D1, bạn có thể nhận được giá trị với phút và thậm chí là giây.
int ChartXOnDropped()
int ChartYOnDropped()
Hai hàm này trả về tọa độ màn hình X và Y của một điểm tính bằng pixel. Gốc tọa độ nằm ở góc trên bên trái của cửa sổ biểu đồ chính. Chúng ta đã nói về hướng của các trục trong phần Thông số màn hình.
Tọa độ Y luôn được tính từ góc trên bên trái của biểu đồ chính, ngay cả khi điểm thả thuộc về một cửa sổ phụ. Để chuyển đổi giá trị này thành tọa độ y
tương đối với một cửa sổ phụ, hãy sử dụng thuộc tính CHART_WINDOW_YDISTANCE
(xem ví dụ).
Hãy xuất giá trị của tất cả các hàm đã đề cập vào nhật ký trong script ChartDrop.mq5
.
void OnStart()
{
const int w = PRTF(ChartWindowOnDropped());
PRTF(ChartTimeOnDropped());
PRTF(ChartPriceOnDropped());
PRTF(ChartXOnDropped());
PRTF(ChartYOnDropped());
// đối với cửa sổ phụ, tính lại tọa độ y thành tọa độ cục bộ
if(w > 0)
{
const int y = (int)PRTF(ChartGetInteger(0, CHART_WINDOW_YDISTANCE, w));
PRTF(ChartYOnDropped() - y);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Ví dụ, nếu chúng ta thả script này vào cửa sổ phụ đầu tiên nơi chỉ báo WPR đang chạy, chúng ta có thể nhận được kết quả sau.
ChartWindowOnDropped()=1 / ok
ChartTimeOnDropped()=2021.11.30 03:52:30 / ok
ChartPriceOnDropped()=-50.0 / ok
ChartXOnDropped()=217 / ok
ChartYOnDropped()=312 / ok
ChartGetInteger(0,CHART_WINDOW_YDISTANCE,w)=282 / ok
ChartYOnDropped()-y=30 / ok
2
3
4
5
6
7
Mặc dù script được thả trên biểu đồ EURUSD, H1, chúng ta đã nhận được một dấu thời gian với phút và giây.
Lưu ý rằng giá trị "giá" là -50 vì phạm vi giá trị của WPR là [0, -100].
Ngoài ra, tọa độ dọc của điểm 312 (tương đối với toàn bộ cửa sổ biểu đồ) đã được chuyển đổi thành tọa độ cục bộ của cửa sổ phụ: vì khoảng cách dọc từ đầu biểu đồ chính đến cửa sổ phụ là 282, giá trị y
bên trong cửa sổ phụ hóa ra là 30.