Cách xử lý các sự kiện nến
Các sự kiện nến rất quan trọng đối với vòng đời của bất kỳ cBot nào. Xử lý đúng các sự kiện này là rất quan trọng để quản lý cách cBot của bạn phản ứng với các điều kiện thị trường mới. Trong bài viết này và video tương ứng, chúng tôi sẽ trình bày các loại sự kiện nến chính và thảo luận về các trình xử lý cho các sự kiện này được cung cấp bởi API cTrader.
- Nến - đề cập đến các loại đối tượng khác nhau được vẽ tuần tự trên biểu đồ giao dịch bởi cTrader. Nó có thể là biểu đồ nến, khối Renko, thanh Range hoặc thậm chí là nến Heiken Ashi.
Xử lý sự kiện BarOpened
Các sự kiện nến xảy ra khi một nến mới bắt đầu được vẽ trên biểu đồ giao dịch được liên kết với một cBot. Sự kiện BarOpened xảy ra đối với nến mới vừa bắt đầu được vẽ trên biểu đồ.
Việc xử lý sự kiện này được thực hiện thông qua phương thức OnBar(), đây là một phương thức được kế thừa từ lớp cơ sở Robot. Bây giờ chúng ta sẽ tạo một cBot xử lý sự kiện BarOpened như một phần trong chiến lược phân tích tâm lý thị trường của chúng ta. Chúng ta sẽ xóa các phương thức OnStart() và OnStop() khỏi mẫu và thay thế trình xử lý OnTick() bằng trình xử lý OnBar().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
cBot này được thiết kế để chạy trên biểu đồ với khung thời gian D1 (hàng ngày). Trên mỗi nến, nó so sánh sự chênh lệch giá mở cửa với giá mở cửa của nến trước đó và đặt một lệnh mới theo hướng phù hợp. Nếu chênh lệch giá không đáng kể, bot sẽ đóng tất cả các vị thế đang mở.
Nếu chúng ta chạy backtest của bot đơn giản này, kết quả có vẻ khả quan.

Xử lý sự kiện BarClosed
Khi một nến mới mở ra, nó thực sự thiếu bất kỳ dữ liệu giá nào ngoài giá mở cửa của nó. Trong nhiều trường hợp, bạn có thể muốn cBot của mình truy cập dữ liệu từ nến trước đó để đảm bảo thực hiện chiến lược một cách suôn sẻ. Đó là lý do tại sao sự kiện BarClosed xảy ra đối với nến vừa đóng (nến ngay trước nến mới) và cho phép bạn dễ dàng sử dụng dữ liệu giá và khối lượng của nó. Khi sự kiện BarClosed được kích hoạt, nến mới mở hoàn toàn bị bỏ qua khỏi bộ sưu tập Bars
Để xử lý sự kiện BarClosed, API cung cấp phương thức OnBarClosed.
Ghi chú
Trong ví dụ trước, chúng ta đã sử dụng thuộc tính Bars.LastBar.Open để lấy giá mở cửa của nến mới mở. Nếu chúng ta sử dụng cùng một thuộc tính trong phương thức OnBarClosed(), chúng ta sẽ nhận được giá mở cửa của nến vừa đóng.
Chúng ta sẽ tạo một cBot đơn giản sử dụng trình xử lý OnBarClosed() như sau.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
cBot phát hiện mô hình tăng giá (hammer) bằng cách đánh giá độ dài của bóng nến dưới. Nếu phát hiện mô hình hammer, tất cả các vị thế đã mở trước đó sẽ được đóng và một lệnh mua mới được đặt với mức cắt lỗ 50 pip.
Nếu chúng ta backtest bot này, chúng ta sẽ nhận được kết quả khá tốt.

Thêm trình xử lý sự kiện tùy chỉnh
Khi xử lý các sự kiện BarOpened và BarClosed, bạn cũng có thể sử dụng cú pháp hơi khác bằng cách gán các sự kiện này với các trình xử lý tùy chỉnh. Trong khi OnBar() và OnBarClosed() chỉ được kích hoạt một lần, bạn có thể gán bao nhiêu trình xử lý tùy chỉnh tùy ý, cho phép thêm logic phức tạp.
Ghi chú
Các trình xử lý sự kiện tùy chỉnh phải được thêm vào trong phương thức OnStart(). Các trình xử lý tùy chỉnh cũng phải chấp nhận một đối số thuộc loại BarOpenedEventArgs (cho sự kiện BarOpened) hoặc BarClosedEventArgs (cho sự kiện BarClosed).
1 2 3 4 5 6 7 8 9 10 | |
Chúng ta sẽ tạo một cBot khác sử dụng hai trình xử lý tùy chỉnh cho sự kiện BarOpened để phản ứng với các đảo chiều tăng và giảm có thể xảy ra.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
cBot kiểm tra xem giá mở cửa của nến mới mở có cao hơn giá đóng cửa của hai nến trước đó hay không. Nếu đúng như vậy, một lệnh mua sẽ được đặt. Nếu giá mở cửa thấp hơn giá đóng cửa của hai nến trước đó, một lệnh bán sẽ được đặt. Việc sử dụng hai trình xử lý sự kiện riêng biệt cho phép chúng ta chia logic giao dịch của mình thành các thành phần nhỏ hơn mà chúng ta có thể dễ dàng sửa đổi sau này nếu cần.
Kết quả backtest trên khung thời gian D1 cũng khả quan.

Tổng quan
Bằng cách học cách xử lý đúng các sự kiện nến, bạn có thể làm cho cBot của mình thực hiện chính xác những gì bạn muốn chúng làm và khi nào bạn muốn chúng làm điều đó.