docs: add comprehensive project documentation (PROJECT.md)
- Full architecture overview - All 36 files documented with purpose and line counts - 5-layer scoring system explained - Database schema, PM2 processes, signal sources - Deployment info, version roadmap - Known issues and improvements
This commit is contained in:
parent
9528d69a42
commit
a13a93efa5
425
docs/PROJECT.md
Normal file
425
docs/PROJECT.md
Normal file
@ -0,0 +1,425 @@
|
||||
# Arbitrage Engine V5.1 — 项目文档
|
||||
|
||||
> 最后更新:2026-03-01
|
||||
> 版本:V5.1
|
||||
> 作者:琪智科技
|
||||
|
||||
## 一、项目概述
|
||||
|
||||
**Arbitrage Engine** 是一套加密货币合约交易信号系统,基于多因子评分模型,实时分析市场微观结构数据(Order Flow),生成做多/做空信号并执行模拟盘交易。
|
||||
|
||||
### 核心能力
|
||||
- **5层100分评分体系**:方向层(45) + 拥挤层(20) + 环境层(15) + 确认层(15) + 辅助层(5)
|
||||
- **4个交易币种**:BTCUSDT、ETHUSDT、XRPUSDT、SOLUSDT
|
||||
- **8个信号源**(6个已接入评分,2个在采集中)
|
||||
- **模拟盘自动交易**:信号触发 → 开仓 → TP/SL → 平仓,全自动
|
||||
- **实时数据采集**:aggTrades、市场指标、清算数据
|
||||
- **Web仪表盘**:信号展示、模拟盘监控、收益统计
|
||||
|
||||
### 技术栈
|
||||
| 层级 | 技术 |
|
||||
|------|------|
|
||||
| 后端 | Python 3 + FastAPI + uvicorn |
|
||||
| 前端 | Next.js 15 + React + TypeScript + Tailwind CSS |
|
||||
| 数据库 | PostgreSQL 18(GCP Cloud SQL) |
|
||||
| 进程管理 | PM2 |
|
||||
| 数据源 | Binance Futures API + WebSocket |
|
||||
| 反向代理 | Caddy |
|
||||
|
||||
### 代码统计
|
||||
| 模块 | 文件数 | 代码行数 |
|
||||
|------|--------|---------|
|
||||
| Backend (Python) | 15个 | 4,598行 |
|
||||
| Frontend (TSX/TS) | 21个 | 3,518行 |
|
||||
| **总计** | **36个** | **8,116行** |
|
||||
|
||||
---
|
||||
|
||||
## 二、项目结构
|
||||
|
||||
```
|
||||
arbitrage-engine/
|
||||
├── backend/ # Python后端
|
||||
│ ├── main.py # FastAPI主入口 + 全部API路由
|
||||
│ ├── db.py # 数据库连接层(PG同步+异步池+Cloud SQL双写)
|
||||
│ ├── auth.py # 用户认证系统(JWT + 邀请码注册)
|
||||
│ ├── signal_engine.py # 🔥 核心:信号评估引擎(5层评分)
|
||||
│ ├── paper_monitor.py # 模拟盘监控(WebSocket实时TP/SL)
|
||||
│ ├── agg_trades_collector.py # aggTrades实时采集(Binance WS)
|
||||
│ ├── market_data_collector.py# 市场指标采集(多空比/OI/FR等)
|
||||
│ ├── liquidation_collector.py# 清算数据采集(Binance forceOrder)
|
||||
│ ├── backtest.py # 回测框架
|
||||
│ ├── backfill_agg_trades.py # aggTrades历史回补工具
|
||||
│ ├── admin_cli.py # 管理命令行工具
|
||||
│ ├── signal_pusher.py # [已废弃] 旧版信号推送
|
||||
│ ├── subscriptions.py # [预留] 订阅系统
|
||||
│ ├── migrate_sqlite_to_pg.py # [一次性] SQLite→PG数据迁移
|
||||
│ └── migrate_auth_sqlite_to_pg.py # [一次性] Auth SQLite→PG迁移
|
||||
├── frontend/ # Next.js前端
|
||||
│ ├── app/
|
||||
│ │ ├── page.tsx # 首页(仪表盘概览)
|
||||
│ │ ├── layout.tsx # 全局布局
|
||||
│ │ ├── signals/page.tsx # 信号引擎页面(5层评分展示)
|
||||
│ │ ├── paper/page.tsx # 模拟盘页面(持仓+历史+统计)
|
||||
│ │ ├── trades/page.tsx # 历史交易页面
|
||||
│ │ ├── server/page.tsx # 服务器监控页面
|
||||
│ │ ├── kline/page.tsx # K线图页面
|
||||
│ │ ├── live/page.tsx # 实时数据页面
|
||||
│ │ ├── dashboard/page.tsx # 仪表盘页面
|
||||
│ │ ├── login/page.tsx # 登录页面
|
||||
│ │ ├── register/page.tsx # 注册页面(需邀请码)
|
||||
│ │ ├── about/page.tsx # 关于页面
|
||||
│ │ └── history/page.tsx # [占位] 历史页面
|
||||
│ ├── components/
|
||||
│ │ ├── Sidebar.tsx # 侧边导航栏
|
||||
│ │ ├── Navbar.tsx # 顶部导航栏
|
||||
│ │ ├── AuthHeader.tsx # 认证头部
|
||||
│ │ ├── LiveTradesCard.tsx # 实时交易卡片
|
||||
│ │ ├── FundingChart.tsx # 资金费率图表
|
||||
│ │ ├── RateCard.tsx # 费率卡片
|
||||
│ │ └── StatsCard.tsx # 统计卡片
|
||||
│ ├── lib/
|
||||
│ │ ├── auth.tsx # 前端认证逻辑(JWT管理)
|
||||
│ │ └── api.ts # API请求封装
|
||||
│ ├── next.config.ts # Next.js配置(API代理)
|
||||
│ ├── package.json # 依赖配置
|
||||
│ └── tsconfig.json # TypeScript配置
|
||||
├── docs/ # 项目文档
|
||||
│ └── PROJECT.md # 本文件
|
||||
├── .gitignore
|
||||
└── README.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 三、后端文件详解
|
||||
|
||||
### 3.1 `main.py`(949行)— API主入口
|
||||
|
||||
FastAPI应用,包含全部HTTP API路由:
|
||||
|
||||
**API路由:**
|
||||
| 路径 | 方法 | 功能 |
|
||||
|------|------|------|
|
||||
| `/api/health` | GET | 健康检查 |
|
||||
| `/api/signals/latest` | GET | 最新信号数据 |
|
||||
| `/api/signals/history` | GET | 历史信号 |
|
||||
| `/api/paper/summary` | GET | 模拟盘概览 |
|
||||
| `/api/paper/positions` | GET | 当前持仓 |
|
||||
| `/api/paper/trades` | GET | 历史交易 |
|
||||
| `/api/paper/equity-curve` | GET | 权益曲线 |
|
||||
| `/api/paper/stats` | GET | 详细统计(支持按币种) |
|
||||
| `/api/paper/config` | GET/POST | 模拟盘配置 |
|
||||
| `/api/server/status` | GET | 服务器监控 |
|
||||
|
||||
**依赖:** FastAPI, uvicorn, asyncpg, psutil
|
||||
|
||||
**运行方式:** `uvicorn main:app --host 0.0.0.0 --port 4332`
|
||||
|
||||
---
|
||||
|
||||
### 3.2 `signal_engine.py`(739行)— 🔥 核心信号引擎
|
||||
|
||||
**最重要的文件**。每15秒评估一次4个币种的交易信号。
|
||||
|
||||
**5层评分体系(100分满分):**
|
||||
|
||||
| 层级 | 权重 | 信号源 | 逻辑 |
|
||||
|------|------|--------|------|
|
||||
| 方向层 | 45分 | CVD三轨(fast/mid) + P99大单 + CVD加速度 | 资金流向判断多空 |
|
||||
| 拥挤层 | 20分 | 多空比 + 大户持仓比 | 市场拥挤度,反向指标 |
|
||||
| 环境层 | 15分 | OI变化率 | 合约持仓量变化 |
|
||||
| 确认层 | 15分 | CVD-Price背离 + 大单方向确认 | 信号交叉验证 |
|
||||
| 辅助层 | 5分 | Coinbase Premium | 机构资金流向 |
|
||||
|
||||
**核心类:**
|
||||
- `TradeWindow`:滑动窗口,维护buy_vol/sell_vol/CVD,自动trim过期数据
|
||||
- `ATRCalculator`:ATR计算器,用于仓位管理和TP/SL计算
|
||||
- `SymbolState`:每个币种的完整状态(4个窗口 + ATR + 大单 + 市场指标)
|
||||
|
||||
**数据流:**
|
||||
```
|
||||
aggTrades(PG) → process_trade() → 4个TradeWindow更新
|
||||
↓
|
||||
evaluate_signal() → 5层打分
|
||||
↓
|
||||
score >= 60 → 开仓信号
|
||||
↓
|
||||
paper_trading_open() → 写入paper_trades
|
||||
```
|
||||
|
||||
**关键参数:**
|
||||
- `WINDOW_FAST = 30min`:CVD快线窗口
|
||||
- `WINDOW_MID = 4h`:CVD慢线窗口
|
||||
- `WINDOW_DAY = 24h`:P99大单计算窗口
|
||||
- `EVAL_INTERVAL = 15s`:评估间隔
|
||||
- `SIGNAL_THRESHOLD = 60`:开仓阈值分数
|
||||
- `COOLDOWN = 300s`:同币种同方向冷却时间
|
||||
|
||||
**冷启动机制:**
|
||||
1. 启动时`load_historical()`从PG读取最近4小时aggTrades灌入窗口
|
||||
2. 前3轮(45秒)不出信号(冷启动保护)
|
||||
|
||||
---
|
||||
|
||||
### 3.3 `paper_monitor.py`(179行)— 模拟盘监控
|
||||
|
||||
独立PM2进程,通过WebSocket连接Binance实时监控持仓的TP/SL。
|
||||
|
||||
**核心逻辑:**
|
||||
1. 启动时加载所有active/tp1_hit持仓
|
||||
2. 连接Binance aggTrade WS获取实时价格
|
||||
3. 每笔成交检查是否触发TP1/TP2/SL
|
||||
4. 触发后更新paper_trades状态
|
||||
|
||||
**TP/SL规则:**
|
||||
- TP1 = entry ± 1.5×ATR(平半仓)
|
||||
- TP2 = entry ± 3.0×ATR(平剩余)
|
||||
- SL = entry ∓ 1.0×ATR
|
||||
- TP1触发后SL移动到成本价(保本)
|
||||
|
||||
**为什么独立进程:** TP/SL必须毫秒级响应,不能和15秒评估循环共享进程。
|
||||
|
||||
---
|
||||
|
||||
### 3.4 `db.py`(357行)— 数据库连接层
|
||||
|
||||
统一的PostgreSQL连接管理,支持同步和异步两种模式。
|
||||
|
||||
**连接池:**
|
||||
- `get_sync_pool()` / `get_sync_conn()`:psycopg2同步池(供collector/signal_engine用)
|
||||
- `get_async_pool()` / `async_fetch()`:asyncpg异步池(供FastAPI用)
|
||||
- `get_cloud_sync_pool()` / `get_cloud_sync_conn()`:Cloud SQL双写池
|
||||
|
||||
**配置(环境变量):**
|
||||
- `PG_HOST`:数据库地址(默认127.0.0.1,现在应指向Cloud SQL)
|
||||
- `CLOUD_PG_HOST`:Cloud SQL地址(10.106.0.3)
|
||||
- `CLOUD_PG_ENABLED`:双写开关
|
||||
|
||||
**Schema管理:** `init_schema()` + `ensure_partitions()`(按月自动建分区表)
|
||||
|
||||
---
|
||||
|
||||
### 3.5 `agg_trades_collector.py`(307行)— aggTrades采集器
|
||||
|
||||
实时采集Binance合约aggTrades数据,是数据的源头。
|
||||
|
||||
**架构:**
|
||||
- **WebSocket主链路**:4个币种各一条WS连接,实时推送
|
||||
- **REST补洞**:断线重连后用REST API从last_agg_id追平
|
||||
- **连续性巡检**:每60秒检查agg_id连续性,发现断档自动补洞
|
||||
- **批量写入**:攒200条或1秒flush一次
|
||||
|
||||
**双写机制:** flush_buffer同时写本地PG和Cloud SQL,Cloud SQL写失败不影响主流程。
|
||||
|
||||
**数据量:** 目前约7000万条(BTC 23天 + ETH 3天 + XRP/SOL 3天)
|
||||
|
||||
---
|
||||
|
||||
### 3.6 `market_data_collector.py`(192行)— 市场指标采集
|
||||
|
||||
每5分钟从Binance REST API采集市场指标,存入`market_indicators`表。
|
||||
|
||||
**采集指标(5种):**
|
||||
| 指标 | API | 用途 |
|
||||
|------|-----|------|
|
||||
| long_short_ratio | /futures/data/globalLongShortAccountRatio | 多空比 |
|
||||
| top_trader_position | /futures/data/topLongShortPositionRatio | 大户持仓比 |
|
||||
| open_interest_hist | /futures/data/openInterestHist | 持仓量变化 |
|
||||
| coinbase_premium | Coinbase vs Binance价差 | 机构资金流 |
|
||||
| funding_rate | /fapi/v1/fundingRate | 资金费率 |
|
||||
|
||||
---
|
||||
|
||||
### 3.7 `liquidation_collector.py`(140行)— 清算数据采集
|
||||
|
||||
连接Binance WebSocket `forceOrder`流,实时采集强制平仓事件。
|
||||
|
||||
**双层存储:**
|
||||
1. `liquidations`表:每笔清算原始记录
|
||||
2. `market_indicators`表:每5分钟聚合(long_liq_usd/short_liq_usd/total/count)
|
||||
|
||||
**Side映射:** BUY order = SHORT被清算,SELL order = LONG被清算
|
||||
|
||||
---
|
||||
|
||||
### 3.8 `auth.py`(384行)— 认证系统
|
||||
|
||||
基于JWT的用户认证,邀请码注册制。
|
||||
|
||||
**功能:**
|
||||
- 注册(需邀请码)/ 登录 / Token刷新
|
||||
- Admin管理(邀请码生成/用户封禁)
|
||||
- JWT签发(access_token 24h + refresh_token 7d)
|
||||
|
||||
**安全:** scrypt密码哈希 + HMAC-SHA256 JWT签名
|
||||
|
||||
---
|
||||
|
||||
### 3.9 `backtest.py`(503行)— 回测框架
|
||||
|
||||
对历史aggTrades数据运行信号引擎,验证策略表现。
|
||||
|
||||
**输出指标:** 胜率、PF、夏普比率、最大回撤、按方向/币种统计
|
||||
|
||||
---
|
||||
|
||||
### 3.10 其他文件
|
||||
|
||||
| 文件 | 行数 | 说明 |
|
||||
|------|------|------|
|
||||
| `backfill_agg_trades.py` | 209 | aggTrades历史数据回补(REST API批量拉取) |
|
||||
| `admin_cli.py` | 123 | 命令行管理工具(生成邀请码、管理用户) |
|
||||
| `signal_pusher.py` | 108 | **[已废弃]** 旧版信号推送(仍用SQLite,可删除) |
|
||||
| `subscriptions.py` | 23 | **[预留]** 订阅系统占位 |
|
||||
| `migrate_sqlite_to_pg.py` | 215 | **[一次性]** SQLite→PG数据迁移脚本 |
|
||||
| `migrate_auth_sqlite_to_pg.py` | 170 | **[一次性]** Auth SQLite→PG迁移脚本 |
|
||||
|
||||
---
|
||||
|
||||
## 四、前端文件详解
|
||||
|
||||
### 4.1 页面
|
||||
|
||||
| 文件 | 行数 | 功能 |
|
||||
|------|------|------|
|
||||
| `app/page.tsx` | 320 | 首页仪表盘(资金费率卡片 + 概览) |
|
||||
| `app/signals/page.tsx` | 523 | 信号引擎(4币种实时评分 + 5层分数展示) |
|
||||
| `app/paper/page.tsx` | 459 | 模拟盘(当前持仓 + 历史交易 + 权益曲线 + 按币种统计) |
|
||||
| `app/trades/page.tsx` | 384 | 历史交易(筛选、排序、详情) |
|
||||
| `app/server/page.tsx` | 279 | 服务器监控(PM2进程 + CPU/内存 + PG状态) |
|
||||
| `app/kline/page.tsx` | 170 | K线图 |
|
||||
| `app/live/page.tsx` | 130 | 实时数据流 |
|
||||
| `app/dashboard/page.tsx` | 112 | 仪表盘 |
|
||||
| `app/login/page.tsx` | 75 | 登录 |
|
||||
| `app/register/page.tsx` | 88 | 注册(邀请码) |
|
||||
| `app/about/page.tsx` | 81 | 关于 |
|
||||
| `app/layout.tsx` | 34 | 全局布局 |
|
||||
|
||||
### 4.2 组件
|
||||
|
||||
| 文件 | 行数 | 功能 |
|
||||
|------|------|------|
|
||||
| `components/Sidebar.tsx` | 139 | 侧边导航栏 |
|
||||
| `components/LiveTradesCard.tsx` | 124 | 实时交易卡片组件 |
|
||||
| `components/FundingChart.tsx` | 95 | 资金费率图表(Recharts) |
|
||||
| `components/RateCard.tsx` | 82 | 费率展示卡片 |
|
||||
| `components/Navbar.tsx` | 71 | 顶部导航 |
|
||||
| `components/StatsCard.tsx` | 57 | 统计卡片 |
|
||||
| `components/AuthHeader.tsx` | 37 | 认证状态头部 |
|
||||
|
||||
### 4.3 工具库
|
||||
|
||||
| 文件 | 行数 | 功能 |
|
||||
|------|------|------|
|
||||
| `lib/auth.tsx` | 137 | JWT管理(存储/刷新/authFetch封装) |
|
||||
| `lib/api.ts` | 116 | API请求基础封装 |
|
||||
|
||||
---
|
||||
|
||||
## 五、数据库Schema
|
||||
|
||||
### PostgreSQL(Cloud SQL)
|
||||
|
||||
**核心表:**
|
||||
|
||||
| 表名 | 说明 | 数据量 |
|
||||
|------|------|--------|
|
||||
| `agg_trades` | aggTrades分区父表 | 7039万+ |
|
||||
| `agg_trades_202602` | 2月分区 | 6854万 |
|
||||
| `agg_trades_202603` | 3月分区 | 185万+ |
|
||||
| `agg_trades_meta` | 每币种最新agg_id | 4条 |
|
||||
| `signal_indicators` | 信号评分记录(每15秒×4币种) | 2.7万+ |
|
||||
| `market_indicators` | 市场指标(每5分钟×4币种×5指标) | 5400+ |
|
||||
| `paper_trades` | 模拟盘交易记录 | 163+ |
|
||||
| `liquidations` | 清算事件原始记录 | 3600+ |
|
||||
| `rate_snapshots` | 资金费率快照(旧,K线图用) | 12万+ |
|
||||
| `users` | 用户表 | 1 |
|
||||
| `invite_codes` | 邀请码 | 1 |
|
||||
| `subscriptions` | 订阅信息 | 1 |
|
||||
| `refresh_tokens` | JWT刷新令牌 | — |
|
||||
| `signal_indicators_1m` | 1分钟粒度信号(备用) | — |
|
||||
| `signal_trades` | 信号交易记录(旧) | — |
|
||||
| `signal_logs` | 信号日志(旧) | — |
|
||||
|
||||
---
|
||||
|
||||
## 六、PM2进程列表
|
||||
|
||||
| 进程名 | 文件 | 端口 | 说明 |
|
||||
|--------|------|------|------|
|
||||
| `arb-api` | backend/main.py | 4332 | FastAPI后端 |
|
||||
| `arb-web` | frontend/ | 4333 | Next.js前端 |
|
||||
| `signal-engine` | backend/signal_engine.py | — | 信号评估引擎 |
|
||||
| `paper-monitor` | backend/paper_monitor.py | — | 模拟盘TP/SL监控 |
|
||||
| `agg-collector` | backend/agg_trades_collector.py | — | aggTrades采集 |
|
||||
| `market-collector` | backend/market_data_collector.py | — | 市场指标采集 |
|
||||
| `liq-collector` | backend/liquidation_collector.py | — | 清算数据采集 |
|
||||
|
||||
---
|
||||
|
||||
## 七、信号源清单
|
||||
|
||||
| # | 信号源 | 采集方式 | 存储 | 评分使用 |
|
||||
|---|--------|---------|------|---------|
|
||||
| 1 | CVD三轨(fast 30m / mid 4h) | aggTrades WS实时计算 | 内存 | ✅ 方向层 |
|
||||
| 2 | P99大单流 | aggTrades实时统计 | 内存 | ✅ 方向层 |
|
||||
| 3 | CVD加速度 | CVD差分计算 | 内存 | ✅ 方向层+5 bonus |
|
||||
| 4 | 多空比 + 大户持仓比 | Binance REST 5min | market_indicators | ✅ 拥挤层 |
|
||||
| 5 | OI变化率 | Binance REST 5min | market_indicators | ✅ 环境层 |
|
||||
| 6 | Coinbase Premium | Coinbase+Binance价差 | market_indicators | ✅ 辅助层 |
|
||||
| 7 | Funding Rate | Binance REST 5min | market_indicators | ⬜ 采集中 |
|
||||
| 8 | 清算数据 | Binance WS forceOrder | liquidations + market_indicators | ⬜ 采集中 |
|
||||
|
||||
---
|
||||
|
||||
## 八、模拟盘配置
|
||||
|
||||
| 参数 | 值 |
|
||||
|------|-----|
|
||||
| 初始资金 | $10,000 |
|
||||
| 单笔风险 | 2%($200 = 1R) |
|
||||
| 最大同时持仓 | 4个 |
|
||||
| TP1 | 1.5× ATR(平半仓) |
|
||||
| TP2 | 3.0× ATR(平剩余) |
|
||||
| SL | 1.0× ATR |
|
||||
| 手续费 | Taker 0.05% × 2(开仓+平仓) |
|
||||
| 反向信号 | 先平仓再开新仓 |
|
||||
| 冷却时间 | 同币种同方向300秒 |
|
||||
|
||||
---
|
||||
|
||||
## 九、部署信息
|
||||
|
||||
| 项目 | 详情 |
|
||||
|------|------|
|
||||
| 运行服务器 | GCP asia-northeast1-b (n2-standard-2, 2核8G) |
|
||||
| 数据库 | GCP Cloud SQL PG18 (8核64G 100G) |
|
||||
| Cloud SQL 内网IP | 10.106.0.3 |
|
||||
| Cloud SQL 公网IP | 34.85.117.248 |
|
||||
| Web访问 | https://arb.zhouyangclaw.com |
|
||||
| Git仓库 | https://git.darkerilclaw.com/lulu/arbitrage-engine.git |
|
||||
| 反向代理 | Caddy(SSL自动) |
|
||||
|
||||
---
|
||||
|
||||
## 十、版本路线图
|
||||
|
||||
| 版本 | 状态 | 内容 |
|
||||
|------|------|------|
|
||||
| V5.0 | ✅ 完成 | 基础信号系统 + PG迁移 |
|
||||
| V5.1 | ✅ 当前 | 5层评分 + 模拟盘 + 6信号源评分 + 2信号源采集 |
|
||||
| V5.2 | 📋 计划 | FR+清算加入评分 + 策略配置化 + AB测试 + 24h warmup |
|
||||
| V5.3 | 📋 远期 | 推特新闻情绪信号(多模型投票制) |
|
||||
|
||||
---
|
||||
|
||||
## 十一、已知问题与待改进
|
||||
|
||||
1. **signal_pusher.py 已废弃**:仍用SQLite,应删除或重写
|
||||
2. **subscriptions.py 空文件**:预留的订阅系统未实现
|
||||
3. **history/page.tsx 空页面**:只有5行占位代码
|
||||
4. **冷启动warmup只有4小时**:P99大单需要24小时数据(V5.2改进)
|
||||
5. **开仓价用信号评估价**:实盘需改为真实成交价
|
||||
6. **双写机制**:切主库后agg_collector的本地双写可关闭
|
||||
7. **前端缺少错误边界**:API异常时无友好提示
|
||||
Loading…
Reference in New Issue
Block a user