返回列表 发布新帖

实盘 handlebar 内 get_market_data_ex 单股查询日线 gmdSubscribe timeout 问题

492 4
发表于 2026-5-15 17:38:30 | 显示全部楼层 阅读模式

国金qmt交易端版本:2.0.8.300] 券商:国金证券 运行环境:实盘交易模式(非模拟) 周期:1分钟周期 K 线驱动 handlebar

复现步骤: 在 handlebar 中调用:

kline = C.get_market_data_ex(['close'], [stock_code], period='1d', count=3)

9:15 时调用全市场批量查询(10000 只 × 1d × count=3)正常返回。但盘中 10:30 / 14:45 / 14:59 时调用单只持仓股(1-5 只 × 1d × count=3)时,约 10 秒后日志显示:

[WARN] PythonCacheData::gmdSubscribe timeout, stockCode:., period:86400000

然后 handlebar 被强制中断,后续代码不再执行(含异常都没抛出)。

环境排查

  • 网络:ping 国金行情服务器(139.224.114.71、81.69.152.51)全天 0 丢包
  • 已尝试 WiFi 和 USB 有线网卡,问题相同

疑问

  1. get_market_data_ex 单股日线查询是否需要先 subscribe?
  2. 有什么替代方法可以在 handlebar 中查询单股近 3 日收盘价?
  3. 是否有相关参数或调用模式可以避免触发 gmdSubscribe?

谢谢!

评论4

黄裕华
发表于 2026-5-16 12:34:20 | 显示全部楼层
1、get_market_data_ex 单股日线查询是不需要先 subscribe;2、 subscribe 参数设为 False,并指定明确的 start_time 和 end_time 或使用 count 获取历史数据 3、可以通过[color=rgba(0, 0, 0, 0.88)][backcolor=rgba(0, 0, 0, 0.06)] subscribe=False 参数来避免触发[color=rgba(0, 0, 0, 0.88)][backcolor=rgba(0, 0, 0, 0.06)] gmdSubscribe
*******3461_JWYy2楼主
发表于 2026-5-18 11:11:08 | 显示全部楼层
111111
*******3461_JWYy2楼主
发表于 2026-5-18 11:16:38 | 显示全部楼层
黄裕华 发表于 2026-5-16 12:34
1、get_market_data_ex 单股日线查询是不需要先 subscribe;2、 subscribe 参数设为 False,并指定明确的 s ...

接上次咨询(subscribe=False 已确认有效)。

我已按建议改造策略:盘中卖出任务不再调用 get_market_data_ex,
昨收价改为 9:15 时一次性批量缓存到字典,盘中只读字典。

但 2026-05-18 实盘仍出现 task 静默失败现象:

== 现象 ==
策略输出日志:
[10:30:01] 【10:30早盘检查】(模式:LIVE)
[然后完全空白,函数内部循环没有任何打印]

QMT Formula 日志显示 handlebar 实际正常完成:
2026-05-18 10:30:01,723 begin to runonce, bar: 62305
2026-05-18 10:30:01,725 run finished
即 handlebar 在 2ms 内顺利返回,没有 timeout、没有阻塞。

== 我的代码(task_sell_check_morning 简化版)==
def task_sell_check_morning(C):
    print('【10:30早盘检查】(模式:LIVE)')   # 这行打印了
    positions = get_positions()              # 假设成功
    for stock, pos in positions.items():
        if pos['available_amount'] <= 0:
            continue
        curr_price = get_current_price(C, stock)
        if curr_price <= 0:
            continue                          # 怀疑走了这条路径
        ...

def get_current_price(C, stock_code):
    try:
        ticks = C.get_full_tick([stock_code])
        if stock_code in ticks and ticks[stock_code]:
            last_price = ticks[stock_code].get('lastPrice', 0)
            if last_price > 0:
                return float(last_price)
    except:
        pass
    return 0.0

== 关键背景 ==
1. 当时持仓股票 000889.SZ 和 002309.SZ 是策略前几日 9:30 买入的,
   并非主图订阅标的(主图是 SH000300)
2. 同一天 9:25 时调用 C.get_full_tick(待选候选股) 拿数据是成功的
   (39 只票全部拿到 open 字段)
3. 10:30 时调用 C.get_full_tick(持仓股) 推测返回空,导致函数空跑完成

== 疑问 ==
1. get_full_tick 是否只能返回"当前主动订阅"的股票 tick?
2. 对于"非主图、非候选股"的持仓股(策略动态买入持有),
   是否需要在 init() 或买入后主动 subscribe_quote(stock, period='tick')?
3. 如果需要主动订阅,建议在什么时机订阅?init 中订阅初始持仓?
   passorder 买入后订阅?还是有更好的方式?
4. 卖出清仓后是否需要 unsubscribe 释放资源?
5. handlebar 中能不能动态执行 subscribe_quote?

非常感谢!
黄裕华
发表于 2026-5-19 21:35:24 | 显示全部楼层
你加客服微信haha-qmt。

回复

您需要登录后才可以回帖 登录 | 立即注册

客服专线

400-080-8112

用思考的速度交易,用真诚的态度合作,我们是认真的!
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2026 迅投QMT社区 版权所有 All Rights Reserved. 京ICP备2025122616号-3
关灯 快速发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表