I'm trying to maintain code compatibility with my production environment, where I'm storing ohlc data in a dict:
self.ohlc = {-3: {'o': 153.252, 'h': 155.84, 'l': 149.49, 'c': 152.42, 'vol': 155395.333}, -2: {'o': 152.417, 'h': 162.4, 'l': 149.78, 'c': 155.65, 'vol': 255543.915}, -1: {'o': 155.7, 'h': 161.04, 'l': 150.88, 'c': 158.48, 'vol': 297664.05400000006}, 0: {'o': 158.71, 'h': 167.0, 'l': 158.51, 'c': 162.0, 'vol': 189163.71099999998}}
where self.ohlc[0]['l] is the low if the current bar and self.ohlc[-3]['h'] stands for high 3 bars ago.
I was trying to replicate the same with backtrader by doing:
def make_ohlc(self):
ohlc_dict = {}
for x in range(-3, 1):
ohlc = {'o': self.datas[0].open[x], 'h': self.datas[0].high[x], 'l': self.datas[0].low[x], 'c': self.datas[0].close[x]}
ohlc_dict[x] = ohlc
return ohlc_dict
and calling it from init:
self.ohlc = self.make_ohlc()
But once I do that - I'm getting weird error:
File "/Users/arrrr/PycharmProjects/backtrader/reverse.py", line 217, in <module>
cerebro.run()
File "/Users/arrrr/PycharmProjects/backtrader/venv/lib/python3.6/site-packages/backtrader/cerebro.py", line 1127, in run
runstrat = self.runstrategies(iterstrat)
File "/Users/arrrr/PycharmProjects/backtrader/venv/lib/python3.6/site-packages/backtrader/cerebro.py", line 1217, in runstrategies
strat = stratcls(*sargs, **skwargs)
File "/Users/arrrr/PycharmProjects/backtrader/venv/lib/python3.6/site-packages/backtrader/metabase.py", line 88, in __call__
_obj, args, kwargs = cls.doinit(_obj, *args, **kwargs)
File "/Users/arrrr/PycharmProjects/backtrader/venv/lib/python3.6/site-packages/backtrader/metabase.py", line 78, in doinit
_obj.__init__(*args, **kwargs)
File "/Users/arrrr/PycharmProjects/backtrader/reverse.py", line 50, in __init__
self.make_ohlc()
File "/Users/arrrr/PycharmProjects/backtrader/reverse.py", line 55, in make_ohlc
ohlc = {'o': self.dataopen[x], 'h': self.datahigh[x], 'l': self.datalow[x],
File "/Users/arrrr/PycharmProjects/backtrader/venv/lib/python3.6/site-packages/backtrader/linebuffer.py", line 163, in __getitem__
return self.array[self.idx + ago]
IndexError: array index out of range
However if I call same self.make_ohlc() from self.next() - it works (it's obvious that calling it every bar is not a proper way to handle this)
Any ideas what I'm doing wrong?