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