ATRとSMAに基づく動的ストップロス追跡戦略


作成日: 2024-03-11 11:55:21 最終変更日: 2024-03-11 11:55:21
コピー: 0 クリック数: 705
1
フォロー
1617
フォロワー

ATRとSMAに基づく動的ストップロス追跡戦略

概要

この戦略はATR (Average True Range) 指数とSMA (Simple Moving Average) 指数を組み合わせて,動的ストップロスを追跡する取引システムを実現する.価格がSMAの上で多項を開くと同時にATRに基づく動的ストップを設定すると,ストップ価格は価格の上昇に伴い上昇する.価格が動的ストップロスを破るときは平仓する.この戦略の主要な考え方は,動的ストップを活用してトレンドの状況で利益をロックし,撤回を低減することである.

戦略原則

  1. 50日SMAを計算し,終了価格が50日SMAより大きいときは多項を開きます.
  2. ATR指標を計算し,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")