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

模組 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 實現崩潰後的狀態恢復

六、互動練習

🧠 練習:策略中的緩存查詢

假設你正在寫一個策略,需要完成以下任務。寫出你會使用的緩存查詢方法:

  1. 檢查 BTC-USDT 是否有未平倉訂單
  2. 獲取 BTC-USDT 的最新報價(用於計算進場價)
  3. 查詢 BTC-USDT 的合約規格(最小下單量)
  4. 確認帳戶是否有足夠的 USDT 餘額
  1. open_orders = self.cache.orders_open(instrument_id=btc_usdt_id)
    has_open = len(open_orders) > 0
  2. quote = self.cache.quote_tick(btc_usdt_id)
    best_ask = quote.ask_price  # 最佳賣價(你買入的價格)
  3. instrument = self.cache.instrument(btc_usdt_id)
    min_qty = instrument.min_quantity
  4. account = self.cache.account(account_id)
    free = account.balance_free(Currency.from_str("USDT"))
    has_enough = free >= required_amount

七、本模組重點回顧

📋 你應該記住的關鍵點
  1. 緩存 = 共享白板:所有組件透過它共享金融工具、訂單、持倉、帳戶、市場數據
  2. 引擎寫入,策略讀取:分工明確
  3. 記憶體預設,Redis 可選:速度和持久化的取捨
  4. 崩潰恢復:Redis 後端確保系統重啟後狀態不丟失
  5. 查詢 API 豐富:掌握 orders_open、positions_open、quote_tick 等常用方法