ATRとSMAをベースにしたダイナミック・トラッキング・ストップ戦略

作者: リン・ハーンチャオチャン開催日:2024年3月11日 11:55:21
タグ:

img

概要

この戦略は,ATR (Average True Range) インジケーターとSMA (Simple Moving Average) インジケーターを組み合わせて,ダイナミック・トレリング・ストップ・トレーディング・システムを実装する.価格がSMAを超えると,ロングポジションを開き,ATRに基づいてダイナミック・ストップ・ロスを設定する.価格が上昇するにつれてストップ・ロスの価格が上昇し続ける.価格がダイナミック・ストップ・ロスの価格を下回ると,ポジションは閉鎖される.この戦略の主な考えは,ダイナミック・ストップ・ロスを使用してトレンド市場の利益をロックダウンし,引き下げを減らすことである.

戦略の原則

  1. 50日間のSMAを計算します.閉じる価格が50日間のSMAよりも大きいとき,ロングポジションを開きます.
  2. ATR インディケーターを 10 の周期で計算し,キー値 (デフォルトは 3) で掛けると,ストップ損失範囲 nLoss を得ます.
  3. ダイナミックストップ損失価格 xATRTrailingStop を計算し,初期値は 0 です.
    • 閉じる価格と前の閉じる価格の両方が前のストップ損失価格よりも大きい場合,新しいストップ損失価格は,前のストップ損失価格と (閉じる価格 - nLoss) より大きいものです.
    • 閉じる価格と前の閉じる価格の両方が前のストップ損失価格より低い場合,新しいストップ損失価格は,前のストップ損失価格と (閉じる価格+nLoss) のうち小さい値です.
    • 他の場合,新しいストップ・ロスは (閉じる価格 - nLoss) または (閉じる価格 + nLoss) です.
  4. 閉じる価格がダイナミックストップ・ロスの価格を下回ると,ポジションを閉じる.
  5. ストップロスのポイントは色が違う: 長いストップロスの緑色,短いストップロスの赤色,他のケースでは青色.

利点分析

  1. 動的ストップ損失メカニズムは,トレンド市場の利益を保護し,引き下げリスクを軽減することができます.固定ストップ損失と比較して,動的ストップ損失はより柔軟で,異なる市場状況に適応できます.
  2. ストップ損失範囲はATR指標に基づいて計算される.ATRは市場の変動の大きさをよく反映できるため,ストップ損失距離は最近の市場状況の変動に応じて自動的に調整される.変動が増加するとストップ損失スペースを増やし,変動が減少するとストップ損失スペースを減らす.
  3. 傾向判断の基礎としてSMAを使用すると,比較的明確なトレンド市場が把握できます.SMAを超えるロングポジションを開設すると,トレンドの初期段階に介入し,より大きな利益空間を狙うことができます.
  4. ユーザがATR期間とキー値パラメータを設定できるので,戦略パラメータを柔軟に調整し,異なる品種やサイクルの特徴に合わせて調整できます.

リスク分析

  1. 不透明な市場や変動する市場では,この戦略は頻繁にポジションを開閉し,取引コストの増加と利益減少につながる可能性があります.
  2. この戦略には長い論理のみがあり,一方的な市場のリスクに直面して下落傾向で利益を得ることはできません.両方向取引を達成するために短い論理を追加することを検討してください.
  3. ストップ損失ポイントはATR計算に基づいています.市場が激しく変動すると,ストップ損失空間が大きすぎてリスクが高まる可能性があります.単一の取引の最大損失を制御するために最大ストップ損失範囲を設定することを検討してください.
  4. パラメータの不正な選択は戦略の失敗につながる可能性がある.例えば,ATR期間が小さすぎると,過度に敏感なストップ損失と頻繁なトリガーにつながる可能性がある.大きすぎると,時間内に損失を止めることができず,損失を増幅する可能性があります.

最適化方向

  1. ダウントレンドで利益を得るためのショートロジックを追加し,戦略の適応性を向上させることができます.価格がSMAを下回るときにショートポジションを開くことができ,ダイナミックストップ損失ロジックも使用できます.
  2. トレンド強さに応じてポジションサイズを調整するために,ロングとショートポジション管理を導入する. トレンド強さでリターンを増加させるためにポジションを増やす. トレンドが弱いときにリスクを制御するためにポジションを減少させる.
  3. ストップ・ロスのロジックを最適化し,極端な状況で過度の損失を防ぐために最大ストップ・ロスの範囲を設定する.同時に,ストップ・ロスが起動するまで保持するのではなく,期待されるリターンが達成されたときにポジションを積極的に閉じるために,利益を得るポイントを設定することを検討する.
  4. パラメータを最適化するために,異なるパラメータの組み合わせを横断することでパラメータを最適化する.遺伝子アルゴリズムなどのインテリジェントな最適化方法は,最適化効率を改善するために使用することができます.
  5. 取引量や波動性指標などのより多くのフィルタリング条件を追加することを検討し,傾向やリスクをより良く判断し,信号の信頼性を向上させる.

概要

この戦略は,ATRおよびSMA指標に基づいて動的なトレーリングストップ取引システムを実装し,トレンド市場のストップ損失ポジションを自動的に調整して利益を保護し,リスクを制御することができます.戦略論理は明確で,明らかな利点もありますが,いくつかの制限とリスクポイントもあります.ショート論理を追加し,ポジション管理を最適化し,最大ストップ損失を設定するなどの合理的な最適化と改善により,戦略の堅牢性と収益性がさらに向上できます.実用的な応用では,さまざまな取引品種とサイクルに応じて戦略パラメータを柔軟に調整し,リスクを厳格に制御する必要があります.一般的に,この戦略は定量取引のための実行可能なアイデアを提供し,さらなる調査と最適化に値します.


/*backtest
start: 2023-03-05 00:00:00
end: 2024-03-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Trailingstop", overlay=true)

if close > sma(close, 50)
    strategy.entry("long", strategy.long)

// Trailing stop loss for long positions
Trailperc = 0.20
price_stop_long = 0.0

if (strategy.position_size > 0)
    stopValue = close * (1 - Trailperc)
    price_stop_long := max(stopValue, price_stop_long[1])
else
    price_stop_long := 0

if (strategy.position_size > 0)
    strategy.exit(id="stoploss_long", stop=price_stop_long)

// Trailing stop loss for short positions
Trailperc_short = 0.20
price_stop_short = 0.0

if (strategy.position_size < 0)
    stopValue_short = close * (1 + Trailperc_short)
    price_stop_short := min(stopValue_short, price_stop_short[1])
else
    price_stop_short := 0

if (strategy.position_size < 0)
    strategy.exit(id="stoploss_short", stop=price_stop_short)

// ATR Trailing Stop for visualization
keyvalue = input(3, title="Key Value. 'This changes the sensitivity'", step=0.5)
atrperiod = input(10, title="ATR Period")
xATR = atr(atrperiod)
nLoss = keyvalue * xATR

xATRTrailingStop = 0.0
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 = 0  
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)))

xcolor = pos == -1 ? color.red: pos == 1 ? color.green : color.blue

plot(xATRTrailingStop, color = xcolor, title = "Trailing Stop")

もっと