连接器架构设计

📎 引用文件

本文引用的文件 - service.py - profiles.py - types.py - alpaca/sdk.py - binance/sdk.py - ibkr/local.py - tap_forward.py

目录

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

简介

本文件系统化阐述 Vibe-Trading 交易连接器架构,重点覆盖: - 统一连接器抽象层的设计原理与接口规范(账户、持仓、订单、行情、历史数据) - 订单生命周期管理与错误处理机制(含风控前置校验、审计记录) - 连接器的注册机制、配置管理与动态加载实现 - 多券商适配模式(协议转换、数据标准化、认证方式统一) - 连接器开发指南(SDK 集成、API 封装、安全最佳实践) - 连接池管理、连接状态监控与故障转移策略

项目结构

Vibe-Trading 的交易子系统以“服务层 + 连接器模块”的方式组织: - 服务层(service.py)提供统一的交易操作入口,按 profile 的 transport 路由到不同连接器路径 - 连接器模块(connectors/*)针对具体券商或本地网关实现统一接口 - 配置文件与 Profile 注册(profiles.py)集中管理可用连接器及其能力 - 类型定义(types.py)定义统一的数据模型与能力枚举 - TAP 代理(tap_forward.py)提供可选的凭据隔离与人工审批通道

graph TB subgraph "服务层" SVC["service.py<br/>统一交易入口"] PROF["profiles.py<br/>Profile 注册与选择"] TYPES["types.py<br/>统一类型与能力"] end subgraph "连接器" ALPACA["alpaca/sdk.py"] BINANCE["binance/sdk.py"] IBKR["ibkr/local.py"] end subgraph "安全与传输" TAP["tap_forward.py<br/>TAP 代理转发"] end SVC --> PROF SVC --> TYPES SVC --> ALPACA SVC --> BINANCE SVC --> IBKR ALPACA --> TAP BINANCE -.-> TAP IBKR -.-> TAP

图表来源 - service.py:1-120 - profiles.py:1-100 - types.py:1-52 - alpaca/sdk.py:1-120 - binance/sdk.py:1-120 - ibkr/local.py:1-120 - tap_forward.py:1-120

章节来源 - service.py:1-120 - profiles.py:1-100 - types.py:1-52

核心组件

章节来源 - service.py:13-66 - profiles.py:24-41 - alpaca/sdk.py:143-179 - binance/sdk.py:157-205 - ibkr/local.py:121-153 - tap_forward.py:1-22

架构总览

下图展示从调用方到券商的完整链路,包括 Profile 解析、连接器动态加载、读写分流、TAP 代理与安全门控。

sequenceDiagram participant Caller as "调用方" participant Service as "service.py" participant Profiles as "profiles.py" participant Module as "connector sdk.py" participant TAP as "tap_forward.py" participant Broker as "券商/本地网关" Caller->>Service : 调用统一接口(例 : place_order/get_account) Service->>Profiles : profile_by_id() Profiles-->>Service : TradingProfile alt transport == broker_sdk Service->>Module : build_config(profile.config, overrides) opt 写入且为 live Service->>Service : 风控前置(mandate/killswitch/审计) end opt TAP 启用 Service->>Module : 调用SDK方法 Module->>TAP : forward(target, method, headers) TAP-->>Module : 决策/上游响应 Module-->>Service : 标准化结果 else 直连 Module->>Broker : 直接SDK/REST调用 Broker-->>Module : 原始响应 Module-->>Service : 标准化结果 end else transport == local_tws Service->>Module : 本地IBKR接口 Module->>Broker : TWS/IB Gateway Broker-->>Module : 原始响应 Module-->>Service : 标准化结果 else remote Service->>Service : _call_remote(...) end Service-->>Caller : 统一返回体(status, data/error)

图表来源 - service.py:42-117 - service.py:279-342 - alpaca/sdk.py:261-296 - binance/sdk.py:217-264 - ibkr/local.py:165-218 - tap_forward.py:99-188

详细组件分析

统一接口与服务路由(service.py)

flowchart TD Start(["入口: 统一接口"]) --> Resolve["解析 Profile"] Resolve --> Transport{"transport?"} Transport --> |local_tws| Local["调用 IBKR 本地接口"] Transport --> |broker_sdk| SDK["动态导入 SDK 模块"] Transport --> |remote| Remote["_call_remote(...)"] SDK --> WriteCheck{"是否写入?"} WriteCheck --> |是| LiveCheck{"是否 live?"} LiveCheck --> |是| Gate["mandate/killswitch/审计"] LiveCheck --> |否| Direct["直接执行"] Gate --> Exec["执行 SDK 写入"] Direct --> Exec Local --> Return["标准化返回"] Exec --> Return Remote --> Return Return --> End(["结束"])

图表来源 - service.py:42-117 - service.py:279-342

章节来源 - service.py:13-66 - service.py:279-342

Alpaca 连接器(alpaca/sdk.py)

classDiagram class AlpacaConfig { +string api_key +string secret_key +string profile +string feed +float timeout +bool readonly +from_mapping(data) +with_overrides(...) +property environment +property is_paper +property host } class Connector { +check_status(config) dict +get_account_snapshot(config) dict +get_positions(config) dict +get_open_orders(config, include_executions) dict +get_quote(symbol, config) dict +get_historical_bars(symbol, config, period, limit) dict +place_order(config, symbol, side, quantity, notional, order_type, limit_price, time_in_force) dict +cancel_order(config, order_id, symbol) dict } AlpacaConfig <.. Connector : "构建客户端/选择host"

图表来源 - alpaca/sdk.py:65-138 - alpaca/sdk.py:261-296 - alpaca/sdk.py:429-577 - alpaca/sdk.py:668-748

章节来源 - alpaca/sdk.py:143-179 - alpaca/sdk.py:261-296 - alpaca/sdk.py:429-577 - alpaca/sdk.py:668-748

Binance 连接器(binance/sdk.py)

flowchart TD A["输入: symbol/side/type/qty/notional"] --> B["参数校验"] B --> C{"limit/market"} C --> |limit| D["校验limit_price & tif"] C --> |market| E["可选notional(quoteOrderQty)"] D --> F["_assert_host(cfg)"] E --> F F --> G["ccxt.create_order / cancel_order"] G --> H["标准化返回"]

图表来源 - binance/sdk.py:423-547 - binance/sdk.py:550-600 - binance/sdk.py:217-264

章节来源 - binance/sdk.py:157-205 - binance/sdk.py:217-264 - binance/sdk.py:423-547 - binance/sdk.py:550-600

IBKR 本地连接器(ibkr/local.py)

classDiagram class _TwsPool { +acquire(config) IB +release() void -_new_client_id(base) int } class IBKRConnector { +check_local_status(config, scan) dict +get_account_snapshot(config) dict +get_positions(config) dict +get_open_orders(config, include_executions) dict +get_quote(symbol, config, exchange, currency, sec_type) dict +get_historical_bars(symbol, config, exchange, currency, sec_type, duration, bar_size, what_to_show, use_rth) dict } _TwsPool <.. IBKRConnector : "线程局部连接复用"

图表来源 - ibkr/local.py:429-503 - ibkr/local.py:165-218 - ibkr/local.py:241-425

章节来源 - ibkr/local.py:121-153 - ibkr/local.py:165-218 - ibkr/local.py:241-425 - ibkr/local.py:429-503

TAP 代理(tap_forward.py)

sequenceDiagram participant App as "应用" participant TAP as "TAP 代理" participant Broker as "券商" App->>TAP : POST /forward (带占位符头) alt 自动批准(读) TAP-->>App : 200 + 上游响应 else 需要人工批准(写) TAP-->>App : 202 + txn_id/poll_url loop 轮询 App->>TAP : GET /agent/approvals/{txn} alt 已批准 TAP-->>App : forwarded + 上游响应 else 拒绝/超时 TAP-->>App : denied/timed_out end end end

图表来源 - tap_forward.py:99-188

章节来源 - tap_forward.py:1-22 - tap_forward.py:99-188

依赖关系分析

graph LR SVC["service.py"] --> PROFILES["profiles.py"] SVC --> TYPES["types.py"] SVC --> ALPACA["alpaca/sdk.py"] SVC --> BINANCE["binance/sdk.py"] SVC --> IBKR["ibkr/local.py"] ALPACA --> TAP["tap_forward.py"] BINANCE -.-> TAP IBKR -.-> TAP

图表来源 - service.py:13-66 - profiles.py:1-100 - types.py:1-52 - alpaca/sdk.py:1-120 - binance/sdk.py:1-120 - ibkr/local.py:1-120 - tap_forward.py:1-120

章节来源 - service.py:13-66 - profiles.py:1-100 - types.py:1-52

性能考量

[本节为通用指导,无需特定文件来源]

故障排查指南

章节来源 - alpaca/sdk.py:261-296 - binance/sdk.py:217-264 - ibkr/local.py:165-218 - tap_forward.py:99-188

结论

该架构通过统一接口、动态加载、配置与 Profile 管理、以及可选的 TAP 代理,实现了多券商适配与强安全边界。读写分离、环境隔离与审计记录确保生产级可靠性。新增连接器只需实现统一接口并纳入注册即可无缝接入。

[本节为总结性内容,无需特定文件来源]

附录

连接器开发指南

章节来源 - service.py:13-66 - alpaca/sdk.py:143-179 - binance/sdk.py:157-205 - ibkr/local.py:121-153 - tap_forward.py:1-22