ATR 追跡停止戦略

作者: リン・ハーンチャオチャン, 日付: 2023年10月9日 16:59:57
タグ:

概要

この戦略は,ストップ・ロスを保護し,最大限に利益を得るために,株価変動を追跡するために,平均真の範囲 (ATR) 指標に基づいて動的なストップ・ロスを設定します.

戦略の論理

この戦略は主に次のステップを通じて実施されます.

  1. ATR指標を計算します.ATR期間はnATRPeriodパラメータで設定されます.デフォルトは5です.

  2. ATR値に基づいてストップ損失線を計算する.ストップ損失の大きさは,nATRMultipパラメータで設定され,ATRの3.5倍にデフォルトで設定される.

  3. 価格が上昇すると,前回のストップ・ロスの線よりも高くなった場合,ストップ・ロスの線を価格からストップ・ロスの幅を引いた値まで調整する.価格が下がると,前回のストップ・ロスの線より低くなった場合,ストップ・ロスの線を価格からストップ・ロスの幅を引いた値まで調整する.

  4. 価格がストップ・ロスの線を突破するかどうかを判断し,もし突破した場合,買い・売る信号を送信します.

  5. ストップ・ロスのラインのブレイクシグナルに基づいてロング・またはショート・ポジションを入力し,価格がストップ・ロスのラインに再び触れたときにポジションを閉じる.

価格が上昇すると,ストップ損失線は利益をロックするために継続的に上昇する.価格が下がると,ストップ損失線は損失を停止するために継続的に下がる.ATRインジケーターは価格変動をより正確に反映することができます.ATRに基づいてストップ損失ラインを動的に調整することで,過度に攻撃的または過度に保守的なストップ損失を避けることができます.

利点分析

  • 損失拡大を避けるため,タイムリーストップ損失のためにストップ損失ラインを動的に調整します.
  • ストップ損失線調整は,早期ストップ損失を避けるために比較的スムーズです.
  • ATR インディケーターを使用して,最新の変動に基づいて,より合理的なストップロスの大きさを計算します.
  • トレールストップ損失線を効率的に利益をロック

リスク分析

  • ATR パラメータ設定は慎重でなければならない. ATR 期間が短すぎるとストップ・ロスの線が過剰に変動する可能性がある.
  • ストップ・ロスの大きさは,特定の株式変動に応じて設定する必要があります. 過剰に大きい値や小さい値が戦略の業績に影響します.
  • トレイリングストップ損失は,別の価格上昇の前に利益を停止することによって利益率を低下させることがあります.
  • ポジションの頻繁な調整は,取引コストの上昇につながる可能性があります.

パラメータは,ATR期間とストップ損失の大きさを調整することで最適化され,ストップ損失とトラッキングとの間に最適なバランスを見つけることができます.また,他の技術指標を使用して,不要なストップ損失を減らすためにエントリータイミングをフィルタリングすることもできます.

オプティマイゼーションの方向性

  • ストップ・ロスの線の変化が価格変動をより密接に追跡できるように ATR 期間のパラメータを最適化する
  • より合理的なストップ損失のためにストップ損失の大きさのパラメータを最適化
  • 入力タイミングをフィルターに他の指標を追加する
  • 明らかに上昇傾向が現れる時だけ 長期取引をする
  • ストップ・ロスの株への参入を考慮し,上昇を継続する見込みで再参入メカニズムを追加する

概要

この戦略は,動的ATRトレーリングストップ損失ラインを通じてストップ損失と利益を引き出すことを実現する.固定ストップ損失ポイントと比較して,過度に攻撃的または過度に保守的なストップ損失を避け,価格変動により順応する.ATR指標はストップ損失ラインの調整をよりターゲットにします.しかし,パラメータと再エントリー戦略は,不要なストップを削減し,利益率を拡大するためにさらなる最適化が必要です.全体的には,これはさらなる研究と適用に値する良い動的トレーリングストップ損失アイデアです.


/*backtest
start: 2023-09-08 00:00:00
end: 2023-10-08 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//@okadoke
////////////////////////////////////////////////////////////
// Based on Average True Range Trailing Stops Strategy by HPotter
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stops Strategy", shorttitle="ATRTSS", overlay = true, 
  initial_capital=100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type="percent", commission_value=0.0)
  
nATRPeriod      = input(5, "ATR Period")
nATRMultip      = input(3.5, "ATR Multiplier")
useShorts       = input(false, "Test w/Shorts?")
daysBackMax     = input(defval = 360, title = "Max Days Back to Test", minval = 0)
daysBackMin     = input(defval = 0, title = "Min Days Back to Test", minval = 0)
msBackMax       = 1000 * 60 * 60 * 24 * daysBackMax
msBackMin       = 1000 * 60 * 60 * 24 * daysBackMin

xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
xATRTrailingStop = na
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 = na 
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)))
        
color = pos == -1 ? red: pos == 1 ? green : blue 
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop")

isWithinTimeBounds = (msBackMax == 0 or (time > (timenow - msBackMax))) and (msBackMin == 0 or (time < (timenow - msBackMin)))

buy     = crossover(close, xATRTrailingStop)
sell    = crossunder(close, xATRTrailingStop)

strategy.entry("LONG", long=true, when=buy and isWithinTimeBounds)
strategy.close("LONG", when=sell and isWithinTimeBounds)
strategy.entry("SHORT", long=false, when=useShorts and sell and isWithinTimeBounds)
strategy.close("SHORT", when=useShorts and buy and isWithinTimeBounds)



もっと