自定义连接器开发

📎 引用文件

本文引用的文件 - agent/src/tools/trading_connector_tool.py - agent/src/trading/service.py - agent/src/trading/profiles.py - agent/src/trading/types.py - agent/src/trading/connectors/alpaca/sdk.py - agent/src/trading/connectors/alpaca/profiles.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考虑
  8. 故障排查指南
  9. 结论
  10. 附录

简介

本文件面向希望在 Vibe-Trading 中从零开始开发“券商连接器”的工程师,系统阐述连接器的框架、接口规范、数据转换、认证流程、错误处理模式、测试策略、性能优化与部署方式,并重点说明如何保持可维护性与可扩展性。文档以实际代码为依据,通过类图、时序图和流程图展示关键路径,帮助读者快速上手并安全地扩展新的券商接入能力。

项目结构

Vibe-Trading 的交易层采用“工具层 → 服务路由层 → 连接器模块”的分层设计: - 工具层:暴露给 CLI/MCP/Agent 的统一交易工具(如查询账户、下单、取消订单等)。 - 服务路由层:根据配置文件的 profile 选择具体 transport(local_tws / broker_sdk / remote_mcp),并调用对应实现。 - 连接器模块:每个券商一个独立模块,提供统一的读/写接口(build_config、check_status、get_account_snapshot、get_positions、get_open_orders、get_quote、get_historical_bars、place_order、cancel_order 等)。

graph TB Tools["交易工具<br/>trading_connector_tool.py"] --> Service["交易服务路由<br/>service.py"] Service --> Profiles["配置文件与Profile注册<br/>profiles.py"] Service --> SDK["broker_sdk 连接器模块<br/>alpaca/sdk.py 等"] Profiles --> Types["统一类型定义<br/>types.py"] Service --> IBKR["IBKR local_tws 专用路径<br/>ibkr.local"]

图表来源 - agent/src/tools/trading_connector_tool.py:139-174 - agent/src/trading/service.py:17-65 - agent/src/trading/profiles.py:27-41 - agent/src/trading/types.py:8-17

章节来源 - agent/src/tools/trading_connector_tool.py:139-174 - agent/src/trading/service.py:17-65 - agent/src/trading/profiles.py:27-41 - agent/src/trading/types.py:8-17

核心组件

章节来源 - agent/src/tools/trading_connector_tool.py:208-504 - agent/src/trading/service.py:42-117 - agent/src/trading/profiles.py:44-100 - agent/src/trading/connectors/alpaca/sdk.py:261-426

架构总览

下图展示了从工具调用到具体券商实现的完整链路,包括 live 环境的风控门控与审计。

sequenceDiagram participant U as "用户/Agent" participant T as "交易工具<br/>trading_connector_tool.py" participant S as "服务路由<br/>service.py" participant P as "Profile注册<br/>profiles.py" participant M as "连接器模块<br/>alpaca/sdk.py" participant G as "Live风控门控<br/>sdk_order_gate" participant A as "审计记录<br/>audit" U->>T : 调用 trading_place_order(...) T->>S : place_order(symbol, side, quantity/notional, ...) S->>P : profile_by_id() alt 纸面账户 S->>M : module.place_order(config, ...) M-->>S : {status : "ok", order_id,...} else 实盘账户 S->>G : execute_live_order(intent, connector_module, config, ...) G->>M : module.place_order(config, ...) M-->>G : {status : "ok", ...} G->>A : 写入审计日志 G-->>S : {status : "ok", ...} end S-->>T : 标准化结果 T-->>U : JSON 响应

图表来源 - agent/src/tools/trading_connector_tool.py:431-504 - agent/src/trading/service.py:279-342 - agent/src/trading/profiles.py:54-70 - agent/src/trading/connectors/alpaca/sdk.py:429-577

详细组件分析

连接器基类与统一接口

章节来源 - agent/src/trading/service.py:17-29 - agent/src/trading/connectors/alpaca/sdk.py:143-151 - agent/src/trading/types.py:8-17

Alpaca 连接器示例(read/write + TAP 凭据隔离)

flowchart TD Start(["进入 place_order"]) --> Validate["参数校验<br/>symbol/side/order_type/tif/quantity-or-notional"] Validate --> Valid{"是否合法?"} Valid -- 否 --> Err["返回 {status:error, error:...}"] Valid -- 是 --> TapCheck{"TAP 启用?"} TapCheck -- 是 --> TapSubmit["构造订单体<br/>生成client_order_id<br/>POST 到 cfg.host/v2/orders"] TapSubmit --> TapResult{"TAP 批准?"} TapResult -- 否 --> TapErr["返回 {status:error, tap_decision:...}"] TapResult -- 是 --> MapResp["映射上游响应为标准格式"] TapCheck -- 否 --> Direct["创建 TradingClient(paper/live)<br/>提交 Market/Limit Order"] Direct --> Resp["返回标准响应"] MapResp --> Resp Resp --> End(["结束"])

图表来源 - agent/src/trading/connectors/alpaca/sdk.py:429-577 - agent/src/trading/connectors/alpaca/sdk.py:580-665

章节来源 - agent/src/trading/connectors/alpaca/sdk.py:65-151 - agent/src/trading/connectors/alpaca/sdk.py:261-426 - agent/src/trading/connectors/alpaca/sdk.py:429-748

服务路由与 Live 风控门控

sequenceDiagram participant S as "service.py" participant P as "profiles.py" participant M as "connector module" participant G as "sdk_order_gate" participant A as "audit" S->>P : profile_by_id(profile_id) alt transport == local_tws S->>M : ibkr.local.* M-->>S : 标准化结果 else transport == broker_sdk S->>M : build_config(...) alt environment == paper S->>M : place_order(...)/cancel_order(...) M-->>S : 标准化结果 else environment == live S->>G : execute_live_order(..., intent, place_kwargs) G->>M : module.place_order(...) M-->>G : 标准化结果 G->>A : 写入审计 G-->>S : 标准化结果 end else remote_mcp S->>S : _call_remote(...) end S-->>S : _with_profile(...) 附加 profile 元信息

图表来源 - agent/src/trading/service.py:42-117 - agent/src/trading/service.py:279-342 - agent/src/trading/service.py:345-370 - agent/src/trading/profiles.py:54-70

章节来源 - agent/src/trading/service.py:42-117 - agent/src/trading/service.py:279-342 - agent/src/trading/service.py:345-370 - agent/src/trading/profiles.py:54-70

配置文件结构与 Profile 管理

classDiagram class TradingProfile { +string id +string connector +string label +Environment environment +Transport transport +tuple capabilities +bool readonly +dict config +string notes +to_dict(selected) dict } class AlpacaProfiles { +ALPACA_PROFILES tuple[TradingProfile] } TradingProfile <.. AlpacaProfiles : "实例化多个"

图表来源 - agent/src/trading/types.py:20-52 - agent/src/trading/connectors/alpaca/profiles.py:15-71

章节来源 - agent/src/trading/profiles.py:24-41 - agent/src/trading/profiles.py:44-100 - agent/src/trading/connectors/alpaca/profiles.py:15-71 - agent/src/trading/types.py:20-52

认证流程与凭据隔离(TAP)

章节来源 - agent/src/trading/connectors/alpaca/sdk.py:183-227 - agent/src/trading/connectors/alpaca/sdk.py:580-665

错误处理模式

章节来源 - agent/src/tools/trading_connector_tool.py:470-504 - agent/src/trading/connectors/alpaca/sdk.py:429-577 - agent/src/trading/service.py:377-413

数据转换与标准化

章节来源 - agent/src/trading/connectors/alpaca/sdk.py:186-191 - agent/src/trading/connectors/alpaca/sdk.py:242-249 - agent/src/trading/connectors/alpaca/sdk.py:367-426

依赖关系分析

graph LR Tools["tools.trading_connector_tool"] --> Service["trading.service"] Service --> Profiles["trading.profiles"] Service --> SDK["connectors.alpaca.sdk"] SDK --> TAP["tap_forward"] SDK --> Lib["alpaca-py (可选)"]

图表来源 - agent/src/tools/trading_connector_tool.py:13-37 - agent/src/trading/service.py:17-29 - agent/src/trading/connectors/alpaca/sdk.py:252-258

章节来源 - agent/src/tools/trading_connector_tool.py:13-37 - agent/src/trading/service.py:17-29 - agent/src/trading/connectors/alpaca/sdk.py:252-258

性能考虑

[本节为通用指导,不直接分析具体文件]

故障排查指南

章节来源 - agent/src/trading/profiles.py:54-70 - agent/src/trading/connectors/alpaca/sdk.py:261-296 - agent/src/trading/connectors/alpaca/sdk.py:580-665 - agent/src/trading/service.py:554-584

结论

Vibe-Trading 的连接器体系通过“工具层—服务路由—连接器模块”的清晰分层,实现了跨券商的统一接入、强一致的数据标准化、严格的安全风控与审计。新增券商只需遵循统一接口、完善配置与 Profile 声明,即可无缝集成。推荐优先采用 broker_sdk 传输,并结合 TAP 实现凭据隔离与人工审批,确保生产环境的稳健运行。

[本节为总结性内容,不直接分析具体文件]

附录

从零开发一个新券商连接器的步骤清单

[本节为实践指引,不直接分析具体文件]