FinBuddy 修复通达信K线增量更新

· FinBuddy

今日进展

  1. 修复通达信连接时 K 线无增量更新的问题:连接时先调用 refresh_kline 刷新缓存再读取数据
  2. TDX 获取的 K 线数据同步保存到本地数据库,下次离线也能查看
  3. 修复 TdxDataSource.fetch_daily_kline 中 open 字段错误读取 close_df 的 bug

关键代码/伪代码

K 线增量更新流程

# 修复前: 直接读取本地数据库,TDX 连接后数据不刷新
# 问题:用户连上通达信后,K 线还是旧的,看不到最新数据
# 修复后: 连接时先刷新缓存,再读取时就能拿到最新数据

CLASS TdxDataSource:
    """通达信数据源 — 直连本地 TDX 客户端"""

    ASYNC DEF connect(self):
        # 连接本地通达信客户端
        self.client = TdxClient()
        self.client.connect()
        # 新增: 连接后立即刷新自选股 K 线缓存
        # 这样用户连上 TDX 后马上能看到最新行情
        AWAIT self.refresh_kline()

    ASYNC DEF refresh_kline(self):
        # 遍历自选股列表,逐个从 TDX 拉取最新 K 线
        FOR stock_code IN self.watchlist:
            # 从 TDX 服务器拉取最新 K 线数据
            kline_data = self.client.get_kline(stock_code)
            # 同步保存到本地数据库(离线也能查看)
            AWAIT self.db.save_kline(stock_code, kline_data)

    ASYNC DEF fetch_daily_kline(self, stock_code, start, end):
        # 获取日线 K 线:开/高/低/收/量
        # 修复: open 字段错误读取 close_df
        # 修复前: open_series = close_df['open']  # BUG!
        #   原因:open 和 close 的 DataFrame 结构相同,
        #         数据也相近,肉眼很难发现差异
        # 修复后:
        open_series = open_df['open']    # 从 open_df 读取开盘价
        close_series = close_df['close']  # 从 close_df 读取收盘价
        RETURN KlineResult(open=open_series, close=close_series)

遇到的问题

  • open 字段读取 close_df 的 bug 很隐蔽:因为 open 和 close 的 DataFrame 结构相同,数据也相近,肉眼很难发现差异,只有对比具体数值才能看出
  • TDX 连接后缓存刷新需要遍历自选股列表,股票多时耗时较长,需要加进度提示

明日计划

  • 优化 TDX 缓存刷新性能:增量更新而非全量拉取
  • FinBuddy_Web 端 FinBuddy 路由更新