Cấu Trúc
Khi tích hợp các chương trình MQL với hệ thống bên ngoài, đặc biệt là khi gửi hoặc nhận dữ liệu qua Internet, việc chuyển đổi cấu trúc dữ liệu thành mảng byte trở nên cần thiết. Để phục vụ cho mục đích này, API MQL5 cung cấp hai hàm: StructToCharArray
và CharArrayToStruct
.
Trong cả hai trường hợp, giả định rằng một cấu trúc chỉ chứa các kiểu tích hợp đơn giản, tức là tất cả các kiểu tích hợp trừ chuỗi và mảng động. Một cấu trúc cũng có thể chứa các cấu trúc đơn giản khác. Các đối tượng lớp và con trỏ không được phép. Những cấu trúc như vậy còn được gọi là POD (Plain Old Data - Dữ liệu Cũ Đơn Giản).
bool StructToCharArray(const void &object, uchar &array[], uint pos = 0)
Hàm StructToCharArray
sao chép cấu trúc POD object
vào mảng array
kiểu uchar
. Tùy chọn, sử dụng tham số pos
, bạn có thể chỉ định vị trí trong mảng mà từ đó các byte sẽ được đặt. Theo mặc định, việc sao chép diễn ra từ đầu mảng, và mảng động sẽ tự động tăng kích thước nếu kích thước hiện tại không đủ để chứa toàn bộ cấu trúc.
Hàm trả về chỉ báo thành công (true
) hoặc lỗi (false
).
Hãy kiểm tra hiệu suất của nó với script ConversionStruct.mq5
. Chúng ta sẽ tạo một kiểu cấu trúc mới DateTimeMsc
, bao gồm cấu trúc tiêu chuẩn MqlDateTime
(trường mdt
) và một trường bổ sung msc
kiểu int
để lưu trữ mili giây.
struct DateTimeMsc
{
MqlDateTime mdt;
int msc;
DateTimeMsc(MqlDateTime &init, int m = 0) : msc(m)
{
mdt = init;
}
};
2
3
4
5
6
7
8
9
Bên trong hàm OnStart
, chúng ta sẽ chuyển đổi một giá trị kiểm tra datetime
thành cấu trúc của chúng ta, sau đó thành mảng byte.
MqlDateTime TimeToStructInplace(datetime dt)
{
static MqlDateTime m;
if(!TimeToStruct(dt, m))
{
// mã lỗi, _LastError, có thể được hiển thị
// nhưng ở đây chúng ta chỉ trả về thời gian bằng 0
static MqlDateTime z = {};
return z;
}
return m;
}
#define MDT(T) TimeToStructInplace(T)
void OnStart()
{
DateTimeMsc test(MDT(D`2021.01.01 10:10:15`), 123);
uchar a[];
Print(StructToCharArray(test, a));
Print(ArraySize(a));
ArrayPrint(a);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Chúng ta sẽ nhận được kết quả sau trong nhật ký (mảng được định dạng lại với các dấu ngắt dòng bổ sung để nhấn mạnh sự tương ứng của các byte với từng trường):
true
36
229 7 0 0
1 0 0 0
1 0 0 0
10 0 0 0
10 0 0 0
15 0 0 0
5 0 0 0
0 0 0 0
123 0 0 0
2
3
4
5
6
7
8
9
10
11
bool CharArrayToStruct(void &object, const uchar &array[], uint pos = 0)
Hàm CharArrayToStruct
sao chép mảng array
kiểu uchar
vào cấu trúc POD object
. Sử dụng tham số pos
, bạn có thể chỉ định vị trí trong mảng để bắt đầu đọc các byte.
Hàm trả về chỉ báo thành công (true
) hoặc lỗi (false
).
Tiếp tục với cùng ví dụ (ConversionStruct.mq5
), chúng ta có thể khôi phục ngày và giờ ban đầu từ mảng byte.
void OnStart()
{
...
DateTimeMsc receiver;
Print(CharArrayToStruct(receiver, a)); // true
Print(StructToTime(receiver.mdt), "`", receiver.msc); // 2021.01.01 10:10:15`123
}
2
3
4
5
6
7