SuperAPI AI 工具集

trader-broker

办公与效率

查看项目

更新于 10-21 13:45

技能介绍

trader-broker 是 day-trader-skill 技能包中的订单执行器(Order Executor)。它是该技能包中唯一可能导致真实订单的技能,因此规则最为严格。一笔订单每次都必须通过三道独立关卡才能到达市场:第一,trader-risk 当天对这笔确切的订单给出 PASS(按指纹匹配);第二,用户在聊天中针对这一笔订单明确输入 yes;第三,用户在 Claude 自己的权限卡片上点击 Allow once(该卡片出现是因为订单工具被设置为 Needs approval)。也就是说,需要用户两次同意、规则一次 PASS,没有 yes 就不下单。

主要能力与使用方式

trader-broker 通过 ticket.py 脚本工作,该脚本本身从不与券商通信。它负责渲染订单票据、检查回复是否为针对该订单的真实 yes、构建平仓票据,并把日志保存在 trader/state/broker.json。常用命令包括:

python3 "${CLAUDE_SKILL_DIR}/ticket.py" show python3 "${CLAUDE_SKILL_DIR}/ticket.py" approve --index 1 --reply "yes" python3 "${CLAUDE_SKILL_DIR}/ticket.py" result --index 1 --status placed --broker-id ID --filled-qty 8 --filled-price 364.20 python3 "${CLAUDE_SKILL_DIR}/ticket.py" fill --symbol TSLA --side sell --qty 8 --price 370.04 python3 "${CLAUDE_SKILL_DIR}/ticket.py" flatten --symbol TSLA --qty 8 python3 "${CLAUDE_SKILL_DIR}/ticket.py" log

其中 --now "2026-10-19 10:15" 可以固定时钟(纽约时间)。

读写文件

trader-broker 涉及以下文件:trader/orders.json 保存提议的订单(由 trader-budget 写入,flatten 会替换它);trader/state/risk.json 保存 trader-risk 的裁决,只有当天的 PASS 才是 READY;trader/state/broker.json 记录每一次 yes、no、placed、failed 和 filled,以及每条记录的最大亏损;trader/portfolio.json 保存现金和持股,由 fill 和 result --filled-qty 更新;trader/plan.json 保存 flatten 的平仓时间。

接入方式 A:Alpaca(官方 MCP 服务器,Claude Desktop)

Alpaca 自己的服务器是 github.com/alpacahq/alpaca-mcp-server(MIT 许可),运行在用户电脑上的 Claude Desktop 内,不在 Claude 的连接器目录中。除非另有说明,它在模拟账户上交易。用户需要创建 Alpaca 账户并在仪表盘创建模拟交易 API 密钥(模拟密钥与实盘密钥分开),安装 uv(提供 uvx),然后在 Claude Desktop 的 Settings > Developer > Edit Config 中编辑 claude_desktop_config.json,加入包含 ALPACA_API_KEY、ALPACA_SECRET_KEY、ALPACA_PAPER_TRADE、ALPACA_TOOLSETS 的配置块。密钥只放在该文件中,绝不进入聊天。之后重启 Claude Desktop,并在 Customize > Connectors 中设置工具权限:place_stock_order 设为 Needs approval,绝不设为 Always allow;其他会下单、修改、取消或平仓的工具也设为 Needs approval;place_option_order、place_crypto_order、close_all_positions、cancel_all_orders 等除非用户有理由并明确说明,否则设为 Blocked;只读工具可以设为 Always allow。在 Claude Code 中,应把订单工具保留为 ask,绝不放入 allow。

关于 Alpaca 的括号订单(bracket orders):place_stock_order 接受 take_profit_limit_price 和 stop_loss_stop_price(以及可选的 stop_loss_limit_price)。当其中任一存在时,服务器会自动把 order_class 设为 "bracket"。括号订单只支持整数股,time_in_force 为 day 或 gtc。入场成交后,止损和止盈作为两个互相取消的订单留在券商处,它们也是当日订单,因此会在收盘时结束。

接入方式 B:Interactive Brokers(Claude 目录中的连接器)

Interactive Brokers 发布了经过验证的连接器(claude.ai/directory/interactive-brokers,连接器 URL 为 https://api.ibkr.com/v1/api/mcp)。从 Customize > Connectors > Browse connectors 添加,并在 IBKR 处登录,而不是在聊天中登录。其说明称 Claude 可以起草交易指令并发送到用户的 IBKR 账户供其审核和批准,Claude 从不直接向市场提交订单。因此使用 IBKR 时,最终的 yes 也在 IBKR 中完成。需要在 trader/config.json 中设置 "broker": "ibkr",并把起草订单的工具也设为 Needs approval。

下单流程

首先运行 ticket.py show,只有 READY 的票据才会展示给用户;NOT READY 或 BLOCKED 的票据会退回 /trader-risk。然后一次只展示一张票据并询问:"Place this order? Reply yes or no.",一笔订单一个问题,绝不提供 "yes to all"。接着运行 ticket.py approve --index N --reply "<用户回复原文>";如果输出 "Not recorded",说明回复不是针对该订单的明确 yes(例如 "sure"、"yes to all",或 yes 中提到的股票或数量不同),需要重新询问,绝不自行把回复转成 yes。只有在输出 "Recorded your yes" 之后,才用票据打印的确切 JSON 调用 place_stock_order,此时 Claude 的卡片出现,提供 Allow once 或 Deny。最后记录结果:ticket.py result --index N --status placed --broker-id <id> --filled-qty Q --filled-price P,或 --status denied,或 --status failed 并附 --note。失败的订单不会在没有新的检查和新的 yes 的情况下重试。

持仓期间与收盘前平仓

trader-alerts 会监视止损、目标和平仓时间(alerts.py add --from-plan),括号订单自身的订单负责止损。当止损或止盈成交时,用 ticket.py fill 记录。到 flat_by(纽约时间 15:55)时,任何仍开仓的头寸都要平掉:先用 get_open_position(只读)询问 Alpaca 持有多少股,再用 ticket.py flatten --symbol TSLA --qty 8 把市价卖出写入 trader/orders.json,然后走 /trader-risk(仅平掉用户持仓的卖出不会被每日限额或入场窗口阻止),再 ticket.py show,并像上面一样获得用户对该笔订单的 yes。由于括号订单的止损和止盈仍持有这些股票,Alpaca 会拒绝新的卖出,直到它们被取消:用 get_orders(status open, nested true)查看,用 cancel_order_by_id 逐个取消(Needs approval),然后 place_stock_order 下单,再 result。

示例票据

ORDER 1 of 1, PAPER account, Alpaca:BUY 8 TSLA,市价,当日有效;止损 358.32;止盈 370.04;如果止损在 358.32 成交,最大亏损约 $46.88(快速市场中可能成交更差);理由:TSLA 开盘区间突破,8 股,受每笔 $50 最大亏损限制(8 x 5.86 = $46.88 于止损处);READY:trader-risk PASS,等待你的 yes;Claude 将用以下确切 JSON 调用 place_stock_order:{"symbol": "TSLA", "side": "buy", "qty": "8", "type": "market", "time_in_force": "day", "order_class": "bracket", "take_profit_limit_price": "370.04", "stop_loss_stop_price": "358.32"}。用户回复 "yes" 后,Claude 记录并调用 place_stock_order,卡片显示 "Claude wants to use Place stock order" 及该 JSON 和两个按钮:Allow once、Deny。Allow once 会把它发送到模拟账户。理由和计划留在文件中,绝不发送。

限制与安全

trader-broker 绝不在缺少全部三道关卡时下单,绝不用一次 yes 下两笔订单;绝不从定时或后台任务下单(因为没有人能说 yes);绝不索取、读取、存储或重复 API 密钥或密码;绝不把 ALPACA_PAPER_TRADE 或 "paper" 切换为实盘(由用户自己操作);绝不自行调用 close_all_positions、cancel_all_orders、期权或加密货币订单工具;绝不承诺成交价格(市价单和止损单按市场给出的价格成交)。安全方面:这是教育和工具,不是财务建议;PASS 是规则检查,不是推荐。默认模拟交易("paper": true),转实盘是用户自己的决定,在自己的配置中进行。除非配置允许且用户确认,否则不使用期权、保证金、卖空或杠杆。券商密钥存放在环境变量或 Claude Desktop 配置中,绝不进入聊天。