arbitrage-engine/docs/arbitrage-engine-full-spec.md

595 lines
24 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "Arbitrage Engine 完整项目规格文档"
---
# Arbitrage Engine — 完整项目规格文档
> 供 Codex 重写使用。描述现有系统的所有功能、界面、后端逻辑、数据库结构。
> 语言:精确、无歧义、面向 AI。
---
## 一、项目概述
**项目名称**ArbitrageEngine
**核心目标**:加密货币量化策略研究平台,通过实时信号引擎计算多因子评分,在模拟盘上验证策略表现,为未来实盘交易提供数据支撑。
**当前阶段**模拟盘运行paper trading不连接真实资金。
**主要币种**BTCUSDT、ETHUSDT、SOLUSDT、XRPUSDT币安永续合约
---
## 二、技术栈
### 后端
- **语言**Python 3.11
- **框架**FastAPI异步 HTTP
- **数据库**PostgreSQL 18GCP Cloud SQL内网 IP 10.106.0.3,数据库名 arb_engine
- **认证**JWTHS256secret=`arb-engine-jwt-secret-v2-2026`
- **进程管理**PM2
- **WebSocket**`websockets` 库,连接币安 WebSocket stream
### 前端
- **框架**Next.js 14App Router
- **UI 组件**shadcn/ui + Tailwind CSS + Radix UI + Lucide Icons
- **图表**Recharts
- **主题**:默认暗色,主色 slate + cyan
- **HTTP 客户端**fetch原生
### 基础设施
- **服务器**GCP asia-northeast1-bUbuntuTailscale IP 100.105.186.73
- **Cloud SQL**GCP内网 10.106.0.3,公网 34.85.117.248PostgreSQL 18
- **PM2 路径**`/home/fzq1228/Projects/ops-dashboard/node_modules/pm2/bin/pm2`
- **项目路径**`/home/fzq1228/Projects/arbitrage-engine/`
- **前端端口**4333arb-web
- **后端端口**4332arb-api
- **对外域名**`https://arb.zhouyangclaw.com`
---
## 三、PM2 进程列表
| ID | 名称 | 职责 |
|----|------|------|
| 0 | arb-web | Next.js 前端,端口 4333 |
| 8 | arb-api | FastAPI 后端,端口 4332 |
| 9 | signal-engine | 核心信号引擎Python单进程事件循环 |
| 24 | agg-collector | 从币安 WebSocket 收集逐笔成交agg_trades |
| 25 | paper-monitor | 模拟盘实时止盈止损监控WebSocket 价格推送) |
| 26 | liq-collector | 收集强平数据liquidations 表) |
| 27 | market-collector | 收集市场指标资金费率、OI、多空比等 |
| 28 | position-sync | 实盘持仓同步(暂不使用) |
| 29 | risk-guard | 风控守护进程 |
---
## 四、数据库完整结构
### 4.1 `strategies` — 策略配置表V5.4 核心)
每行代表一个可独立运行的策略实例。
| 字段 | 类型 | 说明 |
|------|------|------|
| strategy_id | uuid PK | 自动生成,全局唯一 |
| display_name | text | 展示名,如 `BTC_CVD15x1h_TP保守` |
| schema_version | int | 默认 1 |
| status | text | `running` / `paused` / `deprecated` |
| status_changed_at | timestamp | 状态变更时间 |
| last_run_at | timestamp | 最近一次信号评估时间 |
| deprecated_at | timestamp | 停用时间 |
| symbol | text | 交易对,如 `BTCUSDT` |
| direction | text | `long` / `short` / `both`(默认 both |
| cvd_fast_window | text | CVD 快线窗口,如 `5m` / `15m` / `30m` |
| cvd_slow_window | text | CVD 慢线窗口,如 `30m` / `1h` / `4h` |
| weight_direction | int | 方向层权重(默认 55 |
| weight_env | int | 环境层权重(默认 25 |
| weight_aux | int | 辅助层权重(默认 15 |
| weight_momentum | int | 动量层权重(默认 5 |
| entry_score | int | 开仓最低分(默认 75 |
| gate_obi_enabled | bool | 是否启用 OBI 否决门 |
| obi_threshold | float | OBI 否决阈值(默认 0.3 |
| gate_whale_enabled | bool | 是否启用鲸鱼否决门 |
| whale_usd_threshold | float | 鲸鱼成交额阈值(默认 $50,000 |
| whale_flow_pct | float | 鲸鱼流向占比阈值 |
| gate_vol_enabled | bool | 是否启用波动率门 |
| vol_atr_pct_min | float | 最低 ATR/price 比例(默认 0.002 |
| gate_spot_perp_enabled | bool | 是否启用期现背离门 |
| spot_perp_threshold | float | 期现背离阈值(默认 0.002 |
| gate_cvd_enabled | bool | 是否启用 CVD 共振门 |
| sl_atr_multiplier | float | SL 宽度倍数,`risk_distance = sl_atr_multiplier × ATR`,定义 1R 的价格距离(默认 1.5 |
| tp1_ratio | float | TP1 目标,以 R 计:`TP1 距离 = tp1_ratio × risk_distance`(默认 0.75 |
| tp2_ratio | float | TP2 目标,以 R 计:`TP2 距离 = tp2_ratio × risk_distance`(默认 1.5 |
| timeout_minutes | int | 超时平仓分钟数(默认 240 |
| flip_threshold | int | 反向信号强制平仓的最低分(默认 80 |
| initial_balance | float | 初始模拟资金(默认 $10,000 |
| current_balance | float | 当前模拟余额 |
| description | text | 策略描述 |
| tags | text[] | 标签数组 |
| created_at | timestamp | 创建时间 |
| updated_at | timestamp | 更新时间 |
**已有的固定 UUID 策略legacystatus=deprecated**
- `00000000-0000-0000-0000-000000000053` → v53 StandardBTCUSDT+ETHUSDT+SOLUSDT+XRPUSDT30m/4h
- `00000000-0000-0000-0000-000000000054` → v53 Middle全币种15m/1h
- `00000000-0000-0000-0000-000000000055` → v53 Fast全币种5m/30m
**当前运行中策略18个 BTC 对照组)**
- 命名规则:`BTC_CVD{fast}x{slow}_TP{保守|平衡|激进}`
- 6个 CVD 组合 × 3个 TP 方案 = 18个策略
- symbol 全部 = `BTCUSDT`
- 权重统一dir=38 / env=32 / aux=28 / mom=2 / entry_score=71
---
### 4.2 `paper_trades` — 模拟盘交易记录
每行代表一笔模拟交易(开仓→平仓)。
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | 自增 |
| symbol | text | 交易对 |
| direction | text | `LONG` / `SHORT` |
| score | int | 开仓时评分 |
| tier | text | `light` / `standard` / `heavy`(仓位档位) |
| entry_price | float | 开仓价格(实时成交价快照) |
| entry_ts | bigint | 开仓时间戳(毫秒) |
| exit_price | float | 平仓价格 |
| exit_ts | bigint | 平仓时间戳(毫秒) |
| tp1_price | float | 止盈1价格 |
| tp2_price | float | 止盈2价格 |
| sl_price | float | 止损价格 |
| tp1_hit | bool | 是否曾触及 TP1 |
| status | text | `active` / `tp1_hit` / `tp` / `sl` / `sl_be` / `timeout` / `signal_flip` |
| pnl_r | float | 盈亏(以 R 计1R = SL 距离) |
| atr_at_entry | float | 开仓时 ATR 值 |
| score_factors | jsonb | 四层评分详情 |
| strategy | varchar | 策略名(如 `custom_62047807` |
| risk_distance | float | 1R 对应的价格距离(= sl_atr_multiplier × ATR |
| calc_version | int | 计算版本1=VWAP2=last_trade |
| price_source | text | 价格来源 |
| strategy_id | uuid FK | 关联 strategies 表 |
| strategy_name_snapshot | text | 开仓时的策略展示名快照 |
**status 含义**
- `active`:持仓中,尚未触及 TP1
- `tp1_hit`:已触及 TP1移动止损到保本价
- `tp`:全仓止盈出场(同时触及 TP2或手动
- `sl`止损出场pnl_r = -1.0
- `sl_be`保本止损出场pnl_r ≈ +0.5 × tp1_ratio小正收益
- `timeout`持仓超时平仓240分钟
- `signal_flip`:反向信号强制平仓
**pnl_r 计算规则**(以价格距离除以 1R = risk_distance 为基准):
- SL 触发:`pnl_r = -1.0`(恒定)
- TP1 触发后 SL_BE`pnl_r = 0.5 × tp1_ratio`
- 全仓 TP2`pnl_r = 0.5 × tp1_ratio + 0.5 × tp2_ratio`
- timeout/flip`pnl_r = (exit_price - entry_price) / risk_distance`LONG 方向SHORT 取反)
- 实际实现中,以上结果再统一减去手续费折算:`fee_r = (2 × fee_rate × entry_price) / risk_distance`,当前 `fee_rate = 0.0005`0.05% taker即最终写入的 `pnl_r = 上述值 - fee_r`
**胜率定义**(重要):`pnl_r > 0` 的笔数 / 总闭仓笔数。不用 status 字段判断。
---
### 4.3 `signal_indicators` — 信号指标快照
每次信号引擎评估时写入一行,记录当时所有原始指标和评分结果。
| 字段 | 类型 | 说明 |
|------|------|------|
| id | bigint PK | 自增 |
| ts | bigint | 时间戳(毫秒) |
| symbol | text | 交易对 |
| cvd_fast | float | 旧字段30m CVD别名实际=cvd_30m |
| cvd_mid | float | 旧字段4h CVD别名实际=cvd_4h |
| cvd_day | float | 24h CVD |
| cvd_fast_slope | float | CVD 快线斜率 |
| atr_5m | float | 5分钟粒度 ATR |
| atr_percentile | float | ATR 百分位0~100 |
| vwap_30m | float | 30分钟 VWAP |
| price | float | 当前价格(实时最新成交价) |
| p95_qty | float | 过去1分钟成交量 P95 |
| p99_qty | float | 过去1分钟成交量 P99 |
| buy_vol_1m | float | 过去1分钟主动买入量 |
| sell_vol_1m | float | 过去1分钟主动卖出量 |
| score | int | 综合评分0~100 |
| signal | text | `LONG` / `SHORT` / nullnull=无信号) |
| factors | jsonb | 四层评分详情,格式见下 |
| strategy | varchar | 策略名 |
| atr_value | float | ATR 值(用于计算 SL/TP |
| cvd_5m | float | 5分钟 CVD |
| cvd_15m | float | 15分钟 CVD |
| cvd_30m | float | 30分钟 CVD |
| cvd_1h | float | 1小时 CVD |
| cvd_4h | float | 4小时 CVD |
| strategy_id | uuid FK | 关联 strategies 表 |
| strategy_name_snapshot | text | 策略展示名快照 |
**factors jsonb 结构**
```json
{
"direction": {"score": 38.0, "detail": "CVD共振LONG, cvd_fast=1234.5, cvd_slow=5678.9"},
"environment": {"score": 32.0, "detail": "ATR正常, VWAP上方"},
"auxiliary": {"score": 28.0, "detail": "OBI=0.45, 无否决"},
"momentum": {"score": 2.0, "detail": "P99成交量正常"},
"total": 75,
"gate_passed": true,
"block_reason": null
}
```
---
### 4.4 `agg_trades` — 逐笔成交数据(分区表)
主表 + 按月分区子表agg_trades_202602, agg_trades_202603 等)。
| 字段 | 类型 | 说明 |
|------|------|------|
| agg_id | bigint PK | 币安 agg trade ID |
| symbol | text | 交易对 |
| price | float | 成交价格 |
| qty | float | 成交量 |
| time_ms | bigint | 成交时间戳(毫秒) |
| is_buyer_maker | smallint | 0=主动买入1=主动卖出 |
**数据量**
- BTCUSDT2026-02-05 起,约 8949 万条
- ETHUSDT2026-02-25 起,约 3297 万条
- SOLUSDT/XRPUSDT2026-02-28 起,约 400~500 万条
---
### 4.5 `market_indicators` — 市场宏观指标
| 字段 | 类型 | 说明 |
|------|------|------|
| id | int PK | 自增 |
| symbol | varchar | 交易对 |
| indicator_type | varchar | 指标类型(`funding_rate` / `open_interest` / `ls_ratio` 等) |
| timestamp_ms | bigint | 时间戳 |
| value | jsonb | 指标值(结构因类型而异) |
| created_at | timestamp | 写入时间 |
---
### 4.6 `rate_snapshots` — 资金费率快照
| 字段 | 说明 |
|------|------|
| ts | 时间戳(毫秒) |
| btc_rate | BTC 资金费率 |
| eth_rate | ETH 资金费率 |
| btc_price | BTC 价格 |
| eth_price | ETH 价格 |
| btc_index_price | BTC 指数价格 |
| eth_index_price | ETH 指数价格 |
---
### 4.7 `liquidations` — 强平数据
| 字段 | 说明 |
|------|------|
| symbol | 交易对 |
| side | `LONG` / `SHORT` |
| price | 强平价格 |
| qty | 数量 |
| usd_value | USD 价值 |
| trade_time | 时间戳(毫秒) |
---
### 4.8 `users` — 用户认证
| 字段 | 说明 |
|------|------|
| id | bigint PK |
| email | 邮箱(唯一) |
| password_hash | bcrypt 哈希 |
| role | `admin` / `user` |
| discord_id | Discord 用户 ID |
| banned | 0=正常1=封禁 |
Admin 账号:`fzq1228@gmail.com`role=admin。
---
### 4.9 `signal_feature_events` — 信号特征事件(机器学习数据集)
记录每次 gate 决策的全部原始特征,用于事后分析和 Optuna 优化。
重要字段:`gate_passed`bool、`score_direction`、`score_crowding`、`score_environment`、`score_aux`、`score_total`、`block_reason`。
---
## 五、信号引擎signal_engine.py详细逻辑
### 5.1 架构
- **单进程 Python 事件循环**asyncio每 ~15 秒运行一轮
- 每轮对 4 个币种 × N 个策略 进行评估
- 实时数据来源:`agg_trades` 表(由 agg-collector 写入)
- 附加数据来源:`market_indicators` 表OBI、OI、资金费率等
### 5.2 滑动窗口
每个币种维护 3 个滑动窗口(按 `agg_trades.time_ms` 切片):
- `win_fast`30分钟窗口`WINDOW_FAST = 30 * 60 * 1000 ms`
- `win_mid`4小时窗口`WINDOW_MID = 4 * 3600 * 1000 ms`
- `win_day`24小时窗口`WINDOW_DAY = 24 * 3600 * 1000 ms`
每个窗口存储 `(time_ms, qty, price, is_buyer_maker)` 元组列表,定期淘汰过期数据。
**CVD 计算**
`CVD = 主动买入量 - 主动卖出量`(在窗口时间范围内求和)
**动态切片**
当策略配置了非标准窗口(如 15m、1h`win_fast``win_mid` 的 trades 列表中按时间范围切片重算 CVD
- fast 周期 ≤ 30m → 从 `win_fast.trades` 切片
- fast 周期 > 30m → 从 `win_mid.trades` 切片
- slow 周期 → 始终从 `win_mid.trades` 切片
### 5.3 评分模型(`evaluate_factory_strategy`,别名 `evaluate_v53`,原 `_evaluate_v53`
**四层线性评分**,总分 = 各层得分之和,满分 = 各层权重之和。
#### 门控系统5个门按顺序任意一门否决则 gate_passed=false不开仓
| 门 | 条件 | 否决理由 |
|----|------|----------|
| 门1 波动率 | `ATR/price >= vol_atr_pct_min` | ATR 过小,市场太平静 |
| 门2 CVD共振 | `cvd_fast``cvd_slow` 同向(同正=LONG同负=SHORT | 快慢 CVD 不共振 |
| 门3 鲸鱼否决 | 大额成交(>whale_usd_threshold的净流向与信号方向一致或该门禁用 | 鲸鱼反向 |
| 门4 OBI否决 | OBI订单簿不平衡不与信号方向矛盾或该门禁用 | OBI 反向 |
| 门5 期现背离 | 现货-永续价差在阈值内(或该门禁用) | 期现背离过大 |
门2CVD共振同时决定信号方向两个 CVD 都正→LONG都负→SHORT不同向→HOLD跳过
#### 评分计算gate_passed=true 后)
**方向层**weight_direction默认 38
- CVD共振强度 → 占方向层满分的比例
- 公式:`score_dir = weight_direction × min(1.0, abs(cvd_fast + cvd_slow) / normalization_factor)`
**环境层**weight_env默认 32
- ATR 百分位(价格波动强度)
- VWAP 相对位置
- 资金费率方向
**辅助层**weight_aux默认 28
- OBI 强度
- 期现背离程度
- 强平数据方向
**动量层**weight_momentum默认 2
- P99 成交量异常
- 买卖量比
**开仓条件**`total_score >= entry_score`(默认 75
### 5.4 开仓逻辑
```
for each symbol:
update sliding windows with new agg_trades
for each strategy (status=running):
if strategy.symbol != symbol → skip
evaluate_signal(strategy_cfg) → result
if result.signal and score >= entry_score:
if no active position for this strategy:
if active_position_count < max_positions:
paper_open_trade(...)
```
**开仓价格**:取 `signal_indicators.price`(实时最新成交价),不是 VWAP。
**SL/TP 计算**
- `risk_distance = sl_atr_multiplier × ATR`1R
- LONG`SL = price - risk_distance``TP1 = price + tp1_ratio × risk_distance``TP2 = price + tp2_ratio × risk_distance`
- SHORT`SL = price + risk_distance``TP1 = price - tp1_ratio × risk_distance``TP2 = price - tp2_ratio × risk_distance`
**当前标准TP/SL配置BTC 18组对照**
- 保守:`sl=2.0×ATR, tp1=0.75×ATR, tp2=1.5×ATR`TP全到=+0.5625R
- 平衡:`sl=2.0×ATR, tp1=1.0×ATR, tp2=2.0×ATR`TP全到=+1.5R
- 激进:`sl=2.0×ATR, tp1=1.5×ATR, tp2=3.0×ATR`TP全到=+2.25R
### 5.5 平仓逻辑paper_monitor.py
独立进程,通过币安 WebSocket 实时接收 mark price
1. `price >= tp1_price`LONG`price <= tp1_price`SHORT→ 触发 TP1status 改为 `tp1_hit`,移动止损到保本价
2. TP1 已触发后,`price >= tp2_price` → 全仓 TP2status=`tp`
3. `price <= sl_price`LONG`price >= sl_price`SHORT→ 止损status=`sl``pnl_r=-1.0`
4. 持仓超 240 分钟 → status=`timeout`
5. 反向信号强度 >= flip_threshold → signal_engine 触发 `signal_flip`
---
## 六、FastAPI 后端接口main.py
### 6.1 认证
- `POST /api/auth/login` → 返回 JWT token
- `POST /api/auth/register` → 注册(需邀请码)
- 所有接口需 Bearer JWT通过 `Depends(get_current_user)` 校验
### 6.2 行情数据
- `GET /api/rates` → 最新资金费率快照rate_snapshots 最新一行)
- `GET /api/snapshots` → 多个时间点的资金费率历史
- `GET /api/kline?symbol=BTC&interval=1m&limit=100` → K线从 agg_trades 聚合)
### 6.3 信号引擎
- `GET /api/signals/latest?strategy=v53` → 各币种最新一条信号指标signal_indicators 每币种 LIMIT 1
- `GET /api/signals/latest-v52?strategy=v52_8signals` → 同上v52 字段
- `GET /api/signals/indicators?symbol=BTCUSDT&strategy=v53&limit=100` → 历史信号指标列表
- `GET /api/signals/signal-history?symbol=BTC&strategy=v53&limit=50` → 有信号signal IS NOT NULL的历史列表
- `GET /api/signals/market-indicators?symbol=BTCUSDT` → 最新市场宏观指标OI/多空比/资金费率)
- `GET /api/signals/history?strategy=v53&limit=100` → 信号历史(含各层分数)
### 6.4 模拟盘paper trading
- `GET /api/paper/config` → 读取 paper_config.json
- `POST /api/paper/config` → 更新 paper_config.json控制总开关和每策略开关
- `GET /api/paper/summary?strategy=v53&strategy_id=uuid` → 总览总盈亏R/USDT、胜率、余额、持仓数、盈亏比
- `GET /api/paper/positions?strategy=v53&strategy_id=uuid` → 当前活跃持仓列表(含实时浮盈计算)
- `GET /api/paper/trades?strategy=v53&strategy_id=uuid&symbol=BTC&status=tp&limit=100` → 历史交易列表
- `GET /api/paper/equity-curve?strategy=v53&strategy_id=uuid` → 权益曲线(按时间累加 pnl_r
- `GET /api/paper/stats?strategy=v53&strategy_id=uuid` → 详细统计(胜率/盈亏比/MDD/Sharpe/avg_win/avg_loss按币种分组
- `GET /api/paper/stats-by-strategy` → 所有策略的汇总统计(策略广场用)
### 6.5 策略广场strategy plaza
- `GET /api/strategy-plaza?status=running` → 策略列表(支持 status 过滤)
- `GET /api/strategy-plaza/{strategy_id}/summary` → 单策略总览卡
- `GET /api/strategy-plaza/{strategy_id}/signals` → 单策略最新信号
- `GET /api/strategy-plaza/{strategy_id}/trades` → 单策略交易记录
### 6.6 策略管理 CRUD
- `POST /api/strategies` → 创建新策略(写入 strategies 表signal_engine 15秒内热重载
- `GET /api/strategies` → 策略列表(含 open_positions 数量)
- `GET /api/strategies/{sid}` → 单策略详情
- `PATCH /api/strategies/{sid}` → 更新策略参数
- `POST /api/strategies/{sid}/pause` → 暂停status=paused
- `POST /api/strategies/{sid}/resume` → 恢复status=running
- `POST /api/strategies/{sid}/deprecate` → 停用status=deprecated
- `POST /api/strategies/{sid}/restore` → 恢复到 running
- `POST /api/strategies/{sid}/add-balance` → 补充模拟资金
### 6.7 服务器监控
- `GET /api/server/status` → 服务器资源CPU/内存/磁盘/PM2进程状态
### 6.8 实盘接口(暂未真实使用)
- `GET /api/live/*` → 实盘持仓、交易、权益曲线、账户余额、风控状态等
- `POST /api/live/emergency-close` → 紧急平仓
- `POST /api/live/block-new` → 暂停新开仓
- `POST /api/live/resume` → 恢复开仓
---
## 七、前端页面列表
### 7.1 主导航Sidebar
固定左侧 sidebar包含所有页面入口和当前 BTC/ETH 资金费率实时显示。
### 7.2 页面详情
#### `/` (首页/Dashboard)
- 资金费率历史折线图BTC/ETH 双轨)
- 资金费率 24h 统计(最大/最小/均值)
- 近期套利机会卡片
#### `/signals-v53` (信号引擎 v5.3,老页面)
- CVD 三轨卡片cvd_fast/cvd_mid/cvd_day + 斜率 + 共振判断)
- ATR / VWAP / P95 / P99 市场环境指标
- 信号状态卡LONG/SHORT/无信号 + 评分 + 四层分数进度条)
- Gate-Control 卡5门详情波动率/CVD共振/鲸鱼/OBI/期现背离)
- 信号历史列表最近20条时间/方向/评分)
- CVD 折线图(可切 1h/4h/12h/24h 时间范围)
- 币种切换BTC/ETH/SOL/XRP
#### `/paper-v53` (模拟盘 v5.3,老页面)
- 总览卡片总盈亏R/USDT/胜率/持仓数/盈亏比/余额)
- 最新信号(四币种最近信号+四层分+Gate状态
- 控制面板(启动/停止按钮)
- 当前活跃持仓实时价格WebSocket/浮盈R/入场TP SL价格
- 权益曲线(面积图)
- 历史交易列表(筛选币种/盈亏;入场/出场价/状态/评分/持仓时长)
- 详细统计(胜率/盈亏比/avg_win/avg_loss/MDD/Sharpe按币种分Tab
#### `/strategy-plaza` (策略广场,主入口)
- 策略列表卡片视图(按 status 过滤running/paused/deprecated
- 每个卡片显示:策略名/币种/CVD周期/TP方案/胜率/净R/余额/状态
- 快速操作:暂停/恢复/停用
- 「新建策略」按钮 → 跳转 `/strategy-plaza/create`
#### `/strategy-plaza/create` (新建策略)
- 表单:策略名/symbol/CVD快慢周期/四层权重/五门阈值/TP-SL参数/初始余额
- 提交后 POST /api/strategiessignal_engine 15秒内热重载
#### `/strategy-plaza/[id]` (策略详情页,通用)
- Tab1: 信号引擎SignalsGeneric 组件)
- 动态显示该策略配置的 CVD 周期、权重、Gate 阈值
- 实时信号评分
- 信号历史、CVD 图表
- Tab2: 模拟盘PaperGeneric 组件)
- 总览统计、活跃持仓、权益曲线、交易列表、详细统计
- 启停控制
#### `/strategy-plaza/[id]/edit` (编辑策略)
- 同新建表单,预填当前参数,提交 PATCH /api/strategies/{id}
#### `/server` (服务器状态)
- CPU/内存/磁盘/PM2进程状态实时监控
#### `/kline` (K线图)
- 任意币种 K线支持 1m/5m/15m/1h 粒度
#### `/login` / `/register`
- JWT 登录/邀请码注册
---
## 八、paper_config.json模拟盘控制文件
路径:`backend/paper_config.json`
```json
{
"enabled": true,
"enabled_strategies": [],
"initial_balance": 10000,
"risk_per_trade": 0.02,
"max_positions": 100,
"tier_multiplier": {"light": 0.5, "standard": 1.0, "heavy": 1.5}
}
```
- `enabled_strategies` 为空列表 = 全部策略放行
- `max_positions` 当前设为 100实际无限制
---
## 九、数据流(完整链路)
```
币安 WebSocket逐笔成交
↓ agg-collector.py
agg_trades 表PostgreSQL 分区表)
↓ signal_engine.py每15秒读取
滑动窗口win_fast 30m / win_mid 4h / win_day 24h
↓ 计算CVD/ATR/VWAP
evaluate_factory_strategy() (内部别名 evaluate_v53原 _evaluate_v53
↓ 5门检查 → 四层评分
signal_indicators 写入
↓ signal IS NOT NULL 且 score >= entry_score
paper_open_trade() → paper_trades 写入
paper_monitor.pyWebSocket 实时价格监控)
↓ 触及 TP1/TP2/SL 或超时
paper_trades 平仓status/exit_price/pnl_r 更新)
FastAPImain.py← Next.js 前端查询展示
```
---
## 十、已知缺陷Codex 重写需改进)
1. **signal_engine.py 单体巨型文件**1800+ 行),所有逻辑混在一起
2. **所有策略共享同一个 snapshot**,无法真正独立评估
3. **CVD 动态切片依赖 win_fast/win_mid 两个固定窗口**,扩展性受限
4. **开仓逻辑耦合在 signal_engine 主循环**paper_monitor 只管平仓
5. **前端页面碎片化**:每个策略版本有独立页面,维护困难
6. **strategy_name 路由逻辑脆弱**`custom_` 路由曾多次因 scp 覆盖丢失
7. **API 无分页**,大数据量接口可能超时
---
## 十一、关键配置
```
数据库连接: postgresql://arb:arb_engine_2026@10.106.0.3/arb_engine
JWT Secret: arb-engine-jwt-secret-v2-2026
Admin: fzq1228@gmail.com (id=1, role=admin)
前端: https://arb.zhouyangclaw.com (端口 4333)
后端: 端口 4332
项目路径: /home/fzq1228/Projects/arbitrage-engine/
```