在面向对象编程中,当然在 Python 本身中,现有类的扩展可以通过两种方式实现。
继承(或子类化)
组合(或嵌入)
在开发指针中,仅用几行代码开发了指针Trix
。 ChartSchool - Trix参考文献有一个带有信号线的Trix
,显示与 MACD 的相似性。
让我们使用已经开发的Trix
“组合” MyTrixSignal
class MyTrixSignalComposed(bt.Indicator): lines = ('trix', 'signal') params = (('period', 15), ('sigperiod', 9)) def __init__(self): self.lines.trix = MyTrix(self.data, period=self.p.period) self.lines.signal = btind.EMA(self.lines.trix, period=self.p.sigperiod)
有些东西必须在定义中重复,例如trix
线的名称和用于计算的period
。已定义新的线路signal
和相应的sigperiod
参数。
2-liner是一个很好的结果。
现在让我们开始继承,但首先回顾一下Trix
的样子:
class MyTrix(bt.Indicator): lines = ('trix',) params = (('period', 15),) def __init__(self): ema1 = btind.EMA(self.data, period=self.p.period) ema2 = btind.EMA(ema1, period=self.p.period) ema3 = btind.EMA(ema2, period=self.p.period) self.lines.trix = 100.0 * (ema3 - ema3(-1)) / ema3(-1)
使用Trix
作为基类,这是TrixSignal
的方面
class MyTrixSignalInherited(MyTrix): lines = ('signal',) params = (('sigperiod', 9),) def __init__(self): super(MyTrixSignalInherited, self).__init__() self.lines.signal = btind.EMA(self.lines.trix, period=self.p.sigperiod)
继承的指针最终也是一个 2 线,但是:
无需重新定义
trix
线不需要重新定义
period
参数
两者都继承自基类Trix
。并且trix
线的计算是在基类的__init__
方法中完成的:
- 超级(MyTrixSignalInherited,自我)。初始化()
组合与继承的选择是一个经典。这个例子并不是为了澄清哪个更好,而是更多地表明:
笔记
即使存在线和参数的元定义,继承也有效,它们也继承自基类的元定义
最后是两个版本的代码和图表在付诸实施时。
- 第一个显示继承的版本
from __future__ import (absolute_import, division, print_function, unicode_literals) import backtrader as bt import backtrader.feeds as btfeeds from mytrix import MyTrixSignalInherited class NoStrategy(bt.Strategy): params = (('trixperiod', 15), ('analyzer', False),) def __init__(self): MyTrixSignalInherited(self.data, period=self.p.trixperiod) if __name__ == '__main__': # Create a cerebro entity cerebro = bt.Cerebro() # Add a strategy cerebro.addstrategy(NoStrategy, trixperiod=15) # Create a Data Feed datapath = ('../datas/2006-day-001.txt') data = bt.feeds.BacktraderCSVData(dataname=datapath) # Add the Data Feed to Cerebro cerebro.adddata(data) # Run over everything cerebro.run() # Plot the result cerebro.plot()
- 第一个显示组合版本
from __future__ import (absolute_import, division, print_function, unicode_literals) import backtrader as bt import backtrader.feeds as btfeeds from mytrix import MyTrixSignalComposed class NoStrategy(bt.Strategy): params = (('trixperiod', 15), ('analyzer', False),) def __init__(self): MyTrixSignalComposed(self.data, period=self.p.trixperiod) if __name__ == '__main__': # Create a cerebro entity cerebro = bt.Cerebro() # Add a strategy cerebro.addstrategy(NoStrategy, trixperiod=15) # Create a Data Feed datapath = ('../datas/2006-day-001.txt') data = bt.feeds.BacktraderCSVData(dataname=datapath) # Add the Data Feed to Cerebro cerebro.adddata(data) # Run over everything cerebro.run() # Plot the result cerebro.plot()