Issue with BuySell obverver plot from cerebro.plot(). Disappearing with few data points
-
Hello,
After a while of trying to trace the source of my missing BuySell indicators, I think the issue is with backtrader.
Consider the following example:class St(bt.Strategy): def __init__(self): self.dataclose = self.datas[0].close def next(self): if self.dataclose[0] > 2944: self.order = self.sell() data = bt.feeds.BacktraderCSVData(dataname='data.csv') cerebro = bt.Cerebro() cerebro.adddata(data) cerebro.addstrategy(St) cerebro.run() cerebro.plot()
With data.csv
Date,Open,High,Low,Close,Volume,OpenInterest 2005-01-03,2952.29,2989.61,2946.80,2970.02,0,0 2005-01-04,2969.78,2979.88,2961.14,2971.12,0,0 2005-01-05,2969.00,2969.00,2942.69,2947.19,0,0 2005-01-06,2947.44,2967.65,2947.44,2966.24,0,0 2005-01-07,2965.54,2988.99,2964.48,2979.82,0,0 2005-01-10,2980.30,2986.07,2967.79,2977.21,0,0 2005-01-11,2977.14,2981.51,2943.42,2949.29,0,0 2005-01-12,2948.89,2952.79,2914.00,2924.01,0,0 2005-01-13,2925.60,2943.09,2922.91,2936.32,0,0 2005-01-14,2933.58,2951.77,2925.13,2948.22,0,0 2005-01-17,2948.11,2963.22,2948.11,2963.06,0,0 2005-01-18,2962.28,2965.60,2940.77,2962.50,0,0 2005-01-19,2963.91,2976.33,2957.21,2959.90,0,0 2005-01-20,2957.55,2957.55,2929.78,2937.71,0,0 2005-01-21,2937.27,2944.92,2927.62,2940.87,0,0 2005-01-24,2939.68,2940.02,2916.08,2937.83,0,0 2005-01-25,2937.66,2960.90,2932.56,2958.61,0,0 2005-01-26,2958.31,2967.62,2954.36,2956.43,0,0 2005-01-27,2956.32,2970.81,2948.55,2970.81,0,0 2005-01-28,2969.91,2977.99,2950.68,2955.89,0,0 2005-01-31,2958.07,2987.88,2958.07,2984.75,0,0 2005-02-01,2984.63,3008.85,2982.06,3008.85,0,0 2005-02-02,3009.08,3022.87,3008.92,3021.95,0,0 2005-02-03,3021.94,3023.85,3001.87,3010.39,0,0 2005-02-04,3011.58,3038.31,3011.58,3037.13,0,0
This yields:
But delete the last 6 dates from data.csv and you will end up with this:
In addition, if my data is on hourly resolution, all BuySell markers disappear, no matter how many hours I include.
Any idea what to do?
-
@lammy said in Issue with BuySell obverver plot from cerebro.plot(). Disappearing with few data points:
I think the issue is with backtrader.
Sorry, but you are wrong. The issue is with
matplotlib
and with not using the existing possibilities of the platform to try to compensate.But first: backtrader is NOT a charting platform. The possibility to offer automated charts (at the end of the backtesting) with some customization options is meant as a visual aid.
And it is not a charting platform because backtesting relies on numbers and not on charts.
Even if
matplotlib
is a great platform and backtrader tries to abstract as much as possible to offer automated charts, not everything is possible.Your options:
-
Change the way the
BuySell
observer shows up by plotting right on the price and not above/below the price. See Docs - Observer Reference -
Plot the data allowing other items to change the scale. See
ylimited
- Docs - Plotting
@lammy said in Issue with BuySell obverver plot from cerebro.plot(). Disappearing with few data points:
In addition, if my data is on hourly resolution
Have you told the platform when loading your data that your data has your expected timeframe/compression?
-
-
You are absolutely right, the problem is not with backtrader, but rather with matplotlib. Taking a look at the (excellent) documentation and previous questions have highlighted that for me.
I will post my workaround as soon as I am done.
For others who are stuggeling here, take a look at:https://www.backtrader.com/docu/observers-reference.html?highlight=buysell#backtrader.observers.BuySell
https://www.backtrader.com/blog/posts/2016-12-10-buysellarrows/buysellarrows.html
https://community.backtrader.com/topic/8/change-buysell-to-trade-arrows-in-charts-213/3 -
Hey @Lammy have you solved this in the end?
I'm trying to handle this arrows misplacement problem with my tick data (single-tick value).
The only solution that I've found is to call:cerebro = bt.Cerebro(stdstats=False) cerebro.addobserver(bt.Observers.BuySell)
This way the arrows will be printed above/under the priceline and maybe, as in my case, too close to it. But I think is better to have it too close than not having at all!
Errata Corrige: this solution will lead to many problems when plotting more than one datas, I'm currently looking for another option to solve it!