Lưu ảnh biểu đồ
Trong các chương trình MQL, thường cần phải ghi lại trạng thái hiện tại của chính chương trình và môi trường giao dịch. Theo quy tắc, mục đích này thường sử dụng việc xuất các chỉ số phân tích hoặc tài chính khác nhau ra nhật ký, nhưng một số thứ được biểu diễn rõ ràng hơn bằng hình ảnh của biểu đồ, ví dụ, tại thời điểm giao dịch. API MQL5 bao gồm một hàm cho phép lưu ảnh biểu đồ vào một tệp.
bool ChartScreenShot(long chartId, string filename, int width, int height,
ENUM_ALIGN_MODE alignment = ALIGN_RIGHT)
2
Hàm chụp ảnh nhanh của biểu đồ được chỉ định ở định dạng GIF, PNG hoặc BMP tùy thuộc vào phần mở rộng trong dòng có tên tệp filename
(tối đa 63 ký tự). Ảnh chụp màn hình được đặt trong thư mục MQL5/Files
.
Các tham số width
và height
thiết lập chiều rộng và chiều cao của hình ảnh tính bằng pixel.
Tham số alignment
ảnh hưởng đến phần nào của biểu đồ sẽ được đưa vào tệp. Giá trị ALIGN_RIGHT
(mặc định) có nghĩa là ảnh chụp được thực hiện cho các giá gần đây nhất (có thể coi đây là terminal âm thầm thực hiện chuyển đổi khi nhấn phím End
trước khi chụp). Giá trị ALIGN_LEFT
đảm bảo rằng các thanh được đưa vào hình ảnh, bắt đầu từ thanh đầu tiên hiển thị ở bên trái tại thời điểm đó. Do đó, nếu bạn cần chụp ảnh màn hình của biểu đồ từ một vị trí nhất định, bạn phải định vị biểu đồ thủ công hoặc sử dụng hàm ChartNavigate
.
Hàm ChartScreenShot
trả về true
trong trường hợp thành công.
Hãy kiểm tra hàm này trong script ChartPanorama.mq5
. Nhiệm vụ của nó là lưu một bản sao của biểu đồ từ thanh hiển thị bên trái hiện tại đến thời điểm hiện tại. Bằng cách dịch chuyển phần đầu của biểu đồ lùi lại đến độ sâu lịch sử mong muốn, bạn có thể có được một khung cảnh khá mở rộng. Trong trường hợp này, bạn không cần phải nghĩ xem nên chọn chiều rộng hình ảnh bao nhiêu. Tuy nhiên, hãy nhớ rằng một lịch sử quá dài sẽ yêu cầu một hình ảnh khổng lồ, có khả năng vượt quá khả năng của định dạng đồ họa hoặc phần mềm.
Chiều cao của hình ảnh sẽ tự động được xác định bằng chiều cao hiện tại của biểu đồ.
void OnStart()
{
// chiều rộng chính xác của thang giá không được biết, chúng ta lấy nó một cách thực nghiệm
const int scale = 60;
// tính tổng chiều cao, bao gồm các khoảng cách giữa các cửa sổ
const int w = (int)ChartGetInteger(0, CHART_WINDOWS_TOTAL);
int height = 0;
int gutter = 0;
for(int i = 0; i < w; ++i)
{
if(i == 1)
{
gutter = (int)ChartGetInteger(0, CHART_WINDOW_YDISTANCE, i) - height;
}
height += (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, i);
}
Print("Gutter=", gutter, ", total=", gutter * (w - 1));
height += gutter * (w - 1);
Print("Height=", height);
// tính tổng chiều rộng dựa trên số pixel trong một thanh,
// và cũng bao gồm độ lệch biểu đồ từ cạnh phải và chiều rộng thang
const int shift = (int)(ChartGetInteger(0, CHART_SHIFT) ?
ChartGetDouble(0, CHART_SHIFT_SIZE) * ChartGetInteger(0, CHART_WIDTH_IN_PIXELS) / 100 : 0);
Print("Shift=", shift);
const int pixelPerBar = (int)MathRound(1.0 * ChartGetInteger(0, CHART_WIDTH_IN_PIXELS)
/ ChartGetInteger(0, CHART_WIDTH_IN_BARS));
const int width = (int)ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR) * pixelPerBar + scale + shift;
Print("Width=", width);
// ghi tệp với hình ảnh ở định dạng PNG
const string filename = _Symbol + "-" + PeriodToString() + "-panorama.png";
if(ChartScreenShot(0, filename, width, height, ALIGN_LEFT))
{
Print("File saved: ", filename);
}
}
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
35
36
37
38
39
Chúng ta cũng có thể sử dụng chế độ ALIGN_RIGHT
, nhưng sau đó chúng ta sẽ phải buộc tắt độ lệch từ cạnh phải, vì nó được tính lại cho hình ảnh, tùy thuộc vào kích thước của nó, và kết quả sẽ trông hoàn toàn khác so với những gì hiển thị trên màn hình (khoảng cách bên phải sẽ trở nên quá lớn, vì nó được chỉ định dưới dạng phần trăm của chiều rộng).
Dưới đây là ví dụ về nhật ký sau khi chạy script trên biểu đồ XAUUSD,H1.
Gutter=2, total=2
Height=440
Shift=74
Width=2086
File saved: XAUUSD-H1-panorama.png
2
3
4
5
Tính đến việc điều hướng đến một lịch sử không quá xa, ảnh chụp màn hình sau đã được thu thập (được biểu diễn dưới dạng bản sao thu nhỏ 4 lần).
Chart Panorama