Nhóm sự kiện OnTester để kiểm soát tối ưu hóa
Có ba sự kiện đặc biệt trong MQL5 để quản lý quá trình tối ưu hóa và truyền các kết quả ứng dụng tùy ý (ngoài các chỉ số giao dịch) từ các agent đến terminal: OnTesterInit
, OnTesterDeinit
, và OnTesterPass
. Khi đã mô tả các trình xử lý cho chúng trong mã, lập trình viên sẽ có thể thực hiện các hành động cần thiết trước khi bắt đầu tối ưu hóa, sau khi tối ưu hóa hoàn tất, và vào cuối mỗi lần chạy tối ưu hóa riêng lẻ (nếu dữ liệu ứng dụng đã được nhận từ agent, chi tiết hơn ở phần dưới).
Tất cả các trình xử lý đều là tùy chọn. Như chúng ta đã thấy, tối ưu hóa hoạt động mà không cần chúng. Cũng cần hiểu rằng cả ba sự kiện này chỉ hoạt động trong quá trình tối ưu hóa, chứ không phải trong một bài kiểm tra đơn lẻ.
Expert Advisor với các trình xử lý này được tự động tải lên một biểu đồ riêng biệt của terminal với ký hiệu và chu kỳ được chỉ định trong tester. Bản sao Expert Advisor này không giao dịch, mà chỉ thực hiện các hành động dịch vụ. Tất cả các trình xử lý sự kiện khác, chẳng hạn như OnInit
, OnDeinit
, và OnTick
không hoạt động trong đó.
Để tìm hiểu xem một Expert Advisor đang được thực thi ở chế độ giao dịch thông thường trên agent hay ở chế độ dịch vụ trong terminal, hãy gọi hàm MQLInfoInteger(MQL_FRAME_MODE)
trong mã của nó và nhận được true
hoặc false
. Chế độ dịch vụ này còn được gọi là chế độ "frames", áp dụng cho các gói dữ liệu có thể được gửi đến terminal từ các bản sao Expert Advisor trên các agent. Chúng ta sẽ thấy cách thực hiện điều này một chút sau.
Trong quá trình tối ưu hóa, chỉ một bản sao Expert Advisor hoạt động trong terminal và nếu cần, nhận các frame đến. Đừng quên rằng bản sao như vậy chỉ được khởi động nếu mã Expert Advisor chứa một trong ba trình xử lý sự kiện đã mô tả.
Sự kiện OnTesterInit
được tạo ra khi tối ưu hóa được khởi động trong tester chiến lược trước lần chạy đầu tiên. Trình xử lý có hai phiên bản: với kiểu trả về int
và void
.
int OnTesterInit(void)
void OnTesterInit(void)
Trong phiên bản trả về int
, giá trị bằng 0 (INIT_SUCCEEDED) có nghĩa là khởi tạo thành công Expert Advisor được khởi động trên biểu đồ trong terminal, điều này cho phép bắt đầu tối ưu hóa. Bất kỳ giá trị nào khác có nghĩa là mã lỗi, và tối ưu hóa sẽ không bắt đầu.
Phiên bản thứ hai của hàm luôn ngụ ý việc chuẩn bị thành công Expert Advisor cho tối ưu hóa.
Thời gian thực thi của OnTesterInit
được giới hạn, sau đó Expert Advisor sẽ bị buộc kết thúc, và bản thân quá trình tối ưu hóa sẽ bị hủy bỏ. Trong trường hợp này, một thông báo tương ứng sẽ được hiển thị trong nhật ký của tester.
Trong phần trước, chúng ta đã thấy một ví dụ về cách trình xử lý OnTesterInit
được sử dụng để sửa đổi các tham số tối ưu hóa bằng các hàm ParameterGetRange/ParameterSetRange
.
void OnTesterDeinit(void)
Hàm OnTesterDeinit
được gọi khi quá trình tối ưu hóa Expert Advisor hoàn tất.
Hàm này được thiết kế để xử lý cuối cùng các kết quả tối ưu hóa ứng dụng. Ví dụ, nếu một tệp được mở trong OnTesterInit
để ghi nội dung của các frame, thì nó cần được đóng trong OnTesterDeinit
.
void OnTesterPass(void)
Sự kiện OnTesterPass
được tự động tạo ra khi một frame dữ liệu đến trong quá trình tối ưu hóa. Hàm này cho phép xử lý dữ liệu ứng dụng nhận được từ các bản sao Expert Advisor chạy trên các agent trong quá trình tối ưu hóa. Một frame từ agent kiểm tra phải được gửi từ trình xử lý OnTester
bằng hàm FrameAdd
.
Sơ đồ thể hiện trình tự các sự kiện khi tối ưu hóa Expert Advisors
Một tập hợp tiêu chuẩn các thống kê tài chính về mỗi lần kiểm tra được gửi tự động từ các agent đến terminal. Expert Advisor không cần phải gửi bất cứ thứ gì bằng
FrameAdd
nếu không cần thiết. Nếu các frame không được sử dụng, trình xử lýOnTesterPass
sẽ không được gọi.
Bằng cách sử dụng OnTesterPass
, bạn có thể xử lý động các kết quả tối ưu hóa "trong lúc thực hiện", ví dụ, hiển thị chúng trên biểu đồ trong terminal hoặc thêm chúng vào một tệp để xử lý hàng loạt sau này.
Để thể hiện khả năng của các trình xử lý sự kiện OnTester
, trước tiên chúng ta cần tìm hiểu các hàm làm việc với frame. Chúng được trình bày trong các phần tiếp theo.