適応型ATRストップロスに基づくMACD取引戦略


作成日: 2023-09-20 15:23:00 最終変更日: 2023-09-20 15:23:00
コピー: 1 クリック数: 870
1
フォロー
1621
フォロワー

概要

この戦略は,MACD指標を利用して取引シグナルを生成し,ATRベースの自律的なストップを用いることでリスクを制御する.

戦略原則

  1. MACD指数の差離値デルット折線が0軸を突破し,買入と売却のシグナルを生成する.

  2. 最近のNサイクルによるATR計算動的ストップ・ポイント.ATRは市場の変動率を反映することができる.

  3. ストップローズは波動率の変化に自律的に調整され,波動が大きくなるとストップローズは緩やかになります.

  4. 利益をロックし,リスクをコントロールするために,信号を保持する際にストップロスをリアルタイムで更新します.

  5. ストップ・ロスのトリガー時にポジションを外し,リスクコントロールを完了する.

優位分析

  1. MACD指数はトレンドを追跡するのに敏感です.

  2. ダイナミック・ストップは,市場環境に自律的に適応し,近距離または遠距離のストップを避ける.

  3. ビジュアル化されたストップ・ローズ・ラインは,リスク状況を直視的に反映する.

  4. 戦略はシンプルでわかりやすく,理解しやすい.

  5. リスク管理がうまくいっています.

リスク分析

  1. MACD指数は誤信号を発生させ,不必要な損失を招く可能性があります.

  2. ATRパラメータの設定が不適切で,近距離または遠距離の問題に害を与えます.

  3. ストップダメージが頻繁に発生する危険性

  4. 逆転が困難で,時差が下がる.

  5. パラメータの最適化では過適合のリスクがあるかもしれない.

最適化の方向

  1. 異なるパラメータのMACDの組み合わせをテストし,最適なパラメータを探します.

  2. ストップ・トラッキングなど,他のストップ・方法を試してください.

  3. ストップ・損失のパラメータを最適化し,ストップ・損失の頻度とリスク管理をバランスさせる.

  4. 逆転の停止を避けるためのトレンド判断メカニズムを追加します.

  5. 取引コストの影響を考慮し,過剰取引を防止する.

  6. スライドポイントまたは強化ストープを使用してストープを有効にします.

要約する

この戦略は,MACD指標に基づく信号を発信し,自己適応ATRダイナミックストロップを採用している. リスクが制御可能で,簡単な実用的な特徴がある. しかし,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)