第二階段:核心組件深度解讀
模組 06:緩存系統 — 高速記憶體所有組件共享的「中央白板」— 查詢速度是納秒級的
緩存 (Cache) 是系統的共享記憶體。所有訂單狀態、持倉、帳戶信息、市場數據快照都集中存放在這裡,讓任何組件都能以極快的速度讀取。
一、緩存的角色定位
flowchart LR
subgraph writers["✍️ 寫入者組件"]
direction TB
de["📊 DataEngine"]
ee["⚙️ ExecutionEngine"]
adapter["🔌 適配器"]
end
cache["💾 Cache<br/>中央緩存記憶體"]
subgraph readers["👁️ 讀取者組件"]
direction TB
strategy["🎯 你的策略"]
risk["🛡️ RiskEngine"]
portfolio["💰 Portfolio"]
end
writers ==> cache ==> readers
style cache fill:#0f1419,stroke:#4fc3f7,stroke-width:2px
圖 1:緩存是「寫入者」和「讀取者」之間的橋樑
💡 類比理解
想像一個交易室的大白板:行情部門在上面寫最新報價,交易台在上面記錄訂單狀態,風控部門隨時看板確認風險數據。每個人都能看到所有信息,但只有負責的人能修改自己的區域。
二、緩存中存了什麼?
| 類別 | 存儲內容 | 誰寫入 | 典型查詢場景 |
|---|---|---|---|
| 金融工具 | 所有已知金融工具的完整定義 | 適配器 | 策略查詢 tick_size、lot_size |
| 帳戶 | 帳戶餘額、保證金 | ExecutionEngine | 風控計算可用資金 |
| 訂單 | 所有訂單的當前狀態 | ExecutionEngine | 策略查詢未完成訂單 |
| 持倉 | 所有開倉持倉 | ExecutionEngine | 策略查詢當前持倉方向和數量 |
| 市場數據 | 最新報價、K 線、訂單簿 | DataEngine | 策略獲取最新價格 |
| 自定義數據 | 策略私有的鍵值對 | 策略自己 | 跨函數共享計算結果 |
三、策略中的查詢 API
以下是你在策略開發中最常用的緩存查詢方法:
3.1 金融工具查詢
# 獲取金融工具定義
instrument = self.cache.instrument(instrument_id)
# 獲取所有已知金融工具
all_instruments = self.cache.instruments()
# 獲取特定交易所的所有金融工具
binance_instruments = self.cache.instruments(venue=BINANCE)3.2 訂單和持倉查詢
# 查詢所有未完成訂單
open_orders = self.cache.orders_open()
# 查詢特定品種的未完成訂單
btc_orders = self.cache.orders_open(instrument_id=btc_usdt_id)
# 查詢當前持倉
positions = self.cache.positions_open()
# 查詢特定品種的持倉
btc_position = self.cache.positions_open(instrument_id=btc_usdt_id)
# 快速判斷是否有持倉
is_flat = self.cache.is_flat(instrument_id=btc_usdt_id)3.3 市場數據查詢
# 最新報價
quote = self.cache.quote_tick(instrument_id)
# 最新成交
trade = self.cache.trade_tick(instrument_id)
# 最新 K 線
bar = self.cache.bar(bar_type)
# 獲取最近 N 根 K 線
bars = self.cache.bars(bar_type, count=100)
# 獲取訂單簿
book = self.cache.order_book(instrument_id)3.4 帳戶查詢
# 獲取帳戶
account = self.cache.account(account_id)
# 獲取帳戶餘額
balances = account.balances()
# 獲取可用資金(扣除保證金後)
free_balance = account.balance_free(Currency.from_str("USDT"))四、緩存後端
緩存預設使用記憶體存儲(最快),但可以配置 Redis 後端實現持久化:
🧠
記憶體後端(預設)
• 速度最快(納秒級讀取)
• 系統關閉後數據消失
• 適合回測和沙箱
• 零外部依賴
🔴
Redis 後端(可選)
• 速度很快(微秒級)
• 系統崩潰後數據不丟失
• 適合實盤生產環境
• 支持跨進程共享
# 配置 Redis 緩存後端
from nautilus_trader.cache.config import CacheConfig
config = CacheConfig(
database=CacheDatabaseConfig(
type="redis",
host="localhost",
port=6379,
),
flush_on_start=False, # 啟動時不清除舊數據(用於崩潰恢復)
)五、快照與恢復
sequenceDiagram
participant Cache as 💾 Cache
participant Redis as 🔴 Redis
Note over Cache,Redis: 正常運行中
Cache->>Redis: 定期寫入訂單狀態
Cache->>Redis: 定期寫入持倉數據
Cache->>Redis: 定期寫入帳戶餘額
Note over Cache: 💥 系統崩潰
Note over Cache,Redis: 重新啟動
Redis->>Cache: 恢復所有訂單狀態
Redis->>Cache: 恢復所有持倉
Redis->>Cache: 恢復帳戶餘額
Note over Cache: ✅ 狀態完全恢復
圖 2:透過 Redis 實現崩潰後的狀態恢復
六、互動練習
🧠 練習:策略中的緩存查詢
假設你正在寫一個策略,需要完成以下任務。寫出你會使用的緩存查詢方法:
- 檢查 BTC-USDT 是否有未平倉訂單
- 獲取 BTC-USDT 的最新報價(用於計算進場價)
- 查詢 BTC-USDT 的合約規格(最小下單量)
- 確認帳戶是否有足夠的 USDT 餘額
open_orders = self.cache.orders_open(instrument_id=btc_usdt_id) has_open = len(open_orders) > 0quote = self.cache.quote_tick(btc_usdt_id) best_ask = quote.ask_price # 最佳賣價(你買入的價格)instrument = self.cache.instrument(btc_usdt_id) min_qty = instrument.min_quantityaccount = self.cache.account(account_id) free = account.balance_free(Currency.from_str("USDT")) has_enough = free >= required_amount
七、本模組重點回顧
📋 你應該記住的關鍵點
- 緩存 = 共享白板:所有組件透過它共享金融工具、訂單、持倉、帳戶、市場數據
- 引擎寫入,策略讀取:分工明確
- 記憶體預設,Redis 可選:速度和持久化的取捨
- 崩潰恢復:Redis 後端確保系統重啟後狀態不丟失
- 查詢 API 豐富:掌握 orders_open、positions_open、quote_tick 等常用方法