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

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-08 02:01:18 +08:00

122 lines
5.7 KiB
Markdown
Raw Permalink 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.
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Project Overview
3-exchange spread surge detection system using Binance, OKX, and Bitget. Scans ~150 coins for inter-exchange price spread anomalies, detects surge events with per-coin adaptive baselines, and displays real-time data on a React dashboard.
## Build & Run Commands
```bash
# Build Go binary
go build -o exchange-monitor .
# Start (kills old process + builds if needed + runs)
bash start.sh
# Options: --clean (delete DB), --rebuild (force recompile)
bash start.sh --clean --rebuild
# Frontend dev (hot reload on :5173, proxies /api to :8888)
cd frontend && npm run dev
# Frontend production build
cd frontend && npm run build
```
## Architecture
### Data Flow
```
Exchange WS (Bitget + Binance + OKX) → PriceStore (in-memory)
scanner (Scan3Ex)
┌───────────────┼───────────────┐
↓ ↓ ↓
surge_detector momentum.go trend.go
cumulative.go trend_filter.go
↓ ↓ ↓
dashboard (SSE hub, :8888)
React frontend (SSE events)
```
### Main Loop (main.go)
Fixed 50ms tick: reads snap from PriceStore → Scan3Ex() → surgeDetector.Tick() → momentum.Tick() etc. Every 30s: status log. Hourly: Telegram summary.
### Package Layout
| Package | Files | Responsibility |
|---------|-------|---------------|
| `main` (root) | `main.go`, `scanner.go`, `dashboard.go`, `config.go`, `types.go`, `surge_detector.go`, `momentum.go`, `trend.go`, `cumulative.go`, `trend_filter.go` | All core logic in a single flat package |
| `exchange/` | `connector.go`, `bitget.go`, `binance.go`, `okx.go`, `helpers.go` | WS reconnector + exchange-specific REST/WS APIs |
| `db/` | `db.go`, `surge_event_repo.go` | SQLite persistence (surge_events, cm_events, trend_events, trend_signals) |
| `frontend/` | Vite + React | Real-time dashboard consuming SSE from backend |
### Key Types
- **PriceStore** — Thread-safe in-memory map of coin→exchange→price, with bid/ask spread tracking
- **ThreeExSpread** — 3-exchange scan result: coin, prices, spread %, max/min exchange
- **SurgeDetector** — Per-coin adaptive baseline surge detection with rolling window median
- **SurgeEvent** — Detected surge: coin, prices, spread, baseline, direction, leading exchange
- **MomentumTracker** — Multi-window (1s/5s/15s/60s) price change tracking per exchange
- **TrendDetector** — Cross-exchange trend state machine (idle→alert→confirmed→exhausting)
- **CumulativeTracker** — 1m/5m/1h consensus change tracking across exchanges
- **TrendFilter** — K-line based quiet detection + EMA52 trend filtering
### Exchange Connector
`PriceConnector` (exchange/connector.go) is a reusable WebSocket reconnector with exponential backoff (1s-30s), configurable ping interval, and read deadline. Bitget uses text ping frames; Binance and OKX use standard ping/pong.
### Surge Detection Logic
- **Adaptive baseline**: Per-coin rolling window (600 samples, ~30s at 50ms tick) of 3-exchange max spreads
- **Threshold**: median(spreads) × multiplier (default 3.0), with min floor (0.05%)
- **Trigger**: currentSpread > threshold AND cooldown (60s) passed
- **Direction**: Compare highest exchange deviation from median vs lowest exchange deviation
- **Leading exchange**: The exchange furthest from median price (first to reflect price move)
### Configuration Priority
`.env` vars > `config.json` > code defaults. Config struct in `config.go`.
Key env vars: `BITGET_API_KEY`, `BITGET_API_SECRET`, `BITGET_PASSPHRASE`, `BINANCE_API_KEY`, `BINANCE_API_SECRET`, `HTTPS_PROXY`, `TELEGRAM_BOT_TOKEN`, `TELEGRAM_CHAT_ID`.
### Dashboard API
| Endpoint | Description |
|----------|-------------|
| `GET /` | Serves index.html (disk first, fallback embed) |
| `GET /api/status` | Current prices snapshot |
| `GET /events` | SSE stream (prices, spread_3ex, momentum, trend, cumulative, trend_filter, surge, status) |
| `GET /api/history?coin=&exchange=` | Price history ring buffer (500 pts) |
| `GET /api/spread-history?coin=` | 3-exchange spread history |
| `GET /api/surge-events?limit=` | Surge event history from DB or memory |
| `GET /api/cm-history` | Cumulative change event history |
| `GET /api/trend-signals` | Trend filter signal history |
| `GET /api/connections` | Exchange WS health (online/stale/offline) |
### SSE Events
| Event | Data | Frequency |
|-------|------|-----------|
| `prices` | All coin prices + 3-ex spread | Every tick |
| `spread_3ex` | Top 3-ex spreads scan results | Every tick |
| `momentum` | Multi-window price change % | Every tick |
| `trend` | Trend state machine snapshots | Every tick |
| `cumulative` | Cumulative consensus changes | Every tick |
| `trend_filter` | K-line filter states | Every tick |
| `trend_signal` | Individual trend signal (enter/exit) | On event |
| `surge` | Current spread/baseline snapshots | Every tick |
| `surge_event` | New surge detection event | On detection |
| `status` | Connection health + coin count | Every tick |
### Database
SQLite at `~/Project/exchange-monitor-go/data/trades.db` (single-writer mode). Tables: `surge_events`, `cm_events`, `trend_events`, `trend_signals`.
### Coin Tracking
~150 coins in `TrackedCoins` slice (scanner.go). Each entry has Name, BN (Binance symbol), BG (Bitget symbol), OKX (OKX symbol). Active WebSocket connections: Bitget + Binance + OKX.