VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 179
声望: 0

过去的版本可以使用engine.main_engine.get_gateway(interface).td_api.contract_inited,返回True时代表初始化已完成,现在还可以这样用吗?尝试连接simnow时始终返回的是False.

Super Moderator
avatar
加入于:
帖子: 141
声望: 15

结论:可以,这个用法在当前版本中依然有效。

我查看了当前安装的 vnpy_ctp 源码(vnpy_ctp/gateway/ctp_gateway.py),CtpTdApi 中仍然保留了 contract_inited 标志:

self.contract_inited: bool = False

它在 onRspQryInstrument 收到最后一包合约数据(last=True)时才会被置为 True,同时输出日志"合约信息查询成功"。

初始化完成的完整流程

contract_inited = True 之前必须依次完成:

  1. 交易服务器连接成功(onFrontConnected)
  2. 授权验证成功(如果填了授权编码)
  3. 登录成功(onRspUserLogin)
  4. 结算单确认成功(onRspSettlementInfoConfirm)→ 自动发起合约查询
  5. 合约查询回报全部接收完毕 → contract_inited = True

始终返回 False 的常见原因

  1. 检查时机太早:connect_gateway 是异步的,整个流程通常需要几秒到十几秒(SimNow 合约数量多,查询较慢)。建议轮询等待,或以日志中出现"合约信息查询成功"为准。

  2. 登录/授权失败:如果登录失败(login_failed=True)或授权失败(auth_failed=True),后续流程不会执行。请检查日志中是否有"交易服务器登录失败"等报错。SimNow 注意:

    • 第一组(实盘环境)需要填写产品名称和授权编码
    • 第二组(测试环境)不需要授权码,但密码是投资者密码而非 SimNow 网站注册密码
  3. 接口名称不匹配:如果你用的是 vnpy_ctptest(CTPTEST 接口)连接 SimNow 测试环境,get_gateway("CTP") 会拿不到对象,应使用 get_gateway("CTPTEST")。

  4. 非交易时段:SimNow 第二组只在交易时段开放,第一组提供 7x24 环境,请确认连接时段。

建议的判断方式

from time import sleep

main_engine.connect_gateway(setting, "CTP")

gateway = main_engine.get_gateway("CTP")
while not gateway.td_api.contract_inited:
    sleep(1)

print("CTP 接口初始化完成")

同时观察日志输出,如果卡在"交易服务器登录成功"之后没有"结算信息确认成功",说明结算确认环节出了问题;如果有"合约信息查询成功"但 contract_inited 仍为 False,则可能是你获取的 gateway 对象不对(接口名错误)。

参考来源:vnpy_ctp/gateway/ctp_gateway.py(CtpTdApi.__init__、onRspQryInstrument、onRspSettlementInfoConfirm)


基于RAG技术开发的VeighNa AI助手,你的个人专属 Desk Quant