アダプティブATRストップロスのMACD取引戦略

作者: リン・ハーンチャオチャン開催日:2023年9月20日15時23分
タグ:

概要

この戦略は,トレード・シグナルとリスク管理のための適応型ATRベースのストップ・ロスを生成するためにMACD指標を使用します.これはトレンドフォロー戦略に属します.

戦略の論理

  1. MACDデルタ線クロスオーバー0は 買い・売るシグナルを生成します

  2. 動的ストップ損失は,過去NのATR期間に基づいて計算され,変動を反映する.

  3. ストップ・ロスは変動の変化に適応して調整され,変動が急上昇すると拡大する.

  4. ポジションのストップロスをリアルタイムで更新し,利益とリスクを制御します.

  5. リスク管理のためにストップ・ロスは実行される場合,ポジションを終了します.

利点

  1. MACDは傾向を追跡する際に敏感です.

  2. アダプティブストップは異なる市場環境に適しており,ストップが狭すぎたり緩すぎたりしない.

  3. 視覚的なストップラインは リスク状態を直感的に反映します

  4. シンプルで明快な戦略ルールで 分かりやすく実行できます

  5. 制御可能な抽出と効果的なリスク管理

リスク

  1. MACDは誤った信号を生成し,不必要な損失を引き起こす可能性があります.

  2. ATR パラメータが正しくない場合 ストップが狭すぎたり 緩やかすぎたりします

  3. 停電が頻繁に行われるリスク

  4. トレンドが逆転すると タイミングで止まるのは難しい

  5. パラメータを最適化する際に過度に調整するリスク

強化

  1. 最適な組み合わせのためにMACDパラメータをテストする.

  2. 他のストップ方法を試してみてください

  3. 停止を最適化して 頻度とリスク管理を均衡させる

  4. 逆転停止を防ぐためにトレンドフィルターを追加します.

  5. 過剰取引を避けるために取引コストの影響を考慮してください.

  6. スリップや強化ストップを使用してストップを起動します.

結論

この戦略は,適応型ATRダイナミックストップでMACD信号を取引する.制御可能なリスクとシンプルさを特徴づける.しかし,MACD信号は誤りであり,ストップは継続的な最適化が必要である.全体として,パラメータチューニング,ストップ最適化などにより,それは強力なトレンドフォローリングシステムになることができます.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MACD BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() =>  true

///////////////  MACD  /////////////// 
fastLength = input(13) 
slowlength = input(30) 
MACDLength = input(12) 

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD

///////////////  Strategy  /////////////// 
long = crossover(delta, 0)
short = crossunder(delta, 0)

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Dynamic ATR Stop Losses ///////////////
atrLkb = input(2, minval=1, title='ATR Stop Period')
atrMult = input(1.25, step=0.25, title='ATR Stop Multiplier') 
atr1 = atr(atrLkb)

longStop = 0.0
longStop :=  short_signal ? na : long_signal ? close - (atr1 * atrMult) : longStop[1]
shortStop = 0.0
shortStop := long_signal ? na : short_signal ? close + (atr1 * atrMult) : shortStop[1]

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("Long", strategy.long, when=long)
    strategy.entry("Short", strategy.short, when=short)
    strategy.exit("Long SL", "Long", stop=longStop, when=since_longEntry > 0)
    strategy.exit("Short SL", "Short", stop=shortStop, when=since_shortEntry > 0)

/////////////// Plotting /////////////// 
barcolor(long ? color.lime : short ? color.red : na)
plot(strategy.position_size <= 0 ? na : longStop, title="Long Stop Loss", color=color.yellow, style=plot.style_circles, linewidth=2)
plot(strategy.position_size >= 0 ? na : shortStop, title="Short Stop Loss", color=color.orange, style=plot.style_circles, linewidth=2)
bgcolor(strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=90)
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=60)

もっと