Tổng quan về các hàm lấy thuộc tính tài khoản
Bộ đầy đủ các thuộc tính tài khoản được chia logic thành ba nhóm tùy thuộc vào kiểu của chúng. Các thuộc tính kiểu chuỗi được tổng hợp trong liệt kê ENUM_ACCOUNT_INFO_STRING
và được truy vấn bởi hàm AccountInfoString
. Các thuộc tính kiểu thực được kết hợp trong liệt kê ENUM_ACCOUNT_INFO_DOUBLE
, và hàm hoạt động với chúng là AccountInfoDouble
. Liệt kê ENUM_ACCOUNT_INFO_INTEGER
được sử dụng trong hàm AccountInfoInteger
chứa các định danh của các thuộc tính kiểu số nguyên và boolean (cờ), cũng như một số liệt kê ứng dụng ENUM_ACCOUNT_INFO
.
double AccountInfoDouble(ENUM_ACCOUNT_INFO_DOUBLE property)
long AccountInfoInteger(ENUM_ACCOUNT_INFO_INTEGER property)
string AccountInfoString(ENUM_ACCOUNT_INFO_STRING property)
Chúng ta đã tạo lớp AccountMonitor
(AccountMonitor.mqh
) để đơn giản hóa việc đọc các thuộc tính. Bằng cách nạp chồng các phương thức get
, lớp này cung cấp việc gọi tự động hàm API cần thiết tùy thuộc vào phần tử của một liệt kê cụ thể được truyền trong tham số.
class AccountMonitor
{
public:
long get(const ENUM_ACCOUNT_INFO_INTEGER property) const
{
return AccountInfoInteger(property);
}
double get(const ENUM_ACCOUNT_INFO_DOUBLE property) const
{
return AccountInfoDouble(property);
}
string get(const ENUM_ACCOUNT_INFO_STRING property) const
{
return AccountInfoString(property);
}
long get(const int property, const long) const
{
return AccountInfoInteger((ENUM_ACCOUNT_INFO_INTEGER)property);
}
double get(const int property, const double) const
{
return AccountInfoDouble((ENUM_ACCOUNT_INFO_DOUBLE)property);
}
string get(const int property, const string) const
{
return AccountInfoString((ENUM_ACCOUNT_INFO_STRING)property);
}
...
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
Ngoài ra, nó có một số phiên bản nạp chồng của phương thức stringify
, tạo ra một biểu diễn chuỗi thân thiện với người dùng của các giá trị thuộc tính (đặc biệt hữu ích cho các liệt kê ứng dụng, nếu không sẽ được hiển thị dưới dạng số không cung cấp thông tin). Các đặc điểm của từng thuộc tính sẽ được thảo luận trong các phần tiếp theo.
static string boolean(const long v)
{
return v ? "true" : "false";
}
template<typename E>
static string enumstr(const long v)
{
return EnumToString((E)v);
}
// "giải mã" các thuộc tính theo kiểu con bên trong các giá trị số nguyên
static string stringify(const long v, const ENUM_ACCOUNT_INFO_INTEGER property)
{
switch(property)
{
case ACCOUNT_TRADE_ALLOWED:
case ACCOUNT_TRADE_EXPERT:
case ACCOUNT_FIFO_CLOSE:
return boolean(v);
case ACCOUNT_TRADE_MODE:
return enumstr<ENUM_ACCOUNT_TRADE_MODE>(v);
case ACCOUNT_MARGIN_MODE:
return enumstr<ENUM_ACCOUNT_MARGIN_MODE>(v);
case ACCOUNT_MARGIN_SO_MODE:
return enumstr<ENUM_ACCOUNT_STOPOUT_MODE>(v);
}
return (string)v;
}
string stringify(const ENUM_ACCOUNT_INFO_INTEGER property) const
{
return stringify(AccountInfoInteger(property), property);
}
string stringify(const ENUM_ACCOUNT_INFO_DOUBLE property, const string format = NULL) const
{
if(format == NULL) return DoubleToString(AccountInfoDouble(property),
(int)get(ACCOUNT_CURRENCY_DIGITS));
return StringFormat(format, AccountInfoDouble(property));
}
string stringify(const ENUM_ACCOUNT_INFO_STRING property) const
{
return AccountInfoString(property);
}
...
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
40
41
42
43
44
45
46
47
48
Cuối cùng, có một phương thức mẫu list2log
cho phép lấy thông tin toàn diện về tài khoản.
// danh sách tên và giá trị của tất cả các thuộc tính thuộc kiểu liệt kê E
template<typename E>
void list2log()
{
E e = (E)0; // ngăn chặn cảnh báo 'có thể sử dụng biến chưa được khởi tạo'
int array[];
const int n = EnumToArray(e, array, 0, USHORT_MAX);
Print(typename(E), " Số lượng=", n);
for(int i = 0; i < n; ++i)
{
e = (E)array[i];
PrintFormat("% 3d %s=%s", i, EnumToString(e), stringify(e));
}
}
};
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Chúng ta sẽ kiểm tra lớp mới này trong phần tiếp theo.