ATR トレイリングストップバンド戦略

作者: リン・ハーンチャオチャン,日付: 2023年10月19日 12:42:26
タグ:

img

概要

この戦略の主なアイデアは,平均真範囲 (ATR) インジケーターを使用して,収益性の高いポジションの保護を最大化し,早期ストップ損失を回避するために適応的なトレーリングストップ損失ラインを設定することです.ATRインジケーターは市場の変動を動的に把握し,市場の変動に基づいてストップ損失距離を調整し,有効なストップ損失を保証し,ストップ損失が引き起こす可能性を最小限に抑えます.この戦略にはストップ損失ラインの上下限を視覚化するためのボリンジャーバンドも組み込まれ,レンジング市場のウィップソー効果に対抗するためにウィック保護を追加するオプションもあります.

戦略の論理

この戦略は,ATR指標のN期間の平均をベースストップ損失距離として因数で掛けます.ATR値が大きいほど,市場の変動が大きいので,ストップ損失距離がより広く設定されます.ATR値が小さいほど,ストップ損失距離が狭くなっています.これは市場の変動に基づいてストップ損失距離を動的に調整することができます.

具体的には,この戦略は次の基本的な論理を使用します.

  1. ATR 期間 (nATRPeriod) の ATR 値を計算する.

  2. ATR値を因数 (nATRMultip) で掛けることで,基本ストップ損失距離 nLoss を得ます.

  3. xATRTrailingStopのストップ損失線を更新します. 現在の上位,下位,前期のストップ損失ラインに基づいて.

  4. 現在の低値が前期のストップ損失線を誘発した場合,ストップ損失線は nLoss 距離の低値以下に移動します.

  5. 現在の高値が前期のストップ・ロスの線を触発すると,ストップ・ロスの線は nLoss 距離の高値以上まで下がります.

  6. ストップ・ロスは起動しない場合,ストップ・ロスのラインをストップ・ロスの価格の距離に基づいて調整します.

  7. ストップ損失線をさらに最適化するためにオプションのウィーク保護距離を追加します.

  8. ストップ・ロスの上限と下限を視覚化するためにボリンジャー・バンドをグラフ化します

  9. ストップ損失線の色に基づいて位置方向を決定します.

この戦略は,市場変動に基づいてストップ・ロスの線が適応的に調整できるように,柔軟にATR指標を使用し,不必要なストップ・ロスの原因となる過剰なストップ・ロスの回避を同時に合理的なストップ・ロスの距離を確保します.

利点

この戦略の利点は

  1. ATR インジケーターを使用して,異なる市場条件に動的に適応してストップ・ロスの距離を調整します.

  2. カスタマイズ可能な倍数で,ストップ損失距離を柔軟に調整できます.

  3. ボリンジャーバンドを追加すると,ストップ・ロスの上限と下限の可視化ができます.

  4. 選択的なウィーク保護は,さまざまな市場でウィップソウを避けます.

  5. 利潤のあるポジションの引き下げを最大化するために,ストップ損失を後押しするために使用できます.

  6. 戦略の論理は 明確で理解しやすいもので 最適化可能なパラメータは少ない.

  7. 複数の製品と時間枠に適用できる.

リスク

この戦略のリスクは以下の通りです.

  1. ATRインジケーターは,市場のショックにゆっくり反応し,大きなストップロスの距離につながります.

  2. 過剰な倍数設定は,ストップ損失距離を拡大し,損失リスクを増加させます.

  3. ストップ・ロスの線が 緩すぎると ワイプソウが増加します

  4. 入口規則は考慮されていないので,入口/出口戦略として使用できません.

  5. 様々な製品と時間枠に必要とされるパラメータの広範なテストと最適化

  6. ストップ・ロスは損失を拡大し,効率的な資本管理が必要になる.

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

戦略は以下の側面で最適化できます.

  1. ストップ損失距離を最適化するために,異なるATR期間をテストする.

  2. ストップ損失距離と確率のバランスを調整します

  3. ストローの保護期間を最適化して ストローを防ぎます

  4. ストップ・ロスの上には エントリー・エクジット・戦略を 追加してみてください

  5. トレンドをベースにストップ・ロスの距離を調整するためにトレンド・インジケーターを追加します.

  6. エリオット波理論に基づいてストップロスを調整します

  7. 単一の損失額を制限するためにポジションサイズを追加します.

概要

この戦略は,動的なストップ損失メカニズムを設計するためにATR指標の適応性特性を利用する.ストップ損失を保証する一方で,不要なストップ損失トリガーも最小限に抑える.戦略論理は単純で明確で,ニーズに基づいて柔軟な最適化が可能である.利益の保護を最大化するためにストップ損失を後押しするために最もうまく機能する.適切なパラメータ最適化とリスク制御により,この戦略は定量取引における効果的なストップ損失ツールとなる.


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

//@version=2
////////////////////////////////////////////////////////////
//  Copyright by HPotter v2.0 13/10/2014
// Average True Range Trailing Stops Strategy, by Sylvain Vervoort 
// The related article is copyrighted material from Stocks & Commodities Jun 2009 
// Modified by River to add Bands, and change color of Trailing Stop and add Wick Protection. Now turned into a Strategy for Backtesting Purposes.
// After backtesting, it seems clear that it functions well as a Trailing Stop, but not as an Entry/Exit strategy.
////////////////////////////////////////////////////////////
strategy(title="ATR Trailing Stop Bands Strategy[R] ", overlay = true)
nATRPeriod = input(5)
nATRMultip = input(4)
length = input(30, "#Periods of Wick Protection", minval=2)
bType = input(0, "Max [1] or Avg Wick Protection [0]", minval=0, maxval=1)
avgupperwick = sma(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
maxupperwick = highest(close[1] <= open[1] ? high[1] - open[1] : high[1] - close[1], length)
avglowerwick = sma(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
maxlowerwick = highest(close[1] > open[1] ? open[1] - low[1] : close[1] - low[1], length)
upperwick = bType == 0 ? avgupperwick : maxupperwick
lowerwick = bType == 0 ? avglowerwick : maxlowerwick
xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR 
upperband = iff(high < nz(upperband[1], 0) and high[1] < nz(upperband[1], 0), min(nz(upperband[1]), high + nLoss + upperwick), high + nLoss + upperwick)
lowerband = iff(low > nz(lowerband[1], 0) and low[1] > nz(lowerband[1], 0), max(nz(lowerband[1]), low - nLoss - lowerwick), low - nLoss - lowerwick) 
xATRTrailingStop = iff(low > nz(xATRTrailingStop[1], 0) and low[1] > nz(xATRTrailingStop[1], 0), max(nz(xATRTrailingStop[1]), low - nLoss - lowerwick),
 iff(high < nz(xATRTrailingStop[1], 0) and high[1] < nz(xATRTrailingStop[1], 0), min(nz(xATRTrailingStop[1]), high + nLoss + upperwick), 
//                        iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), high + nLoss + upperwick, iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), low - nLoss - lowerwick,0))))
 iff(low <= nz(xATRTrailingStop[1], 0) and close[1] > nz(xATRTrailingStop[1], 0), upperband[1], iff(high >= nz(xATRTrailingStop[1], 0) and close[1] < nz(xATRTrailingStop[1], 0), lowerband[1],0))))

pos =	iff(close[1] > nz(xATRTrailingStop[1], 0) and low <= nz(xATRTrailingStop[1], 0), 1,
 iff(close[1] < nz(xATRTrailingStop[1], 0) and high >= nz(xATRTrailingStop[1], 0), -1, nz(pos[1], 0))) 
color = pos == 1 ? red: pos == -1 ? green : blue 
plot(upperband, color=red, title="ATR Upper")
plot(xATRTrailingStop, color=color, title="ATR Trailing Stop", linewidth=2)
plot(lowerband, color=green, title="ATR Lower")

longCondition = (color == green and color[1] == red)
if (longCondition)
    strategy.entry("Long", strategy.long)
longExitCondition = (color == red and color[1] == green)
if (longExitCondition)
    strategy.close("Long")

shortCondition = (color == red and color[1] == green)
if (shortCondition)
    strategy.entry("Short", strategy.short)
shortexitCondition = (color == green and color[1] == red)
if (shortexitCondition)
    strategy.close("Short")


もっと