backtrader开发启动时的目标之一是使开发新的指针变得非常容易(至少对作者本人而言),以在数学和视觉上测试想法。
门票#102 是关于将 UltimateOscillator 添加到 backtrader
注意
它将在下一个版本中添加,同时可以使用下面的代码使用它。
票证中所示的参考:
以及:
无需在这里重复。
参考参考文献:
BP = Close - Minimum(Low or Prior Close) TR = Maximum(High or Prior Close) - Minimum(Low or Prior Close) Average7 = (7-period BP Sum) / (7-period TR Sum) Average14 = (14-period BP Sum) / (14-period TR Sum) Average28 = (28-period BP Sum) / (28-period TR Sum) UO = 100 x [(4 x Average7)+(2 x Average14)+Average28]/(4+2+1)
总结:
-
确保
bt.Indicator
整个机器工作的第一个子类:class UltimateOscillator(bt.Indicator):
-
它有1个输出 line:我们将它
uo
命名为:lines = ('uo',)
-
它有 3 个参数,这些参数使用默认值
7
定义 3 个周期,14
以及28
.要命名p1
,p2
和p3
:params = (('p1', 7), ('p2', 14), ('p3', 28), )
-
计算使用一些已经内置的东西 backtrader
Minimum(Low or Prior Close)
:这是TrueLow
威尔斯·怀尔德为指针RSI
定义的。因此,BP
可以计算出或购买压力:
bp = self.data.close - TrueLow(self.data)
Maximum(Low or Prior Close) - Minimum(Low or Prior Close)
:这是TrueRange
威尔斯·怀尔德为RSI
指针定义的(可以表示为TrueHigh - TrueLow
。因此,下一个计算就像这样简单:
tr = TrueRange(self.data)
- 其余的是纯数学运算,用于
SumN
将 和tr
的最新p1
、p2
、p3
周期bp
相加,再加上加权计算:
av7 = SumN(bp, period=self.p.p1) / SumN(tr, period=self.p.p1) av14 = SumN(bp, period=self.p.p2) / SumN(tr, period=self.p.p2) av28 = SumN(bp, period=self.p.p3) / SumN(tr, period=self.p.p3) uo = 100.0 * (4.0 * av7 + 2.0 * av14 + av28) / (4.0 + 2.0 + 1.0)
- 最后,将计算分配给定义的
uo
line:
self.lines.uo = uo
它似乎比底部的实际时间(完整代码,包括导入)更长。
由于我们不仅需要值,还需要一个漂亮的绘图,例如Stockcharts提供的绘图,因此我们将添加2个额外的触摸:
-
2个参数,用于确定水准 lines 的位置,以划分超买和超卖区域(ala
RSI
或Stochastic
):('upperband', 70.0), ('lowerband', 30.0),
-
并绘制初始化代码以使用参数。
10
50
将添加刻度和90
股票图表图中的刻度:def _plotinit(self): baseticks = [10.0, 50.0, 90.0] hlines = [self.p.upperband, self.p.lowerband] self.plotinfo.plotyhlines = hlines self.plotinfo.plotyticks = baseticks + hlines
为了测试和进一步使用 backtrader提供的现有设施,btrun
将使用与 backtrader 一起安装的可运行档。
-
指针存储在名为
ultimateoscillator.py
-
使用的数据是 backtrader
-
指针将使用缺省参数和短期参数添加两次
运行:
btrun \ --nostdstats \ --data 2005-2006-day-001.txt \ --indicator ultimateoscillator:UltimateOscillator \ --indicator ultimateoscillator:UltimateOscillator:p1=4,p2=8,p3=16 \ --plot
注意
使用 –nostdstats 从图表中删除一些 observers 。在这种情况下,无需跟踪现金和价值
输出只是一个显示演变的UltimateOscillator
图表。
代码UltimateOscillator
:
from __future__ import (absolute_import, division, print_function, unicode_literals) import backtrader as bt from backtrader.indicators import SumN, TrueLow, TrueRange class UltimateOscillator(bt.Indicator): ''' Formula: # Buying Pressure = Close - TrueLow BP = Close - Minimum(Low or Prior Close) # TrueRange = TrueHigh - TrueLow TR = Maximum(High or Prior Close) - Minimum(Low or Prior Close) Average7 = (7-period BP Sum) / (7-period TR Sum) Average14 = (14-period BP Sum) / (14-period TR Sum) Average28 = (28-period BP Sum) / (28-period TR Sum) UO = 100 x [(4 x Average7)+(2 x Average14)+Average28]/(4+2+1) See: - https://en.wikipedia.org/wiki/Ultimate_oscillator - http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:ultimate_oscillator ''' lines = ('uo',) params = (('p1', 7), ('p2', 14), ('p3', 28), ('upperband', 70.0), ('lowerband', 30.0), ) def _plotinit(self): baseticks = [10.0, 50.0, 90.0] hlines = [self.p.upperband, self.p.lowerband] self.plotinfo.plotyhlines = hlines self.plotinfo.plotyticks = baseticks + hlines def __init__(self): bp = self.data.close - TrueLow(self.data) tr = TrueRange(self.data) av7 = SumN(bp, period=self.p.p1) / SumN(tr, period=self.p.p1) av14 = SumN(bp, period=self.p.p2) / SumN(tr, period=self.p.p2) av28 = SumN(bp, period=self.p.p3) / SumN(tr, period=self.p.p3) uo = 100.0 * (4.0 * av7 + 2.0 * av14 + av28) / (4.0 + 2.0 + 1.0) self.lines.uo = uo