ATRと標準偏差チャネルに基づくトレンドフォロー取引戦略


作成日: 2024-01-05 16:34:27 最終変更日: 2024-01-05 16:34:27
コピー: 0 クリック数: 931
1
フォロー
1617
フォロワー

ATRと標準偏差チャネルに基づくトレンドフォロー取引戦略

概要

この策略は,ATRトレンド追跡策略である.これは,平均実際の波動幅 ((ATR)) をベースにストップロスを設定し,標準差チャネルを使用して入札のタイミングを判断するトレンド追跡取引策略である.この策略は,株式指数,外貨,商品などの明らかにトレンドのある金融製品に適用される.

戦略原則

この策略はATR指標を使用して止損価格を設定する.ATR指標は市場の変動を反映し,止損距離を動的に設定することができます.策略はATR周期と倍数を入力してATR値を計算し,倍数を止損距離として掛けます.具体的には,ATR止損線の計算式は次のとおりです.

ATR线 = 前一日ATR线 ± nLoss(nLoss = nATRMultip * ATR值)

若收盘价 > ATR线,ATR线上调至收盘价 - nLoss 
若收盘价 < ATR线,ATR线下调至收盘价 + nLoss

このATR線は,価格変動に応じて動的に調整され,トレンド追跡ストップを可能にします.

ATRのストップに加えて,策略は標準差チャネルを使用して市場に出入するタイミングを判断する.標準差チャネルの計算式は以下の通りである.

中线 = ATR止损线
上轨 = 中线 + n倍标准差
下轨 = 中线 - n倍标准差  

価格が下から上へと中線を突破するとき,多めに;価格が上から下へと中線を突破するとき,空いてください.

戦略的優位性

この戦略の最大の利点は,ATR指標をストップ・ツールとして利用することで,市場の変動程度に応じてストップ・距離を動的に調整でき,トレンド・トラッキング・ストップ・損失を実現し,リスクを効果的にコントロールできることです.

また,標準差チャネルによる市場投入のタイミングの判断と組み合わせることで,価格のわずかな波動による頻繁に開設を回避できます.

リスクと解決策

この戦略の主なリスクは,止損距離が長すぎるとリスクを効果的に制御できないことにある.止損距離が長すぎると,市場の騒音に阻害されやすい.このリスクに対して,ATR周期およびATR倍数を調整して,最適なパラメータの組み合わせを探することができる.

もう一つのリスクは,標準差チャネルパラメータの設定が不適切であり,ポジション開設頻度が高すぎたり低すぎたりする可能性があるということです.パラメータ最適化によって最適なパラメータを見つけることができます.

最適化の方向

この戦略は以下の点で最適化できます.

  1. ATR周期と倍数最適化.この2つのパラメータを調整すると,よりよい止損効果が得られます.

  2. 標準差通路パラメータの最適化 経路パラメータの最適化,よりよい入場効果を得る

  3. 他の指標のフィルタを追加する.移動平均,K線形状などの指標を追加して,トレンドの方向を判断し,利得率を向上させる.

  4. ポジション開設と平和ポジションの論理を最適化する. 価格が標準差チャネルに触れたとき,K線形状を再び確認した後にポジションを開設する.

要約する

この戦略はATR指標に基づいてトレンド追跡ストップを実現し,標準差チャネルで入札のタイミングを判断する.戦略の優点は,ストップリスク制御効果が良いこと,トレンド取引に適していることにある.リスクと最適化の方向も明確に分析されている.この戦略は,さらなるテスト・最適化の価値があり,実物取引の価値がある.

ストラテジーソースコード
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version = 2
strategy(title="Average True Range Strategy", overlay = true)
nATRPeriod = input(11) //Hur många perioder ATR är på
nATRMultip = input(0.5) //Hur många gånger nuvarande ATR multipliceras med
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
xATRTrailingStop =  iff(close > nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), close - nLoss),
                     iff(close < nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), close + nLoss), 
                      iff(close > nz(xATRTrailingStop[1], 0), close - nLoss, close + nLoss)))
pos = iff(close[1] < nz(xATRTrailingStop[1], 0) and close > nz(xATRTrailingStop[1], 0), -1,
	   iff(close[1] > nz(xATRTrailingStop[1], 0) and close < nz(xATRTrailingStop[1], 0), 1, nz(pos[1], 0))) 

stdev3 = 14*stdev(xATR, nATRPeriod)
band1 = xATRTrailingStop+stdev3 //Översta stdev bandet
band2 = xATRTrailingStop-stdev3 //Nedersta stdev bandet


// Datum och tid
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 18, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2013, title = "From Year", minval = 2013)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", minval = 2017)

start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start 
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest slut
startTimeOk()  => true
initial_capital = 100000

take = close > xATRTrailingStop

if( startTimeOk() ) and (pos == 1)
//if (pos == 1) 
    strategy.entry("Long", strategy.long, comment = "KOP")
    strategy.exit("Long", when = take)
   
if( startTimeOk() ) and (pos == -1)
//if (pos == -1)
    strategy.entry("Short", strategy.short, comment = "SALJ")
   
barcolor(pos == -1 ? red: pos == 1 ? green : blue )
plot(xATRTrailingStop, color=red, title="ATR Trailing Stop") //Mittersta linjen som är triggerlinjen för köp/sälj
plot(band1, color=red)
plot(band2, color=blue)