内容
# OpenProphet — IBKR 版本
**自主 AI 交易代理,带有网页仪表盘、MCP 工具和 Go 交易后端 — 适用于 Interactive Brokers**
> 从 [JakeNesler/OpenProphet](https://github.com/JakeNesler/OpenProphet) 分叉而来。本分叉替换 Alpaca 为 IBKR(TWS API),替换 OpenCode 为 Claude Code,并针对工具无关的欧洲和美国交易。
---
> **警告:** 这是一个实验性 AI 驱动的交易系统。期权交易涉及重大损失风险。仅使用模拟交易。作者不对金融损失承担任何责任。
---
## 变更内容
| 组件 | 原始(Alpaca) | 本分叉(IBKR) |
|---|---|---|
| **券商** | Alpaca REST API | IBKR TWS API via IB Gateway(自定义 Go 包装器) |
| **AI 运行时** | OpenCode CLI | Claude Code(`claude -p` 无头模式) |
| **市场** | 仅美国股票和期权 | 工具无关:OESX 指数期权,美国/欧洲股票,期货 |
| **新闻** | Google News + MarketWatch(美国焦点) | ECB,Eurex,Reuters Europe + Google News |
| **连接** | REST 请求-响应 | TCP 套接字,回调→通道模式 |
| **认证** | Alpaca API 密钥对 | IB Gateway(自动重启,无需每日重新认证) |
---
## 这是什么?
OpenProphet 是一个完全自主的交易系统,它在一个心跳循环中运行一个 AI 代理。代理按计划唤醒,评估市场状况,管理仓位,并执行交易 — 这一切都无需人工干预。一个移动友好的网页仪表盘,位于 `http://localhost:3737`,实时流式传输所有内容。
```
+---------------------+
| 网页仪表盘 |
| (端口 3737) |
| SSE 流式传输 |
+--------+------------+
|
+--------v------------+
| 代理服务器 |
| (Node.js/Express) |
| 心跳循环 |
| 配置存储 |
+--------+------------+
|
+------------------+------------------+
| |
+---------v-----------+ +-----------v-----------+
| Claude Code CLI | | Go 交易后端 |
| (claude -p) | | (Gin,端口 4534) |
| 无头模式 | | TWS API 客户端 |
+---------------------+ | 新闻聚合 |
| | 技术分析 |
+---------v-----------+ +-----------+-----------+
| MCP 服务器 | |
| (Node.js) | +-----------v-----------+
| 45+ 交易工具 | | IB Gateway |
| 权限门控 | | (模拟:4002) |
+---------------------+ | (实盘: 4001) |
+-----------------------+
```
### 循环
1. 代理在心跳(市场阶段间隔变化)时唤醒
2. Claude Code 子进程使用 `claude -p` + MCP 工具启动
3. 代理调用工具:检查账户,扫描新闻,分析设置,发出订单
4. 结果通过 SSE 流式传输到网页仪表盘
5. 代理在下一个心跳前休眠
代理通过 `set_heartbeat` MCP 工具控制其自身的心跳间隔 — 它可以在波动期间加快或在市场平静时减慢。
---
## 架构
```
OpenProphet(IBKR 版本)
├── 代理/ # 自主代理系统(Node.js)
│ ├── server.js # Express 网页服务器,SSE,Go 生命周期,认证
│ ├── harness.js # 心跳循环,Claude Code 子进程,会话管理
│ ├── config-store.js # 持久化 JSON 配置,带写锁定
│ └── public/index.html # 单页仪表盘(模拟美学)
├── mcp-server.js # MCP 工具服务器(45+ 工具,权限强制执行)
├── .mcp.json # Claude Code MCP 服务器注册
├── cmd/bot/main.go # Go 后端入口点
├── tws/ # ★ 自定义 Go TWS API 包装器(从头开始)
│ ├── client.go # TCP 连接,握手,消息 I/O
│ ├── decoder.go # 入站消息解析器
│ ├── encoder.go # 出站消息构建器
│ ├── contract.go # TWS Contract 类型
│ ├── order.go # TWS Order + OrderCancel 类型
│ ├── wrapper.go # EWrapper 回调接口(Go)
│ ├── dispatcher.go # reqId → 通道注册表
│ └── constants.go # 消息 ID,tick 类型
├── 接口/ # Go 类型定义
│ ├── instrument.go # ★ 通用 Instrument 类型
│ ├── broker.go # ★ BrokerService 接口
│ ├── market_data.go # ★ MarketDataService 接口
│ └── news.go # ★ NewsService 接口
├── controllers/ # HTTP 处理程序(工具无关)
│ ├── order_controller.go # 买入/卖出/期权/管理仓位
│ ├── intelligence_controller.go # AI 新闻分析
│ ├── news_controller.go # 新闻聚合(欧洲来源)
│ ├── activity_controller.go # 活动日志记录
│ └── position_controller.go # 仓位管理
├── services/ # 业务逻辑
│ ├── ibkr_broker.go # ★ BrokerService 实现(TWS API)
│ ├── ibkr_market_data.go # ★ MarketDataService 实现(TWS API)
│ ├── position_manager.go # 自动止损 / 获利
│ ├── gemini_service.go # Gemini AI 用于新闻清理(欧洲背景)
│ ├── news_service.go # 多源新闻(ECB,Eurex,Reuters Europe)
│ ├── stock_analysis_service.go # 股票分析
│ ├── technical_analysis.go # RSI,MACD,动量指标
│ └── activity_logger.go # 交易日志记录
├── models/ # 数据库模型
├── database/ # SQLite 存储层
├── config/ # 环境配置
├── vectorDB.js # 语义交易搜索(sqlite-vec)
├── TRADING_RULES.md # 策略规则(注入代理提示)
├── CLAUDE.md # ★ Claude Code 会话项目上下文
└── data/
├── agent-config.json # 运行时配置
└── prophet_trader.db # SQLite 数据库
```
---
## 关键差异
### 自定义 Go TWS API 包装器(`tws/`)
我们从头开始用纯 Go 编写了 TWS API 客户端 — 没有第三方库,没有 CGO。包装器直接实现了 TWS TCP 套接字协议:
- **线路协议:** 长度前缀,空分隔的文本字段通过 TCP
- **握手:** `API\0` → 版本协商 → `startApi` → 等待 `nextValidId`
- **回调→通道模式:** TWS 回调(EWrapper)被翻译成 Go 通道,通过一个 `Dispatcher` 映射 `reqId` 到缓冲通道
- **订单 ID 管理:** 从 `nextValidId` 回调种子,原子递增 thereafter
- **最小表面:** 只实现了我们实际需要的 ~15 消息类型
### 工具无关设计
一个通用的 `Instrument` 类型取代了 Alpaca 的符号字符串:
``` go
// EUREX 上的 OESX 指数期权
inst := interfaces.Instrument{
Symbol: "ESTX50", Type: interfaces.InstrumentIndexOption,
Exchange: "EUREX", Currency: "EUR",
Expiry: "20260620", Strike: 5200, Right: interfaces.Call,
Multiplier: 10, TradingClass: "OESX",
}
// 美国股票
inst := interfaces.Instrument{
Symbol: "AAPL", Type: interfaces.InstrumentStock,
Exchange: "SMART", Currency: "USD",
}
// 期货合约
inst := interfaces.Instrument{
Symbol: "ES", Type: interfaces.InstrumentFuture,
Exchange: "CME", Currency: "USD",
Expiry: "20260620", Multiplier: 50,
}
```
`Instrument` 结构体是一个纯数据容器,没有特定于产品的逻辑。所有字段值来自配置,用户输入或合约搜索结果 — 接口层永远不会假设您正在交易什么。
### Claude Code 集成
代理核心程序在无头模式下启动 Claude Code:
``` bash
claude -p \
--output-format stream-json \
--model sonnet \
--max-turns 25 \
--resume <session-id>
```
会话连续性通过 `--resume` 使用捕获的会话 ID 实现。系统(包括 TRADING_RULES.md)通过 stdin 在第一个节拍上输入。MCP 工具通过 `.mcp.json` 在项目根目录注册。
---
## 功能
### 自主代理
- **阶段性心跳** — 盘前(15m),市场开盘(2m),日内(10m),市场关闭(2m),盘后(30m),关闭(1h)
- **会话持久性** — `claude -p --resume` 在节拍之间保持上下文
- **系统提示优化** — 仅在第一个节拍发送,节省 ~2,000 个令牌/节拍
- **用户中断** — 在节拍中间发送消息;杀死当前子进程,在同一会话上恢复
- **代理自我修改** — 工具更新其自身的提示,策略规则,权限和心跳间隔
### 网页仪表盘
- **8 个标签** — 终端,交易,投资组合,代理,策略,账户,插件,设置
- **实时 SSE 流式传输** — 代理文本,工具调用,工具结果,节拍生命周期,交易事件
- **聊天输入** — 向代理发送消息,中断正在运行的节拍
- **移动优先** — 响应式布局,触摸友好
### 安全和防护
- **MCP 权限强制执行** — 资产类别门控,订单价值限制,0DTE 检测,工具阻止
- **每日损失断路器** — 当 P&L 超过 `maxDailyLoss`% 时自动暂停代理
- **IB Gateway 自动重新连接** — 处理每日重启和连接断开
- **基于令牌的身份验证** — 设置 `AGENT_AUTH_TOKEN` 以保护仪表盘 API
### AI 智能
- **Gemini 新闻清理** — 将嘈杂的源转换为结构化的欧洲交易情报
- **欧洲新闻源** — ECB 新闻稿,Eurex 公告,Reuters Europe,FT 头条
- **技术分析** — 通过 Go 后端进行 RSI,MACD,动量指标
- **向量相似性搜索** — 使用本地嵌入的过去交易语义搜索
---
## 快速入门
### 先决条件
- **Go 1.22+** — 用于交易后端
- **Node.js 18+** — 用于代理服务器和 MCP 工具
- **Claude Code** — `npm install -g @anthropic-ai/claude-code`
- **IB Gateway** — [下载](https://www.interactivebrokers.com/en/trading/ibgateway-stable.php) (模拟交易免费)
- **IBKR Pro 账户** — [interactivebrokers.com](https://www.interactivebrokers.com)
### 1. 克隆和安装
``` bash
git clone https://github.com/natslash/OpenProphet.git
cd OpenProphet
git checkout feature/ibkr-porting
npm install
go build -o prophet_bot ./cmd/bot
```
### 2. 配置 IB Gateway
启动 IB Gateway 并使用您的 IBKR 模拟交易凭证登录:
- **模拟交易端口:** 4002
- **API 设置:** 启用“启用 ActiveX 和 Socket 客户端”,将套接字端口设置为 4002
- **受信任的 IP 地址:** 添加 127.0.0.1
- **只读 API:** 取消勾选(我们需要发出订单)
### 3. 配置环境
``` bash
cp .env.example .env
```
编辑 `.env`:
``` env
# IBKR 配置
IBKR_HOST=127.0.0.1
IBKR_PORT=4002 # 模拟交易:4002,实盘:4001
IBKR_CLIENT_ID=1
# Gemini API(可选 — 用于 AI 新闻清理)
GEMINI_API_KEY=your_gemini_key
# 代理仪表盘配置(可选)
AGENT_PORT=3737
AGENT_AUTH_TOKEN=
TRADING_BOT_PORT=4534
```
### 4. 认证 Claude Code
``` bash
npm install -g @anthropic-ai/claude-code
claude auth login
```
### 5. 启动仪表盘
``` bash
npm run agent
```
打开 `http://localhost:3737` 并点击 **开始**。
### 6. (替代)仅 MCP 模式
``` bash
./prophet_bot # 启动 Go 后端(连接到 IB Gateway)
claude # 交互式 Claude Code 交易工具
```
---
## 支持的工具
| 工具 | 示例 | 交易所 | 状态 |
|---|---|---|---|
| OESX 指数期权 | ESTX50 2026 年 6 月 5200 看涨 | EUREX | ✅ 主要 |
| 美国股票 | AAPL,MSFT,TSLA | SMART/NYSE/NASDAQ | ✅ 支持 |
| 美国股票期权 | SPY 2026 年 6 月 580 看跌 | SMART | ✅ 支持 |
| 期货 | ES,NQ,FESX | CME,EUREX | ✅ 支持 |
| 外汇 | EUR.USD,GBP.USD | IDEALPRO | 🔄 计划 |
添加新的工具类型无需对代理、MCP 工具或仪表盘进行任何更改 — 只需一个新的 `InstrumentType` 常量和一个 TWS Contract 映射。
---
## MCP 工具参考
### 交易
| 工具 | 描述 |
|---|---|
| `place_options_order` | 买入/卖出期权,限价订单 |
| `place_managed_position` | 仓位自动止损 / 获利 |
| `close_managed_position` | 市场关闭管理仓位 |
| `place_buy_order` | 购买股票/合约 |
| `place_sell_order` | 卖出股票/合约 |
| `cancel_order` | 取消待处理订单 |
### 市场数据
| 工具 | 描述 |
|---|---|
| `get_account` | 投资组合价值,现金,购买力, margin |
| `get_positions` | 所有开放仓位 |
| `get_options_positions` | 所有开放的期权仓位 |
| `get_options_chain` | 期权链,带有行权价/到期过滤 |
| `get_orders` | 订单历史记录 |
| `get_quote` | 实时报价 |
| `get_latest_bar` | 最新 OHLCV 条形 |
| `get_historical_bars` | 历史价格条形 |
| `get_managed_positions` | 带有止损/目标状态的管理仓位 |
### 新闻与情报
| 工具 | 描述 |
|---|---|
| `get_quick_market_intelligence` | AI 清理的欧洲市场总结 |
| `analyze_stocks` | 技术分析 + 新闻 + 推荐 |
| `get_cleaned_news` | 多源聚合情报 |
| `search_news` | 关键词搜索 |
| `get_ecb_news` | ECB 新闻稿和演讲 |
| `get_eurex_bulletins` | Eurex 交易所公告 |
### 向量搜索(AI 内存)
| 工具 | 描述 |
|---|---|
| `find_similar_setups` | 过去交易的语义搜索 |
| `store_trade_setup` | 存储交易以供未来模式匹配 |
| `get_trade_stats` | 胜率,利润因子,按符号/策略 |
### 代理自我修改
| 工具 | 描述 |
|---|---|
| `update_agent_prompt` | 更新活动代理的系统提示 |
| `update_strategy_rules` | 更新交易策略规则 |
| `get_agent_config` | 读取当前代理配置和权限 |
| `set_heartbeat` | 动态覆盖心跳间隔 |
| `update_permissions` | 修改权限门控 |
---
## 配置
所有运行时配置存储在 `data/agent-config.json`:
``` json
{
"activeAccountId": "DU1234567",
"activeAgentId": "default",
"activeModel": "sonnet",
"heartbeat": {
"pre_market": 900,
"market_open": 120,
"midday": 600,
"market_close": 120,
"after_hours": 1800,
"closed": 3600
},
"permissions": {
"allowLiveTrading": false,
"allowOptions": true,
"allowStocks": true,
"allow0DTE": false,
"requireConfirmation": false,
"maxPositionPct": 15,
"maxDeployedPct": 80,
"maxDailyLoss": 5,
"maxOpenPositions": 10,
"maxOrderValue": 0,
"maxToolRoundsPerBeat": 25,
"blockedTools": []
}
}
```
---
## Go 后端服务
| 服务 | 目的 | 关键功能 |
|---|---|---|
| `IbkrBrokerService` | 通过 TWS API 进行订单执行 | PlaceOrder,CancelOrder,GetPositions,GetAccount |
| `IbkrMarketDataService` | 通过 TWS API 进行市场数据 | GetQuote,GetHistoricalBars,GetOptionChain |
| `PositionManager` | 自动化 | MonitorPositions,CloseManagedPosition |
| `TechnicalAnalysisService` | 指标 | CalculateRSI,CalculateMACD |
| `NewsService` | 欧洲情报 | GetECBNews,GetEurexBulletins,SearchNews |
| `GeminiService` | AI 处理 | CleanNewsForTrading |
| `ActivityLogger` | 日志记录 | LogDecision,LogActivity |
---
## 开发
### 添加新 MCP 工具
1. 在 Go 中添加端点 (`controllers/` + `cmd/bot/main.go` 中的路由)
2. 在 `mcp-server.js` 中添加工具定义
3. 在 `mcp-server.js` 中的 `switch` 块中添加处理程序
4. 如果是订单工具,在 `enforcePermissions()` 中添加权限检查
### 添加新的工具类型
1. 在 `interfaces/instrument.go` 中添加 `InstrumentType` 常量(例如 `InstrumentBond`)
2. 为新的 SecType 在 `tws/contract.go` 中添加 TWS Contract 映射
3. 在控制器、MCP 工具或仪表盘中无需进行任何更改
### 运行测试
``` bash
go test ./tws/... -v # 单元测试(无需 IB Gateway)
go test ./services/... -v -tags=integration # 集成测试( IB Gateway 模拟交易)
```
---
## 从上游 Alpaca OpenProphet 迁移
1. 替换 `.env` — 删除 `ALPACA_*` 变量,添加 `IBKR_*` 变量
2. 将 `opencode.jsonc` 替换为 `.mcp.json`
3. 安装 Claude Code — `npm install -g @anthropic-ai/claude-code && claude auth login`
4. 启动 IB Gateway — 模拟交易端口 4002
5. 重新构建 — `go build -o prophet_bot ./cmd/bot`
6. 更新 `TRADING_RULES.md` — 适应目标工具的策略
---
## 未来:Java/Spring Boot 迁移
架构设计可适用于未来的迁移到 Java/Spring Boot + 容器。代理接口直接映射到 Java 接口,MCP 服务器和仪表盘通过 HTTP 通信(无缝替换),SQLite 架构可移植到 JPA。Docker Compose 现在可以容器化当前堆栈。
---
## 免责声明
本软件按“原样”提供,不附带任何形式的保证。作者强烈建议在纸上交易充分测试后,不要使用本系统进行实际交易。期权交易具有重大损失风险。您对自己的交易决策承担全部责任。
---
## 许可
[CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/) — 免费用于个人和非商业用途。详见 [LICENSE](LICENSE) 获取详细信息。
原始作品版权 (c) 2025 Jake Nesler。Shashi 的分叉修改。
MCP 配置
以下是此 MCP Server 的配置信息,可直接复制到 Cursor 或其他 MCP 客户端中使用。
mcp.json
连接信息
猜你喜欢
暂无推荐服务器