Đóng terminal bằng lập trình và thiết lập mã trả về
API MQL5 chứa nhiều hàm không chỉ để đọc mà còn để sửa đổi môi trường chương trình. Một trong những hàm mạnh mẽ nhất là TerminalClose
. Sử dụng hàm này, một chương trình MQL có thể đóng terminal (mà không cần xác nhận từ người dùng!).
bool TerminalClose(int retcode)
Hàm này có một tham số retcode
, là mã mà tiến trình terminal64.exe trả về cho hệ điều hành Windows. Những mã như vậy có thể được phân tích trong các tệp hàng loạt (*.bat và .cmd), cũng như trong các script shell (Windows Script Host (WSH), hỗ trợ VBScript và JScript, hoặc Windows PowerShell (WPS), với tệp .ps) và các công cụ tự động hóa khác (ví dụ, lịch trình tích hợp của Windows, hệ thống phụ hỗ trợ Linux dưới Windows với tệp *.sh, v.v.).
Hàm không dừng terminal ngay lập tức, mà gửi một lệnh kết thúc đến terminal.
Nếu kết quả của lời gọi là true
, điều đó có nghĩa là lệnh đã được "chấp nhận để xem xét" thành công, và terminal sẽ cố gắng đóng càng nhanh càng tốt, nhưng theo cách đúng đắn (tạo thông báo và dừng các chương trình MQL khác đang chạy). Trong mã gọi hàm, tất nhiên, mọi chuẩn bị cũng phải được thực hiện cho việc kết thúc công việc ngay lập tức (cụ thể, tất cả các tệp đã mở trước đó nên được đóng), và sau khi gọi hàm, quyền điều khiển nên được trả lại cho terminal.
Một hàm khác liên quan đến mã trả về của tiến trình là SetReturnError
. Nó cho phép định trước mã này mà không gửi lệnh đóng ngay lập tức.
void SetReturnError(int retcode)
Hàm này thiết lập mã mà tiến trình terminal sẽ trả về cho hệ thống Windows sau khi đóng.
Lưu ý rằng terminal không cần phải bị đóng cưỡng chế bằng hàm TerminalClose
. Việc đóng terminal thông thường bởi người dùng cũng sẽ xảy ra với mã đã chỉ định. Ngoài ra, mã này sẽ được gửi vào hệ thống nếu terminal đóng do lỗi nghiêm trọng bất ngờ.
Nếu hàm SetReturnError
được gọi nhiều lần và/hoặc từ các chương trình MQL khác nhau, terminal sẽ trả về mã được thiết lập cuối cùng.
Hãy kiểm tra các hàm này bằng script EnvClose.mq5
.
#property script_show_inputs
input int ReturnCode = 0;
input bool CloseTerminalNow = false;
void OnStart()
{
if(CloseTerminalNow)
{
TerminalClose(ReturnCode);
}
else
{
SetReturnError(ReturnCode);
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Để kiểm tra nó trong thực tế, chúng ta cũng cần tệp envrun.bat
(nằm trong thư mục MQL5/Files/MQL5Book/
).
terminal64.exe
@echo Exit code: %ERRORLEVEL%
2
Thực tế, nó chỉ khởi chạy terminal, và sau khi hoàn tất, hiển thị mã kết quả ra console. Tệp này nên được đặt trong thư mục terminal (hoặc phiên bản hiện tại của MetaTrader 5 trong số nhiều phiên bản cài đặt trên hệ thống cần được đăng ký trong biến hệ thống PATH).
Ví dụ, nếu chúng ta khởi động terminal bằng tệp bat và thực thi script EnvClose.mq5
, chẳng hạn với các tham số ReturnCode=100
, CloseTerminalNow=true
, chúng ta sẽ thấy điều gì đó như sau trong console:
Microsoft Windows [Version 10.0.19570.1000]
(c) 2020 Microsoft Corporation. All rights reserved.
C:\Program Files\MT5East>envrun
C:\Program Files\MT5East>terminal64.exe
Exit code: 100
C:\Program Files\MT5East>
2
3
4
5
6
Như một lời nhắc nhở, MetaTrader 5 hỗ trợ nhiều tùy chọn khi được khởi chạy từ dòng lệnh (xem chi tiết trong phần tài liệu Chạy nền tảng giao dịch). Do đó, có thể tổ chức, chẳng hạn, kiểm tra hàng loạt các Expert Advisors hoặc cài đặt khác nhau, cũng như chuyển đổi tuần tự giữa hàng nghìn tài khoản được theo dõi, điều mà sẽ không thực tế nếu vận hành song song liên tục nhiều phiên bản như vậy trên một máy tính.