vn.py量化社区
By Traders, For Traders.
Member
avatar
加入于:
帖子: 8
声望: 1

想一次性获取全部合约行情作一些条件判断,经老大提示可以用get_all_contracts和get_all_ticks
先使用守护进程的脚本方式启动,发现print的列表为空[]。
什么原因呢? 我调用的不对?

代码如下:

from vnpy.event import EventEngine
from vnpy.trader.engine import MainEngine
from vnpy.trader.ui import MainWindow, create_qapp
from vnpy.gateway.ctp import CtpGateway
from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.data_recorder import DataRecorderApp

import multiprocessing
from time import sleep
from datetime import datetime, time

def runChildProcess():
    """子进程运行函数"""
    """Start VN Trader"""
    qapp = create_qapp()
    ctp_setting = {
     **** }

    event_engine = EventEngine()
    main_engine = MainEngine(event_engine)
    main_engine.add_gateway(CtpGateway)
    main_engine.add_app(CtaStrategyApp)
    main_engine.add_app(DataRecorderApp)
    main_window = MainWindow(main_engine, event_engine)
    main_window.showMaximized()
    # print("anti***")
    main_engine.connect(ctp_setting, "CTP")
    main_engine.write_log("连接CTP接口")
    qapp.exec()

    while True:
        print("syleist")
        sleep(1)

def insert(dba):

    event_engine1 = EventEngine()
    main_engine1 = MainEngine(event_engine1)
    main_engine1.add_gateway(CtpGateway)

    #testv = main_engine1.get_all_ticks()
    testv = main_engine1.get_all_contracts()
    print('now ct', testv)     # 测试输出为空[]

def runParentProcess():
    """父进程运行函数"""
    # 创建日志引擎

if __name__ == "__main__":
    runParentProcess()
Member
加入于:
帖子: 86
声望: 19

建议用script_engine跑,代码有点迷糊,你这个main_engine1都没有加入gateway,当然不行。

Member
avatar
加入于:
帖子: 8
声望: 1

张国平 wrote:

建议用script_engine跑,代码有点迷糊,你这个main_engine1都没有加入gateway,当然不行。

噢,我截少了。 加了gateway,print也是空。
其实就是函数insert想获取全部合约列表或者所有合约报价

Administrator
avatar
加入于:
帖子: 1919
声望: 87
  1. 接口没有连接服务器
  2. 接口连接后等待几秒,数据从服务器返回后再查询

以上两个操作参考examples/no_ui的例子

Member
avatar
加入于:
帖子: 8
声望: 1

用Python的交易员 wrote:

  1. 接口没有连接服务器
  2. 接口连接后等待几秒,数据从服务器返回后再查询

以上两个操作参考examples/no_ui的例子

老大说得对,我连了CTP,get_all_contracts成功,返回了所有合约的信息。但get_all_ticks不行,返回空,我已经sleep 20秒了。code如下:

    event_engine1 = EventEngine()
    main_engine1 = MainEngine(event_engine1)
    main_engine1.add_gateway(CtpGateway)
    main_engine1.connect(ctp_setting1, "CTP")
    sleep(25)
    testv = main_engine1.get_all_ticks()
    sleep(20)
    print('now ct', testv)
    print('now time', datetime.now().time())
Administrator
avatar
加入于:
帖子: 1919
声望: 87

get_all_ticks之前,需要你先subscribe订阅行情推送后,本地收到行情数据(sleep若干秒),此时才能获取到

Member
avatar
加入于:
帖子: 8
声望: 1

code text here

engine.connect_gateway(setting, "CTP")
sleep(10)
allcontractsinfo = engine.get_all_contracts(True)
sleep(10)
print("HAH全部合约", allcontractsinfo)  
rr = allcontractsinfo[allcontractsinfo['exchange'].isin(['Exchange.DCE'])]   # 一直输出empty dataframe

连上了CTP,也获取到了全部合约,想筛选郑交所的期货合约,发现print(rr)一直都是empty dataframe,空的。

找了很久原因,才知道exchange的类型不是string,是一个自定义的数据类型。

那我应该如何定义这个exchange呢? 需要重新定义isin()的参数?

Member
avatar
加入于:
帖子: 81
声望: 10

要先订阅合约

Member
avatar
加入于:
帖子: 8
声望: 1

上弦之月 wrote:

要先订阅合约

不用订阅,engine.get_all_contracts(True)也能获取所有合约的信息,是一个dataframe的格式。
现在是对这个dataframe用isin函数作筛选操作时出现了问题。

Administrator
avatar
加入于:
帖子: 1919
声望: 87

Exchange枚举量的定义,可以通过from vnpy.trader.constant import Exchange来加载

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

星像眼睛 wrote:

code text here

engine.connect_gateway(setting, "CTP")
sleep(10)
allcontractsinfo = engine.get_all_contracts(True)
sleep(10)
print("HAH全部合约", allcontractsinfo)
rr = allcontractsinfo[allcontractsinfo['exchange'].isin(['Exchange.DCE'])] # 一直输出empty dataframe

连上了CTP,也获取到了全部合约,想筛选郑交所的期货合约,发现print(rr)一直都是empty dataframe,空的。

找了很久原因,才知道exchange的类型不是string,是一个自定义的数据类型。

那我应该如何定义这个exchange呢? 需要重新定义isin()的参数?
很奇怪这一句怎么能执行 allcontractsinfo = engine.get_all_contracts(True),,,提示 参数 是 有两个?
我修改这样 allcontractsinfo = engine.get_all_contracts() 返回的 仍然是 个 []空列表,,不知道哪里出错了?

sleep(10)
allcontractsinfo = engine.get_all_contracts()
然后 查询到所有合约。。。

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