# 行情数据模块 这个模块提供了完整的行情数据管理功能,通过 WebSocket 实时获取 Binance 期货市场的行情数据,并在内存中缓存和管理。 ## 功能特性 - 🔄 **实时数据**: 通过 WebSocket 获取实时行情数据 - 💾 **内存缓存**: 高效的内存缓存机制,减少重复请求 - 🔄 **自动重连**: 网络断开时自动重连 - 📊 **多种数据类型**: 支持行情、K线、深度等多种数据 - 🎯 **事件驱动**: 基于事件的数据更新机制 - 🧹 **自动清理**: 自动清理过期数据,优化内存使用 ## 模块组成 ### 1. MarketDataManager 基础的 WebSocket 行情数据管理器,负责: - WebSocket 连接管理 - 数据订阅和取消订阅 - 原始数据处理 ### 2. MarketDataCache 缓存管理器,负责: - 内存数据缓存 - 数据过期管理 - 内存使用优化 ### 3. EnhancedMarketManager 增强的行情管理器,整合了: - WebSocket 连接 - 缓存管理 - 便捷的数据访问方法 ## 快速开始 ### 基本使用 ```typescript import { EnhancedMarketManager } from './market' // 创建行情管理器 const marketManager = new EnhancedMarketManager({ enableCache: true, cacheConfig: { maxKlineRecords: 500, maxDepthLevels: 10, cleanupInterval: 30000, maxAge: 60000, }, }) // 初始化连接 await marketManager.initialize() // 订阅行情数据 marketManager.subscribeMarketData(['BTCUSDT', 'ETHUSDT'], ['1m', '5m']) // 监听数据更新 marketManager.on('marketData', data => { console.log(`${data.symbol}: $${data.price}`) }) // 获取当前价格 const btcPrice = marketManager.getCurrentPrice('BTCUSDT') console.log(`BTC 当前价格: $${btcPrice}`) ``` ### 高级使用 ```typescript // 监听所有事件 marketManager.on('connected', () => { console.log('WebSocket 连接成功') }) marketManager.on('disconnected', (code, reason) => { console.log(`连接断开: ${code} - ${reason}`) }) marketManager.on('ticker24hr', data => { console.log(`${data.symbol} 24h涨跌幅: ${data.priceChangePercent}%`) }) marketManager.on('kline', data => { console.log(`${data.symbol} ${data.interval} K线: ${data.close}`) }) marketManager.on('depth', data => { console.log(`${data.symbol} 深度数据更新`) }) // 获取各种数据 const marketData = marketManager.getMarketData('BTCUSDT') const ticker24hr = marketManager.getTicker24hr('BTCUSDT') const klines = marketManager.getKlineData('BTCUSDT', '1m', 10) const depth = marketManager.getDepthData('BTCUSDT') // 获取分析数据 const spread = marketManager.getSpread('BTCUSDT') const spreadPercent = marketManager.getSpreadPercent('BTCUSDT') const isUp = marketManager.isPriceUp('BTCUSDT') const isDown = marketManager.isPriceDown('BTCUSDT') // 获取排序数据 const symbolsByPrice = marketManager.getSymbolsByPrice('desc') const symbolsByChange = marketManager.getSymbolsByChange('desc') ``` ## 数据类型 ### MarketData ```typescript interface MarketData { symbol: string price: number volume: number change: number changePercent: number high: number low: number open: number close: number timestamp: number bid: number ask: number bidSize: number askSize: number } ``` ### Ticker24hr ```typescript interface Ticker24hr { symbol: string priceChange: string priceChangePercent: string weightedAvgPrice: string prevClosePrice: string lastPrice: string lastQty: string bidPrice: string bidQty: string askPrice: string askQty: string openPrice: string highPrice: string lowPrice: string volume: string quoteVolume: string openTime: number closeTime: number firstId: number lastId: number count: number } ``` ### KlineData ```typescript interface KlineData { symbol: string interval: string openTime: number open: number high: number low: number close: number volume: number closeTime: number quoteVolume: number trades: number takerBuyBaseVolume: number takerBuyQuoteVolume: number } ``` ### DepthData ```typescript interface DepthData { symbol: string bids: [string, string][] // [price, quantity] asks: [string, string][] // [price, quantity] lastUpdateId: number } ``` ## 配置选项 ### EnhancedMarketManagerConfig ```typescript interface EnhancedMarketManagerConfig { wsUrl?: string // WebSocket URL reconnectInterval?: number // 重连间隔(毫秒) maxReconnectAttempts?: number // 最大重连次数 cacheConfig?: Partial // 缓存配置 enableCache?: boolean // 是否启用缓存 enableAutoReconnect?: boolean // 是否启用自动重连 enablePingPong?: boolean // 是否启用 Ping/Pong } ``` ### CacheConfig ```typescript interface CacheConfig { maxKlineRecords: number // 每个交易对每个时间间隔最大K线记录数 maxDepthLevels: number // 深度数据最大档位数 cleanupInterval: number // 清理间隔(毫秒) maxAge: number // 数据最大保存时间(毫秒) } ``` ## 事件列表 | 事件名 | 描述 | 参数 | | ----------------------------- | ------------------ | ------------------------------ | | `connected` | WebSocket 连接成功 | - | | `disconnected` | WebSocket 连接断开 | `code: number, reason: string` | | `error` | 发生错误 | `error: Error` | | `marketData` | 行情数据更新 | `data: MarketData` | | `ticker24hr` | 24小时数据更新 | `data: Ticker24hr` | | `kline` | K线数据更新 | `data: KlineData` | | `depth` | 深度数据更新 | `data: DepthData` | | `maxReconnectAttemptsReached` | 达到最大重连次数 | - | ## 方法列表 ### 连接管理 - `initialize()`: 初始化连接 - `disconnect()`: 断开连接 - `isConnected()`: 检查连接状态 - `destroy()`: 销毁管理器 ### 数据订阅 - `subscribeMarketData(symbols, intervals)`: 订阅行情数据 - `unsubscribeMarketData(symbols)`: 取消订阅 - `getSubscribedSymbols()`: 获取订阅的符号列表 ### 数据获取 - `getMarketData(symbol)`: 获取行情数据 - `getAllMarketData()`: 获取所有行情数据 - `getTicker24hr(symbol)`: 获取24小时数据 - `getAllTicker24hr()`: 获取所有24小时数据 - `getKlineData(symbol, interval, limit)`: 获取K线数据 - `getDepthData(symbol)`: 获取深度数据 - `getSymbolData(symbol)`: 获取指定交易对的所有数据 ### 便捷方法 - `getCurrentPrice(symbol)`: 获取当前价格 - `getPriceChangePercent(symbol)`: 获取价格变化百分比 - `get24hrHigh(symbol)`: 获取24小时最高价 - `get24hrLow(symbol)`: 获取24小时最低价 - `get24hrVolume(symbol)`: 获取24小时成交量 - `getSpread(symbol)`: 获取买卖价差 - `getSpreadPercent(symbol)`: 获取买卖价差百分比 - `isPriceUp(symbol)`: 检查价格是否上涨 - `isPriceDown(symbol)`: 检查价格是否下跌 ### 排序方法 - `getAllPrices()`: 获取所有价格 - `getSymbolsByPrice(sortOrder)`: 按价格排序 - `getSymbolsByChange(sortOrder)`: 按涨跌幅排序 ### 缓存管理 - `getCacheStats()`: 获取缓存统计 - `cleanupCache()`: 清理过期缓存 - `clearCache()`: 清空所有缓存 - `isDataExpired(symbol, type, interval)`: 检查数据是否过期 - `getDataTimestamp(symbol, type, interval)`: 获取数据更新时间 ## 使用示例 ### 实时价格监控 ```typescript const marketManager = new EnhancedMarketManager() await marketManager.initialize() marketManager.subscribeMarketData(['BTCUSDT', 'ETHUSDT']) // 实时监控价格 setInterval(() => { const btcPrice = marketManager.getCurrentPrice('BTCUSDT') const ethPrice = marketManager.getCurrentPrice('ETHUSDT') console.log(`BTC: $${btcPrice?.toFixed(2)}, ETH: $${ethPrice?.toFixed(2)}`) }, 1000) ``` ### 价格变化监控 ```typescript marketManager.on('marketData', data => { const changePercent = marketManager.getPriceChangePercent(data.symbol) const isUp = marketManager.isPriceUp(data.symbol) if (isUp) { console.log(`📈 ${data.symbol} 上涨 ${changePercent}%`) } else { console.log(`📉 ${data.symbol} 下跌 ${Math.abs(changePercent)}%`) } }) ``` ### K线数据分析 ```typescript marketManager.on('kline', data => { const klines = marketManager.getKlineData(data.symbol, data.interval, 20) if (klines.length >= 20) { // 计算移动平均线 const ma5 = klines.slice(-5).reduce((sum, k) => sum + k.close, 0) / 5 const ma20 = klines.slice(-20).reduce((sum, k) => sum + k.close, 0) / 20 console.log(`${data.symbol} MA5: ${ma5.toFixed(2)}, MA20: ${ma20.toFixed(2)}`) } }) ``` ## 注意事项 1. **内存使用**: 大量订阅会占用较多内存,建议合理配置缓存参数 2. **网络稳定性**: 确保网络稳定,模块会自动重连但有限制 3. **数据准确性**: 缓存数据可能有延迟,关键操作建议使用实时数据 4. **资源清理**: 使用完毕后调用 `destroy()` 方法清理资源 ## 错误处理 ```typescript marketManager.on('error', error => { console.error('行情数据错误:', error) }) marketManager.on('maxReconnectAttemptsReached', () => { console.error('达到最大重连次数,请检查网络连接') }) // 处理连接断开 marketManager.on('disconnected', (code, reason) => { console.log(`连接断开: ${code} - ${reason}`) // 可以在这里实现自定义的重连逻辑 }) ```