温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

python如何实现SuperTrend V.1超级趋势线系统

发布时间:2022-01-15 15:10:19 来源:亿速云 阅读:1351 作者:小新 栏目:互联网科技

这篇文章将为大家详细讲解有关python如何实现SuperTrend V.1超级趋势线系统,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

系统介绍

CMC Markets 新一代智能交易系统 —— 超级趋势线(Supertrend)

这里有一篇文章介绍这个系统。

python如何实现SuperTrend V.1超级趋势线系统

在CMC Markets中的新一代智能交易系统中,在技术指标中选取“超级趋势线”调取即可使用,

如图中所示,可以根据自身喜好对上涨的信号、下跌的信号调节“颜色和粗细”。

那么什么是超趋势指标?在理解超趋势指标公式之前,理解ATR是必要的,因为超趋势使用ATR值来计算指标值。

其中的主要算法下面也有一张图来介绍

python如何实现SuperTrend V.1超级趋势线系统

大致看一下,主要描述是HL2(k线均价)乘以n倍ATR的通道。做趋势突破。

但文章写得比较简略。没有详细的算法。随后我想到了最牛的社区Tradingview。

果不奇然。上面果然有。

python如何实现SuperTrend V.1超级趋势线系统

从图上看,还是比较切合趋势的。但可惜的是它只是一个Alert的报警信号。

学习源码

看着代码还不算太长,那我们就翻译过来试一下吧。!(っ•̀ω•́)っ✎⁾⁾!

python如何实现SuperTrend V.1超级趋势线系统

完整pine代码如上。。

四、代码转化

这里我们在FMZ新建一个策略,起名SuperTrade

python如何实现SuperTrend V.1超级趋势线系统

接着我们来设置2个参数Factor、Pd

python如何实现SuperTrend V.1超级趋势线系统

为了更好的简化代码的操作,便于理解,这样要用到python的高级数据扩展包pandas

中午吃饭的时候我问梦梦老师,FMZ是否支持这个库。下午一看居然可以用了。

梦梦老师真的太厉害了。

1.我们要导入pandas库time库

2.在main函数当中设置使用季度合约(主要跑okex)

3.设定一个循环doTicker()15分钟检测1次。

将代码跑在15分钟的周期上

接着我们在doTicker()中写主要策略。

python如何实现SuperTrend V.1超级趋势线系统

4.我们要取回k线的OHCLV 所以用GetRecords()

5.我们将取回的数据导入pandas M15 = pd.DataFrame(records)

6.我们要修改表的头部标签。 M15.columns = ['time','open','high','low','close','volume','OpenInterest']

其实就是将'open','high','low','close’ 的首字母改成小写,便于后期写代码不要一会大写一会小写。

python如何实现SuperTrend V.1超级趋势线系统

7.给数据集合增加一列hl2 hl2=(high+low)/2

python如何实现SuperTrend V.1超级趋势线系统

8.接着我们来计算ATR

因为ATR的计算要导入一个变量length,它的取值是Pd

接着我们通过查阅麦语言手册,ATR真實波動幅度均值的算法步骤如下:

TR : MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));

ATR : RMA(TR,N)

其中TR的值取下面3个差值的最大一个

1、当前交易日的最高价与最低价间的波幅 HIGH-LOW

2、前一交易日收盘价与当个交易日最高价间的波幅 REF(CLOSE,1)-HIGH)

3、前一交易日收盘价与当个交易日最低价间的波幅 REF(CLOSE,1)-LOW)

所以TR : MAX(MAX((HIGH-LOW),ABS(REF(CLOSE,1)-HIGH)),ABS(REF(CLOSE,1)-LOW));

在python计算中

python如何实现SuperTrend V.1超级趋势线系统

要先设立一个prev_close 去取close在上一行的数据,也就是将close右移1格成立一个新的参数

python如何实现SuperTrend V.1超级趋势线系统

接着定义一个中间变量 记录TR的3个对比值的数组。(HIGH-LOW)(high-prev_close)(low-prev_close)

python如何实现SuperTrend V.1超级趋势线系统

我们在数据集合当中定义新的一列取名TR,TR的取值是取中间变量绝对值的最大一个,使用abs()和max()函数

python如何实现SuperTrend V.1超级趋势线系统

最后我们要计算ATR的值,ATR : RMA(TR,N),据查RMA的算法其实就是一个固定值变种的EMA算法。

N是我们导入的变量,其中ATR的默认参数是14。这里我们导入alpha=length的倒数。

===

然后用ewm算法计算ema

完整ATR计算过程如下

python如何实现SuperTrend V.1超级趋势线系统

9始计算Up和Dn

python如何实现SuperTrend V.1超级趋势线系统

Up=hl2 -(Factor * atr)

Dn=hl2 +(Factor * atr)

是不是很简单呢。

下面是TV当中15行-21行的核心代码段

python如何实现SuperTrend V.1超级趋势线系统

这一段的主要意思是想表达,

如果处于看涨阶段,(下方线)TrendUp = max(Up,TrendUp[1])

如果处于下跌阶段,(上方线)TrendDown=min(Dn,TrendDown[1])

也就是说在一个趋势中,ATR的值一直在使用一种类似强盗布林策略的技术。

不断将通道的另一侧收窄

这里TrendUp和TrendDown每一次的计算都需要进行自我迭代。

就是每一步都要拿上一步的自己来计算。

所以要对数据集合做循环遍历。

这里先要对数据集合新建字段TrendUp,TrendDown,Trend,linecolor。并给定他们一个初始值

接着使用fillna(0)语法将之前计算的结果中带有空值的数据填上0

python如何实现SuperTrend V.1超级趋势线系统

启用一个for循环

在循环中采用python三目运算

python如何实现SuperTrend V.1超级趋势线系统

计算TrendUp

TrendUp = MAX(Up,TrendUp[-1]) if close[-1]>TrendUp[-1] else Up

大致意思是 如果 上一个close>上一个TrendUp,成立取Up和上一个TrendUp当中最大的值,不成立取Up值,并传递给当前TrendUp

python如何实现SuperTrend V.1超级趋势线系统

同理,计算TrendDown

TrendDown=min(Dn,TrendDown[-1]) if close[-1]<TrendDown[-1] else Dn

大致意思是 如果 上一个close<上一个TrendDown,成立取Dn和上一个TrendDown当中最小的值,不成立取Dn值,并传递给当前TrendDown

python如何实现SuperTrend V.1超级趋势线系统

下面是计算控制方向的flag,我简化了一下伪代码

Trend= 1 if (close > TrendDown[-1]) else (x)

x = -1 if (close< TrendUp[-1]) else Trend[-1]

意义是是 如果 收盘价>上一个 TrendDown 则取1(看多) 不成立取x

如果 收盘价<上一个 TrendUp 则取-1(看空)不成立取上一个Trend (意思是是不变)

翻译成图像语言就是突破上轨转换flag看多,突破下轨转换flag看空,其他时间不变。

python如何实现SuperTrend V.1超级趋势线系统

计算Tsl和Linecolor

Tsl= rendUp if (Trend==1) else TrendDown

Tsl 是用来在图像上表示SuperTrend 的值。意思是看多的时候在图上标记下轨,看空的时候在图上标记上轨。

linecolor= 'green' if (Trend==1) else 'red'

linecolor 的含义是 如果看多 则标记绿线 ,如果看空则标记空色(主要是用途Tradingview展示)

python如何实现SuperTrend V.1超级趋势线系统

接着23-30行的代码主要是plot绘图 这里不做详解。

最后还有2行代码用于买入卖出信号控制

Tradingview中,他的含义是 反转了Flag以后给出信号

将条件语句转换成为python。

如果上一个Trend flag从-1变成1 代表突破上方阻力 开多

如果上一个Trend flag从1变成-1 代表突破下发支撑 开空

python如何实现SuperTrend V.1超级趋势线系统

本段完整代码如下:

python如何实现SuperTrend V.1超级趋势线系统

python如何实现SuperTrend V.1超级趋势线系统

python如何实现SuperTrend V.1超级趋势线系统

五、全部代码

我调整了一下整体的代码结构。

并将做多做空相关下单指令合并到策略中。

下面是完整代码

python如何实现SuperTrend V.1超级趋势线系统

公开策略连接https://www.fmz.com/strategy/200625

六、回测与总结

我们选取了近一年的数据进行回测。

使用okex季度合约 15分钟周期。

设定的参数是,

Factor=3

Pd=45

vol=100(每次下单100张)

所得年化收益,约33%。

总体来说回撤并不是很大,

其中主要是312的大跌对系统产生了比较大的冲击,

如果没有312的话收益应该会比较好看。

python如何实现SuperTrend V.1超级趋势线系统

七、写在最后

SuperTrend是一个非常不错的交易系统

SuperTrend系统的主要原理是采用ATR通道突破策略(类似于肯特通道)

但其变化的地方主要在于使用了强盗布林的收窄策略,或者说是逆向的唐奇安原理。

在行情运行中不断收窄上下通道。

以便达到通道突破转向的操作。(一旦通道突破,上下轨恢复初始值)

我在TradingView上把up dn TrendUp TrendDn 分别plot了出来

这样便于更好的理解这个策略

一目了然

python如何实现SuperTrend V.1超级趋势线系统

另外github上还有一个js的版本。js我不是很懂,但从if语句看好像有点问题。

地址是https://github.com/Dodo33/gekko-supertrend-strategy/blob/master/Supertrend.js

关于“python如何实现SuperTrend V.1超级趋势线系统”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI