| Logic Chuyển Trạng Thái Chi Tiết FSM

Được viết bởi thanhdt vào ngày 03/02/2026 lúc 19:25 | 42 lượt xem

Hướng dẫn Code FSM cho Bot Trading (Phần 2): Logic Chuyển Trạng Thái Chi Tiết

Trong Phần 1, chúng ta đã bàn về kiến trúc tổng quan của FSM (Finite State Machine) cho Bot Trading. Ở phần này, chúng ta sẽ đi sâu vào việc triển khai code (Implementation). Làm sao để chuyển từ ý tưởng sơ đồ sang những dòng code chạy thực tế?

1. Cấu trúc dữ liệu cho Step

Trước khi viết logic chuyển trạng thái, ta cần định nghĩa một Step quản lý những gì.

python
class Step:
def __init__(self, step_id, entry_price, volume):
self.id = step_id
self.state = "INIT" # Trạng thái ban đầu
self.buy_order = None # Lưu ticket/ID lệnh Buy
self.sell_order = None # Lưu ticket/ID lệnh Sell
self.entry_price = entry_price
self.volume = volume
self.tp_gap = 100 # Ví dụ: 100 point

2. Logic Chuyển Trạng Thái (State Transition Logic)

Trái tim của FSM nằm ở hàm on_tick() hoặc update(), nơi bot kiểm tra điều kiện thị trường để quyết định xem có chuyển trạng thái hay không.

Sơ đồ Logic:

  • INIT -> HEDGED: Khi đặt đủ 2 lệnh Buy & Sell.
  • HEDGED -> TP_BUY: Khi Giá Hiện Tại >= Giá Entry + TP.
  • HEDGED -> TP_SELL: Khi Giá Hiện Tại <= Giá Entry - TP.
  • TP_BUY -> REBALANCE: Ngay sau khi lệnh Buy đóng, ta cần bù lệnh.
  • REBALANCE -> HEDGED: Khi đã bù đủ lệnh, step quay lại trạng thái cân bằng an toàn.

Code minh họa (Pseudo-code/Python)

“`python
def update_step(step, current_price):

# 1. Xử lý trạng thái INIT
if step.state == "INIT":
    if not step.buy_order and not step.sell_order:
        step.buy_order = place_order("BUY", step.volume)
        step.sell_order = place_order("SELL", step.volume)

    if step.buy_order and step.sell_order:
        step.state = "HEDGED"
        print(f"Step {step.id} -> HEDGED")

# 2. Xử lý trạng thái HEDGED (Quan trọng nhất)
elif step.state == "HEDGED":
    # Kiểm tra TP Buy
    if current_price >= step.entry_price + step.tp_gap:
        close_order(step.buy_order)
        step.buy_order = None
        step.state = "TP_BUY"
        print(f"Step {step.id} -> TP_BUY")

    # Kiểm tra TP Sell
    elif current_price <= step.entry_price - step.tp_gap:
        close_order(step.sell_order)
        step.sell_order = None
        step.state = "TP_SELL"
        print(f"Step {step.id} -> TP_SELL")

# 3. Xử lý trạng thái sau khi đã chốt lời (TP_BUY / TP_SELL)
elif step.state == "TP_BUY":
    # Logic: Lúc này chỉ còn Sell đang gồng lỗ.
    # Ta cần chờ hoặc Rebalance ngay lập tức tùy thuật toán.
    # Ở đây giả sử Rebalance ngay:
    step.state = "REBALANCE"

elif step.state == "TP_SELL":
    step.state = "REBALANCE"

# 4. Xử lý Rebalance
elif step.state == "REBALANCE":
    if not step.buy_order:
         # Bù lệnh Bye (thường là lệnh Pending hoặc Market giá mới)
         step.buy_order = place_order("BUY", step.volume)

    if not step.sell_order:
         step.sell_order = place_order("SELL", step.volume)

    # Nếu đã đủ cả 2 lệnh
    if step.buy_order and step.sell_order:
        step.state = "HEDGED"
        print(f"Step {step.id} Rebalanced -> HEDGED")

“`

3. Xử lý sự cố (Edge Cases)

Thực tế khốc liệt hơn lý thuyết. Bot viết bằng FSM phải xử lý được các tình huống sau:

  1. Mất kết nối / Khởi động lại Bot:
    • Do FSM lưu trạng thái trong bộ nhớ (RAM), nếu tắt bot, trạng thái sẽ mất.
    • Giải pháp: Cần lưu trạng thái vào File hoặc Database (hoặc comment của lệnh trên sàn). Khi bot bật lại, nó phải đọc lại lịch sử để khôi phục trạng thái step.state.
  2. Lệnh bị từ chối (Rejection):
    • Khi gửi lệnh Buy ở trạng thái INIT nhưng sàn báo lỗi (hết tiền, thị trường đóng cửa).
    • Giải pháp: Ở trạng thái INIT hoặc REBALANCE, bot phải retry (thử lại) sau vài giây chứ không được crash.
  3. Trượt giá (Slippage):
    • Lệnh TP có thể không khớp đúng giá Entry + TP.
    • Giải pháp: Logic TP nên dùng dấu >= thay vì ==.

Kết luận

Việc chia nhỏ logic thành từng khối if-else dựa trên state giúp code cực kỳ dễ debug. Nếu bot hoạt động sai ở bước chốt lời, bạn chỉ cần nhìn vào block elif step.state == "HEDGED" để sửa, không sợ ảnh hưởng đến logic vào lệnh ban đầu.

Ở phần sau, chúng ta sẽ bàn về Quản lý vốn nâng cao khi kết hợp nhiều Step FSM lại với nhau.