Ghi Nhật Ký Mảng
Việc in các biến, mảng và thông điệp về trạng thái của một chương trình MQL vào nhật ký là phương tiện đơn giản nhất để thông báo cho người dùng, gỡ lỗi và chẩn đoán các vấn đề. Đối với mảng, chúng ta có thể thực hiện việc in từng phần tử bằng cách sử dụng hàm Print
mà chúng ta đã biết từ các tập lệnh demo. Chúng ta sẽ mô tả chính thức về hàm này sau một chút, trong phần Tương tác với người dùng.
Tuy nhiên, sẽ thuận tiện hơn nếu giao phó toàn bộ công việc lặp qua các phần tử và định dạng chính xác của chúng cho môi trường MQL5. API cung cấp một hàm đặc biệt là ArrayPrint
cho mục đích này.
Chúng ta đã thấy các ví dụ về cách làm việc với hàm này trong phần Sử dụng mảng. Bây giờ hãy cùng tìm hiểu chi tiết hơn về các khả năng của nó.
void ArrayPrint(const void &array[], uint digits = _Digits, const string separator = NULL, ulong start = 0, ulong count = WHOLE_ARRAY, ulong flags = ARRAYPRINT_HEADER | ARRAYPRINT_INDEX | ARRAYPRINT_LIMIT | ARRAYPRINT_DATE | ARRAYPRINT_SECONDS)
Hàm này ghi nhật ký một mảng bằng cách sử dụng các cài đặt được chỉ định. Mảng phải thuộc một trong những kiểu tích hợp hoặc kiểu cấu trúc đơn giản. Cấu trúc đơn giản là một cấu trúc có các trường thuộc kiểu tích hợp, ngoại trừ chuỗi và mảng động. Sự hiện diện của các đối tượng lớp và con trỏ trong thành phần của cấu trúc sẽ đưa nó ra khỏi danh mục đơn giản.
Mảng phải có chiều từ 1 hoặc 2. Việc định dạng tự động điều chỉnh theo cấu hình mảng và, nếu có thể, hiển thị nó dưới dạng trực quan (xem bên dưới). Mặc dù MQL5 hỗ trợ mảng có chiều tối đa 4, nhưng hàm này không hiển thị mảng có 3 chiều trở lên, vì khó biểu diễn chúng dưới dạng "phẳng". Điều này diễn ra mà không tạo ra lỗi trong bước biên dịch hoặc thực thi chương trình.
Tất cả các tham số trừ tham số đầu tiên có thể được bỏ qua, và các giá trị mặc định được định nghĩa cho chúng.
Tham số digits
được sử dụng cho các mảng số thực và các trường số của cấu trúc. Nó đặt số ký tự hiển thị trong phần thập phân của số. Giá trị mặc định là một trong những biến biểu đồ được định nghĩa trước, cụ thể là _Digits
, tức là số chữ số thập phân trong giá biểu đồ hiện tại.
Ký tự phân tách separator
được sử dụng để chỉ định các cột khi hiển thị các trường trong mảng cấu trúc. Với giá trị mặc định (NULL), hàm sử dụng khoảng trắng làm ký tự phân tách.
Các tham số start
và count
lần lượt đặt số thứ tự của phần tử bắt đầu và số lượng phần tử cần in. Theo mặc định, hàm in toàn bộ mảng, nhưng kết quả có thể bị ảnh hưởng thêm bởi sự hiện diện của cờ ARRAYPRINT_LIMIT (xem bên dưới).
Tham số flags
chấp nhận sự kết hợp của các cờ điều khiển các tính năng hiển thị khác nhau. Dưới đây là một số cờ:
ARRAYPRINT_HEADER
xuất tiêu đề với tên các trường của cấu trúc trước mảng cấu trúc; nó không ảnh hưởng đến mảng không phải cấu trúc.ARRAYPRINT_INDEX
xuất chỉ số của các phần tử theo chiều (đối với mảng một chiều, chỉ số hiển thị bên trái; đối với mảng hai chiều, chúng hiển thị bên trái và phía trên).ARRAYPRINT_LIMIT
được sử dụng cho mảng lớn, và đầu ra bị giới hạn ở 100 bản ghi đầu tiên và 100 bản ghi cuối cùng (giới hạn này được bật theo mặc định).ARRAYPRINT_DATE
được sử dụng cho các giá trị kiểudatetime
để hiển thị ngày.ARRAYPRINT_MINUTES
được sử dụng cho các giá trị kiểudatetime
để hiển thị thời gian đến phút gần nhất.ARRAYPRINT_SECONDS
được sử dụng cho các giá trị kiểudatetime
để hiển thị thời gian đến giây gần nhất.
Các giá trị kiểu datetime
được xuất theo mặc định ở định dạng ARRAYPRINT_DATE | ARRAYPRINT_SECONDS
.
Các giá trị kiểu color
được xuất ở định dạng thập lục phân.
Các giá trị liệt kê được hiển thị dưới dạng số nguyên.
Hàm không xuất các mảng lồng nhau, cấu trúc và con trỏ đến đối tượng. Thay vào đó, ba dấu chấm được hiển thị.
Tập lệnh ArrayPrint.mq5
thể hiện cách hàm này hoạt động.
Hàm OnStart
cung cấp định nghĩa của một số mảng (một chiều, hai chiều và ba chiều), được xuất bằng ArrayPrint
(với cài đặt mặc định).
void OnStart()
{
int array1D[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
double array2D[][5] = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
double array3D[][3][5] =
{
{{ 1, 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}},
};
Print("array1D");
ArrayPrint(array1D);
Print("array2D");
ArrayPrint(array2D);
Print("array3D");
ArrayPrint(array3D);
...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Chúng ta sẽ nhận được các dòng sau trong nhật ký:
array1D
1 2 3 4 5 6 7 8 9 10
array2D
[,0] [,1] [,2] [,3] [,4]
[0,] 1.00000 2.00000 3.00000 4.00000 5.00000
[1,] 6.00000 7.00000 8.00000 9.00000 10.00000
array3D
2
3
4
5
6
7
Mảng array1D
không đủ lớn (nó vừa trong một hàng), nên chỉ số không được hiển thị cho nó.
Mảng array2D
có nhiều hàng (chỉ số), do đó các chỉ số của chúng được hiển thị (ARRAYPRINT_INDEX
được bật theo mặc định).
Lưu ý rằng vì tập lệnh được chạy trên biểu đồ EURUSD với giá năm chữ số, _Digits=5
, điều này ảnh hưởng đến định dạng của các giá trị kiểu double
.
Mảng array3D
bị bỏ qua: không có hàng nào được xuất cho nó.
Ngoài ra, các cấu trúc Pair
và SimpleStruct
được định nghĩa trong tập lệnh:
struct Pair
{
int x, y;
};
struct SimpleStruct
{
double value;
datetime time;
int count;
ENUM_APPLIED_PRICE price;
color clr;
string details;
void *ptr;
Pair pair;
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Cấu trúc SimpleStruct
chứa các trường thuộc kiểu tích hợp, một con trỏ đến void
, cũng như một trường kiểu Pair
.
Trong hàm OnStart
, một mảng kiểu SimpleStruct
được tạo và xuất bằng ArrayPrint
ở hai chế độ: với cài đặt mặc định và với cài đặt tùy chỉnh (số chữ số sau dấu "phẩy" là 3, ký tự phân tách là ";", định dạng cho datetime
chỉ là ngày).
void OnStart()
{
...
SimpleStruct simple[] =
{
{ 12.57839, D'2021.07.23 11:15', 22345, PRICE_MEDIAN, clrBlue, "text message"},
{135.82949, D'2021.06.20 23:45', 8569, PRICE_TYPICAL, clrAzure},
{ 1087.576, D'2021.05.15 10:01:30', -3298, PRICE_WEIGHTED, clrYellow, "note"},
};
Print("SimpleStruct (default)");
ArrayPrint(simple);
Print("SimpleStruct (custom)");
ArrayPrint(simple, 3, ";", 0, WHOLE_ARRAY, ARRAYPRINT_DATE);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Điều này tạo ra kết quả sau:
SimpleStruct (default)
[value] [time] [count] [type] [clr] [details] [ptr] [pair]
[0] 12.57839 2021.07.23 11:15:00 22345 5 00FF0000 "text message" ... ...
[1] 135.82949 2021.06.20 23:45:00 8569 6 00FFFFF0 null ... ...
[2] 1087.57600 2021.05.15 10:01:30 -3298 7 0000FFFF "note" ... ...
SimpleStruct (custom)
12.578;2021.07.23; 22345; 5;00FF0000;"text message"; ...; ...
135.829;2021.06.20; 8569; 6;00FFFFF0;null ; ...; ...
1087.576;2021.05.15; -3298; 7;0000FFFF;"note" ; ...; ...
2
3
4
5
6
7
8
9
WARNING
Lưu ý rằng nhật ký mà chúng ta sử dụng trong trường hợp này và trong các phần trước được tạo ra trong terminal và có sẵn cho người dùng trong tab Experts
của cửa sổ Toolbox
. Tuy nhiên, trong tương lai, chúng ta sẽ làm quen với tester, nơi cung cấp cùng môi trường thực thi cho một số loại chương trình MQL (chỉ báo và Expert Advisors) như chính terminal. Nếu chúng được khởi chạy trong tester, hàm ArrayPrint
và các hàm liên quan khác, được mô tả trong phần Tương tác với người dùng, sẽ xuất thông điệp vào nhật ký của tác nhân kiểm tra.
Cho đến nay, chúng ta đã làm việc, và sẽ tiếp tục làm việc trong một thời gian, chỉ với các tập lệnh, và chúng chỉ có thể được thực thi trong terminal.