|
|
2 bulan lalu | |
|---|---|---|
| .. | ||
| README.md | 2 bulan lalu | |
| enhancedMarketManager.ts | 2 bulan lalu | |
| index.ts | 2 bulan lalu | |
| marketDataCache.ts | 2 bulan lalu | |
| marketDataManager.ts | 2 bulan lalu | |
这个模块提供了完整的行情数据管理功能,通过 WebSocket 实时获取 Binance 期货市场的行情数据,并在内存中缓存和管理。
基础的 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')
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
}
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
}
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
}
interface DepthData {
symbol: string
bids: [string, string][] // [price, quantity]
asks: [string, string][] // [price, quantity]
lastUpdateId: number
}
interface EnhancedMarketManagerConfig {
wsUrl?: string // WebSocket URL
reconnectInterval?: number // 重连间隔(毫秒)
maxReconnectAttempts?: number // 最大重连次数
cacheConfig?: Partial<CacheConfig> // 缓存配置
enableCache?: boolean // 是否启用缓存
enableAutoReconnect?: boolean // 是否启用自动重连
enablePingPong?: boolean // 是否启用 Ping/Pong
}
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)}%`)
}
})
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)}`)
}
})
destroy() 方法清理资源marketManager.on('error', error => {
console.error('行情数据错误:', error)
})
marketManager.on('maxReconnectAttemptsReached', () => {
console.error('达到最大重连次数,请检查网络连接')
})
// 处理连接断开
marketManager.on('disconnected', (code, reason) => {
console.log(`连接断开: ${code} - ${reason}`)
// 可以在这里实现自定义的重连逻辑
})