Problem with resampling 1m data to 5m/15m
-
I have 1m OHLC data and would like to compress that into 5m and 15m data. I know Backtrader has resampling and I tried different options but I still can't get it to align correctly with my data and charts at TradingView.
What I want to achieve:
1m bars 17:00-17:04 (inclusive) -> 5m bar dated 17:00
What Backtrader does by default:
1m bars 17:01-17:05 (inclusive) -> 5m bar dated 17:05
Obviously this gives me OHLC data that is not matching what I want so I used the
boundoff=1
option. This results in correct OHLC for the 5m bars but they are dated incorrectly for my needs, like this:1m bars 17:00-17:04 (inclusive) -> 5m bar dated 17:04
I tried other resampling options but perhaps I don't fully understand them and I could not get the result I want.
Could you give me some hints if it can be achieved before I dive into the Backtrader code?
-
You want
rightedge=False
. Docs - Data ResamplingBut what you probably really want is to resample your data outise of backtrader and thenn lod it, to avoid a problem with the convention.
-
@backtrader I tried that already and it does not seem to have any effect - I get the same results with either
rightedge=false
ortrue
(default I guess).Might that be a conflict of this option with
boundoff=1
?In any case, I would prefer to avoid processing the data outside of Backtrader because I already am storing 1m bar data so no point storing 5m as well. So I'm thinking about writing a data source for Backtrader which converts this automatically or adding an option to the resampling method that outputs correct bars for my use case. If I would make it work with resampling, does it make sense to put it in a PR?
-
There were several patches to resampling, which probably had an impact on
rightedge
.Use this code as a template to achieve your desired effect.
rd = cerebro.resampledata(data, timeframe=bt.TimeFrame.Minutes, compression=5) def _new_load(self): ret = self._old_load() if ret: dt = self.datetime.datetime(0) self.datetime[0] = bt.date2num(dt - datetime.timedelta(minutes=5)) return ret rd._old_load, rd._load = rd._load, _new_load.__get__(rd, rd.__class__)