Skip to content

Latest commit

 

History

History
276 lines (213 loc) · 7.05 KB

File metadata and controls

276 lines (213 loc) · 7.05 KB

交易所数据源切换问题修复报告

🐛 问题描述

在交易控制台中切换不同交易所时,发现以下问题:

  1. 数据混合问题:切换到新交易所后,数据仍然保留了之前交易所的更新规律
  2. 刷新频率不一致:例如从模拟数据(高频更新)切换到CoinGecko(低频更新)后,数据仍然以模拟数据的频率更新
  3. 状态残留:旧数据源的价格和K线数据没有完全清除

🔍 根本原因分析

1. 状态管理问题

  • useMarketData hook 中的状态(priceData, candlestickData等)在切换交易所时没有重置
  • 旧的数据仍然保留在组件状态中,与新数据混合

2. 订阅机制问题

  • 数据订阅的 useEffect 依赖项不完整,没有监听数据源变化
  • 切换数据源时,旧的订阅没有完全清理

3. 数据源变化检测缺失

  • 缺少对当前数据源的跟踪
  • 无法检测到数据源切换事件

🔧 修复方案

1. 增强 useMarketData Hook

添加数据源跟踪

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 依赖
  • 添加详细的日志记录,便于调试

2. 增强统一市场数据服务

添加数据源查询方法

getCurrentDataSource(): string {
  return this.config.dataSource;
}

3. 改进交易所切换逻辑

增强切换流程

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]);

✅ 修复效果

1. 数据源隔离

  • ✅ 切换交易所时完全清除旧数据
  • ✅ 每个数据源保持独立的更新频率
  • ✅ 避免数据混合问题

2. 状态同步

  • ✅ 数据源变化时自动重置所有状态
  • ✅ 订阅机制正确响应数据源变化
  • ✅ 连接状态与实际数据源保持一致

3. 用户体验改进

  • ✅ 交易所标识显示在交易对名称旁边
  • ✅ 切换过程有明确的状态反馈
  • ✅ 数据更新频率符合选中交易所的特性

🧪 测试验证

测试场景

1. 模拟数据 → CoinGecko

预期行为:

  • 切换前:数据每秒更新,价格波动较大
  • 切换后:数据每30秒更新,价格波动较小
  • 图表数据完全更新为CoinGecko数据

2. CoinGecko → 模拟数据

预期行为:

  • 切换前:数据更新频率较低
  • 切换后:数据恢复高频更新
  • K线图重新生成模拟数据

3. 连续快速切换

预期行为:

  • 每次切换都能正确清理旧数据
  • 不会出现数据混合
  • 状态指示器正确反映当前连接状态

验证步骤

  1. 启动服务器

    cd frontend
    npm run dev
    # 访问 http://localhost:3001/trading
  2. 登录并访问交易控制台

  3. 测试交易所切换

    • 观察顶部交易所选择器
    • 点击切换不同交易所
    • 观察数据更新频率变化
  4. 检查控制台日志

    • 查看数据重置日志
    • 确认订阅清理日志
    • 验证数据源切换日志

📊 技术细节

修改的文件

  1. src/hooks/useMarketData.ts

    • 添加数据源跟踪
    • 增强数据重置功能
    • 改进订阅管理
  2. src/services/unifiedMarketData.ts

    • 添加数据源查询方法
  3. src/hooks/useExchangeManager.ts

    • 增强切换日志
    • 改进错误处理
  4. src/pages/TradingDashboardPage.tsx

    • 添加重新连接监听器
    • 交易所标识显示

关键改进点

1. 依赖项管理

// 之前
useEffect(() => {
  // 订阅逻辑
}, [isConnected]);

// 修复后
useEffect(() => {
  // 订阅逻辑
}, [isConnected, currentDataSource]);

2. 数据重置时机

// 数据源变化时重置
if (newDataSource !== currentDataSource) {
  resetAllData();
}

// 断开连接时重置
const disconnect = useCallback(() => {
  marketDataService.disconnect();
  resetAllData();
}, [resetAllData]);

3. 日志追踪

  • 添加详细的日志记录
  • 便于调试和问题定位
  • 提供操作反馈

🚀 后续优化建议

1. 数据缓存策略

  • 为每个交易所维护独立的数据缓存
  • 快速切换时复用缓存数据

2. 平滑过渡效果

  • 添加数据加载动画
  • 切换过程中显示loading状态

3. 连接质量监控

  • 监控不同数据源的稳定性
  • 自动推荐最优数据源

4. 错误恢复机制

  • 连接失败时自动重试
  • 提供备用数据源选择

📝 使用说明

用户操作指南

  1. 选择交易所

    • 点击顶部导航栏的交易所选择器
    • 从下拉菜单选择目标交易所
  2. 观察数据变化

    • 注意连接状态指示器的变化
    • 观察图表数据的更新频率
    • 查看交易对旁边的交易所标识
  3. 验证数据正确性

    • 模拟数据:高频更新,大幅波动
    • CoinGecko:低频更新,真实价格
    • 每个交易所的数据特征不同

开发者调试

  1. 检查控制台日志

    📊 数据源变化: mock → coingecko
    🔄 重置市场数据状态...
    📊 订阅价格数据更新...
    ✅ 交易所 coingecko 连接成功
    
  2. 监控网络请求

    • 观察API调用模式
    • 验证请求频率变化
  3. 状态检查

    • 使用React DevTools检查状态变化
    • 确认数据重置正确执行

通过这些修复,交易所切换功能现在能够正确隔离不同数据源的数据,确保用户看到的是当前选中交易所的准确数据和更新频率。