使用Indicators- backtrader中文教程
使用Indicators
Indicators可以在平台上两个地方使用:
- 里面Strategies
- Inside其他在action
Indicators
- Indicators`指标期间总是实例化
__init__
在Strategy - 指示符值(或来自其的值)被用来/检查期间
next
有考虑到一个重要的公理:
- 的任何
Indicator
(或值由其衍生)期间__init__
声明`之前将预先计算next
是called.
Let我们去操作modes.
__init__
VSnext
事作为工作的差异如下:
- 任何operation在涉及lines对象
__init__
生成另一个lines object - Anyoperation涉及lines对象中
next
得到正规Python类型等的浮纱和bools.
During__init__
`中的操作的实施例__init__
:
hilo_diff = self.data.high - self.data.low
的可变hilo_diff
保持到参考一个lines对象,它是调用next
并且可以使用标准的被访问数组符号[]
它明显包含用于数据的每个棒料进给之间的差混合简单,当高和low.
This也适用lines(像那些在self.data数据饲料)和复杂的类似指标:
sma = bt.SimpleMovingAverage(self.data.close) close_sma_diff = self.data.close - sma
现在close_sma_diff
又包含了line object.
Using逻辑operatorss:
close_over_sma = self.data.close > sma
现在所产生的lines对象将包含booleans.
During阵列next
的操作的实施例(逻辑运算):
close_over_sma = self.data.close > self.sma
使用等效阵列(索引0基于符号):
close_over_sma = self.data.close[0] > self.sma[0]
在这种情况下close_over_sma
产生一个boolen其结果比较两个浮点值,由[0]
运算符的那些施加到self.data.close
和self.sma
的__init__
VSnext
why
逻辑简化(和与它易用性)是关键。计算和最相关联的逻辑的可在__init__
保持实际被声明期间next
.
其实还有一个附带的好处:speed(由于预先计算解释在开始时)
这期间产生了buy信号一个完整的例子__init__
:
class MyStrategy(bt.Strategy): def __init__(self): sma1 = btind.SimpleMovingAverage(self.data) ema1 = btind.ExponentialMovingAverage() close_over_sma = self.data.close > sma1 close_over_ema = self.data.close > ema1 sma_ema_diff = sma - ema buy_sig = bt.And(close_over_sma, close_over_ema, sma_ema_diff > 0) def next(self): if buy_sig: self.buy()
Note
Python的and
经营者不能被覆盖,迫使平台定义自己的And
。这同样适用于其他构造,如Or
和If
应该是显而易见的,在`的“声明”的方式__init__
保持的腹胀next
(其中实际的战略工作情况),到minimum.
(别忘了还有一个加速因子)
Note
当逻辑变得非常复杂,涉及多个业务它通常是更好的来封装内部的Indicator
.
的一些notes
In上面的例子中有已在被简化两件事backtrader
相比其他平台时:
- `声明
Indicators
既不得到了parent参数(如战略,而他们被创造,也不是任何形式的“注册”方法/函数尽管它是called.And策略将踢的计算
Indicators
和任何生成,因为操作的lines对象(如sma - ema
) ExponentialMovingAverage
被而不self.data
这是故意的实例化。如果没有
data
通过,1st的数据parent(在这种情况下在其中被创建的策略)将是自动传递在background
Indicator Plotting
First最重要的是:
- `声明
Indicators
得到自动绘制(如果cerebro.plot是叫) - lines从操作对象没有得到绘制(如
close_over_sma
)
= self.data.close > self.sma有一个辅助
LinePlotterIndicator
图表等操作如果希望用下面的方法:close_over_sma = self.data.close > self.sma LinePlotterIndicator(close_over_sma, name="Close_over_SMA)
`的
name
参数给出的名字到single此行举行indicator.
Controlling plotting
During的Indicator
了plotinfo
声明可以是添加。它可以是元组的元组(2个元件),一个dict
或OrderedDict
。它看起来像:
class MyIndicator(bt.Indicator): .... plotinfo = dict(subplot=False) ....
值可以稍后访问(并设置)如下(如果需要的话):
myind = MyIndicator(self.data, someparam=value) myind.plotinfo.subplot = True
值甚至可以实例化时进行设置:
myind = MyIndicator(self.data, someparams=value, subplot=True)
的subplot=True
将被传递到(幕后)intantiated成员变量plotinfo
的indicator.
Theplotinfo
提供下列参数来控制绘图行为:
plot
(默认值:True
)无论指示器为被绘制或not
subplot
(默认值:True
)是否绘制在不同的窗口的指示。对于这样的指标均线默认改为
False
plotname
(默认:""
)设置plotname显示在图上。空值表示的规范将被使用的指示器的名称(
class.__name__
)。这有一些限制因为Python标识符不能使用,例如算术像DI + operators.An指示灯会声明如下:
class DIPlus(bt.Indicator): plotinfo=dict(plotname="DI+")
使图中的“更好”
plotabove
(默认:False
)指标通常的数据绘制以下(那些具有
subplot=True
)他们已经手术。将其设置为True
将使指示器所述data.plotlinelabels
上述绘制(默认值:False
)意味着在“指标”,“指标”。如果一个计算RSI指标的SimpleMovingAverage情节通常会显示名称“SimpleMovingAverage”为对应的标绘线。这是名字该“指标”,而不是实际的线是plotted.
因为用户希望通常可以看到这个默认的行为很有道理一个SimpleMovingAverage已使用RSI.
if的值被设置为创建
True
内部线路的实际名称SimpleMovingAverage将used.plotymargin
(默认值:0.0
)余量的量在所述指示器的顶部和底部离开(
0.15
matplotlib
情节去太远的顶部/底部所述轴和余量可以wishedplotyticks
(默认:[])
用来控制绘制y缩放ticks
如果空单被通过了“Y蜱”会自动计算。对于像一个随机它可能是有意义的这个设置众所周知idustry标准,如:
[20.0, 50.0, 80.0]
有些指标提供像
upperband
和lowerband
参数实际用于操纵在y ticksplothlines
(默认值:[]
)用于沿着指示器axis.
If控制的水平线的绘制一个空的名单没有通过水平线条将drawn.
For像一个随机它可能是有意义的绘制线众所周知idustry标准,如:
[20.0, 80.0]
有些指标提供像
upperband
和lowerband
参数实际使用来操纵水平linesplotyhlines
(默认值:[]
)用于同时控制使用单个parameter.
plotforce
plotyticks和plothlines(缺省:False
)如果由于某种原因,你认为一个指标应绘制,这是不绘制…将其设置为
True
作为最后resort.