Các chế độ hoạt động của Terminal và chương trình
Môi trường MetaTrader 5 cung cấp giải pháp cho nhiều nhiệm vụ khác nhau tại giao điểm giữa giao dịch và lập trình, điều này đòi hỏi phải có nhiều chế độ hoạt động khác nhau của cả terminal lẫn chương trình cụ thể.
Sử dụng API MQL5, bạn có thể phân biệt giữa hoạt động trực tuyến thông thường và kiểm tra ngược (backtesting), giữa việc gỡ lỗi mã nguồn (để xác định các lỗi tiềm ẩn) và phân tích hiệu suất (tìm kiếm các điểm nghẽn trong mã), cũng như giữa bản sao cục bộ của terminal và phiên bản đám mây (MetaTrader VPS).
Các chế độ được mô tả bằng các cờ (flags), mỗi cờ chứa một giá trị kiểu boolean: true
hoặc false
.
Bảng mô tả các cờ
Định danh | Mô tả |
---|---|
MQL_DEBUG | Chương trình đang chạy ở chế độ gỡ lỗi |
MQL_PROFILER | Chương trình hoạt động ở chế độ phân tích hiệu suất mã |
MQL_TESTER | Chương trình hoạt động trong tester |
MQL_FORWARD | Chương trình được thực thi trong quá trình kiểm tra tiến |
MQL_OPTIMIZATION | Chương trình đang chạy trong quá trình tối ưu hóa |
MQL_VISUAL_MODE | Chương trình đang chạy ở chế độ kiểm tra trực quan |
MQL_FRAME_MODE | Expert Advisor được thực thi trên biểu đồ ở chế độ thu thập khung kết quả tối ưu hóa |
TERMINAL_VPS | Terminal hoạt động trên máy chủ ảo MetaTrader Virtual Hosting (MetaTrader VPS) |
Các cờ MQL_FORWARD
, MQL_OPTIMIZATION
và MQL_VISUAL_MODE
ngụ ý rằng cờ MQL_TESTER
đã được thiết lập.
Một số cặp kết hợp cờ loại trừ lẫn nhau, tức là các cờ này không thể được bật cùng lúc. Cụ thể, sự hiện diện của MQL_FRAME_MODE
loại trừ MQL_TESTER
và ngược lại. MQL_OPTIMIZATION
loại trừ MQL_VISUAL_MODE
, và MQL_PROFILER
loại trừ MQL_DEBUG
.
Chúng ta sẽ nghiên cứu tất cả các cờ liên quan đến kiểm tra (MQL_TESTER
, MQL_VISUAL_MODE
) trong các phần dành cho Expert Advisors và một phần cho chỉ báo. Mọi thứ liên quan đến tối ưu hóa Expert Advisor (MQL_OPTIMIZATION
, MQL_FORWARD
, MQL_FRAME_MODE
) sẽ được đề cập trong một phần riêng.
Bây giờ, hãy làm quen với nguyên tắc đọc các cờ bằng ví dụ về chế độ gỡ lỗi (MQL_DEBUG
) và chế độ phân tích hiệu suất (MQL_PROFILER
). Đồng thời, hãy ôn lại cách kích hoạt các chế độ này từ MetaEditor (xem chi tiết trong tài liệu, tại các phần Gỡ lỗi và Phân tích hiệu suất).
Chúng ta sẽ sử dụng script EnvMode.mq5
.
void OnStart()
{
PRTF(MQLInfoInteger(MQL_TESTER));
PRTF(MQLInfoInteger(MQL_DEBUG));
PRTF(MQLInfoInteger(MQL_PROFILER));
PRTF(MQLInfoInteger(MQL_VISUAL_MODE));
PRTF(MQLInfoInteger(MQL_OPTIMIZATION));
PRTF(MQLInfoInteger(MQL_FORWARD));
PRTF(MQLInfoInteger(MQL_FRAME_MODE));
}
2
3
4
5
6
7
8
9
10
Trước khi chạy chương trình, bạn nên kiểm tra cài đặt gỡ lỗi/phân tích hiệu suất. Để làm điều này, trong MetaEditor, chạy lệnh Tools -> Options
và kiểm tra giá trị các trường trong tab Debugging/Profiling
. Nếu tùy chọn Use specified settings
được bật, thì các giá trị của các trường bên dưới sẽ ảnh hưởng đến biểu đồ công cụ tài chính và khung thời gian mà chương trình sẽ được khởi chạy. Nếu tùy chọn này bị tắt, công cụ tài chính đầu tiên trong Market Watch
và khung thời gian H1 sẽ được sử dụng.
Tại giai đoạn này, việc chọn tùy chọn không quá quan trọng.
Sau khi chuẩn bị, chạy script bằng lệnh Debug -> Start on Real Data
(F5). Vì script chỉ in các thuộc tính được yêu cầu vào nhật ký (và chúng ta không cần điểm dừng trong đó), việc thực thi sẽ diễn ra tức thời. Nếu cần gỡ lỗi từng bước, chúng ta có thể đặt điểm dừng (F9) trên bất kỳ câu lệnh nào trong mã nguồn, và việc thực thi script sẽ dừng lại tại đó trong bất kỳ khoảng thời gian nào chúng ta cần, cho phép nghiên cứu nội dung của tất cả các biến trong MetaEditor, đồng thời di chuyển từng dòng (F10) dọc theo thuật toán.
Trong nhật ký MetaTrader 5 (tab Experts), chúng ta sẽ thấy như sau:
MQLInfoInteger(MQL_TESTER)=0 / ok
MQLInfoInteger(MQL_DEBUG)=1 / ok
MQLInfoInteger(MQL_PROFILER)=0 / ok
MQLInfoInteger(MQL_VISUAL_MODE)=0 / ok
MQLInfoInteger(MQL_OPTIMIZATION)=0 / ok
MQLInfoInteger(MQL_FORWARD)=0 / ok
MQLInfoInteger(MQL_FRAME_MODE)=0 / ok
2
3
4
5
6
7
Tất cả các cờ của các chế độ đều được đặt lại, ngoại trừ MQL_DEBUG
.
Bây giờ, hãy chạy cùng script từ Navigator
trong MetaTrader 5 (chỉ cần kéo nó bằng chuột vào bất kỳ biểu đồ nào). Chúng ta sẽ nhận được một tập hợp cờ gần giống nhau, nhưng lần này MQL_DEBUG
sẽ bằng 0 (vì chương trình được thực thi theo cách thông thường, không phải dưới trình gỡ lỗi).
WARNING
Lưu ý rằng việc khởi chạy chương trình với gỡ lỗi được thực hiện sau khi biên dịch lại nó ở chế độ đặc biệt, khi thông tin dịch vụ cho phép gỡ lỗi được thêm vào tệp thực thi. Tệp nhị phân như vậy sẽ lớn hơn và chậm hơn bình thường. Do đó, sau khi hoàn tất gỡ lỗi, trước khi sử dụng trong giao dịch thực tế, chuyển giao cho khách hàng hoặc tải lên Market, chương trình cần được biên dịch lại bằng lệnh File -> Compile
(F7).
Phương pháp biên dịch không ảnh hưởng trực tiếp đến thuộc tính MQL_DEBUG
. Phiên bản gỡ lỗi của chương trình, như chúng ta thấy, có thể được khởi chạy trong terminal mà không có trình gỡ lỗi, và MQL_DEBUG
sẽ được đặt lại trong trường hợp này. Hai macro tích hợp sẵn cho phép xác định phương pháp biên dịch: _DEBUG
và _RELEASE
(xem phần Hằng số định sẵn). Chúng là hằng số, không phải hàm, vì thuộc tính này được "cố định" vào chương trình tại thời điểm biên dịch và không thể thay đổi sau đó (khác với môi trường thời gian chạy).
Bây giờ, hãy thực thi trong MetaEditor lệnh Debug -> Start Profiling on Real Data
. Tất nhiên, không có ý nghĩa đặc biệt trong việc phân tích hiệu suất một script đơn giản như vậy, nhưng nhiệm vụ của chúng ta bây giờ là đảm bảo rằng cờ phù hợp được bật trong thuộc tính môi trường. Thật vậy, đối diện với MQL_PROFILER
giờ đây là 1.
MQLInfoInteger(MQL_TESTER)=0 / ok
MQLInfoInteger(MQL_DEBUG)=0 / ok
MQLInfoInteger(MQL_PROFILER)=1 / ok
...
2
3
4
TIP
Việc khởi chạy chương trình với phân tích hiệu suất cũng được thực hiện sau khi biên dịch lại ở một chế độ đặc biệt khác, bổ sung thông tin dịch vụ khác vào tệp nhị phân cần thiết để đo tốc độ thực thi lệnh. Sau khi phân tích báo cáo profiler và sửa các điểm nghẽn, bạn nên biên dịch lại chương trình theo cách thông thường.
Nguyên tắc là, gỡ lỗi và phân tích hiệu suất có thể được thực hiện cả trực tuyến và trong tester (MQL_TESTER
) trên dữ liệu lịch sử, nhưng tester chỉ hỗ trợ Expert Advisors và chỉ báo. Do đó, không thể thấy cờ MQL_TESTER
hoặc MQL_VISUAL_MODE
được thiết lập trong ví dụ script.
Như bạn đã biết, MetaTrader 5 cho phép kiểm tra các chương trình giao dịch ở chế độ nhanh (không có biểu đồ) và ở chế độ trực quan (trên một biểu đồ riêng). Trong trường hợp thứ hai, thuộc tính MQL_VISUAL_MODE
sẽ được bật. Việc kiểm tra điều này là hợp lý, đặc biệt để vô hiệu hóa các thao tác với đối tượng đồ họa khi không có trực quan hóa.
Để gỡ lỗi ở chế độ trực quan bằng lịch sử, trước tiên bạn phải bật tùy chọn Use visual mode for debugging on history
trong hộp thoại cài đặt MetaEditor. Các chương trình phân tích (chỉ báo) luôn được kiểm tra ở chế độ trực quan.
Hãy nhớ rằng gỡ lỗi trực tuyến không an toàn cho các Expert Advisors giao dịch.