Indikator Momentum MACD Backtest Strategi

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

Ringkasan

Strategi ini menggabungkan penunjuk momentum MACD dengan penunjuk overbought / oversold RSI. Apabila MACD melintasi ke atas atau ke bawah, ia memeriksa sama ada RSI juga menyelesaikan pembalikan bawah / atas yang sesuai dalam tempoh melihat semula untuk menjana isyarat perdagangan yang lebih boleh dipercayai.

Logika Strategi

  1. Mengira MACD DIFF, DEA dan histogram. Crossover DIFF di atas DEA memberikan isyarat crossover bullish, dan crossover di bawah memberikan isyarat crossover kematian.

  2. Mengira RSI untuk mengenal pasti bouncing oversold dan overbought selloffs.

  3. Apabila MACD bullish crossover berlaku, jika RSI telah memantul dari oversold dalam tetingkap pandangan, isyarat panjang dihasilkan.

  4. Stop loss ditetapkan selepas masuk untuk mengawal risiko.

Kelebihan

  1. MACD secara sensitif mengenal pasti perubahan trend. RSI secara berkesan menilai tahap overbought / oversold.

  2. Menghendaki kedua-dua isyarat MACD dan RSI menapis isyarat palsu.

  3. Tingkap belakang meningkatkan kebolehpercayaan isyarat.

  4. Stop loss membantu pengurusan risiko.

Risiko

  1. Kelewatan MACD dan RSI boleh menyebabkan entri optimum terlewat.

  2. Kemungkinan isyarat dua penunjuk yang lebih rendah bermakna lebih sedikit perdagangan.

  3. Tiada pertimbangan arah trend yang lebih besar berisiko terperangkap.

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

Kemungkinan Penyelesaian:

  1. Sesuaikan parameter MACD dan RSI untuk mengurangkan lag.

  2. Luaskan julat ambang penunjuk untuk memberikan lebih banyak isyarat.

  3. Tambah penapis trend untuk mengelakkan entri yang bertentangan dengan trend.

  4. Uji parameter stop loss yang berbeza untuk tahap optimum.

Arahan pengoptimuman

  1. Uji SMA dan purata bergerak yang lain.

  2. Tambah kerugian hentian untuk hentian fleksibel.

  3. Masukkan kekuatan trend untuk menilai kualiti kemasukan.

  4. Gunakan pembelajaran mesin untuk meramalkan pergerakan penunjuk.

  5. Gabungkan lebih banyak faktor untuk mengoptimumkan masa kemasukan.

Ringkasan

Strategi ini menapis isyarat pembalikan yang boleh dipercayai menggunakan MACD dan RSI yang diselaraskan. Logiknya jelas dan parameter fleksibel untuk penambahbaikan seperti pemilihan penunjuk, penapis trend, teknik hentian kerugian dll untuk memperoleh lebih banyak perdagangan sambil mengekalkan kestabilan, tetapi risiko pengoptimuman berlebihan perlu dielakkan.


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