diff --git a/docs/arbitrage-engine-full-spec.md b/docs/arbitrage-engine-full-spec.md new file mode 100644 index 0000000..9b1fa0f --- /dev/null +++ b/docs/arbitrage-engine-full-spec.md @@ -0,0 +1,593 @@ +--- +title: "Arbitrage Engine 完整项目规格文档" +--- +# Arbitrage Engine — 完整项目规格文档 +> 供 Codex 重写使用。描述现有系统的所有功能、界面、后端逻辑、数据库结构。 +> 语言:精确、无歧义、面向 AI。 + +--- + +## 一、项目概述 + +**项目名称**:ArbitrageEngine +**核心目标**:加密货币量化策略研究平台,通过实时信号引擎计算多因子评分,在模拟盘上验证策略表现,为未来实盘交易提供数据支撑。 +**当前阶段**:模拟盘运行(paper trading),不连接真实资金。 +**主要币种**:BTCUSDT、ETHUSDT、SOLUSDT、XRPUSDT(币安永续合约) + +--- + +## 二、技术栈 + +### 后端 +- **语言**:Python 3.11 +- **框架**:FastAPI(异步 HTTP) +- **数据库**:PostgreSQL 18(GCP Cloud SQL,内网 IP 10.106.0.3,数据库名 arb_engine) +- **认证**:JWT(HS256,secret=`arb-engine-jwt-secret-v2-2026`) +- **进程管理**:PM2 +- **WebSocket**:`websockets` 库,连接币安 WebSocket stream + +### 前端 +- **框架**:Next.js 14(App Router) +- **UI 组件**:shadcn/ui + Tailwind CSS + Radix UI + Lucide Icons +- **图表**:Recharts +- **主题**:默认暗色,主色 slate + cyan +- **HTTP 客户端**:fetch(原生) + +### 基础设施 +- **服务器**:GCP asia-northeast1-b,Ubuntu,Tailscale IP 100.105.186.73 +- **Cloud SQL**:GCP,内网 10.106.0.3,公网 34.85.117.248,PostgreSQL 18 +- **PM2 路径**:`/home/fzq1228/Projects/ops-dashboard/node_modules/pm2/bin/pm2` +- **项目路径**:`/home/fzq1228/Projects/arbitrage-engine/` +- **前端端口**:4333(arb-web) +- **后端端口**:4332(arb-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 = sl_atr_multiplier × ATR(默认 1.5) | +| tp1_ratio | float | TP1 = tp1_ratio × ATR(默认 0.75) | +| tp2_ratio | float | TP2 = tp2_ratio × ATR(默认 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 策略(legacy,status=deprecated)**: +- `00000000-0000-0000-0000-000000000053` → v53 Standard(BTCUSDT+ETHUSDT+SOLUSDT+XRPUSDT,30m/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=VWAP,2=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 计算规则**: +- 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 取反) + +**胜率定义**(重要):`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` / null(null=无信号) | +| 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=主动卖出 | + +**数据量**: +- BTCUSDT:2026-02-05 起,约 8949 万条 +- ETHUSDT:2026-02-25 起,约 3297 万条 +- SOLUSDT/XRPUSDT:2026-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_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 期现背离 | 现货-永续价差在阈值内(或该门禁用) | 期现背离过大 | + +门2(CVD共振)同时决定信号方向:两个 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 × ATR`,`TP2 = price + tp2_ratio × ATR` +- SHORT:`SL = price + risk_distance`,`TP1 = price - tp1_ratio × ATR`,`TP2 = price - tp2_ratio × ATR` + +**当前标准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)→ 触发 TP1:status 改为 `tp1_hit`,移动止损到保本价 +2. TP1 已触发后,`price >= tp2_price` → 全仓 TP2:status=`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/strategies,signal_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_v53() + ↓ 5门检查 → 四层评分 +signal_indicators 写入 + ↓ signal IS NOT NULL 且 score >= entry_score +paper_open_trade() → paper_trades 写入 + ↓ +paper_monitor.py(WebSocket 实时价格监控) + ↓ 触及 TP1/TP2/SL 或超时 +paper_trades 平仓(status/exit_price/pnl_r 更新) + ↓ +FastAPI(main.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/ +```