Sự kiện tương tác trên biểu đồ
Biểu đồ MetaTrader 5 không chỉ cung cấp hình ảnh trực quan của dữ liệu và là môi trường thực thi cho các chương trình MQL, mà còn hỗ trợ cơ chế sự kiện tương tác, cho phép các chương trình phản hồi hành động của người dùng và các chương trình khác. Điều này được thực hiện thông qua một loại sự kiện đặc biệt — OnChartEvent
— mà chúng ta đã thảo luận trong Tổng quan về các hàm xử lý sự kiện.
Bất kỳ chỉ báo hoặc Cố vấn Chuyên gia nào cũng có thể nhận các sự kiện như vậy, với điều kiện hàm xử lý sự kiện cùng tên với chữ ký được định nghĩa trước được mô tả trong mã. Trong một số ví dụ về chỉ báo mà chúng ta đã xem xét trước đó, chúng ta đã phải tận dụng cơ hội này. Trong chương này, chúng ta sẽ xem xét hệ thống sự kiện một cách chi tiết.
Sự kiện OnChartEvent
được tạo ra bởi thiết bị đầu cuối khách hàng trong các thao tác biểu đồ sau đây do người dùng thực hiện:
- Thay đổi kích thước hoặc cài đặt biểu đồ
- Nhấn phím khi cửa sổ biểu đồ đang được tập trung
- Di chuyển con trỏ chuột
- Nhấp chuột trên biểu đồ
- Nhấp chuột trên các đối tượng đồ họa
- Tạo một đối tượng đồ họa
- Xóa một đối tượng đồ họa
- Di chuyển một đối tượng đồ họa bằng chuột
- Hoàn tất chỉnh sửa văn bản trong trường nhập của đối tượng OBJ_EDIT
Chương trình MQL chỉ nhận các sự kiện được liệt kê từ biểu đồ mà nó đang chạy. Giống như các loại sự kiện khác, chúng được thêm vào một hàng đợi. Tất cả các sự kiện sau đó được xử lý từng cái một theo thứ tự đến. Nếu đã có một sự kiện OnChartEvent
của một loại cụ thể trong hàng đợi chương trình MQL hoặc nó đang được xử lý, một sự kiện mới cùng loại sẽ không được xếp hàng (bị loại bỏ).
Một số loại sự kiện luôn hoạt động, trong khi những loại khác bị tắt theo mặc định và phải được kích hoạt rõ ràng bằng cách đặt các thuộc tính biểu đồ phù hợp sử dụng lệnh gọi ChartSetInteger
(xem thêm). Các sự kiện bị tắt bao gồm, đặc biệt, chuyển động chuột và cuộn bánh xe chuột. Tất cả chúng đều có đặc điểm là có thể tạo ra luồng sự kiện lớn, và để tiết kiệm tài nguyên, nên chỉ kích hoạt chúng khi cần thiết.
Ngoài các sự kiện tiêu chuẩn, còn có khái niệm "sự kiện tùy chỉnh". Ý nghĩa và nội dung của các tham số cho các sự kiện như vậy được gán và diễn giải bởi chính chương trình MQL (một hoặc nhiều, nếu chúng ta đang nói về sự tương tác của một tập hợp các chương trình). Một chương trình MQL có thể gửi "sự kiện người dùng" đến một biểu đồ (bao gồm cả biểu đồ khác) bằng hàm EventChartCustom
(xem thêm). Các sự kiện như vậy cũng được xử lý bởi hàm OnChartEvent
.
Nếu có nhiều chương trình MQL trên biểu đồ với trình xử lý OnChartEvent
, tất cả chúng sẽ nhận được cùng một luồng sự kiện.
Tất cả các chương trình MQL chạy trong các luồng khác ngoài luồng chính của ứng dụng. Luồng chính của thiết bị đầu cuối chịu trách nhiệm xử lý tất cả các thông điệp hệ thống Windows, và kết quả của quá trình xử lý này, lần lượt, tạo ra các thông điệp Windows cho chính ứng dụng của nó. Ví dụ, kéo một biểu đồ bằng chuột tạo ra một số thông điệp hệ thống WM_MOUSE_MOVE (theo thuật ngữ API Windows) để vẽ tiếp theo cửa sổ ứng dụng, và cũng gửi các thông điệp nội bộ đến các Cố vấn Chuyên gia và chỉ báo được khởi chạy trên biểu đồ này. Trong trường hợp này, có thể xảy ra tình huống rằng luồng chính của ứng dụng chưa kịp xử lý thông điệp hệ thống về việc vẽ lại cửa sổ WM_PAINT (và do đó chưa thay đổi giao diện của biểu đồ), trong khi Cố vấn Chuyên gia hoặc chỉ báo đã nhận được sự kiện về việc di chuyển con trỏ chuột. Sau đó, thuộc tính biểu đồ CHART_FIRST_VISIBLE_BAR sẽ chỉ thay đổi sau khi biểu đồ được vẽ.
Vì trong hai loại chương trình MQL tương tác, chúng ta mới chỉ nghiên cứu các chỉ báo cho đến nay, tất cả các ví dụ trong chương này sẽ được xây dựng dựa trên cơ sở của các chỉ báo. Loại thứ hai, Cố vấn Chuyên gia, sẽ được mô tả trong Phần tiếp theo của cuốn sách. Tuy nhiên, các nguyên tắc làm việc với sự kiện trong chúng hoàn toàn trùng khớp với những gì được trình bày ở đây.