Community图像github.com

trader-broker

订单执行器。将已批准的订单发送至你的券商,默认使用模拟交易,未经你明确确认绝不执行。每笔订单均以简洁的凭单形式展示(包含止损、止盈及止损最大损失),同时显示发送给 Alpaca place_stock_order 的确切 JSON,逐字记录你的同意,并通过 Claude 自己的“允许一次/拒绝”卡片再次确认。

trader-broker 是什么?

trader-broker 是 trader 技能包中最严格的组件,负责将经 trader-risk 规则验证通过的订单实际发送至券商。它实现了三重安全闸门:1) trader-risk 当日通过了该笔精确订单;2) 用户在聊天中逐字输出了明确的“是”;3) 用户在 Claude 自己的“允许一次”权限卡上点击确认。该技能支持 Alpaca(通过官方 MCP 服务器,默认模拟交易,密钥仅通过环境变量配置)和 Interactive Brokers(通过验证连接器)。此外还包含完整的交易生命周期管理:通过 ticke.py 工具展示待执行订单、记录成交明细、生成平仓凭单并追踪每笔交易的最大损失,以配合 trader-risk 执行日交易限额。密钥永远不会出现在聊天中,订单工具必须设置为“需要批准”,且绝不允许自动执行订单。

兼容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/arv-fazriansyah/antigrafity-trading-skill/tree/HEAD/skills/trader-broker

Installed? Explore more 图像 skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

trader-broker 是做什么的?

订单执行器是本包中唯一可能导致真实订单的技能,因此也是最严格的。一笔订单只有在通过了三重独立关卡后才能到达市场,每次、每笔订单均需如此:

  1. trader-risk 已于当日通过了此笔精确订单(通过指纹匹配)。
  2. 用户在聊天中为此笔订单明确输入了同意指令。
  3. 用户在 Claude 自己的权限卡上点击了“允许一次”,该卡因订单工具设置为“需要批准”而出现。

用户给出两次确认,规则给出一次通过。没有确认,就没有订单。

${CLAUDE_SKILL_DIR} 指的是本技能所在的文件夹(即此 SKILL.md 所在的位置)。

python3 "${CLAUDE_SKILL_DIR}/ticket.py" show                     # 显示所有凭单,READY 或未就绪
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

ticket.py 从不直接与券商通信。它负责渲染凭单、检查用户的回复是否为针对该笔订单的真实同意、构建平仓凭单,并将日志保存在 trader/state/broker.json 中。使用 --now "2026-10-19 10:15" 可以锁定时钟时间(纽约时间)。

读取与写入的内容

文件说明
trader/orders.json提议的订单(由 trader-budget 写入;flatten 会替换它)
trader/state/risk.jsontrader-risk 的裁决结果;只有当日通过的 PASS 状态才会被标记为 READY
trader/state/broker.json所有“是”、“否”、已下达、失败和已成交的记录,包含每笔条目的最大损失
trader/portfolio.json现金及持股数量,由 fill 和 result --filled-qty 更新
trader/plan.jsonflatten 所需的平仓截止时间

方案 A:Alpaca(官方 MCP 服务器,Claude Desktop)

Alpaca 官方服务器位于 github.com/alpacahq/alpaca-mcp-server(MIT 协议)。它运行在用户计算机上的 Claude Desktop 内部,不在 Claude 的连接器目录中。默认情况下,它使用模拟账户进行交易,除非另有配置。已针对其源代码(版本 2.4.0,2026-10-20 版本)进行核查。

  1. 用户需注册 Alpaca 账户,并在 Alpaca 仪表盘中创建模拟交易 API 密钥。模拟密钥与实盘密钥是分开的。
  2. 用户安装 uv(它提供 uvx),安装方式参考 docs.astral.sh/uv。
  3. 在 Claude Desktop 中:设置 > 开发者 > 编辑配置。这将打开 claude_desktop_config.json(macOS:~/Library/Application Support/Claude/,Windows:%APPDATA%\Claude\)。用户需添加以下代码块(此处的 claude_desktop_config.example.json 中也包含),并将其自己的密钥输入文件中:
{
  "mcpServers": {
    "alpaca": {
      "command": "uvx",
      "args": ["alpaca-mcp-server"],
      "env": {
        "ALPACA_API_KEY": "在此文件中粘贴你的模拟密钥",
        "ALPACA_SECRET_KEY": "在此文件中粘贴你的模拟密钥",
        "ALPACA_PAPER_TRADE": "true",
        "ALPACA_TOOLSETS": "account,trading,stock-data"
      }
    }
  }
}

env 块将密钥作为环境变量传递给服务器。密钥绝不能出现在聊天中。 切勿索要密钥、切勿将该文件内容读回对话中。如果用户不小心粘贴了密钥,请告知他们删除该消息并在 Alpaca 仪表盘中重新生成密钥。ALPACA_PAPER_TRADE 默认已为 true;将其写入配置使其可见。ALPACA_TOOLSETS 为可选设置,用于隐藏用户不需要的工具。 4. 重启 Claude Desktop。 5. 设置工具权限。 路径:自定义 > 连接器(旧版本为设置 > 连接器),打开 alpaca,为每个工具选择“始终允许”、“需要批准”或“阻止”:

  • place_stock_order:需要批准。切勿设置为“始终允许”。
  • 其他所有用于下达、修改、取消或平仓的工具(cancel_order_by_id、replace_order_by_id、close_position、update_account_config):需要批准。
  • place_option_order、place_crypto_order、close_all_positions、cancel_all_orders、exercise_options_position、do_not_exercise_options_position:阻止,除非用户有明确理由并主动提及。
  • 只读工具(get_account_info、get_all_positions、get_open_position、get_orders、get_clock、get_stock_snapshot、get_stock_latest_quote):设置为“始终允许”没问题。
  1. 检查:让 Claude 获取 Alpaca 账户信息(只读),并在 Alpaca 仪表盘中确认是模拟账户。

如果在 Claude Code(而非 Claude Desktop)中使用,需将订单工具设置为 ask 模式,位于 .claude/settings.json 中:"permissions": {"ask": ["mcp__alpaca__place_stock_order"]},并且绝不要将任何订单工具放入 allow 列表中。

Alpaca 上的括号订单。 place_stock_order 接受 take_profit_limit_price 和 stop_loss_stop_price(以及可选的 stop_loss_limit_price)。当存在这些参数时,服务器会自动将 order_class 设置为 "bracket";trader-budget 仍会显式写入该参数,以便凭单显示。括号订单仅支持整股,time_in_force 为 day 或 gtc。当主单成交后,止损单和止盈单会作为两个相互抵消的订单留在券商处。它们也是当日有效订单,因此会在收盘时失效:这是另一个必须在收盘前平仓的理由。

方案 B:Interactive Brokers(位于 Claude 目录中的连接器)

Interactive Brokers 发布了一个经过验证的连接器:claude.ai/directory/interactive-brokers(连接器 URL 为 https://api.ibkr.com/v1/api/mcp)。用户可通过路径:自定义 > 连接器 > 浏览连接器添加该连接器,并在此处(而非聊天中)登录 IBKR 账户。其说明指出,Claude 可以起草交易指令,这些指令会被发送到用户的 IBKR 账户供其审核和批准,Claude 从不直接向市场提交订单。因此,使用 IBKR 时,最终的确认操作也是在 IBKR 内部完成的。在 trader/config.json 中设置 "broker": "ibkr"。同时将其用于起草订单的工具也设置为“需要批准”。

步骤:开仓

  1. 执行 ticket.py show。只有状态为 READY 的凭单才会展示给用户。状态不是 READY 或 BLOCKED 的凭单会被退回给 /trader-risk。
  2. 展示一笔凭单并询问:“是否下达此订单?请回复 yes 或 no。”每次只询问一笔订单。切勿提供“全部同意”的选项。
  3. 执行 ticket.py approve --index N --reply "<用户的回复,逐字复制>"。如果输出“Not recorded”,则表示用户的回复并非针对此订单的明确同意(例如“sure”、“yes to all”,或者回复中提到了不同的股票或数量)。请重新询问。切勿自行将用户的回复转为同意。
  4. 仅在输出“Recorded your yes”之后,才能调用 place_stock_order,并使用凭单打印的精确 JSON。Claude 的权限卡将出现:允许一次或拒绝。
  5. 记录结果:执行 ticket.py result --index N --status placed --broker-id <id> --filled-qty Q --filled-price P(成交数据来自响应或 get_open_position),或者 --status denied,或者 --status failed 并附上 --note。失败的订单未经新的检查和新的同意不得重试。日志会记录该笔开仓的最大损失,供 trader-risk 计算日交易限额使用。

步骤:持仓期间及收盘前平仓

  • trader-alerts 监控止损位、目标位和平仓截止时间(alerts.py add --from-plan)。括号订单自带的止损止盈单会自行执行。
  • 当止损或止盈单成交时,记录它:执行 ticket.py fill --symbol TSLA --side sell --qty 8 --price 358.32。
  • 在 flat_by 时间(纽约时间 15:55)之前,任何仍持有的仓位都会被平仓:
    1. 向 Alpaca 查询持有的股份数量:执行 get_open_position(只读)。
    2. 执行 ticket.py flatten --symbol TSLA --qty 8,将市价卖出凭单写入 trader/orders.json。
    3. 执行 /trader-risk。仅用于平掉用户持仓的卖出操作,不会被日交易限额或开仓时间窗口阻止。
    4. 执行 ticket.py show,然后用户对该笔订单做出同意(如上述流程)。
    5. 括号订单的止损和止盈单仍在锁定这些股份,因此 Alpaca 会拒绝新的卖出指令,直到它们被取消:执行 get_orders(状态为 open,nested 为 true)查看这些订单;对每个订单执行 cancel_order_by_id(需要批准)。然后使用凭单调用 place_stock_order,最后执行 result。

示例:完整流程

ORDER 1 of 1, PAPER account, Alpaca
  BUY 8 TSLA, market, good for today
  stop-loss 358.32
  take-profit 370.04
  max loss about $46.88 if the stop fills at 358.32 (it can fill worse in a fast market)
  why: opening-range breakout on TSLA: 8 shares, bound by your $50 max loss per trade (8 x 5.86 = $46.88 at the stop)
  READY: trader-risk PASS, waiting for your yes
  Claude will call place_stock_order with exactly:
    {"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 和两个按钮:允许一次、拒绝。点击“允许一次”将订单发送至模拟账户。why 字段和计划信息仅保留在文件中,不会发送出去。

禁止事项

  • 未经全部三重关卡,绝不下达订单;绝不允许一次确认执行多笔订单。
  • 绝不通过定时任务或后台任务下达订单:因为没有人能在那时进行确认。
  • 绝不索要、读取、存储或重复 API 密钥或密码。
  • 绝不自行切换 ALPACA_PAPER_TRADE 或 "paper" 为实盘模式。该操作需由用户自己完成。
  • 绝不自行调用 close_all_positions、cancel_all_orders、期权或加密货币订单工具。
  • 绝不承诺成交价格:市价单和止损单的成交价以市场实际价格为准。

安全说明

  • 提供的是教育工具和辅助工具,不构成财务建议。PASS 状态仅是规则检查结果,而非推荐建议。
  • 默认使用模拟交易("paper": true)。切换至实盘是用户自己的决定,需在用户自己的配置中完成。
  • 本包中没有任何组件会下达订单,除了 trader-broker,且仅当以下三个条件同时满足时才能执行:trader-risk 已于当日通过了该笔精确订单,用户在聊天中为该笔订单输入了明确的同意,且用户在 Claude 自己的权限卡上点击了“允许一次”(因为订单工具已设置为“需要批准”——路径:自定义 > 连接器 > 工具权限)。切勿将任何订单工具设置为“始终允许”。
  • 除非配置允许且用户确认,否则不涉及期权、保证金、卖空或杠杆交易。
  • 券商密钥仅存在于环境变量或 Claude Desktop 配置中,绝不出现于聊天中。

相关技能