发现在Scripts运行station.exe或者veighna.exe可以运行vnpy,这两个文件有什么差别吗?
我将一个电脑上的vnpy对应的文件夹移植到了另一个电脑上
可是另一个电脑上的桌面是没有图标的,我该怎么做,才能在另一个电脑上运行这份vnpy呢? 点击pythonw.exe也没有任何反应
给ctp_Gateway加了几个函数,发现错误应该出在login函数 到 onRspUserLogin() 之间,我这里显示self.reqUserLogin 已经被调用,但是登录后的回调函数onRspUserLogin() 并没有被触发, 而是在这个过程中断开了连接
今天在交易时间尝试连接CTP,发现一直滚动的报错,日志信息栏不断的被下面的信息塞满:
可以看到,几乎每10ms,都会出现一次连接尝试,并且连接失败
另外,哪里可以看到,错误编号0所对应的错误呢? 上网查询了CTP客户端开发指南,里面也没有提到原因0的错误,究竟是什么错误
连接CTP的信息都是按照使用文档填写的:
之前一直使用的是TTS环境,因为CTP又开了,所以转过来,但是一直报错,是非交易时间段自动就会断开连接吗?
我有一个策略,这个策略中有一个关键变量,类型是字典,会随着策略的运行而不断改变。
现在我有一个需求,那就是,当我停止这个策略时,这个字典的值能够保存到对应策略的json文件中。并且,当我下一次启动该程序时,能够自动读取这个字典的值并且参与到后续的计算中。那么,很显然,这个变量 应该是一个variable
但是根据使用文档的说明,variables只能接受str、int、float和bool四种数据类型传入, 我无法把这个字典设置为variables, 如果把这个参数的定义放到策略模板中的init下面,相当于每次启动程序时,都将初始化这个字典为一个空字典,而这不是我想要的,我想要初始成上一次结束时的那个状态。
这应该怎么操作呢?
例如小时数据,9:00的Bar 其实是9:00 - 10:00, 可是怎么看都觉得这个bar的datetime设置成10:00更合理吧?
郭易燔 wrote:
tick是有交易才会产生的,所以不活跃的品种可能几分钟都没有tick推送。
tts是私人搭建的测试环境,数据都是爬取的,所以只能用来测试程序的稳定性,数据的精确度是没有保证的
ctp也要分simnow和实盘,simnow中交易所同一时间的tick一般都是一起推送的,但是实盘中每个合约之间都有一定的时间间隔,累加起来就会比较大了
也就说,虽然tick数据是500ms的切片,但交易所也是有成交量才发,没成交量就不发
你说的每个合约都有一定的时间间隔,我想问一下这种间隔是因为什么原因造成的呢?如果是同一个交易所的品种也有间隔吗?不都是从同一个交易所发出来的吗?
由于这个错误是TTS中出现的,我想问下各位,在CTP中,也会有这样的错误吗? 不同品种同一秒的tick,接收时间最远能差几秒呢?
之所以问这个问题,是我在TTS接口中测试中发现,PortfolioBargenerator中保存的分钟bar, 在同一时间下,不同品种的分钟bar的datetime可以最多相差超过30s !!!
这造成了许多问题, 由于在vnpy中,只要接收到一个品种下一分钟的tick数据时,就会进行全体品种分钟bar的合成。
在14:27 这个分钟内,可能al2209 的bar已经推进到 14:27:59, 而MA209的bar才推进到14:27:49。 这两者相差10s, 这会导致:
对CTP系统而言,如果做一个两个品种的策略, 如al2209 和 MA209
那么,对于时间 14:27:00 这秒来说,这两个合约都会发来两个tick,由于郑商所切片的随机性,有可能MA209在这一秒也可能会发来1个或3个tick。 那么我想问的是,这一秒中,两个品种最后的tick,vnpy接收到的时间最多会相差多少秒呢?
这是update_tick的源代码
这段代码里最让我困惑的是,只要有一个品种的 tick的 tick.datetime.minute != self.last_dt_minute,就会触发self.on_bars()
可是问题是投资组合中不是只有一个品种啊!!!
如果有多个品种,而vnpy接收到这些tick的时间有毫秒的差别(郑商所的毫秒时间本来就和大商所、上期所不一样)
那么,vnpy会在检测到第一个品种的tick 符合条件时,就直接调用self.on_bars()!!!!
如果此时on_bars计算的时间长一些,例如碰上固定的交易时间了,需要计算策略了,需要调用update_bar_hour_window了,需要send_order了,那么此时on_bars还没计算完。但此时过了200ms,另外一个品种的tick发过来了,它将又要调用self.on_bars() !!!! (因为上个品种的on_bars还没调用完, self.last_dt是在on_bars调用完后面才修改的)
这岂不是在很短的时间内就要对策略进行两次计算吗??
为了实现自己的需求,仿照着vnpy的代码,写了一个类似于PortfolioStrategy的模块
问题是,我该修改哪部分的代码,才能让这个模块,出现在这个启动界面中呢?
另外,我观察,几乎所有的模块,除了代码本身,还有一个后缀为.dist-info的文件夹, 里面保存的都是一些我看不懂的内容,我想问下,自己写的模块也需要添加这些内容吗?
郭易燔 wrote:
因为把手里的空头仓位平掉和开多头仓位,方向都是多
你的意思是,一个OrderData
如果它的Offset是 CLOSE, Direction是 SHORT的话,那么它不是平空,而是平多,是这个意思吗?
而且这段代码里,似乎默认了req的Offset一定是Close, 但是在调用这个函数的代码中,传入的req没有做任何限制
这是vnpy 中 converter关于锁仓的逻辑
可是,令我困惑的是,平空如果用锁仓做,不就是开多吗? 同样的,平多的锁仓方式,应该就是开空。但是代码里,似乎只修改了request的 offset, 将其改为了OPEN, 却没有修改request的Direction, 这是为什么?
郭易燔 wrote:
tts的交易时段环境么?交易时不能24小时连接交易的。就算是7*24小时的环境,也会在某些时间关闭一段时间服务器。实盘中更会出现错误,所以还是老老实实的开盘时启动系统,收盘后关闭系统,如果非要全自动,也得写个脚本实现定时启动和关闭系统的功能。
查询得到合约是因为在第一次登录后就缓存了所有合约的信息,程序不关是不需要再去服务器拉取这些合约信息的。
嗯好的,我了解了。
我还有一个问题,我得怎么做,才能让vnpy行情那一栏显示行情数据呢?
我刚才试了一下,必须把我的策略删除掉,然后重新添加策略,这样才能显示行情的数据。我不想删除的话,该怎么做呢?