Vòng đời của cBot
Trong bài viết này và video đi kèm, chúng tôi sẽ hướng dẫn từng bước cấu trúc mã và giải thích logic đằng sau các sự kiện và vòng đời của một cBot cTrader.
Để nhắc lại, bạn có thể truy cập cBot của mình trong ứng dụng Algo trong cTrader. Để tạo một cBot mới, chỉ cần nhấp vào nút cBot mới hoặc chọn tùy chọn này trong menu thả xuống như hiển thị bên dưới.

Giải thích mẫu cơ bản
Sau khi tạo một cBot mới, bạn sẽ thấy cấu trúc cơ bản sau trong cửa sổ trình soạn thảo mã.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
Lưu ý rằng chỉ có ba sự kiện được hiển thị trong mẫu cơ bản; các sự kiện này được xử lý bởi các phương thức OnStart(), OnTick() và OnStop(). Chúng ta sẽ thêm hai phương thức bổ sung (OnBar() và OnException()) và giải thích cách chúng hoạt động sau; trước tiên, chúng ta sẽ thảo luận về phương thức OnStart().
Sử dụng phương thức OnStart()
Phương thức OnStart() được kích hoạt khi một cBot bắt đầu lần đầu tiên. Nó được sử dụng để khởi tạo bất kỳ biến nào bạn dự định sử dụng trong cBot của mình, bao gồm các chỉ báo, bộ đếm, trình xử lý sự kiện hoặc bộ hẹn giờ.
Ghi chú
Mẫu mã ban đầu đã bao gồm một câu lệnh mã để in một thông báo vào nhật ký khi cBot bắt đầu. Như bạn có thể thấy, cBot của chúng ta có tham số Message, và phương thức OnStart() truyền giá trị của tham số này vào phương thức Print().
Chúng ta có thể minh họa cách phương thức OnStart() hoạt động bằng cách chỉ cần khởi động phiên bản cBot trong ứng dụng Giao dịch và mở tab Nhật ký để xem kết quả.

Chúng ta cũng có thể dừng cBot bất cứ lúc nào, thay đổi giá trị của tham số Message trong tab Tham số, và khởi động lại phiên bản của chúng ta. Khi bắt đầu, thông báo mới của chúng ta vẫn sẽ được in vào nhật ký.


Sử dụng phương thức OnTick()
Phương thức OnTick() được kích hoạt mỗi khi giá bid hoặc ask của ký hiệu thay đổi. Bên trong phương thức này, bạn thường có thể lập trình các điều kiện vào và thoát vị thế cũng như bất kỳ chức năng phụ trợ nào khác mà bạn cần chạy khi một tick dữ liệu mới đến.
Chúng ta sẽ thêm mã sau vào phương thức OnTick() để nó in một thông báo vào nhật ký.
1 | |
Như bạn có thể thấy bên dưới, cBot của chúng ta hiện in giá bid và ask vào nhật ký mỗi khi giá thay đổi.

Sử dụng phương thức OnBar()
Phương thức OnBar() không được bao gồm trong mẫu mã cBot mặc định nên chúng ta sẽ thêm đoạn mã sau để thêm nó.
1 2 3 4 | |
Phương thức OnBar() được kích hoạt bất cứ khi nào một thanh hoặc nến mới được vẽ trên biểu đồ mà cBot được gắn vào. Tương tự như phương thức OnTick(), bạn có thể sử dụng phương thức OnBar() để lập trình các điều kiện vào và thoát vị thế cũng như bất kỳ logic nào khác cần được thực thi khi mỗi thanh mới được hình thành.
Cách phương thức OnBar() được kích hoạt
Nếu bạn có biểu đồ H1, một thanh mới được hình thành mỗi giờ, nghĩa là phương thức OnBar() sẽ được gọi mỗi giờ một lần. Nếu bạn có biểu đồ m1, cùng phương thức đó sẽ được gọi mỗi phút một lần.
Phương thức OnBar() của chúng ta sẽ in "OnBar" trên mỗi thanh/nến mới. Để minh họa cách hoạt động của nó, chúng ta sẽ gắn cBot của mình vào biểu đồ m1 và xem nhật ký.

Sử dụng phương thức OnStop()
Phương thức OnStop() được gọi khi cBot dừng lại, hoặc do người dùng hoặc thông qua mã. Khi điều này xảy ra, bất kỳ mã nào bên trong phương thức OnStop() sẽ được thực thi. Điều này có thể được sử dụng để thực hiện các hoạt động cuối cùng, như đóng các vị thế.
Chúng ta sẽ thêm mã sau vào phương thức OnStop() của mình - như thường lệ, cBot của chúng ta sẽ in giá trị của tham số Message khi nó dừng lại.
1 | |
Trong ảnh chụp màn hình dưới đây, chúng ta khởi chạy và dừng một phiên bản cBot của mình để minh họa cách hoạt động của tất cả.

Sử dụng phương thức OnException()
Phương thức OnException() cung cấp khả năng chịu lỗi bằng cách bắt các ngoại lệ không được xử lý, cho phép bạn quyết định cách xử lý chúng. Nó không được bao gồm trong mẫu mã mặc định nên chúng ta sẽ tự thêm nó bằng cách sử dụng đoạn mã sau.
1 2 3 4 | |
Để kích hoạt phương thức OnException(), chúng ta sẽ viết một số mã để bắt một ngoại lệ xảy ra khi chúng ta cố gắng truy cập thông tin về một giao dịch không còn tồn tại. Chúng ta sẽ thêm mã dưới đây vào phương thức OnStart() của mình.
1 | |
Mã chúng ta đã viết trong phương thức OnStart() sẽ thực hiện một lệnh thị trường với các tham số có thể cấu hình sau.
- Loại giao dịch sẽ là lệnh mua.
- Giao dịch sẽ được thực hiện cho ký hiệu hiện tại của biểu đồ mà cBot được gắn vào.
- Khối lượng lệnh sẽ là 1.000 đơn vị.
- Nhãn duy nhất gắn với lệnh sẽ là "my label".
Chúng ta cũng sẽ thêm mã sau vào phương thức OnTick().
1 2 3 | |
Mã chúng ta đã viết trong phương thức OnTick() sẽ tìm vị thế đã được mở trong phương thức OnStart() bằng cách sử dụng tên nhãn "my label".
Nếu tìm thấy vị thế có cùng nhãn, nó sẽ in ID vị thế của giao dịch mở vào nhật ký. Nó cũng sẽ in một thông báo khác có tên "Message below" như dòng mã tiếp theo được thực thi.
Khi cBot của chúng ta được khởi chạy và phương thức OnTick() được gọi và tìm thấy lệnh, cBot sẽ in ID lệnh vào nhật ký và sau ID lệnh, nó sẽ in thông báo "Message below".

Như bạn có thể thấy, không có ngoại lệ nào phát sinh và cBot của chúng ta thực hiện công việc của nó một cách hoàn hảo.
Tuy nhiên, bây giờ chúng ta sẽ đóng thủ công vị thế được mở bởi cBot và thực hiện những thay đổi nhỏ trong mã để đảm bảo một ngoại lệ sẽ xảy ra. Trong phương thức OnStart(), chúng ta sẽ thay đổi nhãn lệnh thành "cTrader". Trong phương thức OnTick(), chúng ta sẽ chú thích điều kiện kiểm tra xem có tồn tại vị thế với nhãn "my label" hay không.
Đây là mã cuối cùng của cBot của chúng ta - lưu ý rằng mã này sẽ luôn kích hoạt một ngoại lệ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
Chúng ta sẽ chạy cBot một lần nữa và xem điều gì xảy ra.

Điều đã xảy ra là một lệnh thị trường mới đã được tạo khi cBot bắt đầu. Nhãn gắn với lệnh này là "cTrader". Trong phương thức OnTick(), mã cố gắng lấy một vị thế với nhãn "my label" và vì chúng ta đã chú thích dòng mã có điều kiện. Sau đó, nó cố gắng in ID vị thế vào nhật ký.
Điều này gây ra một lỗi ngoại lệ mà thông thường sẽ dừng cBot trong các phiên bản trước của cTrader, nhưng với phương thức OnException() mới, chúng ta giờ đây có thể bắt và xử lý lỗi này. cBot sẽ tiếp tục chạy và chúng ta có thể ghi lại lỗi để có thể sửa nó.
Tổng quan
Vòng đời của cBot bao gồm một số sự kiện chính mà bạn có thể xử lý thông qua các phương thức OnStart(), OnTick(), OnStop(), OnBar() và OnException(). Bằng cách tùy chỉnh cách cBot của bạn phản ứng với các sự kiện chính, bạn có thể đảm bảo rằng các thuật toán của bạn hoạt động chính xác như mong đợi.