量化交易学习(四十七)backtrader自定义k线形态指标

前几天看《量价分析》的时候,书里介绍了一个动态画趋势线的方法 链接:。。。。

其中里面介绍了画趋势线依赖的高位支点和低位支点的概念(如下图)。我就想着用backtrader实现这种蜡烛图形态指标,在一番试验后终于搞定了。

20240329-231520.jpeg

指标代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import backtrader as bt

class Pivot(bt.Indicator):
lines = ('high_pivot','low_pivot')

plotlines = dict(
high_pivot=dict(color='green', ls='',marker='d',markersize='7.0'),
low_pivot=dict(color='red', ls='',marker='d',markersize='7.0')
)

# 设置画在主图上
plotinfo = dict()
plotinfo['subplot'] = False
plotinfo['plotlinelabels'] = True

def __init__(self):
super(Pivot, self).__init__()
linehigh = bt.If(bt.And(bt.And(
self.data.high(-1)>self.data.high(-2),self.data.high(-1)>self.data.high(0)),
bt.And(self.data.low(-1)>self.data.low(-2),self.data.low(-1)>self.data.low(0))
),self.data.high(-1)*1.01,-100)
# 因为支点是三根k线中间的那条线,所以要往前挪一位
self.l.high_pivot=linehigh(1)

linelow = bt.If(bt.And(bt.And(
self.data.high(-1)<self.data.high(-2),self.data.high(-1)<self.data.high(0)),
bt.And(self.data.low(-1)<self.data.low(-2),self.data.low(-1)<self.data.low(0))
),self.data.high(-1)*1.01,-100)
self.l.low_pivot=linelow(1)

以沪深300ETF为例,检验这个指标能否正常工作。

Snipaste_2024-04-04_20-07-50.png

图中用绿色和红色的菱形块标记出了高低支点所对应的k线位置:bd6aba16633e2e2d7b280c4f0100e8e2.png

可以很清楚的看到,程序确实按照规则把高低支点对应的k线找出来了。

再看整张图,会发现当用蜡烛图画线时,backtrader会有个小bug,它把成交量和主图画在一起了,导致有一部分成交量和k线叠在一起了,这块我还没找到方法解决。

9360b2c1d640971c053086abcf7eb1d2.png


这一篇就到这里啦。欢迎大家点赞、转发、私信。还没有关注我的朋友可以关注 江达小记

江达小记