Sự kiện thay đổi biểu đồ
Khi thay đổi kích thước biểu đồ, chế độ hiển thị giá, tỷ lệ hoặc các tham số khác, thiết bị đầu cuối gửi sự kiện CHARTEVENT_CHART_CHANGE, sự kiện này không có tham số. Chương trình MQL phải tự tìm hiểu các thay đổi bằng cách sử dụng các lệnh gọi hàm ChartGet
.
Chúng ta đã sử dụng sự kiện này trong ví dụ ChartModeMonitor.mq5
trong phần về Chế độ hiển thị biểu đồ. Bây giờ hãy xem một ví dụ khác.
Như bạn đã biết, MetaTrader 5 cho phép lưu ảnh chụp màn hình của biểu đồ hiện tại vào một tệp có kích thước được chỉ định (lệnh Save as Picture
trong menu ngữ cảnh). Tuy nhiên, phương pháp này để lấy ảnh chụp màn hình không phù hợp cho mọi trường hợp. Đặc biệt, nếu bạn cần một hình ảnh có chú giải công cụ hoặc khi một đối tượng loại trường nhập đang hoạt động (khi văn bản được chọn bên trong trường và con trỏ văn bản hiển thị), lệnh tiêu chuẩn sẽ không giúp ích, vì nó tái tạo lại hình ảnh biểu đồ mà không tính đến những chi tiết này và một số sắc thái khác của trạng thái hiện tại của cửa sổ.
Lựa chọn duy nhất để có được bản sao chính xác của cửa sổ là sử dụng các phương tiện bên ngoài thiết bị đầu cuối (ví dụ, phím PrtSc
qua bộ nhớ đệm Windows), nhưng phương pháp này không đảm bảo kích thước cửa sổ mong muốn. Để không phải chọn kích thước bằng cách thử và sai, hoặc sử dụng một số chương trình bổ sung, chúng ta sẽ tạo một chỉ báo EventWindowSizer.mq5
, chỉ báo này sẽ theo dõi cài đặt kích thước của người dùng ngay lập tức và xuất giá trị hiện tại trong một bình luận.
Tất cả công việc được thực hiện trong trình xử lý OnChartEvent
, bắt đầu bằng việc kiểm tra ID sự kiện cho CHARTEVENT_CHART_CHANGE. Kích thước của cửa sổ tính bằng pixel có thể được lấy bằng các thuộc tính CHART_WIDTH_IN_PIXELS và CHART_HEIGHT_IN_PIXELS. Tuy nhiên, chúng trả về kích thước không tính đến viền, và viền thường được mong muốn cho ảnh chụp màn hình. Do đó, chúng ta sẽ hiển thị trong bình luận không chỉ giá trị thuộc tính (được đánh dấu bằng từ "Screen"), mà còn các giá trị đã điều chỉnh (được đánh dấu bằng từ "Picture"): cần cộng thêm 2 pixel vào chiều rộng, và 1 pixel vào chiều dọc (đây là các đặc điểm của việc hiển thị cửa sổ trong thiết bị đầu cuối).
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
if(id == CHARTEVENT_CHART_CHANGE)
{
const int w = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS);
const int h = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS);
// Kích thước "thô" "nguyên bản" được hiển thị với dấu "Screen",
// điều chỉnh cho (-2,-1) cần thiết để bao gồm khung - được hiển thị với dấu "Picture",
// điều chỉnh cho (-54,-22) cần thiết để bao gồm tỷ lệ - được hiển thị với cờ "Including scales".
Comment(StringFormat("Screen: %d x %d\nPicture: %d x %d\nIncluding scales: %d x %d",
w, h, w + 2, h + 1, w + 2 + 54, h + 1 + 22));
}
}
2
3
4
5
6
7
8
9
10
11
12
13
Hơn nữa, các giá trị thu được không tính đến tỷ lệ thời gian và giá. Nếu chúng cũng cần được tính đến trong kích thước của ảnh chụp màn hình, thì cần điều chỉnh thêm cho kích thước của chúng. Thật không may, API MQL5 không cung cấp cách để tìm ra các kích thước này, vì vậy chúng ta chỉ có thể xác định chúng một cách thực nghiệm: với cài đặt phông chữ tiêu chuẩn của Windows, chiều rộng tỷ lệ giá là 54 pixel, và chiều cao tỷ lệ thời gian là 22 pixel. Những hằng số này có thể khác nhau đối với phiên bản Windows của bạn, vì vậy bạn nên chỉnh sửa chúng, hoặc đặt chúng bằng các tham số đầu vào.
Sau khi chạy chỉ báo trên một biểu đồ, hãy thử thay đổi kích thước cửa sổ và xem các con số trong bình luận thay đổi như thế nào.
Ảnh chụp màn hình cửa sổ với chú giải công cụ và kích thước hiện tại trong bình luận