在交易控制台中切换不同交易所时,发现以下问题:
- 数据混合问题:切换到新交易所后,数据仍然保留了之前交易所的更新规律
- 刷新频率不一致:例如从模拟数据(高频更新)切换到CoinGecko(低频更新)后,数据仍然以模拟数据的频率更新
- 状态残留:旧数据源的价格和K线数据没有完全清除
useMarketDatahook 中的状态(priceData,candlestickData等)在切换交易所时没有重置- 旧的数据仍然保留在组件状态中,与新数据混合
- 数据订阅的
useEffect依赖项不完整,没有监听数据源变化 - 切换数据源时,旧的订阅没有完全清理
- 缺少对当前数据源的跟踪
- 无法检测到数据源切换事件
const [currentDataSource, setCurrentDataSource] = useState<string>("");const resetAllData = useCallback(() => {
console.log("🔄 重置市场数据状态...");
setPriceData([]);
setCandlestickData(new Map());
setOrderBook(null);
setConnectionError(null);
}, []);const connect = useCallback(async () => {
// 检查数据源是否发生变化
const newDataSource = marketDataService.getCurrentDataSource();
if (newDataSource !== currentDataSource) {
console.log(`📊 数据源变化: ${currentDataSource} → ${newDataSource}`);
setCurrentDataSource(newDataSource);
// 数据源变化时重置所有数据
resetAllData();
}
// ... 连接逻辑
}, [currentDataSource, resetAllData]);- 为所有订阅的
useEffect添加currentDataSource依赖 - 添加详细的日志记录,便于调试
getCurrentDataSource(): string {
return this.config.dataSource;
}const switchExchange = useCallback(async (exchangeId: ExchangeType) => {
console.log(`🔄 切换交易所: ${selectedExchange} → ${exchangeId}`);
// 断开当前连接
if (connectionStatus.status === 'connected') {
updateExchangeStatus(selectedExchange, 'disconnected');
}
// 切换数据源
console.log(`📊 切换到数据源: ${dataSourceMap[exchangeId]}`);
const success = await marketDataService.switchDataSource(dataSourceMap[exchangeId]);
// ... 其他逻辑
}, []);在 TradingDashboardPage 中添加监听器:
useEffect(() => {
if (connectionStatus.status === 'connected') {
console.log(`🔄 检测到交易所切换为: ${selectedExchange},重新连接市场数据...`);
const timer = setTimeout(() => {
connect();
}, 500);
return () => clearTimeout(timer);
}
}, [selectedExchange, connectionStatus.status, connect]);- ✅ 切换交易所时完全清除旧数据
- ✅ 每个数据源保持独立的更新频率
- ✅ 避免数据混合问题
- ✅ 数据源变化时自动重置所有状态
- ✅ 订阅机制正确响应数据源变化
- ✅ 连接状态与实际数据源保持一致
- ✅ 交易所标识显示在交易对名称旁边
- ✅ 切换过程有明确的状态反馈
- ✅ 数据更新频率符合选中交易所的特性
预期行为:
- 切换前:数据每秒更新,价格波动较大
- 切换后:数据每30秒更新,价格波动较小
- 图表数据完全更新为CoinGecko数据
预期行为:
- 切换前:数据更新频率较低
- 切换后:数据恢复高频更新
- K线图重新生成模拟数据
预期行为:
- 每次切换都能正确清理旧数据
- 不会出现数据混合
- 状态指示器正确反映当前连接状态
-
启动服务器
cd frontend npm run dev # 访问 http://localhost:3001/trading
-
登录并访问交易控制台
-
测试交易所切换
- 观察顶部交易所选择器
- 点击切换不同交易所
- 观察数据更新频率变化
-
检查控制台日志
- 查看数据重置日志
- 确认订阅清理日志
- 验证数据源切换日志
-
src/hooks/useMarketData.ts- 添加数据源跟踪
- 增强数据重置功能
- 改进订阅管理
-
src/services/unifiedMarketData.ts- 添加数据源查询方法
-
src/hooks/useExchangeManager.ts- 增强切换日志
- 改进错误处理
-
src/pages/TradingDashboardPage.tsx- 添加重新连接监听器
- 交易所标识显示
// 之前
useEffect(() => {
// 订阅逻辑
}, [isConnected]);
// 修复后
useEffect(() => {
// 订阅逻辑
}, [isConnected, currentDataSource]);// 数据源变化时重置
if (newDataSource !== currentDataSource) {
resetAllData();
}
// 断开连接时重置
const disconnect = useCallback(() => {
marketDataService.disconnect();
resetAllData();
}, [resetAllData]);- 添加详细的日志记录
- 便于调试和问题定位
- 提供操作反馈
- 为每个交易所维护独立的数据缓存
- 快速切换时复用缓存数据
- 添加数据加载动画
- 切换过程中显示loading状态
- 监控不同数据源的稳定性
- 自动推荐最优数据源
- 连接失败时自动重试
- 提供备用数据源选择
-
选择交易所
- 点击顶部导航栏的交易所选择器
- 从下拉菜单选择目标交易所
-
观察数据变化
- 注意连接状态指示器的变化
- 观察图表数据的更新频率
- 查看交易对旁边的交易所标识
-
验证数据正确性
- 模拟数据:高频更新,大幅波动
- CoinGecko:低频更新,真实价格
- 每个交易所的数据特征不同
-
检查控制台日志
📊 数据源变化: mock → coingecko 🔄 重置市场数据状态... 📊 订阅价格数据更新... ✅ 交易所 coingecko 连接成功 -
监控网络请求
- 观察API调用模式
- 验证请求频率变化
-
状态检查
- 使用React DevTools检查状态变化
- 确认数据重置正确执行
通过这些修复,交易所切换功能现在能够正确隔离不同数据源的数据,确保用户看到的是当前选中交易所的准确数据和更新频率。