Quyền hạn
MetaTrader 5 cung cấp các tính năng để hạn chế việc thực thi một số hành động nhất định bởi các chương trình MQL vì lý do bảo mật. Một số hạn chế này có hai cấp độ, tức là chúng được thiết lập riêng cho toàn bộ terminal và cho từng chương trình cụ thể. Cài đặt terminal có ưu tiên cao hơn hoặc đóng vai trò là giá trị mặc định cho cài đặt của bất kỳ chương trình MQL nào. Ví dụ, một nhà giao dịch có thể vô hiệu hóa tất cả giao dịch tự động bằng cách đánh dấu vào ô tương ứng trong hộp thoại cài đặt MetaTrader 5. Trong trường hợp này, các quyền giao dịch riêng được thiết lập trước đó cho các robot cụ thể trong hộp thoại của chúng sẽ trở nên không hợp lệ.
Trong API MQL5, các hạn chế này (hoặc ngược lại, các quyền) có thể được đọc thông qua các hàm TerminalInfoInteger
và MQLInfoInteger
. Vì chúng có cùng tác động lên một chương trình MQL, chương trình phải kiểm tra các cấm đoán chung và cụ thể một cách cẩn thận như nhau (để tránh tạo ra lỗi khi cố gắng thực hiện một hành động bất hợp pháp). Do đó, phần này cung cấp danh sách tất cả các tùy chọn ở các cấp độ khác nhau.
Tất cả các quyền đều là các cờ boolean, tức là chúng lưu trữ các giá trị true
hoặc false
.
Bảng mô tả các quyền
Định danh | Mô tả |
---|---|
TERMINAL_DLLS_ALLOWED | Quyền sử dụng DLL |
TERMINAL_TRADE_ALLOWED | Quyền giao dịch tự động trực tuyến |
TERMINAL_EMAIL_ENABLED | Quyền gửi email (phải chỉ định máy chủ SMTP và thông tin đăng nhập trong cài đặt terminal) |
TERMINAL_FTP_ENABLED | Quyền gửi tệp qua FTP đến máy chủ được chỉ định (bao gồm báo cáo cho tài khoản giao dịch được chỉ định trong cài đặt terminal) |
TERMINAL_NOTIFICATIONS_ENABLED | Quyền gửi thông báo đẩy đến điện thoại thông minh |
MQL_DLLS_ALLOWED | Quyền sử dụng DLL cho chương trình này |
MQL_TRADE_ALLOWED | Quyền cho chương trình giao dịch tự động |
MQL_SIGNALS_ALLOWED | Quyền cho chương trình làm việc với tín hiệu |
Quyền sử dụng DLL ở cấp độ terminal có nghĩa là khi chạy một chương trình MQL chứa liên kết đến một thư viện động nào đó, cờ Enable DLL Import
trên tab Dependencies sẽ được bật mặc định trong hộp thoại thuộc tính của nó. Nếu cờ này bị xóa trong cài đặt terminal, thì tùy chọn trong thuộc tính của chương trình MQL sẽ bị vô hiệu hóa theo mặc định. Dù trong trường hợp nào, người dùng phải cho phép nhập khẩu cho từng chương trình riêng lẻ (có một ngoại lệ cho script, sẽ được thảo luận dưới đây). Nếu không, chương trình sẽ không chạy.
Nói cách khác, các cờ TERMINAL_DLLS_ALLOWED
và MQL_DLLS_ALLOWED
có thể được kiểm tra bởi một chương trình không liên kết với DLL, hoặc bởi một chương trình có liên kết, nhưng đối với chương trình này, MQL_DLLS_ALLOWED
phải rõ ràng bằng true
(do nó đã được khởi động). Vì vậy, trong các hệ thống phần mềm yêu cầu DLL, có lẽ nên cung cấp một tiện ích độc lập để theo dõi trạng thái của cờ và hiển thị chẩn đoán cho người dùng nếu nó đột nhiên bị tắt. Ví dụ, một Expert Advisor có thể yêu cầu một chỉ báo sử dụng DLL. Sau đó, trước khi cố gắng tải chỉ báo và lấy handle của nó, EA có thể kiểm tra cờ TERMINAL_DLLS_ALLOWED
và tạo cảnh báo nếu cờ này bị đặt lại.
Đối với script, hành vi hơi khác vì hộp thoại cài đặt script chỉ mở ra nếu có chỉ thị #property script_show_inputs
trong mã nguồn. Nếu không có chỉ thị này, hộp thoại sẽ xuất hiện khi cờ TERMINAL_DLLS_ALLOWED
bị đặt lại trong cài đặt terminal (và người dùng phải bật cờ để script hoạt động). Khi cờ chung TERMINAL_DLLS_ALLOWED
được bật, script sẽ chạy mà không cần xác nhận của người dùng, tức là giá trị MQL_DLLS_ALLOWED
được giả định là true
(theo TERMINAL_DLLS_ALLOWED
).
Khi làm việc trong tester, các cờ
TERMINAL_TRADE_ALLOWED
vàMQL_TRADE_ALLOWED
luôn bằngtrue
. Tuy nhiên, trong chỉ báo, quyền truy cập vào tất cả các hàm giao dịch bị cấm bất kể các cờ này. Tester không cho phép kiểm tra các chương trình MQL có phụ thuộc vào DLL.
Các cờ TERMINAL_EMAIL_ENABLED
, TERMINAL_FTP_ENABLED
và TERMINAL_NOTIFICATIONS_ENABLED
rất quan trọng đối với các hàm send mail
, SendFTP
và send notification
, được mô tả trong phần Chức năng mạng. Cờ MQL_SIGNALS_ALLOWED
ảnh hưởng đến khả năng sử dụng của một nhóm hàm quản lý đăng ký tín hiệu giao dịch mql5.com (không được thảo luận trong sách này). Trạng thái của nó tương ứng với tùy chọn Allow changing signal settings
trong tab Common
của thuộc tính chương trình MQL.
Vì việc kiểm tra một số thuộc tính đòi hỏi nỗ lực bổ sung, nên gói các cờ trong một lớp che giấu nhiều lệnh gọi đến các hàm hệ thống khác nhau trong các phương thức của nó là hợp lý. Điều này càng cần thiết vì một số quyền không giới hạn ở các tùy chọn trên. Ví dụ, quyền giao dịch có thể được thiết lập (hoặc xóa) không chỉ ở cấp độ terminal hoặc chương trình MQL mà còn cho một công cụ tài chính riêng lẻ — theo thông số kỹ thuật từ nhà môi giới của bạn và các phiên giao dịch. Do đó, tại bước này, chúng ta sẽ trình bày một bản nháp của lớp Permissions
chỉ chứa các yếu tố quen thuộc, sau đó sẽ cải thiện cho các API ứng dụng cụ thể.
Nhờ vào lớp hoạt động như một tầng chương trình, lập trình viên không cần phải nhớ quyền nào được định nghĩa cho các hàm TerminalInfo
và quyền nào được định nghĩa cho các hàm MqlInfo
.
Mã nguồn nằm trong tệp EnvPermissions.mq5
.
class Permissions
{
public:
static bool isTradeEnabled(const string symbol = NULL, const datetime session = 0)
{
// TODO: sẽ được bổ sung bởi các kiểm tra ứng dụng của symbol và sessions
return PRTF(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
&& PRTF(MQLInfoInteger(MQL_TRADE_ALLOWED));
}
static bool isDllsEnabledByDefault()
{
return (bool)PRTF(TerminalInfoInteger(TERMINAL_DLLS_ALLOWED));
}
static bool isDllsEnabled()
{
return (bool)PRTF(MQLInfoInteger(MQL_DLLS_ALLOWED));
}
static bool isEmailEnabled()
{
return (bool)PRTF(TerminalInfoInteger(TERMINAL_EMAIL_ENABLED));
}
static bool isFtpEnabled()
{
return (bool)PRTF(TerminalInfoInteger(TERMINAL_FTP_ENABLED));
}
static bool isPushEnabled()
{
return (bool)PRTF(TerminalInfoInteger(TERMINAL_NOTIFICATIONS_ENABLED));
}
static bool isSignalsEnabled()
{
return (bool)PRTF(MQLInfoInteger(MQL_SIGNALS_ALLOWED));
}
};
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
Tất cả các phương thức của lớp đều là tĩnh và được gọi trong OnStart
.
void OnStart()
{
Permissions::isTradeEnabled();
Permissions::isDllsEnabledByDefault();
Permissions::isDllsEnabled();
Permissions::isEmailEnabled();
Permissions::isPushEnabled();
Permissions::isSignalsEnabled();
}
2
3
4
5
6
7
8
9
Ví dụ về nhật ký được tạo ra được hiển thị dưới đây.
TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)=1 / ok
MQLInfoInteger(MQL_TRADE_ALLOWED)=1 / ok
TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)=0 / ok
MQLInfoInteger(MQL_DLLS_ALLOWED)=0 / ok
TerminalInfoInteger(TERMINAL_EMAIL_ENABLED)=0 / ok
TerminalInfoInteger(TERMINAL_NOTIFICATIONS_ENABLED)=0 / ok
MQLInfoInteger(MQL_SIGNALS_ALLOWED)=0 / ok
2
3
4
5
6
7
Để tự học, script có khả năng tích hợp (nhưng bị comment) kết nối với các DLL hệ thống để đọc nội dung của clipboard Windows. Chúng ta sẽ xem xét việc tạo và sử dụng thư viện, đặc biệt là chỉ thị #import
, trong phần thứ bảy của sách, trong phần Thư viện.
Giả sử tùy chọn nhập DLL toàn cục bị tắt trong terminal (đây là cài đặt được khuyến nghị vì lý do bảo mật). Sau đó, nếu DLL được kết nối với script, sẽ chỉ có thể chạy script bằng cách cho phép nhập trong hộp thoại cài đặt riêng của nó, kết quả là MQLInfoInteger(MQL_DLLS_ALLOWED)
sẽ trả về 1 (true
). Nếu quyền toàn cục cho DLL được bật, thì chúng ta nhận được TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)=1
, và MQL_DLLS_ALLOWED
sẽ kế thừa giá trị này.