backtrader-plotting画图时出现Unexpected data type报错

调用backtrader_plotting绘制回测图时报错

import backtrader as bt
from support import *
from backtrader_plotting import Bokeh, OptBrowser
from backtrader_plotting.schemes import Tradimo

#画回测图
b = Bokeh(style='bar',plot_mode='single',tabs='multi',scheme=Tradimo())
cerebro.plot(b)
Traceback (most recent call last):

  File "<ipython-input-24-9d2a911f184e>", line 1, in <module>
    cerebro.plot(b)

  File "C:\ProgramData\Anaconda3\lib\site-packages\backtrader\cerebro.py", line 989, in plot
    rfig = plotter.plot(strat, figid=si * 100,

  File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\bokeh.py", line 509, in plot
    self._blueprint_strategy(obj, start, end, tradingdomain, **kwargs)

  File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\bokeh.py", line 244, in _blueprint_strategy
    figure.plot(master, None)

  File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\figureenvelope.py", line 301, in plot
    self.plot_indicator(obj, master)

  File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\figureenvelope.py", line 459, in plot_indicator
    self._plot_indicator_observer(obj, master)

  File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\figureenvelope.py", line 462, in _plot_indicator_observer
    pl = plotobj2label(obj)

  File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\label_resolver.py", line 49, in plotobj2label
    return f'{indicator2label(obj)}@{indicator2fullid(obj)}'

  File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\label_resolver.py", line 79, in indicator2fullid
    return datatarget2label([x._owner]) + '[L]'

  File "C:\Users\Administrator\AppData\Roaming\Python\Python38\site-packages\backtrader_plotting\bokeh\label_resolver.py", line 32, in datatarget2label
    raise RuntimeError(f'Unexpected data type: {d.__class__}')

RuntimeError: Unexpected data type: <class 'support.MyStrategy'>

 

我搞定了,看这个连接
https://programmerah.com/tag/runtimeerror-unexpected-data-type/

def datatarget2label(datas: List[Union[bt.AbstractDataBase, bt.Indicator]]):
    """Convert datas (usually a datafeed but might also be an indicator if one indicator operates on another indicator) to a readable string.
    If a name was provided manually then use that."""

    # try some popular attributes that might carry string represantations
    # _name: user assigned value upon instantiation
    # shortname: used by some datafeeds
    # _dataname: underlying bt dataname (should always be available as last resort)
    prim_names = ['_name', 'shortname', '_dataname']
    labels = []
    for d in datas:
        if isinstance(d, bt.Indicator):
            labels.append(indicator2label(d))
        elif isinstance(d, bt.AbstractDataBase):
            for n in prim_names:
                val = getattr(d, n, "")
                if val is None:
                    continue
                val = str(val)

                if len(val) > 0:
                    labels.append(val)
                    break
        else:
            raise RuntimeError(f'Unexpected data type: {d.__class__}')

    if len(labels) == 0:
        return "Unidentified"
    return ','.join(labels)

这是说不识别backtrader的strategy类?

不错,你会点开堆栈指向的代码来查看,你只看了一层,不如层层往上跟踪下?例如 datas 又是上层什么地方传进来的?

遇到同样问题。

解决了吗?

me too

同问