溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

發(fā)布時間:2022-01-15 15:10:19 來源:億速云 閱讀:1432 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章將為大家詳細講解有關python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng),小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

系統(tǒng)介紹

CMC Markets 新一代智能交易系統(tǒng) —— 超級趨勢線(Supertrend)

這里有一篇文章介紹這個系統(tǒng)。

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

在CMC Markets中的新一代智能交易系統(tǒng)中,在技術指標中選取“超級趨勢線”調(diào)取即可使用,

如圖中所示,可以根據(jù)自身喜好對上漲的信號、下跌的信號調(diào)節(jié)“顏色和粗細”。

那么什么是超趨勢指標?在理解超趨勢指標公式之前,理解ATR是必要的,因為超趨勢使用ATR值來計算指標值。

其中的主要算法下面也有一張圖來介紹

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

大致看一下,主要描述是HL2(k線均價)乘以n倍ATR的通道。做趨勢突破。

但文章寫得比較簡略。沒有詳細的算法。隨后我想到了最牛的社區(qū)Tradingview。

果不奇然。上面果然有。

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

從圖上看,還是比較切合趨勢的。但可惜的是它只是一個Alert的報警信號。

學習源碼

看著代碼還不算太長,那我們就翻譯過來試一下吧。!(っ??ω??)っ???!

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

完整pine代碼如上。。

四、代碼轉(zhuǎn)化

這里我們在FMZ新建一個策略,起名SuperTrade

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

接著我們來設置2個參數(shù)Factor、Pd

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

為了更好的簡化代碼的操作,便于理解,這樣要用到python的高級數(shù)據(jù)擴展包pandas

中午吃飯的時候我問夢夢老師,F(xiàn)MZ是否支持這個庫。下午一看居然可以用了。

夢夢老師真的太厲害了。

1.我們要導入pandas庫time庫

2.在main函數(shù)當中設置使用季度合約(主要跑okex)

3.設定一個循環(huán)doTicker()15分鐘檢測1次。

將代碼跑在15分鐘的周期上

接著我們在doTicker()中寫主要策略。

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

4.我們要取回k線的OHCLV 所以用GetRecords()

5.我們將取回的數(shù)據(jù)導入pandas M15 = pd.DataFrame(records)

6.我們要修改表的頭部標簽。 M15.columns = ['time','open','high','low','close','volume','OpenInterest']

其實就是將'open','high','low','close’ 的首字母改成小寫,便于后期寫代碼不要一會大寫一會小寫。

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

7.給數(shù)據(jù)集合增加一列hl2 hl2=(high+low)/2

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

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如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

要先設立一個prev_close 去取close在上一行的數(shù)據(jù),也就是將close右移1格成立一個新的參數(shù)

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

接著定義一個中間變量 記錄TR的3個對比值的數(shù)組。(HIGH-LOW)(high-prev_close)(low-prev_close)

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

我們在數(shù)據(jù)集合當中定義新的一列取名TR,TR的取值是取中間變量絕對值的最大一個,使用abs()和max()函數(shù)

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

最后我們要計算ATR的值,ATR : RMA(TR,N),據(jù)查RMA的算法其實就是一個固定值變種的EMA算法。

N是我們導入的變量,其中ATR的默認參數(shù)是14。這里我們導入alpha=length的倒數(shù)。

===

然后用ewm算法計算ema

完整ATR計算過程如下

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

9始計算Up和Dn

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

Up=hl2 -(Factor * atr)

Dn=hl2 +(Factor * atr)

是不是很簡單呢。

下面是TV當中15行-21行的核心代碼段

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

這一段的主要意思是想表達,

如果處于看漲階段,(下方線)TrendUp = max(Up,TrendUp[1])

如果處于下跌階段,(上方線)TrendDown=min(Dn,TrendDown[1])

也就是說在一個趨勢中,ATR的值一直在使用一種類似強盜布林策略的技術。

不斷將通道的另一側(cè)收窄

這里TrendUp和TrendDown每一次的計算都需要進行自我迭代。

就是每一步都要拿上一步的自己來計算。

所以要對數(shù)據(jù)集合做循環(huán)遍歷。

這里先要對數(shù)據(jù)集合新建字段TrendUp,TrendDown,Trend,linecolor。并給定他們一個初始值

接著使用fillna(0)語法將之前計算的結果中帶有空值的數(shù)據(jù)填上0

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

啟用一個for循環(huán)

在循環(huán)中采用python三目運算

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

計算TrendUp

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

大致意思是 如果 上一個close>上一個TrendUp,成立取Up和上一個TrendUp當中最大的值,不成立取Up值,并傳遞給當前TrendUp

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

同理,計算TrendDown

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

大致意思是 如果 上一個close<上一個TrendDown,成立取Dn和上一個TrendDown當中最小的值,不成立取Dn值,并傳遞給當前TrendDown

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

下面是計算控制方向的flag,我簡化了一下偽代碼

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

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

意義是是 如果 收盤價>上一個 TrendDown 則取1(看多) 不成立取x

如果 收盤價<上一個 TrendUp 則取-1(看空)不成立取上一個Trend (意思是是不變)

翻譯成圖像語言就是突破上軌轉(zhuǎn)換flag看多,突破下軌轉(zhuǎn)換flag看空,其他時間不變。

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

計算Tsl和Linecolor

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

Tsl 是用來在圖像上表示SuperTrend 的值。意思是看多的時候在圖上標記下軌,看空的時候在圖上標記上軌。

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

linecolor 的含義是 如果看多 則標記綠線 ,如果看空則標記空色(主要是用途Tradingview展示)

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

接著23-30行的代碼主要是plot繪圖 這里不做詳解。

最后還有2行代碼用于買入賣出信號控制

Tradingview中,他的含義是 反轉(zhuǎn)了Flag以后給出信號

將條件語句轉(zhuǎn)換成為python。

如果上一個Trend flag從-1變成1 代表突破上方阻力 開多

如果上一個Trend flag從1變成-1 代表突破下發(fā)支撐 開空

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

本段完整代碼如下:

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

五、全部代碼

我調(diào)整了一下整體的代碼結構。

并將做多做空相關下單指令合并到策略中。

下面是完整代碼

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

公開策略連接https://www.fmz.com/strategy/200625

六、回測與總結

我們選取了近一年的數(shù)據(jù)進行回測。

使用okex季度合約 15分鐘周期。

設定的參數(shù)是,

Factor=3

Pd=45

vol=100(每次下單100張)

所得年化收益,約33%。

總體來說回撤并不是很大,

其中主要是312的大跌對系統(tǒng)產(chǎn)生了比較大的沖擊,

如果沒有312的話收益應該會比較好看。

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

七、寫在最后

SuperTrend是一個非常不錯的交易系統(tǒng)

SuperTrend系統(tǒng)的主要原理是采用ATR通道突破策略(類似于肯特通道)

但其變化的地方主要在于使用了強盜布林的收窄策略,或者說是逆向的唐奇安原理。

在行情運行中不斷收窄上下通道。

以便達到通道突破轉(zhuǎn)向的操作。(一旦通道突破,上下軌恢復初始值)

我在TradingView上把up dn TrendUp TrendDn 分別plot了出來

這樣便于更好的理解這個策略

一目了然

python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)

另外github上還有一個js的版本。js我不是很懂,但從if語句看好像有點問題。

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

關于“python如何實現(xiàn)SuperTrend V.1超級趨勢線系統(tǒng)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI