marketstore * new data feed integration
-
i am integrating a new data feed called marketstore (both historical and real time), there is a python interface called pymarketstore I have attached a very simplified version bellow in terms of hoping someone can easily follow the code. However I seem to be running into a basic error that has me.
the code does work when testing it outside of backtrader. the error I get is at the bottom, which to me makes no sense because because I have tested the
date2num
function on the data and it works fine.date2num(datetime.datetime.fromtimestamp(1527973080))
output>>736847.5819444444
import backtrader as bt from backtrader import date2num import backtrader.feed as feed import datetime import pymarketstore as pymkts class MarketStore(feed.DataBase): params = ( ('host', '127.0.0.1'), ('port', '5993'), ('symbol', None), ('timeframe', None), ('startdate', ''), ('high', 'High'), ('low', 'Low'), ('open', 'Open'), ('close', 'Close'), ('volume', 'Volume'), ) def start(self): super(MarketStore, self).start() self.ndb = pymkts.Client('http://{host}:{port}/rpc'.format( host=self.p.host, port=self.p.port )) # The query could already consider parameters like fromdate and todate # to have the database skip them and not the internal code qstr = pymkts.Params(self.p.symbol, self.p.timeframe, 'OHLCV') dbars = list(self.ndb.query(qstr).first().array) self.biter = iter(dbars) def _load(self): try: bar = next(self.biter) except StopIteration: return False self.l.datetime[0] = date2num(datetime.datetime.fromtimestamp(bar[0])) self.l.open[0] = bar[1] self.l.high[0] = bar[2] self.l.low[0] = bar[3] self.l.close[0] = bar[4] self.l.volume[0] = bar[5] return True
ERROR on RUN
File "datafeed_T.py", line 47, in <module> runstrat() File "datafeed_T.py", line 40, in runstrat results = cerebro.run() File "/home/mathew/anaconda3/envs/backtrader/lib/python3.4/site-packages/backtrader/cerebro.py", line 1127, in run runstrat = self.runstrategies(iterstrat) File "/home/mathew/anaconda3/envs/backtrader/lib/python3.4/site-packages/backtrader/cerebro.py", line 1207, in runstrategies data._start() File "/home/mathew/anaconda3/envs/backtrader/lib/python3.4/site-packages/backtrader/feed.py", line 206, in _start self._start_finish() File "/home/mathew/anaconda3/envs/backtrader/lib/python3.4/site-packages/backtrader/feed.py", line 183, in _start_finish self.fromdate = self.date2num(self.p.fromdate) File "/home/mathew/anaconda3/envs/backtrader/lib/python3.4/site-packages/backtrader/feed.py", line 247, in date2num return date2num(dt) File "/home/mathew/anaconda3/envs/backtrader/lib/python3.4/site-packages/backtrader/utils/dateintern.py", line 216, in date2num base = float(dt.toordinal()) AttributeError: 'str' object has no attribute 'toordinal'
if needed for reference this is what the output of
dbars
looks likedbars = [(1527972900, 7635.0, 7635.01, 7635.0, 7635.01, 2.6346132199999994), (1527972960, 7635.0, 7635.0, 7630.0, 7630.01, 2.3528064599999996), (1527973020, 7630.58, 7630.58, 7627.0, 7627.0, 7.306953420000004), (1527973080, 7627.0, 7627.0, 7615.0, 7615.0, 15.73571176999999), (1527973140, 7615.0, 7615.01, 7615.0, 7615.01, 5.795549140000001), (1527973200, 7615.0, 7630.58, 7615.0, 7630.58, 4.835156190000001), (1527973260, 7630.57, 7630.57, 7626.0, 7626.01, 1.85923574), (1527973320, 7626.0, 7626.0, 7621.54, 7621.54, 0.7277), (1527973380, 7621.55, 7621.87, 7621.55, 7621.87, 1.2915719699999997), (1527973440, 7621.86, 7623.22, 7621.86, 7623.22, 0.5715000000000001)]
-
the issue seems to be with the date2num function . I have converted my array of epoch back into datetime objects and it seems to pass fine through the function. However, i still get the same error in backtrader. I updated the code as followed :
self.l.datetime[0] = date2num(datetime.datetime.utcfromtimestamp(int(bar[0])))
-
an example of it passing through function fine but with in backtrader still the error of
AttributeError: 'str' object has no attribute 'toordinal'
import math import datetime from backtrader import date2num bars = [(1527991500, 7635.41, 7635.41, 7635.41, 7635.41, 0.13048232), (1527991560, 7635.4, 7635.41, 7635.4, 7635.41, 0.3689), (1527991620, 7635.41, 7635.41, 7635.41, 7635.41, 3.5814399599999995), (1527991680, 7635.41, 7635.41, 7635.41, 7635.41, 1.41122419),] biter = iter(bars) bar = next(biter) date2num(datetime.datetime.utcfromtimestamp(int(bar[0])))
-
SOLVED
the
fromdate
with in the datafeed initialize was a integer and needed to be a datetime object . IEdatetime.date(2018, 6, 1)