133 lines
5.0 KiB
Markdown
133 lines
5.0 KiB
Markdown
# ⚡ 跨交易所永续合约套利监控
|
||
|
||
Bitget ↔ HyperLiquid 跨交易所永续合约价差套利系统。支持模拟盘/实盘交易、价差监控、自动开仓/加仓/平仓、Web 仪表盘。
|
||
|
||
## 功能特点
|
||
|
||
- **实时价差监控** — 200ms 扫描间隔,追踪 DOGE/LINK/ONDO/OP/WIF/ARB 六个币种
|
||
- **自动套利交易** — 价差超过阈值自动开仓,收敛自动平仓,支持多级加仓
|
||
- **模拟/实盘双模式** — `TestMode` 控制,模拟模式无需真实 API Key
|
||
- **Web 仪表盘** — Go 内置 HTTP Server + Vite React 前端,SSE 实时推送
|
||
- **SQLite 持久化** — 交易记录、订单明细、手续费明细全量存储
|
||
- **手续费精确计算** — 逐笔累加实际 USD 手续费(开仓费+平仓费),非百分比估算
|
||
- **交易所独立资金管理** — 每交易所 $500 初始资金,开仓前检查两边余额充足
|
||
- **模拟滑点** — 可配置 `mock_slippage_pct`,模拟真实滑点对净利的影响
|
||
- **持仓详情弹窗** — 点击持仓卡片查看完整交易详情(价差、PnL、手续费分腿)
|
||
- **Telegram 通知** — 开仓/平仓/异常实时推送
|
||
|
||
## 架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────┐
|
||
│ scanner.go ← 每 200ms 扫描价差 │
|
||
│ ↓ 发现机会 (NetProfit > 阈值) │
|
||
│ trader.go ← 开仓/加仓/平仓逻辑 │
|
||
│ ↓ 持久化 │
|
||
│ db/ ← SQLite (trades / orders / system) │
|
||
│ ↓ SSE 推送 │
|
||
│ dashboard.go ← HTTP Server :8888 │
|
||
│ ↓ │
|
||
│ frontend/ ← Vite + React 仪表盘 │
|
||
└─────────────────────────────────────────────────┘
|
||
```
|
||
|
||
## 快速开始
|
||
|
||
### 1. 配置
|
||
|
||
编辑 `config.json`:
|
||
|
||
```json
|
||
{
|
||
"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"
|
||
}
|
||
```
|
||
|
||
### 2. 启动
|
||
|
||
```bash
|
||
# 一键启动(自动清理旧进程 + 编译 + 运行)
|
||
bash start.sh
|
||
|
||
# 清空数据库 + 启动
|
||
bash start.sh --clean
|
||
|
||
# 强制重新编译 + 启动
|
||
bash start.sh --rebuild
|
||
```
|
||
|
||
仪表盘地址:http://localhost:8888
|
||
|
||
### 3. 前端开发
|
||
|
||
```bash
|
||
cd frontend
|
||
npm install
|
||
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 |
|
||
|
||
## 数据库
|
||
|
||
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 图表
|