Như chúng ta đã thấy trong các phần trước, MQL5 cho phép bạn xuất thông điệp ra cửa sổ nhật ký hoặc cửa sổ cảnh báo. Phương pháp đầu tiên chủ yếu dành cho thông tin kỹ thuật và không thể đảm bảo rằng người dùng sẽ chú ý đến thông điệp (vì cửa sổ nhật ký có thể bị ẩn). Đồng thời, phương pháp thứ hai có vẻ quá xâm phạm nếu được sử dụng để hiển thị trạng thái chương trình thay đổi thường xuyên. Một tùy chọn trung gian cung cấp hàm Comment.
Hàm này hiển thị một thông điệp được tạo từ tất cả các đối số được truyền vào ở góc trên bên trái của biểu đồ. Thông điệp sẽ vẫn ở đó cho đến khi chương trình này hoặc một chương trình khác xóa nó hoặc thay thế nó bằng một thông điệp khác.
Cửa sổ chỉ có thể chứa một bình luận duy nhất: mỗi lần gọi hàm Comment, nội dung cũ (nếu có) sẽ bị thay thế bằng nội dung mới.
Để xóa một bình luận, chỉ cần gọi hàm với một chuỗi rỗng: Comment("").
Số lượng tham số không được vượt quá 64. Chỉ hỗ trợ các đối số thuộc kiểu dữ liệu tích hợp sẵn. Các khái niệm về việc hình thành chuỗi kết quả từ các giá trị được truyền vào tương tự như những gì được mô tả cho hàm Print (Print).
Độ dài tổng cộng của thông điệp hiển thị bị giới hạn ở 2045 ký tự. Nếu vượt quá giới hạn này, phần cuối của dòng sẽ bị cắt bỏ.
Nội dung hiện tại của một bình luận là một trong những thuộc tính chuỗi của biểu đồ, có thể được tìm thấy bằng cách gọi hàm ChartGetString(NULL, CHART_COMMENT). Chúng ta sẽ nói về điều này và các thuộc tính khác của biểu đồ (không chỉ là chuỗi) trong một chương riêng biệt.
Cũng giống như trong các hàm Print, PrintFormat, và Alert, các đối số chuỗi có thể chứa ký tự xuống dòng (\n hoặc \r\n), điều này sẽ khiến thông điệp được chia thành số lượng dòng phù hợp. Đối với Comment, đây là cách duy nhất để hiển thị một thông điệp nhiều dòng. Nếu bạn có thể gọi các hàm in và tín hiệu nhiều lần để đạt được hiệu quả tương tự, thì với Comment, điều này không thể thực hiện được, vì mỗi lần gọi sẽ thay thế chuỗi cũ bằng chuỗi mới.
Một ví dụ về hoạt động của hàm Comment được thể hiện trong hình ảnh của cửa sổ với tập lệnh chào mừng từ chương đầu tiên, trong phần Xuất dữ liệu.
Ngoài ra, chúng ta sẽ phát triển một lớp và các hàm đơn giản hóa để hiển thị các bình luận nhiều dòng dựa trên một bộ đệm vòng với kích thước cho trước. Tập lệnh kiểm tra (OutputComment.mq5) và tệp tiêu đề chứa mã lớp (Comments.mqh) được bao gồm trong sách.
cpp
class Comments{ const int capacity; // số lượng dòng tối đa const bool reverse; // thứ tự hiển thị (mới nhất ở trên nếu true) string lines[]; // bộ đệm văn bản int cursor; // vị trí để đặt chuỗi tiếp theo int size; // số lượng dòng thực tế đã lưupublic: Comments(const int limit = N_LINES, const bool r = false): capacity(limit), reverse(r), cursor(0), size(0) { ArrayResize(lines, capacity); } void add(const string line); void clear();};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Công việc chính được thực hiện bởi phương thức add.
cpp
void Comments::add(const string line){ ... // nếu văn bản được truyền vào chứa nhiều chuỗi, // chia nó thành các phần tử bằng ký tự xuống dòng string inputs[]; const int n = StringSplit(line, `\n`, inputs); // thêm tất cả các phần tử mới vào bộ đệm vòng // ghi đè các mục cũ nhất tại con trỏ // con trỏ tăng theo mô-đun capacity (đặt lại về 0 khi tràn) for(int i = 0; i < n; ++i) { lines[cursor] = inputs[reverse ? n - i - 1 : i]; cursor = (cursor + 1) % capacity; if(size < capacity) size++; } // nối tất cả các mục văn bản theo thứ tự xuôi hoặc ngược // gắn kết bằng ký tự xuống dòng string result = ""; for(int i = 0, k = size == capacity ? cursor % capacity : 0; i < size; ++i, k = ++k % capacity) { if(reverse) { result = lines[k] + "\n" + result; } else { result += lines[k] + "\n"; } } // xuất kết quả Comment(result);}
Chúng chỉ khác nhau ở hướng xuất của bộ đệm. MultiComment hiển thị các dòng theo thứ tự thời gian ngược, tức là dòng mới nhất ở trên cùng, giống như trên bảng thông báo. Hàm này được khuyến nghị để hiển thị thông tin theo từng giai đoạn trong thời gian dài với việc lưu giữ lịch sử. ChronoComment hiển thị các dòng theo thứ tự xuôi, tức là các dòng mới được thêm vào dưới cùng. Hàm này được khuyến nghị để xuất hàng loạt các thông điệp nhiều dòng.
Số lượng dòng bộ đệm mặc định là N_LINES (10). Nếu bạn định nghĩa macro này với giá trị khác trước khi bao gồm tệp tiêu đề, nó sẽ thay đổi kích thước.
Tập lệnh kiểm tra chứa một vòng lặp trong đó các thông điệp được tạo định kỳ.
Tại mỗi lần lặp thứ mười, bình luận được xóa. Tại mỗi lần lặp thứ ba, một thông điệp được tạo từ hai dòng (còn lại - từ một dòng). Độ trễ 1 giây cho phép bạn thấy sự thay đổi trong hành động.
Dưới đây là một ví dụ về cửa sổ trong khi tập lệnh đang chạy (ở chế độ "tin nhắn mới ở trên cùng").
Bình luận nhiều dòng trên biểu đồ
Việc hiển thị thông tin nhiều dòng trong một bình luận có khả năng khá hạn chế. Nếu bạn cần tổ chức xuất dữ liệu theo cột, làm nổi bật bằng màu sắc hoặc phông chữ khác nhau, phản ứng với cú nhấp chuột, hoặc vị trí tùy ý trên biểu đồ, bạn nên sử dụng các đối tượng đồ họa.
Hiển thị thông điệp trong cửa sổ biểu đồ
Như chúng ta đã thấy trong các phần trước, MQL5 cho phép bạn xuất thông điệp ra cửa sổ nhật ký hoặc cửa sổ cảnh báo. Phương pháp đầu tiên chủ yếu dành cho thông tin kỹ thuật và không thể đảm bảo rằng người dùng sẽ chú ý đến thông điệp (vì cửa sổ nhật ký có thể bị ẩn). Đồng thời, phương pháp thứ hai có vẻ quá xâm phạm nếu được sử dụng để hiển thị trạng thái chương trình thay đổi thường xuyên. Một tùy chọn trung gian cung cấp hàm
Comment
.void Comment(argument, ...)
Hàm này hiển thị một thông điệp được tạo từ tất cả các đối số được truyền vào ở góc trên bên trái của biểu đồ. Thông điệp sẽ vẫn ở đó cho đến khi chương trình này hoặc một chương trình khác xóa nó hoặc thay thế nó bằng một thông điệp khác.
Cửa sổ chỉ có thể chứa một bình luận duy nhất: mỗi lần gọi hàm
Comment
, nội dung cũ (nếu có) sẽ bị thay thế bằng nội dung mới.Để xóa một bình luận, chỉ cần gọi hàm với một chuỗi rỗng:
Comment("")
.Số lượng tham số không được vượt quá 64. Chỉ hỗ trợ các đối số thuộc kiểu dữ liệu tích hợp sẵn. Các khái niệm về việc hình thành chuỗi kết quả từ các giá trị được truyền vào tương tự như những gì được mô tả cho hàm
Print
(Print).Độ dài tổng cộng của thông điệp hiển thị bị giới hạn ở 2045 ký tự. Nếu vượt quá giới hạn này, phần cuối của dòng sẽ bị cắt bỏ.
Cũng giống như trong các hàm
Print
,PrintFormat
, vàAlert
, các đối số chuỗi có thể chứa ký tự xuống dòng (\n
hoặc\r\n
), điều này sẽ khiến thông điệp được chia thành số lượng dòng phù hợp. Đối vớiComment
, đây là cách duy nhất để hiển thị một thông điệp nhiều dòng. Nếu bạn có thể gọi các hàm in và tín hiệu nhiều lần để đạt được hiệu quả tương tự, thì vớiComment
, điều này không thể thực hiện được, vì mỗi lần gọi sẽ thay thế chuỗi cũ bằng chuỗi mới.Một ví dụ về hoạt động của hàm
Comment
được thể hiện trong hình ảnh của cửa sổ với tập lệnh chào mừng từ chương đầu tiên, trong phần Xuất dữ liệu.Ngoài ra, chúng ta sẽ phát triển một lớp và các hàm đơn giản hóa để hiển thị các bình luận nhiều dòng dựa trên một bộ đệm vòng với kích thước cho trước. Tập lệnh kiểm tra (
OutputComment.mq5
) và tệp tiêu đề chứa mã lớp (Comments.mqh
) được bao gồm trong sách.2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Công việc chính được thực hiện bởi phương thức
add
.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
Nếu cần, bình luận và bộ đệm văn bản có thể được xóa bằng phương thức
clear
, hoặc bằng cách gọiadd(NULL)
.2
3
4
5
6
Với lớp như vậy, bạn có thể định nghĩa một đối tượng với dung lượng bộ đệm và hướng xuất cần thiết, sau đó sử dụng các phương thức của nó.
2
3
4
5
6
7
Nhưng để đơn giản hóa việc tạo bình luận theo phong cách hàm thông thường, tương tự như hàm
Comment
, một vài hàm trợ giúp đã được triển khai.2
3
4
5
6
7
8
9
10
11
Chúng chỉ khác nhau ở hướng xuất của bộ đệm.
MultiComment
hiển thị các dòng theo thứ tự thời gian ngược, tức là dòng mới nhất ở trên cùng, giống như trên bảng thông báo. Hàm này được khuyến nghị để hiển thị thông tin theo từng giai đoạn trong thời gian dài với việc lưu giữ lịch sử.ChronoComment
hiển thị các dòng theo thứ tự xuôi, tức là các dòng mới được thêm vào dưới cùng. Hàm này được khuyến nghị để xuất hàng loạt các thông điệp nhiều dòng.Số lượng dòng bộ đệm mặc định là
N_LINES
(10). Nếu bạn định nghĩa macro này với giá trị khác trước khi bao gồm tệp tiêu đề, nó sẽ thay đổi kích thước.Tập lệnh kiểm tra chứa một vòng lặp trong đó các thông điệp được tạo định kỳ.
2
3
4
5
6
7
8
9
10
Tại mỗi lần lặp thứ mười, bình luận được xóa. Tại mỗi lần lặp thứ ba, một thông điệp được tạo từ hai dòng (còn lại - từ một dòng). Độ trễ 1 giây cho phép bạn thấy sự thay đổi trong hành động.
Dưới đây là một ví dụ về cửa sổ trong khi tập lệnh đang chạy (ở chế độ "tin nhắn mới ở trên cùng").
Việc hiển thị thông tin nhiều dòng trong một bình luận có khả năng khá hạn chế. Nếu bạn cần tổ chức xuất dữ liệu theo cột, làm nổi bật bằng màu sắc hoặc phông chữ khác nhau, phản ứng với cú nhấp chuột, hoặc vị trí tùy ý trên biểu đồ, bạn nên sử dụng các đối tượng đồ họa.