过去的版本可以使用engine.main_engine.get_gateway(interface).td_api.contract_inited,返回True时代表初始化已完成,现在还可以这样用吗?尝试连接simnow时始终返回的是False.
过去的版本可以使用engine.main_engine.get_gateway(interface).td_api.contract_inited,返回True时代表初始化已完成,现在还可以这样用吗?尝试连接simnow时始终返回的是False.
结论:可以,这个用法在当前版本中依然有效。
我查看了当前安装的 vnpy_ctp 源码(vnpy_ctp/gateway/ctp_gateway.py),CtpTdApi 中仍然保留了 contract_inited 标志:
self.contract_inited: bool = False
它在 onRspQryInstrument 收到最后一包合约数据(last=True)时才会被置为 True,同时输出日志"合约信息查询成功"。
contract_inited = True 之前必须依次完成:
onFrontConnected)onRspUserLogin)onRspSettlementInfoConfirm)→ 自动发起合约查询contract_inited = True检查时机太早:connect_gateway 是异步的,整个流程通常需要几秒到十几秒(SimNow 合约数量多,查询较慢)。建议轮询等待,或以日志中出现"合约信息查询成功"为准。
登录/授权失败:如果登录失败(login_failed=True)或授权失败(auth_failed=True),后续流程不会执行。请检查日志中是否有"交易服务器登录失败"等报错。SimNow 注意:
接口名称不匹配:如果你用的是 vnpy_ctptest(CTPTEST 接口)连接 SimNow 测试环境,get_gateway("CTP") 会拿不到对象,应使用 get_gateway("CTPTEST")。
非交易时段: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