开源 · 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。