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

这两天升级上vnpy-2.0.9, ubuntu linux。
参照 《聚宽数据(JDDataSDK)集成方案(试用期长达一年)http://www.vnpy.com/forum/topic/1472-ju-kuan-shu-ju-jddatasdk-ji-cheng-fang-an-shi-yong-qi-chang-da-yi-nian》也对接上了聚宽数据方案。
其间,遇上了一个小BUG, 我不确定Windows下面是否同样,估计应该也会有同样的问题,由于聚宽数据方案 接口jqdata.py基本上和 米筐数据方案rqdata.py 差不多,因此,我在聚宽数据方案遇到的这个问题 可能在米筐数据接口那个文件rqdata.py也同样会有(我猜):
jqdata.py rqdata.py 这两个文件,RqdataClient 类里面都有一个函数: query_history(self, req: HistoryRequest),这里面有关枚举Interval的两个转换:
是这样的:
rq_interval = INTERVAL_VT2RQ.get(interval)
adjustment = INTERVAL_ADJUSTMENT_MAP[interval]
这两个转换在文件开头有定义:
INTERVAL_VT2RQ = {
Interval.MINUTE: "1m",
Interval.HOUR: "60m",
Interval.DAILY: "1d",
}

INTERVAL_ADJUSTMENT_MAP = {
Interval.MINUTE: timedelta(minutes=1),
Interval.HOUR: timedelta(hours=1),
Interval.DAILY: timedelta() # no need to adjust for daily bar
}
这个在cta_strategy/engine.py(CTA引擎) query_bar_from_rq函数传过来的参数 是可以的,数据也可以正常下载,它传给 query_history(self, req: : HistoryRequest)的参数req.interval 确实是Interval枚举类型,然后经过上述的两个字典的转换是可以得到结果的。
但问题出在,假如是由cta_backtester,也不是图形界面上策略回测那个UI,如果是在那个UI上面下载历史数据按钮,这样的话,它传递到query_history(self, req: : HistoryRequest)的参数req.interval ,就不对了,因为它是从图形界面上的那个组合框(就是选择1m,1h,d,w......的那个组合框),它实际上传递过来的是组给框当前项目上的文字字符串"1m", ”1h","d","w"..., 它实际上是Interval.value ! 而由它来作为字典的键来查询,得到的是空值 ,所以,后面下载是下载不到数据的!
因此,app/cta_backtester, app/cta_strategy这两方面传过来的参数不一致,导致了这个BUG。。。

以下是我的修改方案:(因为我是先按照 cta_backtester传来的参数改的)
jqdata.py rqdata.py 这两个文件里面的这两个字典键改一下:

INTERVAL_VT2RQ = {
Interval.MINUTE.value: "1m",
Interval.HOUR.value: "60m",
Interval.DAILY.value: "1d",
}

INTERVAL_ADJUSTMENT_MAP = {
Interval.MINUTE.value: timedelta(minutes=1),
Interval.HOUR.value: timedelta(hours=1),
Interval.DAILY.value: timedelta() # no need to adjust for daily bar
}
增加一个:
INTERVAL_JQ2VT = {
"1m": Interval.MINUTE,
"60M":Interval.HOUR,
"1d":Interval.DAILY,
}
然后在 def query_history(self, req: HistoryRequest):函数里面修改这一句:
bar = BarData(
symbol=symbol,
exchange=exchange,
interval = INTERVAL_JQ2VT.get(interval) , # interval=interval, 这一句转换回来
datetime=row.name.to_pydatetime() - adjustment,
open_price=row["open"],
high_price=row["high"],
low_price=row["low"],
close_price=row["close"],
volume=row["volume"],
gateway_name="RQ"
)
这样 cta_backtester就可以正常下载了。
然后,再cta_strategy/engine.py 修改一句:
def query_bar_from_rq(
self, symbol: str, exchange: Exchange, interval: Interval, start: datetime, end: datetime
):
"""
Query bar data from RQData.
"""
req = HistoryRequest(
symbol=symbol,
exchange=exchange,
interval=interval.value, # interval=interval, 这里转换一下,传value进去,和cta_backtester那边一致。
start=start,
end=end
)
data = rqdata_client.query_history(req)
return data

这样两边都可以用了。

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

谢谢

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