MACDモメントインジケーター バックテスト戦略

作者: リン・ハーンチャオチャン, 日時: 2023-09-24 13:21:54
タグ:

概要

この戦略は,MACDモメントインジケーターとRSIオーバーバイト/オーバーセールインジケーターを組み合わせます.MACDが上下を横切ると,RSIがより信頼性の高い取引信号を生成するために,バックバック期間に対応する底値/上位逆転も完了しているかチェックします.典型的な短期平均逆転戦略論理.

戦略の論理

  1. MACD DIFF,DEA とヒストグラムを計算します.DEA の上のDIFFのクロスオーバーは上昇のクロスオーバー信号,下のクロスオーバーは死亡のクロスオーバー信号になります.

  2. RSI を計算し,過売り回転と過買い回転を特定する.最近底値または上位値が発生したかどうかをチェックする.

  3. MACDの上昇型クロスオーバーが起こると,RSIがバックウィンドウ内で過売りから反転した場合,ロング信号が生成されます.MACDのデスクロスでは,RSIがバックウィンドウを上回った場合,ショート信号が生成されます.

  4. リスク管理へのエントリー後に停止損失を設定します.

利点

  1. MACDは傾向の変化を敏感に識別し,RSIは過剰購入/過剰販売レベルを効果的に判断します.

  2. MACDとRSIの両方のシグナルが必要なら 偽のシグナルをフィルタリングします

  3. 後ろの窓は信号の信頼性を向上させる.

  4. ストップ・ロスはリスク管理に役立ちます

リスク

  1. MACDとRSIの遅れは,最適なエントリを逃す可能性があります.

  2. 二重指標信号の確率が低いということは,取引が少なくなるということです.

  3. より大きなトレンド方向を考慮しないと 罠にかけられる危険性があります

  4. ストップ・ロスの調節が不十分で,幅が幅が広いか狭すぎた場合もあります.

解決 できる 方法:

  1. MACDとRSIのパラメータを調整して遅延を減らす.

  2. インディケーターの限界範囲を拡大して より多くの信号を提供します

  3. 逆トレンドのエントリを避けるためにトレンドフィルターを追加します.

  4. ストップ・ロスの異なるパラメータをテストして最適なレベルを測る.

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

  1. SMAと他の移動平均値をテストする.

  2. フレキシブルストップには ストップ損失を後押しします

  3. 進出の質を判断するために 傾向の強さを考慮します

  4. マシン学習を使って インディケーターの動きを予測します

  5. 入場時間を最適化するために より多くの要素を組み合わせます

概要

この戦略は,調整されたMACDとRSIを使用して信頼性の高い逆転信号をフィルタリングします.論理は明確で,指標選択,トレンドフィルター,ストップ損失技術などの強化のためにパラメータは柔軟です. 安定性を維持しながらより多くの取引を取得するには,過剰な最適化リスクは避ける必要があります.


/*backtest
start: 2023-08-24 00:00:00
end: 2023-09-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//based on Range Strat - MACD/RSI 
// strategy("MACD/RSI - edited", 
//      overlay=true,
//      default_qty_type=strategy.percent_of_equity,
//      default_qty_value=10, precision=2, initial_capital=100000,
//      pyramiding=2,
//      commission_value=0.05)

//Backtest date range
StartDate = input(timestamp("13 Jun 2022"), title="Start Date")
EndDate = input(timestamp("13 Jun 2024"), title="Start Date")
inDateRange = true

// RSI Input Settings
rsisrc = input(title="RSI Source", defval=close, group="RSI Settings")
length = input(title="Length", defval=14, group="RSI Settings" )
overSold = input(title="Over Sold Threshold", defval=30, group="RSI Settings" )
overBought = input(title="Over Bought Threshold", defval=70, group="RSI Settings" )
rsi_lookback = input(title="RSI cross lookback period", defval=7, group="RSI Settings")

// Calculating RSI
vrsi = ta.rsi(rsisrc, length)
co = ta.crossover(vrsi, overSold)
cu = ta.crossunder(vrsi, overBought)

// Function looking for a happened condition during lookback period
f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed


coCheck = f_somethingHappened(co, rsi_lookback)
cuCheck = f_somethingHappened(cu, rsi_lookback)

// MACD Input Settings
macdsrc = input(title="MACD Source", defval=close, group="MACD Settings")
fast_length = input(title="Fast Length", defval=12, group="MACD Settings")
slow_length = input(title="Slow Length", defval=26, group="MACD Settings")
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9, group="MACD Settings")
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"], group="MACD Settings")
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"], group="MACD Settings")


// Calculating MACD
fast_ma = sma_source == "SMA" ? ta.sma(macdsrc, fast_length) : ta.ema(macdsrc, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(macdsrc, slow_length) : ta.ema(macdsrc, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
delta = macd - signal

MACDcrossover = ta.crossover(delta, 0)
MACDcrossunder = ta.crossunder(delta, 0)

// Stop Loss Input Settings
longLossPerc = input(title="Long Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01
shortLossPerc = input(title="Short Stop Loss (%)", defval=15, group="Stop Loss Settings") * 0.01

// Calculating Stop Loss
longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)
shortStopPrice = strategy.position_avg_price * (1 + shortLossPerc)



// Strategy Entry
if (not na(vrsi))
	if (inDateRange and MACDcrossover and coCheck)
		strategy.entry("LONG", strategy.long, comment="LONG")
	if (inDateRange and MACDcrossunder and cuCheck)
		strategy.entry("SHORT", strategy.short, comment="SHORT")

// Submit exit orders based on calculated stop loss price
if (strategy.position_size > 0)
    strategy.exit(id="LONG STOP", stop=longStopPrice)
if (strategy.position_size < 0)
    strategy.exit(id="SHORT STOP", stop=shortStopPrice)

もっと