Tài nguyên tính toán: bộ nhớ, đĩa và CPU
Giống như tất cả các chương trình, các ứng dụng MQL tiêu tốn tài nguyên máy tính, bao gồm bộ nhớ, dung lượng đĩa và CPU. Xét đến việc bản thân terminal đã tiêu tốn nhiều tài nguyên (đặc biệt là do khả năng tải xuống báo giá và tick cho nhiều công cụ tài chính với lịch sử dài), đôi khi cần phân tích và kiểm soát tình hình về mức độ gần với giới hạn có sẵn.
API MQL5 cung cấp một số thuộc tính cho phép ước lượng tài nguyên tối đa có thể đạt được và đã sử dụng. Các thuộc tính này được tổng hợp trong các liệt kê ENUM_MQL_INFO_INTEGER
và ENUM_TERMINAL_INFO_INTEGER
.
Bảng mô tả các thuộc tính
Định danh | Mô tả |
---|---|
MQL_MEMORY_LIMIT | Dung lượng bộ nhớ động tối đa có thể có cho một chương trình MQL, tính bằng Kb |
MQL_MEMORY_USED | Bộ nhớ được sử dụng bởi một chương trình MQL, tính bằng Mb |
MQL_HANDLES_USED | Số lượng đối tượng lớp |
TERMINAL_MEMORY_PHYSICAL | RAM vật lý trong hệ thống, tính bằng Mb |
TERMINAL_MEMORY_TOTAL | Bộ nhớ (vật lý + tệp hoán đổi, tức là ảo) có sẵn cho quá trình terminal (tác nhân), tính bằng Mb |
TERMINAL_MEMORY_AVAILABLE | Bộ nhớ trống của quá trình terminal (tác nhân), tính bằng Mb, là một phần của TOTAL |
TERMINAL_MEMORY_USED | Bộ nhớ được sử dụng bởi terminal (tác nhân), tính bằng Mb, là một phần của TOTAL |
TERMINAL_DISK_SPACE | Dung lượng đĩa trống, tính đến các hạn ngạch có thể có cho thư mục MQL5/Files của terminal (tác nhân), tính bằng Mb |
TERMINAL_CPU_CORES | Số lượng lõi bộ xử lý trong hệ thống |
TERMINAL_OPENCL_SUPPORT | Phiên bản OpenCL được hỗ trợ dưới dạng 0x00010002 = 1.2; "0" nghĩa là OpenCL không được hỗ trợ |
Dung lượng bộ nhớ tối đa có sẵn cho một chương trình MQL được mô tả bởi thuộc tính MQL_MEMORY_LIMIT
. Đây là thuộc tính duy nhất trong danh sách sử dụng kilobyte (Kb). Tất cả các thuộc tính khác được trả về bằng megabyte (Mb). Thông thường, MQL_MEMORY_LIMIT
bằng với TERMINAL_MEMORY_TOTAL
, tức là toàn bộ bộ nhớ có sẵn trên máy tính có thể được cấp phát cho một chương trình MQL theo mặc định. Tuy nhiên, terminal, đặc biệt là triển khai đám mây của nó cho MetaTrader VPS và các tác nhân kiểm tra đám mây, có thể giới hạn bộ nhớ cho một chương trình MQL duy nhất. Khi đó, MQL_MEMORY_LIMIT
sẽ nhỏ hơn đáng kể so với TERMINAL_MEMORY_TOTAL
.
Vì Windows thường tạo một tệp hoán đổi có kích thước bằng bộ nhớ vật lý (RAM), thuộc tính TERMINAL_MEMORY_TOTAL
có thể lớn gấp đôi so với TERMINAL_MEMORY_PHYSICAL
.
Toàn bộ bộ nhớ ảo có sẵn TERMINAL_MEMORY_TOTAL
được chia giữa bộ nhớ đã sử dụng (TERMINAL_MEMORY_USED
) và bộ nhớ vẫn còn trống (TERMINAL_MEMORY_AVAILABLE
).
Cuốn sách đi kèm với script EnvProvision.mq5
, script này ghi lại tất cả các thuộc tính được chỉ định.
void OnStart()
{
PRTF(MQLInfoInteger(MQL_MEMORY_LIMIT)); // Kb!
PRTF(MQLInfoInteger(MQL_MEMORY_USED));
PRTF(TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL));
PRTF(TerminalInfoInteger(TERMINAL_MEMORY_TOTAL));
PRTF(TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE));
PRTF(TerminalInfoInteger(TERMINAL_MEMORY_USED));
PRTF(TerminalInfoInteger(TERMINAL_DISK_SPACE));
PRTF(TerminalInfoInteger(TERMINAL_CPU_CORES));
PRTF(TerminalInfoInteger(TERMINAL_OPENCL_SUPPORT));
uchar array[];
PRTF(ArrayResize(array, 1024 * 1024 * 10)); // cấp phát 10 Mb
PRTF(MQLInfoInteger(MQL_MEMORY_USED));
PRTF(TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE));
PRTF(TerminalInfoInteger(TERMINAL_MEMORY_USED));
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Sau khi xuất các thuộc tính ban đầu, chúng ta cấp phát 10 Mb cho mảng và sau đó kiểm tra lại bộ nhớ. Dưới đây là ví dụ kết quả (bạn sẽ có giá trị riêng của mình).
MQLInfoInteger(MQL_MEMORY_LIMIT)=8388608 / ok
MQLInfoInteger(MQL_MEMORY_USED)=1 / ok
TerminalInfoInteger(TERMINAL_MEMORY_PHYSICAL)=4095 / ok
TerminalInfoInteger(TERMINAL_MEMORY_TOTAL)=8190 / ok
TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)=7842 / ok
TerminalInfoInteger(TERMINAL_MEMORY_USED)=348 / ok
TerminalInfoInteger(TERMINAL_DISK_SPACE)=4528 / ok
TerminalInfoInteger(TERMINAL_CPU_CORES)=4 / ok
TerminalInfoInteger(TERMINAL_OPENCL_SUPPORT)=0 / ok
ArrayResize(array,1024*1024*10)=10485760 / ok
MQLInfoInteger(MQL_MEMORY_USED)=11 / ok
TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE)=7837 / ok
TerminalInfoInteger(TERMINAL_MEMORY_USED)=353 / ok
2
3
4
5
6
7
8
9
10
11
12
13
Lưu ý rằng tổng bộ nhớ ảo (8190) gấp đôi bộ nhớ vật lý (4095). Lượng bộ nhớ có sẵn cho script là 8388608 Kb, gần bằng toàn bộ bộ nhớ 8190 Mb. Bộ nhớ trống (7842) và bộ nhớ đã sử dụng (348) của hệ thống cũng cộng lại thành 8190.
Nếu trước khi cấp phát bộ nhớ cho mảng, chương trình MQL chiếm 1 Mb, thì sau khi cấp phát, nó đã là 11 Mb. Trong khi đó, lượng bộ nhớ mà terminal chiếm tăng chỉ 5 Mb (từ 348 lên 353), vì một số tài nguyên đã được dự trữ trước.