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

def login_CTP_what_account(setting):

# 配置日志记录信息到最轻阶级
# 登录到CTP上
SETTINGS['log.level'] = DEBUG# 控制显示红字

# 全局配置文件机制
print(setting)

# 创建事件引擎
event_engine = EventEngine()

# 创建主引擎
main_engine = MainEngine(event_engine)

# 添加交易接口,就是UI界面进入时的左边选择项
main_engine.add_gateway(CtpGateway)
main_engine.connect(setting, "CTP")

# 取主引擎的事件引擎
# 向事件引擎注册日志事件监听函数

log_engine = main_engine.get_engine("log")

event_engine.register(EVENT_LOG, log_engine.process_log_event)
main_engine.write_log("注册日志事件监听", 'CTP')

return main_engine, event_engine

...

if name == 'main':
main_engine, event_engine = login_CTP_what_account(setting)
t.sleep(10)
oms = main_engine.get_engine('oms')
p = oms.get_all_positions()
tick = oms.ticks
...
上面代码是我对持仓的净值统计的代码一部分,我目前持仓可以使用 p = oms.get_all_positions() 看到我持有的全部衍生品(CFFEX交易所的IO和HO开头的期权以及IF和IH开头的期货),然而tick = oms.ticks这行代码只能获取到持仓中IO开头的期权的TickData,我想获取持仓的所有衍生品的TickData,请问如何调试呢?

Super Moderator
avatar
加入于:
帖子: 54
声望: 7

要获取所有持仓衍生品的TickData,首先需要确保你已经订阅了这些合约的行情。在VeighNa中,获取TickData的前提是合约的行情已经被订阅。以下是一些调试步骤和建议:

1. 确保订阅所有持仓合约的行情

在登录CTP账户后,你需要手动订阅所有持仓合约的行情。可以通过以下代码实现:

# 获取所有持仓
positions = oms.get_all_positions()

# 遍历持仓并订阅行情
for position in positions:
    vt_symbol = position.vt_symbol
    main_engine.subscribe(vt_symbol, "CTP")

2. 检查订阅是否成功

订阅后,可以通过日志或调试信息确认订阅是否成功。你可以在EventEngine中监听EVENT_TICK事件,确保每个合约的Tick数据都被正确接收。

def on_tick(event):
    tick = event.data
    print(f"Received tick for {tick.vt_symbol}")

event_engine.register(EVENT_TICK, on_tick)

3. 检查oms.ticks的获取逻辑

oms.ticks通常是一个字典,键为vt_symbol,值为TickData对象。确保你在获取oms.ticks时,遍历了所有持仓的vt_symbol

for vt_symbol in positions:
    if vt_symbol in oms.ticks:
        tick = oms.ticks[vt_symbol]
        print(f"Tick data for {vt_symbol}: {tick}")
    else:
        print(f"No tick data found for {vt_symbol}")

4. 检查CTP接口的权限

确保你的CTP账户有权限订阅所有持仓合约的行情。某些账户可能对特定合约的行情订阅有限制。

5. 检查网络和服务器状态

如果某些合约的Tick数据无法获取,可能是由于网络问题或服务器问题。检查CTP服务器的连接状态,确保网络畅通。

6. 使用DataRecorder模块录制Tick数据

如果实时获取Tick数据有问题,可以考虑使用DataRecorder模块录制Tick数据,然后从本地数据库加载。

from vnpy.trader.database import get_database

database = get_database()
ticks = database.load_tick_data(vt_symbol, start_date, end_date)

通过以上步骤,你应该能够调试并获取所有持仓衍生品的TickData。如果问题仍然存在,建议检查VeighNa的日志文件,查看是否有相关错误信息。

 
-- 以上回答来自VeighNa AI
 

Member
avatar
加入于:
帖子: 2
声望: 0

目前已解决。出问题的原因在于之前有一个过滤后再订阅的逻辑。我后续手动添加了过滤出去的品种的订阅后再main_engine.get_tick.last_price无问题了:
opt='IO...'#订阅的代码
req = SubscribeRequest(opt, Exchange.CFFEX)
main_engine.subscribe(req, 'CTP')
main_engine.get_tick.last_price#获取最新价

© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】