连接的是TTS接口
可以看到,在1点31分的时候,合约信息查询成功。 但是当我早上9点33分看vnpy时,此时已经没有了行情数据,因此我试图重新登录TTS, 但是提示我交易服务器登录失败,因为已经重复登录了。
可以看到,行情里面什么也没有
但是,在查询合约里面,却可以查询得到合约。
真是令人感到困惑。另外,原定于在今早上开盘要交易的策略,也毫无动静。
另外想请教大神一个问题
def process_tick_event(self,event:Event):
""" 对原始tick进行过滤 """
tick:TickData = event.data
# 检查tick合约的经验状态是否位有效交易状态
status:StatusData = self.statuses.get(tick.vt_symbol,None)
if not status:
vt_instrument = get_vt_instrument(tick.vt_symbol)
status = self.statuses.get(vt_instrument,None)
if not status:
# 未收到交易状态,返回
return
这段代码我看了很久,如果我的理解没错的话, 判断一个tick是否有效,是用的上一个该品种的tick的 StatusData, 为什么要这样做呢?为什么不能直接用这个tick的状态信息呢?
vnpy真的应该把这个功能整合到正式版本里头去,因为不这样做的话,必须收盘后关闭vnpy,防止接受错误数据。
但是这根本是做不到的,因为每个品种的收盘时间不一样。你运行一个portfolio strategy,这个品种已经收盘了,那个品种还没结束呢,这就导致这个策略停不了。但是已经收盘了的品种是可能这个时候发错误tick过来的。。。。所以所谓的“收盘后立刻停止策略”,这根本就是做不到的事
TradeStatusManager是被弃用了吗? 现在的代码是完全用TickFilter来过滤tick数据了。
但是在新代码里,好像少了DbContractData类的定义, 是下面这个定义吗:
因为想在vnpy种过滤CTP产生的数据,研究了一下,发现CTP在推送数据的时候,是有推送每个品种交易状态的。
但我不懂CTP推送的具体状态是什么,想要研究CTP的API, 但却发现CTP的API所在的网站无法打开?
郭易燔 wrote:
通过pythonpath环境变量的方式使用veighna_studio里的包的确可行,但是ctp、tts这类c++接口都是需要根据python版本来编译pyd的。veighna_studio使用的是python3.10所以编译好的pyd也是3.10的,你的anaconda使用的python不是3.10的,所以找不到。
好的,非常感谢您的解答。
那我还有一个问题想问一下,安装vnpy的时候似乎是会自带一个python环境的对吗? 我看了下vnpy的文件夹,里面是有一个python.exe的文件的。
如果我不想使用我自己的anaconda环境了,我想使用vnpy 自带的这个python环境,那这样我就无需将vnpy的包的路径添加到环境变量中了对吧。可是我的问题是,我该怎么区分打开的是哪个python呢?我在cmd输入jupyter notebook,自动运行的不是vnpy的python啊。。。
郭易燔 wrote:
你贴的回答是vnpy2.x版本的了,不适用于目前最新的veighna。首先确定使用的是最新的veighna_studio,如果有界面的情况下可以正确运行的话,就说明你的脚本或者python环境有问题,你再贴一下你的no_ui脚本吧
我非常非常非常确定我用的是3.2版本,这是我当时迅雷下载的记录
我当时就用的这个安装包安装的vnpy。
我使用的脚本是这样的:
因为在下载vnpy之前,我就已经在用anaconda环境了,所以我将vnpy的路径添加到了sys.path中
from vnpy_tts import TtsGateway
也是相同的问题,完全加载不了。。。
看了一下知乎上的回答,还是弄不懂该怎么做
运行 build.sh。。。可是这个文件夹根本就没有build.sh文件啊? 编译vnctp, 是指编译vnctpmd.cpp这个文件吗? install.bat又是哪里的文件?
观察了一下,vnpy_ctp文件夹中只有如下两个pyd文件
郭易燔 wrote:
vnpy可以24小时开,但是策略需要再开盘前开启收盘后关闭,因为非交易时间会有垃圾数据扰乱交易逻辑。
停止策略后,会将局部变量保存到本地的json中,BarGenerator里的缓存tick数据会消失,所以尽量不要在盘中随意停止再开启策略。
我有两个问题:
vnpy需要24小时开着吗?
一个策略,如果停止它、重新编辑变量、对它进行移仓操作、或者关闭vnpy,在这种种情况下, 那这个策略里头的BarGenerator里的数据,以及策略内部的局部变量(variables),还在吗?
郭易燔 wrote:
螺纹钢合约是小写的rb,是可以获取到合约的。要等到日志栏提示合约查询成功之后,才能查询到合约。
现在我可以查询合约了
可是我发现,在日志里显示“交易服务器登录成功” 到 查询合约成功的这个时间间隔,可能长达30分钟,这正常吗?
当连接到TTS之后,点击查询合约
无论大写还是小写都查不到螺纹钢的合约信息
但是其他品种,例如玻璃,却可以查到
在TTS的QQ群询问了群主,群主回答TTS今天的行情没问题,可以正常获取,可是为什么vnpy连合约信息都查不到呢
郭易燔 wrote:
portfolio不支持,需要自己实现
在实现这个功能的时候,我有个问题。
对于两个portfolio_strategy, 他们是初始化自同一个StrategyEngine类的实例,还是说它们用的是两个不同的StrategyEngine类呢?
或者说,我要实现这个功能,我是应该去StrategyEngine类里做,还是应该去别的地方呢?
比如,我先写了一个趋势策略,交易5个品种,其中 要做多螺纹钢7手
然后,我又写了一个反转策略,也交易这5个品种,虽然这个反转策略在完整计算手续费之后的赚钱效果很差,但是它总是产生和趋势策略相反的信号,例如:做空螺纹钢2手
那么,我希望这两个策略能合并起来,开多螺纹钢5手。
但是实际在模拟盘上,第一个策略会做多7手,第二个策略会平今2手。。。不仅没节省手续费,反而“超级加倍”了手续费。
portfolio支持多策略之间的“撮合”吗?
xiaohe wrote:
在策略中调用template里的get_pricetick函数即可获取pricetick数据
CtaTemplate类里__init__函数初始话的时候需要传入cta_engine
除了pricetick, 我还想获取每个合约的size,也就是合约乘数。比如,我打算在品种A上花100000元,那么我需要的下单手数是 100000/(限价单的价格* 合约乘数)。可是好像并没有查询size的功能?
看了一下回测程序,我的订单全都是限价单下单的,经过了cross_limit_order这个函数进行订单的匹配来决定订单是否成交、以什么价格成交。
我想问一下,这种情况下,还需要考虑滑点的带来的亏损吗?