用Python编写基于Supertrend“超级趋势线”强化策略
『正文』
ˇ
简文:
什么是超级趋势指标SuperTrend Indicator?
超级趋势指标SuperTrend Indicator是一个在外汇交易中常用指标,它的设计者是Jason Robinson。它的主要用途是确定价格趋势,和进行趋势追踪。
超级趋势指标SuperTrend Indicator的计算公式:
在做多时:
超级趋势指标SuperTrend =(最高价 最低价)/2 – N*ATR(M)
在作图中,这个值只上移不下移,就是取近期的最高值。
在做空时:
超级趋势指标= (最高价 最低价)/2 N*ATR(M)
在作图中,这个值只下移不上移,就是取近期的最低值。
在这个指标当中适用了均值(H L)/2,和ATR真是波动幅度的概念。在设置它的参数时,要考虑两个值,N,M。一个用来计算ATR的倍数,一个用来计算ATR的周期数。例如,周期数可以是10日,倍数可以是3倍,这是这个指标的基本设置。对于不同的交易市场,和交易对象来说,这两个参数是可以优化的。它的计算方法与肯特纳通道Keltner Channels很相似。
超级趋势指标SuperTrend的主要用途:
1, 可以作为决定趋势的过滤器;在上升趋势时,做多;在下降趋势中,做空。
2, 可以作为趋势追踪止损。在做多有盈利时,当收盘价小于这个指标近期最高值时,卖出,这样可以锁定利润,又不会因为止盈而错过大趋势。当然,它的正确适用和它的参数设置有密切关系。
原版源码:
/ This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © LonesomeTheBlue
//@version=4
study('Pivot Point SuperTrend', overlay = true)
prd = input(defval = 2, title='Pivot Point Period', minval = 1, maxval = 50)
Factor=input(defval = 3, title = 'ATR Factor', minval = 1, step = 0.1)
Pd=input(defval = 10, title = 'ATR Period', minval=1)
showpivot = input(defval = false, title='Show Pivot Points')
showlabel = input(defval = true, title='Show Buy/Sell Labels')
showcl = input(defval = false, title='Show PP Center Line')
showsr = input(defval = false, title='Show Support/Resistance')
float ph = na
float pl = na
ph := pivothigh(prd, prd)
pl := pivotlow(prd, prd)
plotshape(ph and showpivot, text='H', style=shape.labeldown, color=na, textcolor=color.red, location=location.abovebar, transp=0, offset = -prd)
plotshape(pl and showpivot, text='L', style=shape.labeldown, color=na, textcolor=color.lime, location=location.belowbar, transp=0, offset = -prd)
float center = na
center := center[1]
float lastpp = ph ? ph : pl ? pl : na
if lastpp
if na(center)
center := lastpp
else
center := (center * 2 lastpp) / 3
Up = center - (Factor * atr(Pd))
Dn = center (Factor * atr(Pd))
float TUp = na
float TDown = na
Trend = 0
TUp := close[1] > TUp[1] ? max(Up, TUp[1]) : Up
TDown := close[1] < TDown[1] ? min(Dn, TDown[1]) : Dn
Trend := close > TDown[1] ? 1: close < TUp[1]? -1: nz(Trend[1], 1)
Trailingsl = Trend == 1 ? TUp : TDown
linecolor = Trend == 1 and nz(Trend[1]) == 1 ? color.lime : Trend == -1 and nz(Trend[1]) == -1 ? color.red : na
plot(Trailingsl, color = linecolor , linewidth = 2, title = 'PP SuperTrend')
plot(showcl ? center : na, color = showcl ? center < hl2 ? color.blue : color.red : na, transp = 0)
bsignal = Trend == 1 and Trend[1] == -1
ssignal = Trend == -1 and Trend[1] == 1
plotshape(bsignal and showlabel ? Trailingsl : na, title='Buy', text='Buy', location = location.absolute, style = shape.labelup, size = size.tiny, color = color.lime, textcolor = color.black, transp = 0)
plotshape(ssignal and showlabel ? Trailingsl : na, title='Sell', text='Sell', location = location.absolute, style = shape.labeldown, size = size.tiny, color = color.red, textcolor = color.white, transp = 0)
float resistance = na
float support = na
support := pl ? pl : support[1]
resistance := ph ? ph : resistance[1]
plot(showsr and support ? support : na, color = showsr and support ? color.lime : na, style = plot.style_circles, offset = -prd)
plot(showsr and resistance ? resistance : na, color = showsr and resistance ? color.red : na, style = plot.style_circles, offset = -prd)
alertcondition(Trend == 1 and Trend[1] == -1, title='Buy Signal', message='Buy Signal')
alertcondition(Trend == -1 and Trend[1] == 1, title='Sell Signal', message='Sell Signal')
alertcondition(change(Trend), title='Trend Changed', message='Trend Changed')
信号图:
Py01策略将国外的supertrend转编译到Python01,ST指标对趋势有很好的跟踪效果,在此基础上对它进行了进行了优化升级,使其更加适应国内商品的变化特征,经过优化升级的supertrend效果极佳。
导入
声明变量
核心计算
计算ATR值同时计算中轨HL2,然后构建上下轨道up和dn
将up和dn利用三元表达式进行迭代计算,更新最大或者最小值
KG值的计算是关键,KG是SuperTrend 的状态转换的重要变量,K==1为多头,K==2为空头如下图效果
仅仅使用SuperTrend 开平仓过于简单,我们引入OPV轨道来强化开仓条件:
同时引入动态止盈止损:
测试绩效
2019年7月-2020年7月绩效
TB同时间段绩效(2019.7-2020.7)
绩效基本一致
信号图
信号比对一致
TB绩效(10年)
螺纹钢5分钟(1.5%%,双向各1跳,2010年至今)
风险提示:
策略仅用于学习交流,松鼠宽客既不享受您的收益,也不承担您的风险。想要实盘请自行修改后谨慎使用,后果自负!