在面向对象编程中,当然在 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()