Files
exchange-monitor-go/README.md
T

133 lines
5.0 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.
# ⚡ 跨交易所永续合约套利监控
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 图表