feat: 新增 Wiki 基础理论和流程图解模块

基础理论:
- 量化交易入门指南(零基础友好,含学习路径)

流程图解(3个完整流程图):
- 信号系统完整流程图(总体/评分/EWO转换/大周期过滤)
- 交易策略执行流程(通用流程/EWO决策树/MTF协同/风控)
- 数据采集与处理流程(API获取/缓存管理/指标计算/质量检查)

所有内部链接均指向仓库内文档,无外部链接
这个提交包含在:
Manus Quant Agent
2026-03-05 23:18:29 -05:00
父节点 baf10a9e91
当前提交 e75a2340d9
修改 4 个文件,包含 1010 行新增0 行删除

查看文件

@@ -0,0 +1,232 @@
# 数据采集与处理流程
> 返回:[Wiki 主索引](../README.md)
> 相关文档:[数据采集与处理流程](../../06_数据流程/数据采集与处理流程.md)
## 概述
本文档说明量化交易系统中数据从交易所 API 到信号计算的完整流程,包括数据获取、清洗、存储和实时更新。
---
## 一、Binance API 数据获取流程
```
┌─────────────────────────────────────────────────────────────┐
│ Binance API 端点 │
│ │
│ REST API历史数据
│ GET /api/v3/klines │
│ 参数symbol, interval, limit最多1000根
│ │
│ WebSocket实时数据
│ wss://stream.binance.com:9443/ws/{symbol}@kline_{interval} │
└──────────────────────┬──────────────────────────────────────┘
┌────────────┴────────────┐
▼ ▼
┌─────────────────┐ ┌──────────────────────┐
│ 初始化加载 │ │ 实时更新 │
│ (启动时) │ │ (持续运行) │
│ │ │ │
│ 拉取最近300根 │ │ WebSocket 推送 │
│ K线数据 │ │ 每根K线实时更新 │
│ 存入 pairCache │ │ 收线时触发信号检测 │
└────────┬────────┘ └──────────┬───────────┘
│ │
└────────────┬──────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 数据格式标准化 │
│ │
│ 原始 Binance K线格式
│ [openTime, open, high, low, close, volume, │
│ closeTime, quoteVolume, trades, ...] │
│ │
│ 标准化后的 Candle 格式: │
│ { time: number, // Unix 时间戳(秒) │
│ open: number, // 开盘价 │
│ high: number, // 最高价 │
│ low: number, // 最低价 │
│ close: number, // 收盘价 │
│ volume: number } // 成交量 │
└──────────────────────────────────────────────────────────────┘
```
---
## 二、K线缓存管理流程
```
pairCache 缓存结构:
Map<"BTCUSDT__10m", {
candles: Candle[], // 最多 300 根
updatedAt: number // 最后更新时间
}>
┌─────────────────────────────────────────────────────────────┐
│ 缓存更新策略 │
│ │
│ 每30秒轮询
│ 1. 检查缓存是否过期(> 30秒
│ 2. 调用 Binance REST API 获取最新 K 线 │
│ 3. 合并新数据到缓存(去重、排序) │
│ 4. 保留最近 300 根(超出则删除最旧的) │
│ 5. 更新 updatedAt 时间戳 │
│ │
│ WebSocket 实时更新: │
│ 1. 收到 kline 消息 │
│ 2. 判断是否已收线x: true
│ 3. 已收线 → 更新缓存中最后一根 K 线 │
│ 4. 触发信号检测 │
└──────────────────────────────────────────────────────────────┘
```
---
## 三、指标计算数据流
```
输入Candle[] 数组300根K线
┌─────────────────────────────────────────────────────────────┐
│ 提取价格序列 │
│ closes = candles.map(c => c.close) │
│ highs = candles.map(c => c.high) │
│ lows = candles.map(c => c.low) │
│ volumes = candles.map(c => c.volume) │
│ midPrices = candles.map(c => (c.high + c.low) / 2) │
└──────────────────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 基础指标计算(所有指标的基础) │
│ │
│ EMA(5) = 指数移动平均周期5
│ EMA(10) = 指数移动平均周期10
│ EMA(20) = 指数移动平均周期20
│ EMA(35) = 指数移动平均周期35
│ │
│ 计算公式: │
│ EMA[i] = price[i] × k + EMA[i-1] × (1-k) │
│ k = 2 / (period + 1) │
└──────────────────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 衍生指标计算 │
│ │
│ EWO = EMA(5) - EMA(35) │
│ MACD = EMA(10) - EMA(20) │
│ MACD信号线 = EMA(MACD, 10) │
│ MACD柱 = MACD - 信号线 │
│ │
│ AO = SMA(midPrices, 5) - SMA(midPrices, 34) │
│ │
│ RSI = 100 - 100/(1 + RS) │
│ RS = 平均涨幅(14) / 平均跌幅(14) │
└──────────────────────┬──────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 信号评分计算 │
│ (见:信号系统完整流程图) │
└──────────────────────────────────────────────────────────────┘
```
---
## 四、数据质量检查流程
```
原始 K 线数据
┌─────────────────────────────────────┐
│ 完整性检查 │
│ ├─ 时间戳连续性(无缺口) │
│ ├─ OHLC 逻辑合理性 │
│ │ high >= max(open, close) │
│ │ low <= min(open, close) │
│ └─ 成交量 >= 0 │
└──────────────────┬──────────────────┘
┌─────────────────────────────────────┐
│ 异常值处理 │
│ ├─ 价格跳空(> 20%)→ 标记警告 │
│ ├─ 成交量异常(> 10倍均值→ 标记 │
│ └─ 零成交量 → 使用前一根数据填充 │
└──────────────────┬──────────────────┘
┌─────────────────────────────────────┐
│ 数据量检查 │
│ K线数量 >= 35 根? │
│ ├─ 否 → 返回 null数据不足
│ └─ 是 → 继续计算 │
└─────────────────────────────────────┘
```
---
## 五、多数据源整合流程(扩展方案)
```
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ Binance │ │ Glassnode│ │Coinglass │ │ CoinGecko│
│ K线数据 │ │ 链上数据 │ │ 资金费率 │ │ 恐惧指数 │
└────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │ │
└──────────────┴──────────────┴──────────────┘
┌──────────────────────┐
│ 数据聚合层 │
│ 统一时间戳 │
│ 标准化格式 │
│ 缺失值处理 │
└──────────┬───────────┘
┌──────────────────────┐
│ 多维度信号引擎 │
│ 技术指标层权重60%)│
│ 链上数据层权重25%)│
│ 情绪指标层权重15%)│
└──────────────────────┘
```
---
## 六、数据存储策略
| 数据类型 | 存储位置 | 保留时间 | 更新频率 |
|---------|---------|---------|---------|
| 实时 K 线 | 内存缓存pairCache | 300根 | 30秒 |
| 行情数据 | 内存缓存tickerCache | 最新1条 | 30秒 |
| 交易信号 | MySQLsignals 表) | 永久 | 实时 |
| 用户配置 | MySQLuser_settings 表) | 永久 | 用户操作时 |
| 历史 K 线 | 本地文件Parquet/CSV | 按需 | 手动下载 |
| 链上数据 | 本地文件JSON/CSV | 按需 | 每日更新 |
---
## 七、API 速率限制处理
Binance API 有速率限制,需要合理规划请求频率:
| API 类型 | 限制 | tradehk 处理方式 |
|---------|------|----------------|
| REST APIK线| 1200 请求/分钟 | 30秒轮询,每次批量获取 |
| REST API行情| 1200 请求/分钟 | 与K线合并请求 |
| WebSocket | 300 连接/5分钟 | 复用连接,不频繁重连 |
**注意**:监控超过 20 个币对时,建议将轮询间隔调整为 60 秒,避免触发速率限制。
## 相关文档
- [数据采集与处理流程](../../06_数据流程/数据采集与处理流程.md) — 详细数据流程
- [tradehk 数据库与存储](../tradehk/数据库与存储.md) — 存储机制
- [链上数据分析指南](../../10_链上数据分析/链上数据分析指南.md) — 链上数据扩展