開源 · Go

Canary

盈透證券(Interactive Brokers)的投資組合、風險及訂單工具。

Canary 在你自己的電腦上連接 IBKR 帳戶,讀取你的投資組合及市場數據,每分鐘檢查你的風險規則,並草擬規則要求的保護措施。Claude、你的腳本及已配對的手機應用程式,讀取的都是同一組數字。

MIT 授權 · 已簽署的發行版本 · 無遙測 · 私人項目 · GitHub · 發行說明

虛構帳戶上 canary brief 的輸出:市場狀態、投資組合摘要及需要留意的事項
canary brief,每日早上的概覽。虛構帳戶

適用於 Claude Desktop

向 Claude 查詢你的 IBKR 帳戶。

在 Mac 上把 Canary 加入 Claude Desktop,然後問它你的持倉今日表現如何、哪些風險規則需要留意,或者市場走勢如何。Claude 可以讀取你的帳戶,但不能下達、更改或取消訂單。

需要 IBKR Pro 帳戶,並在 Mac 上運行 IB Gateway 或 TWS(Interactive Brokers 的桌面軟件),且已開啟其 API。

給工程師

以它為基礎,建立你的交易系統。

本機守護程序(daemon)負責維持 IBKR 連線,並保管你的風險政策及訂單日誌。每個 CLI 指令都會傳回 JSON,因此 CLI 就是你的 API。Go 程式可以使用守護程序客戶端,或直接使用 TWS 協定,無需供應商 SDK。

訂單只經一條路徑,這條路徑設於需自行選用的交易版本內,會按你的限額及確認逐一檢查每張訂單。Canary Desk(私人項目)就是這樣建成的。

給 AI 代理

透過具類型定義的工具讀取 IBKR 數據。

先看 llms.txt:Canary 是甚麼、其工具傳回甚麼、限制在哪裏。數字均附來源及時效。Canary 無法確認的內容會報告為缺失,絕不顯示為零。

每個 MCP 工具都是唯讀的:不能預覽或發送訂單,也不能更改限額。安裝詳情見伺服器清單。

你的投資組合,連同證據

持倉、風險敞口,並與券商結單對帳。過時或缺失的數據會保留標示,絕不填補。

投資組合所處的市場環境

市況階段、市場廣度、壓力、日曆及市場事件,各自附來源及時效。

草擬保護措施的規則

規則手冊每分鐘檢查投資組合。規則一旦觸發,Canary 便草擬其要求的止蝕、平倉或削減預算。

限額以內的訂單

需自行選用的交易版本會發送你確認或按規則預先授權的訂單;當你持有的股數減少時,會縮減或取消自己設下的止蝕盤。標準下載版本是唯讀的。

近期版本

v3.19 至 v3.33.1 的變更。

開始使用

安裝 Canary

在同一部電腦上運行 IB Gateway 10.37 或以上版本,或 TWS。你需要具備 TWS API 權限的 IBKR Pro 帳戶;IBKR Lite 不包括此權限。

每個版本都附有已簽署的校驗碼,安裝程式會以固定的金鑰核對。Canary 不發送遙測數據。

Claude Desktop 安裝
命令列、Cursor、Continue、Zed 及其他 MCP 主機
curl -fsSL https://raw.githubusercontent.com/osauer/canary/main/install.sh | sh
canary status    # 連接到哪個 Gateway 及帳戶
canary brief     # 今日需要留意甚麼

# Claude Desktop
canary setup claude-desktop

# Claude Code 外掛程式
/plugin marketplace add osauer/canary
/plugin install canary@canary

# 然後問:
# 「我的 IBKR 帳戶今日狀況如何?」

開始之前

常見問題

Canary 支援哪些券商?

Canary 透過本機 TWS 或 IB Gateway 連線,與 Interactive Brokers 配合使用。市場數據視乎你的 IBKR 訂閱而定。

Canary 可以提交訂單嗎?

可以,透過選用的交易版本及其審批檢查。標準下載版本及所有 MCP 工具都是唯讀的。見訂單指南。

Canary 適用於香港或新加坡的盈透證券帳戶嗎?

適用。無論你的帳戶由哪家 IBKR 公司持有,連接方式都相同;簡報、交易所日曆和貨幣會跟隨你的持倉,持有港股也一樣。見香港及新加坡指南。你所在的地區未必可以使用 Claude:撰寫本文時(2026 年),Anthropic 的支援地區列表並未包括香港、澳門或中國內地。CLI 和已配對的應用程式不需要 Claude;其他 MCP 主機也可以使用同一套工具,但所用的模型同樣要在你的地區有提供。

Canary 需要哪些 TWS 或 IB Gateway 設定?

運行 canary status。其中的 Gateway 設定一行會以淺白文字指出每項與 Canary 所需不同的設定。Canary 在每次連線後讀取設定一次,絕不更改。見故障排除。

以此為基礎開發

以 Canary 為基礎
建立代理。

Canary 為代理提供每個數字及其來源和時效,並讓每張訂單都受你的規則約束。用兩個指令連接 Claude Code,或建立你自己的代理。Canary Desk 就建基於此,並有用於簡報及分析的代理。

MIT 授權;原始碼在 GitHub 上。無需註冊,也沒有遙測。

唯讀邊界

證據

缺失數據
如何顯示。

Canary 無法確認的數字絕不會顯示為正常。來源、時效及覆蓋範圍都在數字旁邊,讓你和你的助手知道可信賴甚麼。

最新
當前讀數,附來源及時間。
延遲
較舊的讀數,清楚標示。
不完整
現有證據及其缺口並列顯示。
無法取得
不會虛構零值。需要此數據的決定會暫緩。
查看命令列畫面持倉及風險規則,以虛構帳戶示範

在命令列上

你每日
閱讀的內容。

每個數字都註明來源及時效。每個指令也可輸出 JSON 供腳本使用。

虛構帳戶上 canary positions 的輸出:持倉連同價值、當日變動及風險敞口
canary positions虛構帳戶
虛構帳戶上 canary rules 的輸出:每條風險規則的讀數、區間及狀態
canary rules虛構帳戶

Canary Edge

交易與維持倉位
不變的比較。

Edge 把每次開倉、加倉、減倉及平倉,與在 1、5 及 20 個交易日內維持倉位不變作比較,數據來自券商紀錄。

它描述過去的交易,不作預測或建議。

檢查你的限額是否合理所有生效中的限額,以及隨帳戶變動的訂單限額 · v3.18

政策檢查

與帳戶相稱
的限額。

Canary 按你設定的數字行事,由規則門檻到訂單大小及現金儲備。它會列出每一個生效中的數字及其來源和含義,並將它們互相對照、與你的帳戶對照。每個不合適的數值都會附上原因,適用時亦會建議修正方法。

訂單限額跟隨帳戶變動。單一訂單價值的上限會隨帳戶價值(即淨清算價值)變動,介乎你設定的最低值與最高值之間。臨時提高上限需要一次覆寫,Canary 會記錄在日誌中。

在交易版本中,只要保護性止蝕盤沽出的數量不超過你持有的股票或 ETF(連同你其他正在生效的沽出訂單計算),該上限及沽空檢查都不會拒絕它。當你持有的股數少於 Canary 自己某個止蝕盤將沽出的數量時,Canary 會自行縮減或取消該止蝕盤。

檢查只作讀取;要更改限額,請編輯你的檔案。你手動設下的止蝕盤絕不會被更改,標準下載版本維持唯讀。

政策檢查如何運作
  1. 01 · 顯示所有生效中的限額

    canary policy show --explain 列出每項限額、政策及設定,連同其數值、單位及來源。加上章節名稱可只輸出其中一部分。

  2. 02 · 檢查哪裏不合理

    canary policy check 將你的設定檔、政策檔案及帳戶互相對照,解釋每個不合理的數值,適用時建議修正方法。

  3. 03 · 詢問給你助手的同一份報告

    canary_policy_check 為 MCP 客戶端提供相同檢查。它只作讀取,不能更改限額。

留意你的名單成交量轉折、指定認購期權的報價及入場時機 · v3.17

觀察名單及形態

觀察名單及
成交量形態。

在一份觀察名單上保留最多 20 隻美股。Canary 將每根已完成的五分鐘 K 線與過往可比較的交易日對比,當異常成交量之後價格守穩或上升時便會報告。

對於你想跟進的形態,它會列出標準認購期權,並讀取你所選認購期權的一個附日期報價。Canary 落單成交後,會在兩個時點以其後報價檢查入場表現。

形態只是觀察,並非經驗證的訊號。成交後價格追蹤(markout)不計佣金,也絕不取代帳戶盈虧。編輯觀察名單只會更改本機偏好設定,而且沒有 MCP 形態工具。

  1. 01 · 觀察屬於你的一份名單

    canary watchlist add NVDA 保存一份可長期保留的名單,最多 20 隻股票。其他一概不變。

  2. 02 · 查看觀察了甚麼

    canary setups coverage 顯示每個交易日已完成的 K 線、評估狀態及缺失數據。

  3. 03 · 檢討入場表現如何

    canary setups markouts 讀取其後的報價,並說明任何檢查點缺失的原因。

研究借貨及沽空持倉附日期的費用、流動性及 FINRA 報告 · v3.17

借貨研究

借貨成本,
連同日期。

比較你指定股票的借貨費用、價格及流動性。篩選 IBKR 的美股借貨數據,找出費用持續高企的股票,並按規模及回補日數排列 FINRA 報告的沽空持倉。

你的助手透過唯讀 MCP 工具讀取相同結果。篩選條件在結果數量限制之前套用,每行都保留來源日期。

借貨費用是借入方的成本,並非出借方的收益率。沽空持倉來自每月兩次的報告,並不追蹤即時持倉。自由流通量百分比無法提供。

  1. 01 · 指定先看你的股票

    canary lending rates 及 canary lending market,針對你列出的代號。

  2. 02 · 篩選投資組合以外

    canary lending screen 找出在多個來源日期都維持高費用的借貨。

  3. 03 · 報告已報告的沽空持倉

    canary short-interest screen,可按僅限上市股票、價格、流動性及回補日數篩選。

規劃剩餘現金跟隨帳戶的儲備,借款期間不買票據 · v3.18

現金調撥

規劃
剩餘現金。

Canary 為你所持貨幣的剩餘現金規劃短期政府票據。它會優先保留承諾款項及現金儲備,才作新買入;儲備跟隨帳戶的淨清算價值及計劃需要而變動。

在任何買入之前,計劃會顯示票據的最低訂單額、費用範圍,以及扣除差價、費用及放棄的現金利息後的估計收益。每次買入都維持在最低與最高金額之間,確保不會小得賺不回佣金。由你選擇哪種貨幣優先。

Canary 制訂計劃,並檢查現金、票據、價格、費用及授權;如你使用 Canary Desk,計劃會在其中顯示。每張訂單都需要你確認,或經明確預先授權、設有限額及否決時限的調撥。

預設關閉。開啟時需要在政策中設定已校準的儲備,以及最新的交收紀錄。票據如在到期前沽出,可能會虧損。

閱讀調撥控制
  1. 01 · 證據哪些現金可用?

    每種貨幣的已交收現金,資料須新近至已反映已確認的交易,並已扣除承諾款項及儲備。只要任何貨幣處於借款狀態,買入票據便會暫緩,因為票據的收益會低於該筆貸款的孖展利息。

  2. 02 · 審查哪一種票據,是否值得?

    同一貨幣的票據及其到期日。券商預覽價格及費用,計劃則顯示相對持有現金的淨收益。

  3. 03 · 授權在你的政策範圍內

    確認訂單,或使用你已授予的限定授權。缺少證據時訂單會暫緩。

了解貨幣影響以結單為據的歸因 · v3.16.0

以結單為據的外匯

貨幣對
盈虧的影響。

外匯貢獻量度貨幣變動對帳戶基礎貨幣盈虧的影響,涵蓋當日、當週、當月及年初至今,數據來自已完成的券商結單。

外匯貢獻貨幣影響其他盈虧價格、收入及費用投資組合變動扣除外部現金流後

自 v3.16 起。canary reporting fx --json 及 canary_reporting_fx 傳回相同結果。缺失的日期保持可見,不完整的期間不顯示總計。這是估值歸因,與已實現的外匯批次盈虧分開。

外匯如何量度
查看借出股票收入附日期的借出及已賺取費用 · v3.16.0

股票借出觀察

股票借出收入,
來自結單。

Canary 從保留的 IBKR 結單讀取受管理的股票借出及客戶淨費用。借出中的持倉帶有附日期的註記,費用紀錄可按需要開啟。

canary lending fees --json 及 canary_lending_fees 傳回相同、設有上限的唯讀紀錄。缺失的部分、不完整的期間,以及收入確實為零的完整紀錄,三者保持區分。

自 v3.16 起。費用與帳戶盈虧分開,因為費用與派付及盈虧的關係尚未確認。帳戶需要有包含借出數據的結單報告,才會顯示內容。

股票借出如何報告
股票借出,連同相關證據 券商結單提供附日期的借出股份紀錄及淨費用帳目。借出收入獨立顯示,不會重複計入券商盈虧。這是報告示意圖,並非帳戶數據。 股票借出 / 券商證據 收入背後的紀錄。 IBKR 結單 報告日期 + 覆蓋範圍 借出股份 附日期的持倉 數量 · 抵押品 · 券商日期 淨費用紀錄 已賺取費用帳目 起息日 · 貨幣 · 帶正負號的淨費用 收入可見,與券商盈虧分開。 僅作報告 參與安排仍由 IBKR 處理 股票借出,連同相關證據 券商結單提供附日期的借出股份紀錄及淨費用帳目。借出收入獨立顯示,不會重複計入券商盈虧。這是報告示意圖,並非帳戶數據。 股票借出 / 券商證據 收入背後 的紀錄。 IBKR 結單 報告日期 + 覆蓋範圍 借出股份 附日期的持倉 數量 · 抵押品 · 券商日期 淨費用紀錄 已賺取費用帳目 起息日 · 貨幣 · 帶正負號的淨費用 收入可見。 與券商盈虧分開。 僅作報告 · 參與安排仍由 IBKR 處理

架構

一個守護程序,
支撐每個介面。

守護程序負責維持券商連線,並保管證據、你的規則及訂單日誌。其他一切都只是轉接層,建基於相同而具類型定義的結果。

它按需要啟動,閒置 15 分鐘後停止。券商回應緩慢時,狀態查詢仍可快速回應;執行 canary stop 後,它會保持停止,直至你重新啟動。

瀏覽全部功能市場環境、報告、規則及整合

全部功能

內容一覽。

市場環境

  • 市況階段將六組共八項讀數歸納為一個階段:VIX 期限結構及 VVIX、市場廣度、信貸息差、資金、日圓,以及由 SPX 期權計算的莊家 Gamma。
  • 市場廣度標普 500 成份股中高於 50 日及 200 日平均線的股票,由成份股價格計算。
  • 壓力訊號市況轉變時的早期警示。
  • 市場事件Reg SHO 門檻名單、Nasdaq 停牌、可借貨量及借貨費用。
  • 借貨研究 · v3.17附日期的借貨費用連同價格及流動性、範圍更廣的美股篩選,以及 FINRA 沽空持倉。
  • 日曆美國股票及期權、Xetra、倫敦、東京、香港、新加坡、澳交所及中國內地,另加官方經濟數據發布。

你的投資組合

  • 持倉及風險敞口股票、期權及債券,附行業配置。債券顯示孳息率、存續期及利率風險。
  • 觀察名單及形態 · v3.17最多 20 隻股票,逐根 K 線檢視成交量轉折,並提供你所選認購期權的附日期報價。
  • 入場後價格追蹤(markout) · v3.17Canary 落單成交後的其後報價。缺失的檢查點保持缺失;佣金及盈虧分開計算。
  • 表現以結單為據的回報序列,已扣除現金流。
  • 外匯貢獻 · v3.16當日、當週、當月及年初至今的貨幣貢獻,與每日結單對帳。
  • 股票借出觀察 · v3.16附日期的借出股份及已賺取的客戶淨費用,紀錄設有上限,覆蓋範圍明確。
  • Edge你的交易成果,與維持倉位不變作比較。
  • 決定評分表 · v3.22每次持倉變動都與大市及其行業基金比較評分;若有保留報價,也列出每次成交所付的半個買賣差價。
  • 期權平倉回放 · v3.28根據歷史回放期權平倉本來會如何發展。並非預測。
  • 對帳數字與券商結單核對。缺口保持可見。

規則及保護

  • 風險規則手冊你的限額,每分鐘檢查一次。
  • 風險預算 · v3.22整個投資組合的虧損預算,以歷史模擬法量度。投資組合超出預算時,增加風險的訂單會暫緩。
  • 減倉計劃 · v3.29每份計劃都比較指數下跌及上升、尚餘虧損空間及按報價計算的交易成本。
  • 保護性認沽期權 · v3.31為你持有的股份而設的認沽期權,按你的 delta 區間挑選,並在尚未受保護的股數內計算數量。
  • 指數對沖 · v3.29以整張合約計算的 Micro E-mini 標普 500 對沖,只經受檢查的交易路徑落單及買回。
  • 券商權限 · v3.29.1IBKR 不允許帳戶交易的產品類別,其開倉訂單會在到達券商前被拒絕。
  • 政策檢查 · v3.18所有生效中的限額及其來源和含義,並檢查及指出每個不合理的數值。
  • 保護提案止蝕、平倉、減倉及削減預算,各附原因。
  • 現金調撥以同一貨幣的票據安排剩餘現金,儲備跟隨帳戶,依你的貨幣次序,每份計劃都附原因。
  • 調撥經濟效益在任何買入之前列出最低及最高訂單額、費用範圍,以及扣除差價、費用及放棄的現金利息後的淨收益。只要有任何貨幣處於借款狀態,便不會買入票據。
  • 交收證據可用現金需要每種貨幣的最新證據。可選用須登入驗證的券商帳目補充 TWS;有缺口時調撥會暫緩。
  • 訂單限額 · v3.18單一訂單價值的上限,跟隨淨清算價值變動,介乎你設定的最低值與最高值之間。
  • 保護性止蝕盤 · v3.18在交易版本中,當你持有的股數少於 Canary 自己的止蝕盤將沽出的數量時,Canary 會縮減或取消這些止蝕盤。你手動設下的止蝕盤絕不會被更改。
  • 交易版本需自行選用的訂單執行,由你確認或按規則預先授權,並經 Canary 檢查。票據及債券可按 ISIN 或 CUSIP 落單。

使用場景

  • 命令列單一執行檔,適用於 macOS 及 Linux。每個指令都可輸出 JSON。
  • AI 助手供 Claude 及其他主機使用的唯讀 MCP 工具。
  • 你的手機已配對的應用程式,提供即時更新及需自行開啟的通知。
  • Go 函式庫以 Go 實作的 TWS 協定,無需供應商 SDK。
使用 Go 函式庫原生協定存取及程式碼範例

Go 函式庫

以 Go 實作的
TWS 協定。

pkg/ibkr 自行處理 TWS 通訊協定,無需供應商 SDK,也不會再分發任何 Interactive Brokers 程式碼。

要從你自己的程式讀取運行中的 Canary,請匯入模組根目錄。canarytest 在臨時 socket 上提供服務,供你測試使用。

Go API 參考
透過 TWS 協定取得帳戶摘要
cfg := ibkr.DefaultConfig()
cfg.Port = 4002 // Gateway, paper account

conn := ibkr.NewConnector(&ibkr.ConnectorConfig{
    PreferredClientID: 17,
    BaseConfig:        cfg,
})
if err := conn.Start(ctx); err != nil {
    return err
}
defer conn.Stop()

summary, err := conn.RequestAccountSummary(ctx, 5*time.Second)
if err != nil {
    return err
}
fmt.Println(summary.AccountID)

說明文件

手冊及參考資料

打開手冊

Canary Desk 是建基於此引擎的私人工作空間。查看 Canary Desk。