达盖尔不抗旗 2023-02-24 13:10 采纳率: 50%
浏览 85
已结题

怎样指定backtrader库自定义MACD指标红绿柱颜色?

我在学习backtrader库的时候,自定义的一个全新的MACD指标,指标需要的参数是提前算好写在CSV文件里的。新建指标的时候直接从CSV里读取。

class MacdNew(bt.Indicator):  #自定义全新MACD指标
    lines = ('diff', 'dea','macd')
    #colors_bar = np.where(data.macd_bar.values > 0, 'red', 'green')
    setcolor = None
    plotinfo = dict(plot=True,plotname='MACD',plotabove=False,subplot=True)
    plotlines = dict(macd=dict(_method='bar', alpha=0.50, width=0.8,color=setcolor),
                                    diff=dict(color='black',linewidth=0.8),
                                    dea=dict(color='blue',linewidth=0.8))
    def __init__(self):
        self.lines.diff = self.data.diff
        self.lines.dea = self.data.dea
        self.lines.macd = self.data.macd_bar
        MacdNew.setcolor = 'red'

该指标里有三根线,diff,dea,macd。macd就是指MACD指标的红绿柱bar。我想让红绿柱根据bar值的正负,显示对应的红与绿。不知道应该怎么写简单:
(已经扩展了class PandasData_macd(PandasData)库 #扩展PandasData线

class PandasData_macd(PandasData):  #扩展PandasData线
    lines = ('diff','dea','macd_bar',)
    params = (('diff',8),('dea',9),('macd_bar',10))

在尝试解决这个问题的时候,我在从bt.Indicator继承的MacdNew类(自定义的指标)里面,先写上类属性:
setcolor=None
然后在class MacdNew(bt.Indicator)类的init初始化里面给这个类属性赋值'red':

class MacdNew(bt.Indicator):  #自定义MACD指标
    lines = ('diff', 'dea','macd')
    #colors_bar = np.where(data.macd_bar.values > 0, 'red', 'green')
    setcolor = None
    plotinfo = dict(plot=True,plotname='MACD',plotabove=False,subplot=True)
    plotlines = dict(macd=dict(_method='bar', alpha=0.50, width=0.8,color=setcolor),diff=dict(color='black',linewidth=0.8),dea=dict(color='blue',linewidth=0.8))
    def __init__(self):
        self.lines.diff = self.data.diff
        self.lines.dea = self.data.dea
        self.lines.macd = self.data.macd_bar
        MacdNew.setcolor = 'red'

在策略库运行的时候,

class MyStrategy(bt.Strategy):
    params = (('myparam', 27), ('exitbars', 5),('maperiod',[5,20,30]),('fast_period',6),('slow_period',10))
    def log(self,txt,dt=None):
        dt = dt or self.datas[0].datetime.date(0)
        print('%s %s' % (dt.isoformat(),txt))

    def __init__(self):

        self.order = None
        self.buyprice = None
        self.buycomm = None
        self.macd = MacdNew()

并没有将:MacdNew.setcolor = 'red',赋值给自定义指标中: plotlines = dict(macd=dict(_method='bar', alpha=0.50, width=0.8,color=setcolor)的setcolor。
请指教:在backtrader的全新自定义MACD指标(指标提前算好在CSV文件)里,如何根据bar柱值的正负,显示相对应的红绿色?

  • 写回答

4条回答 默认 最新

  • 三尺三 2023-04-20 22:54
    关注

    这样,把柱子分成两部分,即水上部分与水下部分。

    class MacdNew(bt.ind.MACD):  #自定义全新MACD指标
    
        lines = ('histo_up', 'histo_down')
        plotlines = dict(histo_up=dict(_method='bar', alpha=0.80, width=0.5, color='tomato'),
                        histo_down=dict(_method='bar', alpha=0.80, width=0.5, color='limegreen'))
    
        def __init__(self):
            super(MacdNew, self).__init__()
    
        def next(self):
            histo = (self.lines.macd - self.lines.signal) * 2
            if histo > 0:
                self.l.histo_up[0] = histo
            else:
                self.l.histo_down[0] = histo
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 创建了问题 2月24日

悬赏问题

  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗
  • ¥15 运动想象脑电信号数据集.vhdr
  • ¥15 三因素重复测量数据R语句编写,不存在交互作用
  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab