问题已解决,谢谢各位的反馈和帮助。
为了供有类似要求的朋友参考,把我这边的修改罗列在下面:
1。cta_strategy文件夹下面engin文件修改:
1)多import一个EVENT_TIMER 事件
from vnpy.trader.event import (
EVENT_TICK,
EVENT_ORDER,
EVENT_TRADE,
EVENT_POSITION,
EVENT_TIMER
)
2)注册事件时,增加一个self.event_engine.register(EVENT_TIMER,self.process_time_event)
def register_event(self):
""""""
self.event_engine.register(EVENT_TICK, self.process_tick_event)
self.event_engine.register(EVENT_ORDER, self.process_order_event)
self.event_engine.register(EVENT_TRADE, self.process_trade_event)
self.event_engine.register(EVENT_POSITION, self.process_position_event)
self.event_engine.register(EVENT_TIMER,self.process_time_event) # test
3)参照process_tick_event 写一个process_time_event(self, event: Event).。由于每秒中都会调用这个过程,担心占用资源太多,所以在系统中定义了一个timecount的变量,这里设置每5秒真正调用一次。
def process_time_event(self, event: Event):
""""""
if self.timecount < 5:
self.timecount = self.timecount + 1
else:
self.timecount = 0
for k,v in self.symbol_strategy_map.items():
strategies = v
for strategy in strategies:
if strategy.inited:
#self.write_log("valid strategy time driven!!")
self.call_strategy_func(strategy, strategy.on_time)
2. 上面一个过程中实际调用on_time函数,所以要做一些处理
2.1 cta_strategy文件夹中template文件中,参考on_tick函数,定义on_time函数
@virtual
def on_time(self):
"""
Callback of new time data update.
"""
pass
2.2 自编策略文件中定义 on_time(self)函数即可
def on_time(self):
"""
Callback of new time data update.
"""
本人使用这个on_time函数,主要是实盘时用,后向测试可能出问题。
再一次感谢大家的帮助!
还是有问题,请指点,谢谢!
现有程序修改如下:
cta strategy中engine.PY中class CtaEngine(BaseEngine):
增添了以下内容:
1)from vnpy.trader.event import (
EVENT_TICK,
EVENT_ORDER,
EVENT_TRADE,
EVENT_POSITION,
EVENT_TIMER # 新增内容
2)注册事件
def register_event(self):
""""""
self.event_engine.register(EVENT_TICK, self.process_tick_event)
self.event_engine.register(EVENT_TIMER, self.process_time_event) #新增内容
3) def process_time_event(self, event: Event):
如果不做任何判断和操作,直接打印日志是正常的。
self.write_log("调用时间驱动")
strategies = self.symbol_strategy_map.values()
for strategy in self.strategies:
self.write_log(strategy)
------此时在cta界面中可以每秒打印 “调用时间驱动” 和strategy(cu2106),策略也可以正常添加、初始化和启动
但只要将处理过程增加一点,如判断策略是否初始化再打印日志就不成功了
def process_time_event(self, event: Event):
""""""
self.write_log("调用时间驱动")
strategies = self.symbol_strategy_map.values()
for strategy in self.strategies:
#self.write_log(strategy)
if strategy.inited:
self.write_log(strategy)
---此时“调用时间驱动” 的日志不能正常输出。
临时加入策略也不能显示,关闭cta策略再重新打开后,可以显示加入策略是成功的,但点击策略初始化和启动,都没有反应,就像这个线程没有启动一样。
***请大神指点,看看怎么可以修改,谢谢!
系统连接正常了,不过时间驱动还是没有搞定,请熟悉的人指点,谢谢。
现在程序修改的地方包括:
1、自编策略中仿照 ON_TICK函数,编写了一个简单多on_time函数,界面上返回调用次数;
2、cta strategy中template.py中,添加了 @virtual
def on_time(self)
3、cta strategy中engine.PY中class CtaEngine(BaseEngine):
增添了以下内容:
1)from vnpy.trader.event import (
EVENT_TICK,
EVENT_ORDER,
EVENT_TRADE,
EVENT_POSITION,
EVENT_TIMER # 新增内容
2)注册事件
def register_event(self):
""""""
self.event_engine.register(EVENT_TICK, self.process_tick_event)
self.event_engine.register(EVENT_TIMER, self.process_time_event) #新增内容
3) def process_time_event(self, event: Event):
""""""
strategies = self.symbol_strategy_map.values()
for strategy in strategies:
if strategy.inited:
self.call_strategy_func(strategy, strategy.on_time)
运行时无语法错误
打开cta strategy界面,可以正常登录,也可以正常订阅行情
但启动自编策略时,点击初始化后 无任何提示, 界面上原本正常显示多行情也停住了,好像sleep了一样
求大神指点,怎么才可以在cta strategy中实现时间驱动,谢谢!
同问这个问题,请问楼主后面怎么解决的呀
实盘交易时,想在开市前下单,或者无行情时让策略做动作。😅
为如此小错惭愧,谢谢 青青子荆 指点。
好巧不巧,遇到simnow暂停交易,没法调试。
紧急申请期货公司穿透测试和模拟交易,只能下周继续测试了
策略和template里边已经写了on_time函数
启动VN Trade Pro时,弹出“触发异常”
提示 cta_strategy\engin.py中 for strategy in strategies ^Syntax Error:invalid syntax
用Python的交易员 wrote:
直接遍历那个包含所有策略的字典好了
谢谢管理员回复。
程序写成这样,还是通不过,求大神代劳
def process_time_event(self, event: Event):
""""""
# tick = event.data
# strategies = self.symbol_strategy_map[tick.vt_symbol]
strategies = self.symbol_strategy_map.values()
for strategy in strategies
if strategy.inited:
self.call_strategy_func(strategy, strategy.on_time)
pass
参照tick驱动,注册了 self.event_engine.register(EVENT_TIME,self.process_systime_event) # test
在仿照以下程序时,遇到问题:
def process_tick_event(self, event: Event):
""""""
tick = event.data
strategies = self.symbol_strategy_map[tick.vt_symbol]
if not strategies:
return
self.check_stop_order(tick)
for strategy in strategies:
if strategy.inited:
self.call_strategy_func(strategy, strategy.on_tick, tick)
tick驱动时,传进来的数据有vt_symbol,可据此判断所有strategies中执行。 但时间事件中,无合约,怎么让它在所有策略中执行呢
def process_systime_event(self, event: Event):
""""""
systime = event.data
strategies = self.symbol_strategy_map[tick.vt_symbol] ?????
if not strategies:
return
for strategy in strategies:
if strategy.inited:
self.call_strategy_func(strategy, strategy.on_time, tick)
参照tick驱动,注册了 self.event_engine.register(EVENT_TIME,self.process_systime_event) # test
在仿照以下程序时,遇到问题:
def process_tick_event(self, event: Event):
""""""
tick = event.data
strategies = self.symbol_strategy_map[tick.vt_symbol]
if not strategies:
return
self.check_stop_order(tick)
for strategy in strategies:
if strategy.inited:
self.call_strategy_func(strategy, strategy.on_tick, tick)
tick驱动时,传进来的数据有vt_symbol,可据此判断所有strategies中执行。 但时间事件中,无合约,怎么让它在所有策略中执行呢
def process_systime_event(self, event: Event):
""""""
systime = event.data
strategies = self.symbol_strategy_map[tick.vt_symbol] ?????
if not strategies:
return
for strategy in strategies:
if strategy.inited:
self.call_strategy_func(strategy, strategy.on_time, tick)
这个试验程序放在云服务器上的,也不会那么巧刚好断开了吧
而且委托单一直显示提交中,如果是当时断开了,系统重连后还能继续提交吗?
在网站上下载安装的vnstudio-2.1.9,使用上期模拟账户进行测试:
参照策略模本写了个简单策略,交易股指期货IF
策略的基本逻辑是 收到第一个tick数据后判断交易
股指期货的第一个tick数据应该是在9:29分收到,9点29分到9点30分之间模拟系统不允许下单
所以我改成了行情时间9点30分之后下单: self.buy(self.last_price + 1.0, self.fixed_size) 按照最新成交价加1的价格买入1张。策略的判断逻辑没有问题,但“委托单状态”为“提交中”,该委托单没有下到模拟系统中。
请问,是vnpy的cta策略中限制了下单时间(如9点31分之前不能下单),还是我这样使用buy语句错误?
如果盘中设置某tick值超过某阀值后下单,几乎没有遇到过这种问题。
求高手指教,谢谢!
想尝试一个简单的股指期货交易策略,要求在开盘前下单。
现有模板中,只有行情驱动(k线周期驱动也一样)。
想参照on tick的范式定义一个on time函数,请问除了在stratege中写on time函数外,还需要在其它哪些地方修改呀,谢谢!
求大神指点
已在网上找到答案。谢谢关注
为减少其它同学的困难,我这里把答案复制过来,呵呵。
解决方案:
第一步:找到vnpy的QT的bin路径,例如我的是:C:\vnstudio\Lib\site-packages\PyQt5\Qt\bin
第二步:找到Qt5Bluetooth.dll,并重命名为其它名,例如:Qt5Bluetooth.dll1就行了!
按照课程,选用了阿里云,课程中推荐的2核4G -windows 2012server版本。
下载好vn station(2.1.9),安装后启动时提示: this windows version(6.3.9600) does not support the required Bluetooth API.consider updating to a more recent windows(10.0.10586)
windows 自动更新后也不行,求大神指点,谢谢!
vnpy社区新人,一个弱弱的问题。
课程和demo中展示的,很多都是tick或bar生成时驱动交易信号的判断和触发。请问直接用系统时间驱动,是否可行?
简单使用时间驱动,如在某个特定时点(有可能是在开盘前,所以没有quotes中的时间戳,不能用tick驱动)提前下单,等待成交。
这样虽然在后向测试中可能会出问题,但实盘交易时可以更方便。
为了减少尝试成本,请了解的大神告知,谢谢!