Gỡ lỗi và phân tích hiệu suất
Tester MetaTrader 5 không chỉ hữu ích cho việc kiểm tra lợi nhuận của các chiến lược giao dịch mà còn để gỡ lỗi các chương trình MQL. Việc phát hiện lỗi chủ yếu liên quan đến khả năng tái tạo tình huống có vấn đề. Nếu chúng ta chỉ có thể chạy các chương trình MQL trực tuyến, việc gỡ lỗi và phân tích thực thi mã nguồn sẽ đòi hỏi một lượng nỗ lực không thực tế. Tuy nhiên, tester cho phép bạn "chạy" các chương trình trên các đoạn lịch sử tùy ý, thay đổi cài đặt tài khoản và các biểu tượng giao dịch.
Hãy nhớ rằng trong MetaEditor có 2 lệnh trong menu Debug
:
Start/Continue on real data
(F5)Start/Continue on historical data
(Ctrl-F5)
Trong cả hai trường hợp, chương trình được biên dịch lại nhanh chóng theo cách đặc biệt với thông tin gỡ lỗi bổ sung trong tệp ex5 và sau đó được khởi chạy trực tiếp trong terminal (tùy chọn đầu tiên) hoặc trong tester (tùy chọn thứ hai).
Khi gỡ lỗi trong tester, bạn có thể sử dụng cả chế độ nhanh (nền) và chế độ trực quan. Cài đặt này được cung cấp trong hộp thoại Setting
trên tab Debug/Profile
: bật hoặc tắt cờ Use visual mode for debugging on history
. Môi trường và cài đặt của chương trình đang được gỡ lỗi có thể được lấy trực tiếp từ tester (như chúng đã được thiết lập cuối cùng cho chương trình này) hoặc trong cùng hộp thoại trong các trường nhập dưới cờ Use specified settings
(để chúng hoạt động, cờ này phải được bật).
Bạn có thể đặt trước các điểm dừng (F9) trên các toán tử trong phần mà điều gì đó có vẻ bắt đầu hoạt động sai. Tester sẽ tạm dừng quá trình khi nó đến vị trí được chỉ định trong mã nguồn.
Xin lưu ý rằng trong tester, số lượng thanh lịch sử được tải lúc khởi động phụ thuộc vào các yếu tố khác nhau (bao gồm khung thời gian, số ngày trong năm, v.v.) và có thể thay đổi đáng kể. Nếu cần, hãy di chuyển thời gian bắt đầu kiểm tra ngược về quá khứ.
Ngoài các lỗi rõ ràng gây ra việc chương trình dừng lại hoặc hoạt động sai rõ rệt, còn có một loại lỗi tinh vi ảnh hưởng tiêu cực đến hiệu suất. Thông thường, chúng không quá rõ ràng, nhưng trở thành vấn đề khi lượng dữ liệu được xử lý tăng lên, ví dụ, trên các tài khoản giao dịch có lịch sử rất dài, hoặc trên các biểu đồ có số lượng lớn đối tượng đánh dấu.
Để tìm "điểm nghẽn" về hiệu suất, trình gỡ lỗi cung cấp cơ chế phân tích mã nguồn. Nó cũng có thể được thực hiện trực tuyến hoặc trong tester, và điều này đặc biệt quý giá, vì nó cho phép nén thời gian đáng kể. Các lệnh tương ứng cũng có sẵn trong menu gỡ lỗi.
Start profiling on real data
Start profiling on historical data
Để phân tích hiệu suất, chương trình cũng được biên dịch trước với các cài đặt đặc biệt, vì vậy đừng quên biên dịch lại chương trình ở chế độ bình thường sau khi gỡ lỗi hoặc phân tích hiệu suất hoàn tất (đặc biệt nếu bạn định gửi nó cho khách hàng hoặc tải lên MQL5 Market).
Kết quả của việc phân tích hiệu suất trong MetaEditor, bạn sẽ nhận được thống kê thời gian thực thi mã của mình, được chia nhỏ theo dòng và hàm (phương thức). Kết quả là, sẽ rõ ràng điều gì làm chậm chương trình. Giai đoạn phát triển tiếp theo thường là refactoring
mã nguồn, tức là viết lại nó bằng cách sử dụng các thuật toán, cấu trúc dữ liệu được cải tiến, hoặc các nguyên tắc khác về tổ chức xây dựng của các mô-đun (thành phần). Thật không may, một phần đáng kể thời gian trong lập trình được dành để viết lại mã hiện có, tìm kiếm và sửa lỗi.
Chính chương trình, nếu cần, có thể tìm hiểu chế độ hoạt động của nó và điều chỉnh hành vi của mình theo môi trường (ví dụ, khi chạy trong tester, nó sẽ không cố gắng tải dữ liệu từ Internet, vì tính năng này bị tắt, mà sẽ đọc chúng từ một tệp nhất định).
Ở giai đoạn biên dịch, các phiên bản gỡ lỗi và sản xuất của chương trình có thể được hình thành khác nhau do các macro tiền xử lý _DEBUG và _RELEASE
.
Ở giai đoạn thực thi chương trình, các chế độ của nó có thể được phân biệt bằng cách sử dụng các tùy chọn của hàm MQLInfoInteger
.
Bảng sau đây tóm tắt tất cả các kết hợp có sẵn ảnh hưởng đến chi tiết thời gian chạy.
Runtime\ flags | MQL_DEBUG | MQL_PROFILER | Normal(release) |
---|---|---|---|
Online | + | + | + |
Tester (MQL_TESTER) | + | + | + |
Tester (MQL_TESTER+MQL_VISUAL_MODE) | + | - | + |
Phân tích hiệu suất trong tester chỉ có thể thực hiện mà không có chế độ trực quan, vì vậy bạn nên đo lường các thao tác với biểu đồ và đối tượng trực tuyến.
Gỡ lỗi không được phép trong quá trình tối ưu hóa, bao gồm các trình xử lý đặc biệt OnTesterInit
, OnTesterDeinit
, và OnTesterPass
. Nếu bạn cần kiểm tra hiệu suất của chúng, hãy xem xét gọi mã của chúng trong các điều kiện khác.