模組 13:適配器與擴展如何連接新的交易所、數據源以及擴展系統功能
一、適配器架構
適配器 (Adapter) 是系統與外部世界的橋樑。遵循六角架構(模組 03),核心系統不依賴任何具體的交易所或數據源。
flowchart LR
subgraph core["🔷 NautilusTrader 核心"]
direction TB
de["DataEngine"]
ee["ExecutionEngine"]
end
subgraph ports["📌 端口與適配器"]
direction LR
binance["Binance"]
ib["Interactive Brokers"]
custom["Custom Adapter"]
end
core ==> ports
style core fill:#0f1419,stroke:#4fc3f7,stroke-width:2px
style ports fill:#0f1419,stroke:#ab47bc,stroke-width:1px
二、官方支援的適配器(15 個)
| 適配器 | 類型 | 支援功能 | 備注 |
|---|---|---|---|
| Binance | 加密貨幣 | 現貨 + 期貨,數據 + 執行 | 最成熟的適配器之一 |
| Bybit | 加密貨幣 | 現貨 + 永續合約 | 支援統一帳戶 |
| OKX | 加密貨幣 | 現貨 + 合約 + 期權 | 支援多種帳戶模式 |
| Kraken | 加密貨幣 | 現貨 + 合約 | 歐洲合規交易所 |
| BitMEX | 加密貨幣 | 永續合約 + 期貨 | 永續合約先驅 |
| Deribit | 加密貨幣 | 期權 + 期貨 | 最大的加密期權交易所 |
| dYdX v4 | DeFi | 去中心化永續合約 | 基於 Cosmos 鏈 |
| Hyperliquid | DeFi | 去中心化永續合約 | 高效能 L1 鏈上 DEX |
| Polymarket | 預測市場 | 事件合約交易 | 基於以太坊 |
| Interactive Brokers | 傳統金融 | 股票、期貨、期權、外匯 | 覆蓋最廣的傳統券商 |
| Architect AX | 傳統金融 | 多市場執行 | 機構級多資產執行 |
| Databento | 數據供應 | 美股/期貨歷史+即時數據 | 專業級數據(僅數據) |
| Tardis | 數據供應 | 加密貨幣歷史 Tick 數據 | 覆蓋 30+ 個交易所(僅數據) |
| Betfair | 博彩 | 體育博彩交易 | 獨特的 BettingInstrument |
| Sandbox | 內建 | 模擬交易所 | 用於沙箱模式測試 |
上表中的適配器分三類:
加密貨幣:提供數據
+ 執行,可以直接交易
DeFi /
預測市場:去中心化交易,需要錢包
數據供應 /
其他:僅提供數據或特殊交易類型
三、適配器的內部結構
每個適配器通常包含以下組件:
flowchart LR
subgraph clients["🔌 客戶端實現"]
direction TB
dc["Binance Data Client<br/>WebSocket"]
ec["Binance Exec Client<br/>REST API"]
end
subgraph internal["🧩 內部機制"]
direction TB
config["配置映射"]
parsers["數據解析器"]
end
clients ==> internal
style clients fill:#0f1419,stroke:#4fc3f7,stroke-width:1px
style internal fill:#0f1419,stroke:#ab47bc,stroke-width:1px
四、自定義 Actor 和 組件
除了策略之外,你可以用 Actor 來擴展系統功能:
數據收集器
建立自定義 Actor 從第三方 API(如新聞、社交媒體)收集數據並發布到 MessageBus。
通知服務
建立 Actor 監聽交易事件,在成交或觸發止損時發送 Telegram/Email 通知。
績效監控
建立 Actor 訂閱所有訂單事件,即時計算和展示策略績效。
自定義指標
當內建指標不夠用時,可以繼承 Indicator 基類建立自定義指標。
from nautilus_trader.common.actor import Actor
from nautilus_trader.config import ActorConfig
class AlertActorConfig(ActorConfig, frozen=True):
"""通知 Actor 的配置"""
instrument_id: InstrumentId
price_threshold: float # 觸發通知的價格閾值
class AlertActor(Actor):
"""當價格超過閾值時發送通知"""
def __init__(self, config: AlertActorConfig):
super().__init__(config)
self.instrument_id = config.instrument_id
self.threshold = config.price_threshold
def on_start(self):
self.subscribe_quote_ticks(self.instrument_id)
def on_quote_tick(self, tick):
if tick.ask_price.as_double() > self.threshold:
self.log.warning(f"⚠️ 價格突破 {self.threshold}!")
# 這裡可以加入 Telegram/Email 通知邏輯
五、擴展點一覽
| 擴展點 | 基類 | 用途 |
|---|---|---|
| 交易策略 | Strategy | 實現交易邏輯 |
| 通用組件 | Actor | 不涉及下單的通用邏輯(監控、通知、數據收集) |
| 數據客戶端 | DataClient | 連接新的數據源 |
| 執行客戶端 | ExecutionClient | 連接新的交易所 |
| 技術指標 | Indicator | 自定義技術指標計算 |
| 撮合模型 | FillModel | 自定義回測撮合邏輯 |
六、互動練習
設計一個 Actor,當你的策略的持倉盈虧超過帳戶的 5% 時,發出警告日誌。你需要訂閱什麼數據?讀取什麼緩存?
設計思路:
on_start:self.subscribe_quote_ticks(instrument_id)# 訂閱報價更新
on_quote_tick:unrealized = self.portfolio.unrealized_pnl(instrument_id)account = self.cache.account(account_id)balance = account.balance_total(Currency.from_str("USDT"))pnl_ratio = abs(unrealized / balance)if pnl_ratio > 0.05:
self.log.warning(f"⚠️ 持倉盈虧超過 5%: {pnl_ratio:.1%}")
💡 關鍵點:
- Actor 不能下單,所以它只負責監控和通知
- 如果需要自動平倉,應該在 Strategy 中實現
- 可以加入冷卻期,避免重複報警
以下場景,你會選擇哪個適配器?
- 你想交易美股和期貨
- 你想交易 BTC 永續合約,且費率要低
- 你想用歷史的加密 Tick 數據做回測
- 你想交易 BTC 期權
- Interactive Brokers ← 覆蓋最廣的傳統市場
- Bybit 或 Binance ← 兩者都支援永續合約,費率具競爭力
- Tardis ← 專注加密歷史數據,覆蓋 30+ 交易所
- Deribit ← 最大的加密期權交易所
Tardis (數據) + Deribit (執行) = 用歷史數據回測 + 實盤交易
你想建立一個「VWAP 偏離度」指標:計算當前價格距 VWAP 的百分比偏差。想想你需要繼承哪個基類,實現哪些方法?
設計:
- 繼承
Indicator基類 - 實現
handle_bar(bar)方法 - 內部維護:
cumulative_volume += bar.volumecumulative_value += bar.close * bar.volumevwap = cumulative_value / cumulative_volumeself.value = (bar.close - vwap) / vwap * 100
- 重置方法:
reset()清零累計值
💡 自定義指標很強大:
你可以建立任何指標,然後在策略中像用內建指標一樣使用它
七、本模組重點回顧
- 六角架構使得添加新適配器不需要修改核心代碼
- 15 個官方適配器覆蓋加密貨幣、傳統金融、DeFi、博彩、預測市場、數據供應
- Actor:不涉及下單的通用邏輯組件
- 6 個擴展點:Strategy、Actor、DataClient、ExecutionClient、Indicator、FillModel
- 每個適配器包含配置、數據客戶端、執行客戶端、解析器
你現在對 NautilusTrader 的架構、組件、策略開發和部署有了全面的理解。
下一步建議:
- 從
ema_cross.py範例開始動手實踐 - 用回測系統測試你的第一個策略
- 加入 NautilusTrader 社區,閱讀官方文檔的進階內容