第二階段:核心組件深度解讀

模組 08:執行引擎 — 訂單的一生從你下達指令到收到成交回報的完整旅程

一、執行引擎的角色

執行引擎是訂單管理的中央控制塔。它不直接和交易所通訊,而是透過 ExecutionClient 適配器來操作。

flowchart LR
                        subgraph input["📝 命令輸入"]
                        direction TB
                        submit["SubmitOrder"]
                        cancel["CancelOrder"]
                        modify["ModifyOrder"]
                        end

                        ee["⚙️ ExecutionEngine<br/>執行引擎中心"]

                        subgraph output["⚡ 事件輸出"]
                        direction TB
                        accepted["OrderAccepted"]
                        filled["OrderFilled"]
                        rejected["OrderRejected"]
                        end

                        subgraph adapt["🔌 適配器與交易所"]
                        direction TB
                        binance["Binance Client"]
                        ib["IB Client"]
                        sim["Simulator"]
                        end

                        input ==> ee
                        ee ==> adapt
                        adapt ==> ee
                        ee ==> output

                        style ee fill:#0f1419,stroke:#4fc3f7,stroke-width:2px
                        style input fill:#0f1419,stroke:#ab47bc,stroke-width:1px
                        style output fill:#0f1419,stroke:#ef5350,stroke-width:1px
圖 1:執行引擎接收命令、路由到交易所、回報事件

二、訂單的完整生命週期

sequenceDiagram
                        participant S as 🎯 策略
                        participant RE as 🛡️ RiskEngine
                        participant EE as ⚙️ ExecutionEngine
                        participant EC as 🔌 ExecutionClient
                        participant EX as 🏦 交易所
                        participant Cache as 💾 Cache
                        participant Port as 💰 Portfolio

                        S->>RE: SubmitOrder(市價買入 1 BTC)
                        Note over RE: 風控檢查通過 ✅
                        RE->>EE: 轉發命令
                        EE->>EE: 生成 OrderSubmitted 事件
                        EE->>Cache: 更新狀態 → SUBMITTED
                        EE->>EC: 路由到 Binance 適配器
                        EC->>EX: REST API 下單

                        EX-->>EC: 訂單接受確認
                        EC->>EE: OrderAccepted 事件
                        EE->>Cache: 更新狀態 → ACCEPTED

                        EX-->>EC: 成交回報
                        EC->>EE: OrderFilled 事件
                        EE->>Cache: 更新狀態 → FILLED
                        EE->>Port: 更新持倉和盈虧
                        EE->>S: 通知成交(透過 MessageBus)
圖 2:訂單從策略到交易所再回到策略的完整流程

三、訂單命令 API

以下是你在策略中最常使用的訂單操作:

# 市價訂單 — 立即執行
order = self.order_factory.market(
    instrument_id=btc_usdt_id,
    order_side=OrderSide.BUY,
    quantity=Quantity.from_str("0.01"),
)
self.submit_order(order)

# 限價訂單 — 指定價格
order = self.order_factory.limit(
    instrument_id=btc_usdt_id,
    order_side=OrderSide.BUY,
    quantity=Quantity.from_str("0.01"),
    price=Price.from_str("48000.00"),
    time_in_force=TimeInForce.GTC,
)
self.submit_order(order)

# 止損訂單 — 防止虧損擴大
order = self.order_factory.stop_market(
    instrument_id=btc_usdt_id,
    order_side=OrderSide.SELL,
    quantity=Quantity.from_str("0.01"),
    trigger_price=Price.from_str("45000.00"),
)
self.submit_order(order)

# 取消訂單
self.cancel_order(order)

# 修改訂單(改價或改量)
self.modify_order(order, price=Price.from_str("47500.00"))

# 全部取消
self.cancel_all_orders(instrument_id=btc_usdt_id)

四、條件單組合 (Contingency Orders)

NautilusTrader 支援三種訂單組合策略:

🔗

OTO — One Triggers Other

訂單 A 成交後,自動觸發訂單 B。
例子:買入後自動掛止損

⚖️

OCO — One Cancels Other

訂單 A 或 B 任一成交,自動取消另一個。
例子:止盈和止損只觸發一個

🎯

OUO — One Updates Other

訂單 A 部分成交時,自動更新訂單 B 的數量。
例子:保持止損數量和持倉一致

五、模擬交易所 (SimulatedExchange)

在回測和沙箱模式中,ExecutionClient 連接的是模擬交易所而非真實交易所:

特性模擬交易所真實交易所
撮合引擎內建撮合邏輯交易所的撮合引擎
延遲模擬可配置固定延遲真實網絡延遲
手續費按配置計算交易所實際收取
滑點可配置滑點模型真實市場滑點
部分成交基於訂單簿深度模擬真實市場深度

六、互動練習

🧠 練習:設計訂單組合

你想在 50,000 買入 BTC,同時設置止損在 48,000、止盈在 55,000(只觸發一個就取消另一個)。你需要用哪些訂單和什麼組合方式?

步驟:

  1. 掛一個限價買入單 @ 50,000(主訂單)
  2. 設置 OTO 條件:主訂單成交後觸發以下兩個子訂單
  3. 子訂單 A:止損賣出 @ 48,000(StopMarketOrder)
  4. 子訂單 B:止盈賣出 @ 55,000(LimitOrder)
  5. 子訂單 A 和 B 之間設置 OCO:任一成交就取消另一個

💡 這就是經典的「進場 + 止損止盈」三合一訂單組合,也叫 Bracket Order(括號訂單)。

七、本模組重點回顧

📋 關鍵點
  1. 執行引擎管理所有訂單的生命週期,不直接連接交易所
  2. 命令 → 路由 → 事件:策略發送命令,引擎路由到適配器,適配器回報事件
  3. 條件單:OTO(觸發)、OCO(取消)、OUO(更新)三種組合
  4. 模擬交易所:回測中完全模擬真實交易所行為
  5. 訂單工廠:使用 self.order_factory 創建訂單