helium3@sina.com db091bc819 --备份 cursor 2 bulan lalu
..
README.md db091bc819 --备份 cursor 2 bulan lalu
enhancedMarketManager.ts db091bc819 --备份 cursor 2 bulan lalu
index.ts db091bc819 --备份 cursor 2 bulan lalu
marketDataCache.ts db091bc819 --备份 cursor 2 bulan lalu
marketDataManager.ts db091bc819 --备份 cursor 2 bulan lalu

README.md

行情数据模块

这个模块提供了完整的行情数据管理功能,通过 WebSocket 实时获取 Binance 期货市场的行情数据,并在内存中缓存和管理。

功能特性

  • 🔄 实时数据: 通过 WebSocket 获取实时行情数据
  • 💾 内存缓存: 高效的内存缓存机制,减少重复请求
  • 🔄 自动重连: 网络断开时自动重连
  • 📊 多种数据类型: 支持行情、K线、深度等多种数据
  • 🎯 事件驱动: 基于事件的数据更新机制
  • 🧹 自动清理: 自动清理过期数据,优化内存使用

模块组成

1. MarketDataManager

基础的 WebSocket 行情数据管理器,负责:

  • WebSocket 连接管理
  • 数据订阅和取消订阅
  • 原始数据处理

2. MarketDataCache

缓存管理器,负责:

  • 内存数据缓存
  • 数据过期管理
  • 内存使用优化

3. EnhancedMarketManager

增强的行情管理器,整合了:

  • WebSocket 连接
  • 缓存管理
  • 便捷的数据访问方法

快速开始

基本使用

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}`)

高级使用

// 监听所有事件
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

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

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

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

interface DepthData {
  symbol: string
  bids: [string, string][] // [price, quantity]
  asks: [string, string][] // [price, quantity]
  lastUpdateId: number
}

配置选项

EnhancedMarketManagerConfig

interface EnhancedMarketManagerConfig {
  wsUrl?: string // WebSocket URL
  reconnectInterval?: number // 重连间隔(毫秒)
  maxReconnectAttempts?: number // 最大重连次数
  cacheConfig?: Partial<CacheConfig> // 缓存配置
  enableCache?: boolean // 是否启用缓存
  enableAutoReconnect?: boolean // 是否启用自动重连
  enablePingPong?: boolean // 是否启用 Ping/Pong
}

CacheConfig

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): 获取数据更新时间

使用示例

实时价格监控

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)

价格变化监控

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线数据分析

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() 方法清理资源

错误处理

marketManager.on('error', error => {
  console.error('行情数据错误:', error)
})

marketManager.on('maxReconnectAttemptsReached', () => {
  console.error('达到最大重连次数,请检查网络连接')
})

// 处理连接断开
marketManager.on('disconnected', (code, reason) => {
  console.log(`连接断开: ${code} - ${reason}`)
  // 可以在这里实现自定义的重连逻辑
})