
この戦略の核心的な考えは,平均真波幅 (ATR) の指数を活用して,自己適応的なトラッキングストップラインを設定し,有利なポジションを最大限に保護し,過早なストップを回避することです.ATR指数は,市場の波動に応じてストップの距離を調整し,ストップが誘発される確率を最小限に抑えながら,ストップを保証します.この戦略は,ブリンバンドを添加すると同時に,ストップラインの上下限を可視化し,シェードラインを添加するかどうかを選択できます.
この策略はATR指標のN周期平均値を基本のストップ距離として倍数で掛ける.ATR値が大きいほど,市場波動が大きいので,ストップ距離がより広い設定されます.ATR値が小さいほど,ストップ距離がより狭い設定されます.このように,市場の波動程度に応じてストップ距離を動的に調整できます.
具体的には,この戦略は以下の核心的な論理を用いています.
ATR周期 ((nATRPeriod) のATR値を計算する.
ATR 値の倍数 ((nATRMultip) によって基礎止損距離 nLoss を得る.
ストップライン xATRTrailingStopを現在の高点,低点,および前の周期のストップラインに基づいて更新します.
もし現在の低点が前回の周期のストップラインを触発したならば,ストップラインは低点より下にあるnLossの距離に移動する.
もし現在の高点が前回のサイクルストップラインを触発したならば,ストップラインの下から高点より nLossの距離まで移動する.
ストップが触発されていない場合,閉店価格からストップラインの距離に応じてストップラインを調整する.
選択可能な影線保護距離を追加し,さらに止損線を最適化します.
ブリン帯軌道を描いて,止損線の上下限を可視化する.
ストップラインの色によってポジションの方向を判断する.
この戦略はATR指標を柔軟に使用し,市場波動に合わせてストップラインを自律的に調整できるようにし,ストップ距離を合理的に確保するとともに,過剰に激進的なストップが不必要なポジション損失を避けるようにします.
この戦略は以下の利点があります.
ATRの指数を使って,ストップ距離を動的に調整し,異なる市場状況に自律的に適応できます.
倍数パラメータはカスタマイズされ,止損距離の柔軟な調整が可能である.
ブリン帯軌道に加わり,止損線の可視化上下限を形成する.
シャドーライン保護機能の選択は,震動市からのウィップソーを防ぐことができます.
ストップ・ロスの追跡として使用され,利益のポジションを最大限引き戻すことができます.
戦略は明確でわかりやすく,パラメータは楽観的ではない.
複数の品種と周期で使用可能で,適用範囲は広い.
この戦略にはいくつかのリスクがあります.
ATR指標は市場突発に反応し遅れているため,ストップダストの距離が大きすぎる可能性があります.
倍数設定が大きすぎると,止損距離が大きくなり,損失の危険性が高まります.
影線保護機能は,震動が大きくなると,止損線を過度に緩やかにする.
エントリー/エグジットの策略として,入場規則を考慮しないことはできません.
異なる品種と周期に対応するために,最適化パラメータを繰り返しテストする必要があります.
ストップを突破すると,損失が拡大し,効果的な資金管理が必要となる.
この戦略は以下の点で最適化できます.
異なるATR周期パラメータをテストし,停止距離を最適化する.
倍数パラメータを調整し,止損距離と止損確率の間のバランスをとる.
影線保護周期パラメータを最適化して,whipsawを防止する.
エントリー/エグジットの策略として,入場条件をストップ・ローズで追加しようとします.
トレンド判断指標を追加し,トレンドに応じてストップダスト距離を調整する.
波の位置に応じて止損距離を調整する.
ポジションコントロールを追加し,単発損失を制限する.
この戦略は,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")