feat: 重构为三所价差异动监控系统

删除 HyperLiquid + 全部交易功能,构建自适应 surge 检测器。
- 新增 surge_detector.go: 每币独立滚动窗口基线,检测三所价差异常飙升
- 新增 SpreadCard/SurgeCard 前端组件
- 保留 momentum/trend/cumulative/trend_filter 扫描功能
- 更新文档和配置以反映新系统

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
jackyu66git
2026-05-08 02:01:18 +08:00
co-authored by Claude Opus 4.6
parent 559d7bb870
commit d38782490c
36 changed files with 1201 additions and 6374 deletions
+59 -73
View File
@@ -1,33 +1,38 @@
# ⚡ 跨交易所永续合约套利监控
# 三所价差异动监控
Bitget ↔ HyperLiquid 跨交易所永续合约价差套利系统。支持模拟盘/实盘交易、价差监控、自动开仓/加仓/平仓、Web 仪表盘
Binance + OKX + Bitget 三交易所价差异动实时检测系统。通过追踪不同交易所之间的价差异常,捕捉币价「启动」的瞬间
## 功能特点
- **实时价差监控** — 200ms 扫描间隔,追踪 DOGE/LINK/ONDO/OP/WIF/ARB 六个币种
- **自动套利交易** — 价差超过阈值自动开仓,收敛自动平仓,支持多级加仓
- **模拟/实盘双模式** — `TestMode` 控制,模拟模式无需真实 API Key
- **三所价差扫描** — 实时计算 Binance/OKX/Bitget 之间的最大价差,按价差排序展示
- **自适应 Surge 检测** — 每个币维护独立的滚动窗口基线,检测价差异常飙升
- **方向判断** — 根据领先交易所判断上涨/下跌启动方向
- **动量扫描** — 多时间窗口 (1s/5s/15s/60s) 价格变动率追踪
- **趋势检测** — 跨交易所一致性确认的趋势状态机 (idle→alert→confirmed→exhausting)
- **累积变动** — 1m/5m/1h 多交易所共识变动追踪
- **趋势过滤** — K 线数据 + EMA52 趋势过滤,识别安静后的异动
- **Web 仪表盘** — Go 内置 HTTP Server + Vite React 前端,SSE 实时推送
- **SQLite 持久化** — 交易记录、订单明细、手续费明细全量存储
- **手续费精确计算** — 逐笔累加实际 USD 手续费(开仓费+平仓费),非百分比估算
- **交易所独立资金管理** — 每交易所 $500 初始资金,开仓前检查两边余额充足
- **模拟滑点** — 可配置 `mock_slippage_pct`,模拟真实滑点对净利的影响
- **持仓详情弹窗** — 点击持仓卡片查看完整交易详情(价差、PnL、手续费分腿)
- **Telegram 通知** — 开仓/平仓/异常实时推送
- **SQLite 持久化** — Surge 事件、累积变动事件全量存储
## 架构
```
┌─────────────────────────────────────────────────┐
scanner.go ← 每 200ms 扫描价差
│ ↓ 发现机会 (NetProfit > 阈值)
trader.go ← 开仓/加仓/平仓逻辑
│ ↓ 持久化
db/ ← SQLite (trades / orders / system)
│ ↓ SSE 推送
dashboard.go ← HTTP Server :8888
frontend/ ← Vite + React 仪表盘
Exchange WS (Bitget + Binance + OKX)
│ ↓ 价格推送
PriceStore ← 内存价格存储
│ ↓
scanner.go ← 三所价差扫描
│ ↓
surge_detector.go ← 自适应Surge检测
momentum.go ← 动量扫描
trend.go ← 趋势检测
│ cumulative.go ← 累积变动追踪 │
│ trend_filter.go ← K线趋势过滤 │
│ ↓ SSE 推送 │
│ dashboard.go ← HTTP Server :8888 │
│ ↓ │
│ frontend/ ← Vite + React 仪表盘 │
└─────────────────────────────────────────────────┘
```
@@ -39,22 +44,29 @@ Bitget ↔ HyperLiquid 跨交易所永续合约价差套利系统。支持模拟
```json
{
"arb_threshold": 0.3,
"scan_interval_ms": 200,
"trade_enabled": true,
"test_mode": true,
"trade_threshold": 0.20,
"take_profit_pct": 0.20,
"mock_slippage_pct": 0.05,
"trade_amount_usd": 5,
"max_positions": 5,
"initial_capital": 500,
"taker_fee_bitget": 0.060,
"taker_fee_hyperliquid": 0.045,
"telegram_bot_token": "xxx",
"telegram_chat_id": "xxx"
"alert_cooldown_sec": 300,
"surge_enabled": true,
"surge_window_size": 600,
"surge_baseline_multiplier": 3.0,
"surge_min_abs_spread_pct": 0.05,
"surge_cooldown_sec": 60,
"momentum_enabled": true,
"momentum_threshold_pct": 0.25,
"trend_enabled": true,
"trend_baseline_window": 600,
"trend_anomaly_mul": 3.0,
"trend_confirm_ticks": 3,
"trend_alert_cooldown_ms": 60000
}
```
环境变量 (`.env`):
- `BITGET_API_KEY`, `BITGET_API_SECRET`, `BITGET_PASSPHRASE` — Bitget API
- `BINANCE_API_KEY`, `BINANCE_API_SECRET` — Binance API (可选,用于K线)
- `HTTPS_PROXY` — 网络代理 (国内环境需要)
### 2. 启动
```bash
@@ -79,54 +91,28 @@ npm run dev # 开发模式 (Vite HMR :5173)
npm run build # 构建生产版本
```
后端优先从 `frontend/dist/` 读取静态文件(热加载),回退到 Go embed。
## 配置参数
| 参数 | 说明 | 默认 |
|------|------|------|
| `scan_interval_ms` | 扫描间隔 (ms) | 200 |
| `trade_threshold` | 开仓净利阈值 (%) | 0.20 |
| `take_profit_pct` | 止盈净利 (%) | 0.20 |
| `mock_slippage_pct` | 模拟滑点 (%) | 0.05 |
| `trade_amount_usd` | 每腿交易额 ($) | 5 |
| `max_positions` | 最大并行持仓 | 5 |
| `taker_fee_bitget` | Bitget 吃单费率 (%) | 0.060 |
| `taker_fee_hyperliquid` | HyperLiquid 吃单费率 (%) | 0.045 |
| `scale_step_pct` | 加仓步长 (%) | 0.10 |
| `position_timeout` | 最长持仓时间 | 10m |
| `leg_delay` | 两腿下单间隔 | 300ms |
| `initial_capital` | 每交易所初始资金 ($) | 500 |
| `surge_enabled` | 启用 Surge 检测 | true |
| `surge_window_size` | 滚动窗口样本数 | 600 |
| `surge_baseline_multiplier` | 基线倍数(阈值 = 基线 × N) | 3.0 |
| `surge_min_abs_spread_pct` | 最小绝对价差 % | 0.05 |
| `surge_cooldown_sec` | 同币冷却秒数 | 60 |
| `momentum_enabled` | 启用动量扫描 | true |
| `trend_enabled` | 启用趋势检测 | true |
| `trend_baseline_window` | 趋势基线窗口 | 600 |
| `trend_anomaly_mul` | 异常检测倍数 | 3.0 |
| `trend_confirm_ticks` | 确认所需次数 | 3 |
## 数据库
SQLite (`data/trades.db`)三张核心表:
SQLite (`data/trades.db`),核心表:
| 表 | 说明 |
|----|------|
| `trades` | 交易主表 — 价差、PnL、手续费 ($) |
| `orders` | 订单明细 — 每腿的开仓/加仓/平仓、手续费 ($) |
| `system_orders` | 系统订单 — 双向关联 long↔short 订单 |
## 版本历史
### v1.3 (当前)
-**交易所独立资金管理** — 每交易所 $500 初始资金,开仓前检查余额
-**持仓点击详情弹窗** — 点击持仓卡片弹出完整交易详情
-**模拟滑点** — 新增 `mock_slippage_pct` 配置,模拟真实成交滑点
-**止损硬编码** — 取消 `SpreadReverseExitPct` 配置,价差 <= 0 硬止损
- 🐛 修复 DB 迁移 tab 字符损坏导致历史交易数据不显示
- 📊 PnL 统计分腿存储(`pnl_long_usd`/`pnl_short_usd`/`fee_long_usd`/`fee_short_usd`
### v1.2.1
- ✨ scale-in 后 leg.EntryPrice 更新为加权平均(`weightedAvgPrice`
- ✨ 进程重启恢复仓位时,从 `orders` 表加载 scale prices,重建完整价格切片
- ✨ 新增 `GetScalePrices()` DB 方法
### v1.2
-`system_orders` 表,记录系统级开仓/加仓/平仓
- ✨ 手续费改为逐笔累加 USD,不再用百分比估算
- ✨ Vite + React 前端,支持热加载
- ✨ Web 仪表盘持仓 PnL 美元化显示
- 🐛 修复 `persistTrade` 费用在 `SaveTrade` 后才累加导致 fee=0 的 bug
- 🗑 移除老版 Chart.js 图表
| `surge_events` | Surge 异动事件 — 币种、价格、价差、方向、领先交易所 |
| `cm_events` | 累积变动事件 — 1m/5m/1h 多所共识变动 |
| `trend_events` | 趋势状态变迁 — idle→alert→confirmed→exhausting 全生命周期 |
| `trend_signals` | 趋势过滤信号 — K 线安静 + EMA 异动信号记录 |