Indikator Momentum MACD Strategi Backtest

Penulis:ChaoZhang, Tanggal: 2023-09-24 13:21:54
Tag:

Gambaran umum

Strategi ini menggabungkan indikator momentum MACD dengan indikator RSI overbought/oversold. Ketika MACD melintasi naik atau turun, ia memeriksa apakah RSI juga menyelesaikan pembalikan bottoming/topping yang sesuai selama periode lookback untuk menghasilkan sinyal perdagangan yang lebih dapat diandalkan.

Logika Strategi

  1. Menghitung MACD DIFF, DEA dan histogram. Crossover dari DIFF di atas DEA memberikan sinyal crossover bullish, dan crossover di bawah memberikan sinyal crossover kematian.

  2. Menghitung RSI untuk mengidentifikasi bouncing oversold dan overbought selloffs.

  3. Ketika MACD bullish crossover terjadi, jika RSI telah memantul dari oversold dalam jendela lookback, sinyal panjang dihasilkan. Pada MACD death cross, sinyal pendek dihasilkan jika RSI di atas jendela lookback.

  4. Stop loss diatur setelah masuk ke risiko kontrol.

Keuntungan

  1. MACD secara sensitif mengidentifikasi perubahan tren. RSI secara efektif menilai tingkat overbought / oversold.

  2. Membutuhkan kedua sinyal MACD dan RSI menyaring sinyal palsu.

  3. Jendela melihat ke belakang meningkatkan keandalan sinyal.

  4. Stop loss membantu manajemen risiko.

Risiko

  1. Ketinggalan MACD dan RSI dapat menyebabkan entri optimal terlewatkan.

  2. Kemungkinan sinyal indikator ganda yang lebih rendah berarti lebih sedikit perdagangan.

  3. Tidak mempertimbangkan arah tren yang lebih besar berisiko terjebak.

  4. Penyesuaian stop loss yang buruk mungkin terlalu lebar atau terlalu ketat.

Kemungkinan Solusi:

  1. Sesuaikan parameter MACD dan RSI untuk mengurangi lag.

  2. Luaskan kisaran ambang indikator untuk memberikan lebih banyak sinyal.

  3. Tambahkan filter tren untuk menghindari entri kontra-tren.

  4. Uji parameter stop loss yang berbeda untuk tingkat yang optimal.

Arahan Optimasi

  1. Uji SMA dan rata-rata bergerak lainnya.

  2. Tambahkan stop loss untuk stop fleksibel.

  3. Masukkan kekuatan tren untuk menilai kualitas entri.

  4. Gunakan pembelajaran mesin untuk memprediksi pergerakan indikator.

  5. Gabungkan lebih banyak faktor untuk mengoptimalkan waktu masuk.

Ringkasan

Strategi ini menyaring sinyal pembalikan yang dapat diandalkan menggunakan MACD dan RSI terkoordinasi. Logika jelas dan parameter fleksibel untuk peningkatan seperti pemilihan indikator, filter tren, teknik stop loss dll untuk memperoleh lebih banyak perdagangan sambil mempertahankan stabilitas, tetapi risiko over-optimasi perlu dihindari.


/*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)

Lebih banyak