接入实时数据是仿真和实盘的基础,如果不能仿真和实盘,那用backtrader写的策略代码就都只能做研究了。我搜遍了全网都没有找到backtrader如何自定义实时数据源及券商接口的解决方案,backtrader支持的实盘券商不多,在官网上也没找到自定义接口的文档。在研究了backtrader内置的盈透实盘接口的文档和代码后,发现其实实盘与回测差别也就是两点:实时数据源、券商交易接口。
前一篇文章讲了怎么通过掘金量化的history接口获取数据提供给backtrader使用。本文将介绍怎么利用管道通过掘金量化的on_bar、on_tick回调函数获取实时数据。
整体思路是这样的:首先自定义一个 MyQuantData 类用来表示从掘金量化获取的实时数据源:
MyQuantData继承了bt.feed.DataBase类,conn 是用来接收从掘金量化那里传来的行情数据,islive函数用来表示这个数据源是不是实时数据源,这里一定要让它返回True,不然在运行程序的时候会卡住。获取数据的函数是_load函数,通过bar = self.conn.recv()获取管道中传来的数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class MyQuantData(bt.feed.DataBase): conn = None
def islive(self): return True
def start(self): super(MyQuantData, self).start() if self.conn is None: raise Exception("Invalid conn!")
def stop(self): super(MyQuantData, self).stop() if self.conn is not None: self.conn.close() self.conn = None
def _load(self): if self.conn is None: return False try: bar = self.conn.recv() self.lines.datetime[0] = bt.utils.date2num(bar['eob']) self.lines.open[0] = bar['open'] self.lines.high[0] = bar['high'] self.lines.low[0] = bar['low'] self.lines.close[0] = bar['close'] self.lines.volume[0] = bar['volume'] self.lines.openinterest[0] = -1 return True except: return False
|