用 Go 1.26 实现缠论分析管线: 包含处理 → 分型 → 笔 → 中枢 → 走势分类 → 背驰(趋势/盘整)→ 六类买卖点 + 实时增量 WebSocket。
- Go 1.26(
~/Library/Go/1.26.4,由~/.go.env配置环境变量) - 标准库
net/http+encoding/json;WebSocket 用github.com/gorilla/websocketv1.5.3 - 数值
float64(Go 无内置 decimal):RoundTo用strconv最短十进制表示 +math/big.Rat精确 half-up 舍入
cmd/server/
├── main.go # REST + WebSocket /ws/chan + 静态页(go:embed,页面嵌入二进制)
└── web/ # 前端页面(复用 chan4j 单文件页面,同源 WS)
internal/
├── core/
│ ├── models.go # KRow/Fractal/Stroke/Center/ChanSignal/Classification/BuySellPoint
│ ├── chan.go # MergeKlines→FindFractals→MergeSame→BuildStrokes→FindCenters→Classify→HistArea→StrokePoints
│ ├── divergence.go # ChanDivergenceV3(一买/一卖)+ FindSignalsChanV5(盘整预警)
│ ├── buysell.go # 六类买卖点(一二三买/卖 + 盘整类)+ LatestByKind + PointColor
│ ├── indicators.go # Ema/Rsi/Macd/Bollinger/Atr + RoundTo
│ ├── kline.go # Binance kline 解析、UTC 时间格式化/反解
│ ├── helpers.go
│ └── testdata/ # 真实数据(四周期)
├── service/
│ ├── analysis.go # 全量管线 rows→ChanResultDto(指标+缠论+买卖点+方向)
│ ├── incremental.go # 窗口机制(maxRows 裁剪 + MIN_HISTORY=3000 下限)+ 全量重算(mutex 保护)
│ └── binance.go # REST 拉取 + WS 订阅(gorilla Dialer,断线指数退避重连)
└── dto/dto.go # 输出 DTO(与 TS/Java/C# 同构,camelCase 序列化)
source ~/.go.env # 加载 Go 环境(GOROOT/GOPATH/PATH)
go build ./... # 编译
go vet ./... # 静态检查
go test ./... # 全部测试
go run ./cmd/server # 启动,端口 8926| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health |
健康检查 |
| POST | /api/analyze?interval=30m |
body 为 K 线 JSON:Binance 数组格式 [[ms,o,h,l,c,v,...],...] 或行格式 [{t,o,h,l,c,v},...] 或 {data:[...]} |
| GET | /api/analyze?symbol=ETHUSDT&interval=30m&limit=1000 |
Binance 拉取后分析(spot klines 单次上限 1000) |
响应结构:meta[badge/signals/currentPrice/latestBuy/latestSell/direction/summary] + chart[candles/strokes/centerBoxes/markers/ema20/ema50/volume/hist/macd/sig](camelCase)。
- 端点:
WS /ws/chan?interval=30m - 连接后先推送全量分析结果,再订阅 Binance
kline_<interval>流 - 每根 K 线:进行中(
x:false)→UpdateLast;收盘(x:true)→Append(超窗口裁剪最旧行)→ 全量重算 → 推送最新结果 - Binance WS 断线自动重连(指数退避);客户端断开即取消订阅
- 每次订阅独立连接,
Close只关闭自己的连接(无共享状态泄漏);分析器sync.Mutex保护并发访问
| 周期 | K线 | 笔 | 中枢 | 六类买卖点 |
|---|---|---|---|---|
| 15m | 5876 | 914 | 93 | 270 |
| 30m | 2934 | 461 | 49 | 145 |
| 1h | 1467 | 246 | 35 | 82 |
| 日线 | 120 | 18 | 3 | 5 |
- 增量一致性:分批追加 / 进行中 K 线跳动 / 随机混合 30 轮 / 快照 / 窗口裁剪 / 短历史启动,笔/中枢/买卖点与全量重算逐字段一致
- 已知实现注意:
sort.Slice不稳定排序——买卖点只排序一次(FindBuySellPoints 内),BuildDataset 不二次排序
http://localhost:8926/(单文件页面 go:embed 嵌入二进制,WS 同源自动适配端口):K线+EMA+笔+中枢框+买卖点标记 / MACD 副图(时间轴同步)/ 信号面板 / 方向指示 / 周期切换 / 断线重连。
