# 数据采集与处理流程 > 返回:[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秒 | | 交易信号 | MySQL(signals 表) | 永久 | 实时 | | 用户配置 | MySQL(user_settings 表) | 永久 | 用户操作时 | | 历史 K 线 | 本地文件(Parquet/CSV) | 按需 | 手动下载 | | 链上数据 | 本地文件(JSON/CSV) | 按需 | 每日更新 | --- ## 七、API 速率限制处理 Binance API 有速率限制,需要合理规划请求频率: | API 类型 | 限制 | tradehk 处理方式 | |---------|------|----------------| | REST API(K线)| 1200 请求/分钟 | 30秒轮询,每次批量获取 | | REST API(行情)| 1200 请求/分钟 | 与K线合并请求 | | WebSocket | 300 连接/5分钟 | 复用连接,不频繁重连 | **注意**:监控超过 20 个币对时,建议将轮询间隔调整为 60 秒,避免触发速率限制。 ## 相关文档 - [数据采集与处理流程](../../06_数据流程/数据采集与处理流程.md) — 详细数据流程 - [tradehk 数据库与存储](../tradehk/数据库与存储.md) — 存储机制 - [链上数据分析指南](../../10_链上数据分析/链上数据分析指南.md) — 链上数据扩展