ricequant / rqalpha-mod-vnpy Goto Github PK
View Code? Open in Web Editor NEWRQAlpha 对接 vnpy 的扩展 Mod。通过启用该 Mod 来实现期货策略的实盘交易
License: Apache License 2.0
RQAlpha 对接 vnpy 的扩展 Mod。通过启用该 Mod 来实现期货策略的实盘交易
License: Apache License 2.0
vnpy 这两天提交了不少新代码,改动比较大,rqalpa-mod-vnpy 也需要做相应的适配。
Traceback (most recent call last):
File "/media/psf/Home/rqalpha/rqalpha/main.py", line 289, in run
Executor(env).run(bar_dict)
│ │ └ BarMap(RB1710)
│ └ <rqalpha.environment.Environment object at 0x7f11239a7410>
└ <class 'rqalpha.core.executor.Executor'>
File "/media/psf/Home/rqalpha/rqalpha/core/executor.py", line 52, in run
for event in self._env.event_source.events(start_date, end_date, frequency):
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/vnpy_event_source.py", line 131, in events
calendar_dt = parse(''.join((str(tick.date), str(tick.time/1000))))
│ │ └ {'b5_v': 0, 'b4_v': 0, 'limit_down': 2796.0, 'limit_up': 3217.0, 'high': 2954.0, 'b5': 1.7976931348623157e+308, 'b3_v': 0, 'b1':...
│ └ {'b5_v': 0, 'b4_v': 0, 'limit_down': 2796.0, 'limit_up': 3217.0, 'high': 2954.0, 'b5': 1.7976931348623157e+308, 'b3_v': 0, 'b1':...
└ <function parse at 0x7f111c960b18>
File "/home/cui/anaconda2/envs/rqa/lib/python2.7/site-packages/dateutil/parser.py", line 1168, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
│ │ └ {}
│ └ '2017050592628'
└ <dateutil.parser.parser object at 0x7f111ce79050>
File "/home/cui/anaconda2/envs/rqa/lib/python2.7/site-packages/dateutil/parser.py", line 578, in parse
if cday > monthrange(cyear, cmonth)[1]:
File "/home/cui/anaconda2/envs/rqa/lib/python2.7/calendar.py", line 121, in monthrange
day1 = weekday(year, month, 1)
│ │ └ 5
│ └ 2017050592628
└ <function weekday at 0x7f111c956758>
File "/home/cui/anaconda2/envs/rqa/lib/python2.7/calendar.py", line 113, in weekday
return datetime.date(year, month, day).weekday()
│ │ │ └ 1
│ │ └ 5
│ └ 2017050592628
└ <module 'datetime' from '/home/cui/anaconda2/envs/rqa/lib/python2.7/lib-dynload/datetime.so'>
OverflowError: signed integer is greater than maximum
2017-05-05 09:26:28.00 ERROR signed integer is greater than maximum
[2017-05-05 09:26:31.950227] ERROR: system_log: 策略运行产生异常
Traceback (most recent call last):
File "/media/psf/Home/rqalpha/rqalpha/main.py", line 289, in run
Executor(env).run(bar_dict)
File "/media/psf/Home/rqalpha/rqalpha/core/executor.py", line 52, in run
for event in self._env.event_source.events(start_date, end_date, frequency):
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/vnpy_event_source.py", line 131, in events
calendar_dt = parse(''.join((str(tick.date), str(tick.time/1000))))
File "/home/cui/anaconda2/envs/rqa/lib/python2.7/site-packages/dateutil/parser.py", line 1168, in parse
return DEFAULTPARSER.parse(timestr, **kwargs)
File "/home/cui/anaconda2/envs/rqa/lib/python2.7/site-packages/dateutil/parser.py", line 578, in parse
if cday > monthrange(cyear, cmonth)[1]:
File "/home/cui/anaconda2/envs/rqa/lib/python2.7/calendar.py", line 121, in monthrange
day1 = weekday(year, month, 1)
File "/home/cui/anaconda2/envs/rqa/lib/python2.7/calendar.py", line 113, in weekday
return datetime.date(year, month, day).weekday()
OverflowError: signed integer is greater than maximum
`
`
rqalpha : 3.0.2
rqalpha-mod-vnpy: 0.9.30
vnpy is also the latest;
/usr/bin/python2.7 /home/walker/Desktop/Rqalpha30/rqalpha/startmod.py
Traceback (most recent call last):
File "/home/walker/Desktop/Rqalpha30/rqalpha/rqalpha/main.py", line 195, in run
mod_handler.start_up()
└ <rqalpha.mod.ModHandler object at 0x7faba6b47f90>
File "/home/walker/Desktop/Rqalpha30/rqalpha/rqalpha/mod/init.py", line 68, in start_up
self._mod_dict[mod_name].start_up(self._env, mod_config)
│ │ │ └ {'CTP': {'brokerID': '9999',
'mdAddress': 'tcp://180.168.146.187:10010',
'password': 'FinalicA_0472',
'tdAddress': 'tcp://180...
│ │ └ <rqalpha.mod.ModHandler object at 0x7faba6b47f90>
│ └ u'vnpy'
└ <rqalpha.mod.ModHandler object at 0x7faba6b47f90>
File "/usr/local/lib/python2.7/dist-packages/rqalpha_mod_vnpy/mod.py", line 34, in start_up
from .vnpy_broker import VNPYBroker
File "/usr/local/lib/python2.7/dist-packages/rqalpha_mod_vnpy/vnpy_broker.py", line 20, in
from rqalpha.model.account import BenchmarkAccount, FutureAccount
ImportError: No module named account
2017-08-07 ERROR No module named account
[2017-08-07 11:27:55.326767] ERROR: system_log: 策略运行产生异常
Traceback (most recent call last):
File "/home/walker/Desktop/Rqalpha30/rqalpha/rqalpha/main.py", line 195, in run
mod_handler.start_up()
File "/home/walker/Desktop/Rqalpha30/rqalpha/rqalpha/mod/init.py", line 68, in start_up
self._mod_dict[mod_name].start_up(self._env, mod_config)
File "/usr/local/lib/python2.7/dist-packages/rqalpha_mod_vnpy/mod.py", line 34, in start_up
from .vnpy_broker import VNPYBroker
File "/usr/local/lib/python2.7/dist-packages/rqalpha_mod_vnpy/vnpy_broker.py", line 20, in
from rqalpha.model.account import BenchmarkAccount, FutureAccount
ImportError: No module named account
Traceback (most recent call last):
File "/home/walker/Desktop/Rqalpha30/rqalpha/startmod.py", line 78, in
run_file(strategy_file_path, config_mod1)
│ │ └ {'base': {'accounts': {'future': 100000}, 'start_date': '2016-01-01', 'end_date': '2016-12-01', 'strategy_file': '/home/walker/D...
│ └ '/home/walker/Desktop/Rqalpha30/rqalpha/rqalpha/examples/buy_and_hold.py'
└ <function run_file at 0x7faba71fcc80>
File "/home/walker/Desktop/Rqalpha30/rqalpha/rqalpha/init.py", line 97, in run_file
return main.run(config)
│ └ {'base': {'accounts': {'FUTURE': 100000.0},
'benchmark': None,
'data_bundle_path': '/home/walker/.rqalpha/bundle',
'end_date'...
└ <module 'rqalpha.main' from '/home/walker/Desktop/Rqalpha30/rqalpha/rqalpha/main.pyc'>
File "/home/walker/Desktop/Rqalpha30/rqalpha/rqalpha/main.py", line 317, in run
mod_handler.tear_down(code, user_exc)
│ │ └ CustomException()
│ └ EXIT_CODE.EXIT_INTERNAL_ERROR
└ <rqalpha.mod.ModHandler object at 0x7faba6b47f90>
File "/home/walker/Desktop/Rqalpha30/rqalpha/rqalpha/mod/init.py", line 73, in tear_down
ret = self._mod_dict[mod_name].tear_down(*args)
│ │ │ └ (EXIT_CODE.EXIT_INTERNAL_ERROR, CustomException())
│ │ └ u'vnpy'
│ └ <rqalpha.mod.ModHandler object at 0x7faba6b47f90>
└ None
File "/usr/local/lib/python2.7/dist-packages/rqalpha_mod_vnpy/mod.py", line 55, in tear_down
self._gateway.exit()
└ <rqalpha_mod_vnpy.mod.VNPYMod object at 0x7faba6b35f10>
AttributeError: 'NoneType' object has no attribute 'exit'
Process finished with exit code 1
在每次启动vnpy的时候,系统都会自动查询当前仓位信息加载到RQA中。发现当出现空方向仓位的时候就直接报key error了。查看代码发现data_factory中cache_vnpy_position_before_init函数中的空仓字段写错。不应为sell_position,而应为sell_quantity
如题。
如果64不行的话,能不能资辞一下64位的?
分离数据和交易部分,在使用 rqalpha-mod-vnpy 的时候数据和事件不一定要通过 vnpy 获得,应允许替换数据源和事件源。
由于 vtGateway 的封装程度比较高,一些函数的封装不适用于rqalpha。故决定尝试脱离 vtGateway,参照 vtGateway 的模式重写 gateway。
2017-07-01 07:24:33.00 ERROR No module named account
[2017-07-01 07:24:33.068771] ERROR: system_log: 策略运行产生异常
Traceback (most recent call last):
File "//anaconda/lib/python2.7/site-packages/rqalpha/main.py", line 195, in run
mod_handler.start_up()
File "//anaconda/lib/python2.7/site-packages/rqalpha/mod/init.py", line 68, in start_up
self._mod_dict[mod_name].start_up(self._env, mod_config)
File "//anaconda/lib/python2.7/site-packages/rqalpha_mod_vnpy/mod.py", line 34, in start_up
from .vnpy_broker import VNPYBroker
File "//anaconda/lib/python2.7/site-packages/rqalpha_mod_vnpy/vnpy_broker.py", line 20, in
from rqalpha.model.account import BenchmarkAccount, FutureAccount
ImportError: No module named account
目前逻辑是在订阅市场行情 cache住,需要用到时候从里面获取。
但是不同品种期货交易时间不同,比如夜盘,就无法获取到股指期货的市场行情。
此时应当用持仓查询返回的昨结算价作为last_price
log太长,发个文件:
log20170420.txt
python version: 2.7.11
rqalpha version: 2.0.7
rqalpha_mod_vnpy version: 0.9.11
用pycharm运行;
vnpy封装的 onRtnDepthMarketData函数会对volume=0的数据进行过滤。
导致在非交易时段调用subscribe函数没有当前最新快照数据返回,无法计算出portfolio.total_value(举例来说,有股指期货仓位的策略在夜盘时间打印portfolio信息,直接报错退出)。
需要进行改写,或者加入QryDepthMarketData函数。
VNPY的Close只能平上期所昨仓。平今仓需要设置为CloseToday。所以buy_close 以及 sell_close 需要对上期所合约智能识别。举例来说,当前昨仓5,今仓3.当平仓数量为6的时候,按照先进先出的方式,先平昨仓5,后平今仓1,发送2个平仓单。此时函数应返回order list。与此同时,cancel_order API也应当支持对于order list的cancel操作。如果平仓数量为10的时候,则将昨仓5、今仓3分别发送平仓单。
对于仓位获取,注意上期所一个方向可能会返回两条仓位记录,一条昨仓,一条今仓。
由于YdPosition数据有误,所以使用Position获取当前总仓位,使用TodayPosition获取今仓,两者相减得到昨仓。
RQA设置的LimitOrder在发出时实际变成了MarketOrder,并且一发单就自动撤单了。
合约
测试代码如下:
`def init(context):
context.s1 = "IF1705"
#subscribe(context.s1)
subscribe(context.s1)
logger.info("Interested in: " + str(context.s1))
context.counter = 0
context.order = None
context.vwap = 0
context.multiplier = instruments(context.s1).contract_multiplier
def before_trading(context):
print('************* BEFORE TRADING***********')
print('GET OPEN ORDERS {}'.format(get_open_orders()))
p_print(context)
def p_print(context):
print('PORTFOLIO TOTAL VALUE{}, UAV {}, CASH{}, COST{}'.format(context.portfolio.total_value,
context.portfolio.unit_net_value,
context.portfolio.cash,
context.portfolio.transaction_cost))
print('ACCOUNT CASH{}, HOLDING PNL{}, REALIZED PNL{}, BUY MARGIN{}, '
'SELL MARGIN{}, MARGIN{}, FROZEN_CASH{}, TOTAL_VALUE {}'.format(context.portfolio.future_account.cash,
context.portfolio.future_account.holding_pnl,
context.portfolio.future_account.realized_pnl,
context.portfolio.future_account.buy_margin,
context.portfolio.future_account.sell_margin,
context.portfolio.future_account.margin,
context.portfolio.future_account.frozen_cash,
context.portfolio.future_account.total_value))
def handle_tick(context, tick):
context.counter += 1
if tick.volume != 0:
context.vwap = tick.total_turnover / (tick.volume * context.multiplier)
else:
context.vwap = tick.last
if context.counter % 100 == 0:
print('COUNTER {}, VWAP {}, LAST {}, VOLUME {}, TURNOVER {}'.format(
context.counter, context.vwap, tick.last, tick.volume, tick.total_turnover))
print('*******************BUY OPEN NOW****************')
p_print(context)
context.order = buy_open(context.s1, 1, LimitOrder(3500))
if context.counter % 150 == 0:
print('COUNTER {}, VWAP {}, LAST {}, VOLUME {}, TURNOVER {}'.format(
context.counter, context.vwap, tick.last, tick.volume, tick.total_turnover))
print('SELL CLOSE NOW *****************')
sell_close(context.s1, 1, LimitOrder(3300))
p_print(context)
`
rqalpha version: 2.0.7
rqalpha_mod_vnpy version: 0.9.11
使用pycharm运行;
今天又没有这个错误了 。
Exception in thread Thread-7:
Traceback (most recent call last):
File "C:\APPS\Anaconda4_32\lib\threading.py", line 801, in __bootstrap_inner
self.run()
File "C:\APPS\Anaconda4_32\lib\threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "C:\vnpy\vn.trader\eventEngine.py", line 218, in __run
self.__process(event)
File "C:\vnpy\vn.trader\eventEngine.py", line 228, in __process
[handler(event) for handler in self._handlers[event.type]]
File "C:\LocalRqalpha\rqalpha\rqalpha\mod\rqalpha_mod_vnpy\vnpy_engine.py", line 254, in
self.event_engine.register(EVENT_ERROR, lambda e: system_log.error(e['data']))
AttributeError: Event instance has no attribute 'getitem'
账户中有股指期货的仓位。在早晨9点商品开盘的时候,获取股指行情出错。
`
[2017-05-05 09:00:45.451757] ERROR: system_log: Cannot find such tick whose order_book_id is IF1705
Traceback (most recent call last):
File "/media/psf/Home/rqalpha/rqalpha/main.py", line 209, in run
env.portfolio = broker.get_portfolio()
│ └ <rqalpha_mod_vnpy.vnpy_broker.VNPYBroker object at 0x7fe49f38eb50>
└ <rqalpha.environment.Environment object at 0x7fe4ad1ed410>
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/vnpy_broker.py", line 68, in get_portfolio
return self.gateway.get_portfolio()
└ <rqalpha_mod_vnpy.vnpy_broker.VNPYBroker object at 0x7fe49f38eb50>
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/ctp/gateway.py", line 93, in get_portfolio
future_account = self.cache.account
└ <rqalpha_mod_vnpy.ctp.gateway.CtpGateway object at 0x7fe49f38b150>
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/ctp/data_cache.py", line 115, in account
holding_pnl = sum(position.holding_pnl for position in six.itervalues(ps))
│ └ {'CU1705': FuturePosition({'sell_old_quantity': 1, 'contract_multiplier': 5.0, 'last_price': 44960.0, 'buy_pnl': -3850.0, 'buy_r...
└ <module 'six' from '/home/cui/anaconda2/envs/rqa/lib/python2.7/site-packages/six.pyc'>
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/ctp/data_cache.py", line 115, in
holding_pnl = sum(position.holding_pnl for position in six.itervalues(ps))
│ │ └ <module 'six' from '/home/cui/anaconda2/envs/rqa/lib/python2.7/site-packages/six.pyc'>
│ └ FuturePosition({'sell_old_quantity': 0, 'contract_multiplier': 300.0, 'last_price': 3383.4, 'buy_pnl': -8039.999999999918, 'buy...
└ FuturePosition({'sell_old_quantity': 0, 'contract_multiplier': 300.0, 'last_price': 3383.4, 'buy_pnl': -8039.999999999918, 'buy...
File "/media/psf/Home/rqalpha/rqalpha/model/position/future_position.py", line 133, in holding_pnl
return self.buy_holding_pnl + self.sell_holding_pnl
│ └ FuturePosition({'sell_old_quantity': 0, 'contract_multiplier': 300.0, 'last_price': 3383.4, 'buy_pnl': -8039.999999999918, 'buy_...
└ FuturePosition({'sell_old_quantity': 0, 'contract_multiplier': 300.0, 'last_price': 3383.4, 'buy_pnl': -8039.999999999918, 'buy_...
File "/media/psf/Home/rqalpha/rqalpha/model/position/future_position.py", line 105, in buy_holding_pnl
return (self.last_price - self.buy_avg_holding_price) * self.buy_quantity * self.contract_multiplier
│ │ │ └ FuturePosition({'sell_old_quantity': 0, 'contract_multiplier': 300.0, 'last_price': 3383.4, 'buy_pnl': -8039.999999999918, 'buy_...
│ │ └ FuturePosition({'sell_old_quantity': 0, 'contract_multiplier': 300.0, 'last_price': 3383.4, 'buy_pnl': -8039.999999999918, 'buy_...
│ └ FuturePosition({'sell_old_quantity': 0, 'contract_multiplier': 300.0, 'last_price': 3383.4, 'buy_pnl': -8039.999999999918, 'buy_...
└ FuturePosition({'sell_old_quantity': 0, 'contract_multiplier': 300.0, 'last_price': 3383.4, 'buy_pnl': -8039.999999999918, 'buy_...
TypeError: unsupported operand type(s) for -: 'NoneType' and 'float'
2017-05-05 09:00:45.00 ERROR unsupported operand type(s) for -: 'NoneType' and 'float'
[2017-05-05 09:00:45.725248] ERROR: system_log: 策略运行产生异常
Traceback (most recent call last):
File "/media/psf/Home/rqalpha/rqalpha/main.py", line 209, in run
env.portfolio = broker.get_portfolio()
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/vnpy_broker.py", line 68, in get_portfolio
return self._gateway.get_portfolio()
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/ctp/gateway.py", line 93, in get_portfolio
future_account = self._cache.account
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/ctp/data_cache.py", line 115, in account
holding_pnl = sum(position.holding_pnl for position in six.itervalues(ps))
File "/media/psf/Home/rqalpha-mod-vnpy/rqalpha_mod_vnpy/ctp/data_cache.py", line 115, in
holding_pnl = sum(position.holding_pnl for position in six.itervalues(ps))
File "/media/psf/Home/rqalpha/rqalpha/model/position/future_position.py", line 133, in holding_pnl
return self.buy_holding_pnl + self.sell_holding_pnl
File "/media/psf/Home/rqalpha/rqalpha/model/position/future_position.py", line 105, in buy_holding_pnl
return (self.last_price - self.buy_avg_holding_price) * self.buy_quantity * self.contract_multiplier
TypeError: unsupported operand type(s) for -: 'NoneType' and 'float'
CThostFtdcUserApiImplBase::OnSessionDisconnected[0x7fe48c0008c8][-830341119][ 0]
CThostFtdcUserApiImplBase::OnSessionDisconnected[0x7fe4900008c8][-830406655][ 0]
`
OS: Ubuntu 16.04
Python 2.7.12
rqalpha-mod-vnpy: 0.9.11
rqalpha: 2.0.9
Exception in thread Thread-1:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 754, in run
self.__target(*self.__args, **self.__kwargs)
File "/home/Vnpy/vnpy/vn.trader/eventEngine.py", line 218, in __run
self.__process(event)
File "/home/Vnpy/vnpy/vn.trader/eventEngine.py", line 228, in __process
[handler(event) for handler in self._handlers[event.type]]
File "/home/RqalphaNew/rqalpha/rqalpha/mod/rqalpha_mod_vnpy/vnpy_engine.py", line 254, in
self.event_engine.register(EVENT_ERROR, lambda e: system_log.error(e['data']))
AttributeError: Event instance has no attribute 'getitem'
Traceback (most recent call last):
File "/home/RqalphaNew/rqalpha/rqalpha/main.py", line 191, in run
mod_handler.start_up()
└ <rqalpha.mod.ModHandler object at 0x7fb9c50f63d0>
File "/home/RqalphaNew/rqalpha/rqalpha/mod/init.py", line 67, in start_up
self._mod_dict[mod_name].start_up(self.env, mod_config)
│ │ │ └ {'commission_multiplier': 1,
'enabled': True,
'matching_type': MATCHING_TYPE.CURRENT_BAR_CLOSE,
'price_limit': True,
'signal...
│ │ └ <rqalpha.mod.ModHandler object at 0x7fb9c50f63d0>
│ └ 'sys_simulation'
└ <rqalpha.mod.ModHandler object at 0x7fb9c50f63d0>
File "/home/RqalphaNew/rqalpha/rqalpha/mod/rqalpha_mod_sys_simulation/mod.py", line 47, in start_up
raise RuntimeError(("Not supported matching type {}").format(mod_config.matching_type))
│ └ {'commission_multiplier': 1,
'enabled': True,
'matching_type': MATCHING_TYPE.CURRENT_BAR_CLOSE,
'price_limit': True,
'signal...
└ <function gettext at 0x7fb9d118c9b0>
RuntimeError: 不支持撮合类型: MATCHING_TYPE.CURRENT_BAR_CLOSE
0000-00-00 ERROR 不支持撮合类型: MATCHING_TYPE.CURRENT_BAR_CLOSE
[2017-04-11 16:01:00.747647] ERROR: system_log: 策略运行产生异常
Traceback (most recent call last):
File "/home/RqalphaNew/rqalpha/rqalpha/main.py", line 191, in run
mod_handler.start_up()
File "/home/RqalphaNew/rqalpha/rqalpha/mod/init.py", line 67, in start_up
self._mod_dict[mod_name].start_up(self.env, mod_config)
File "/home/RqalphaNew/rqalpha/rqalpha/mod/rqalpha_mod_sys_simulation/mod.py", line 47, in start_up
raise RuntimeError(("Not supported matching type {}").format(mod_config.matching_type))
RuntimeError: 不支持撮合类型: MATCHING_TYPE.CURRENT_BAR_CLOSE
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.