MACD dan Regresi Linear Strategi Perdagangan Pintar Dwi Isyarat

MACD LRS WMA TEMA EMA SMA
Tarikh penciptaan: 2024-12-11 15:46:20 Akhirnya diubah suai: 2024-12-11 15:46:20
Salin: 0 Bilangan klik: 361
1
fokus pada
1617
Pengikut

MACD dan Regresi Linear Strategi Perdagangan Pintar Dwi Isyarat

Gambaran keseluruhan

Strategi ini adalah sistem perdagangan pintar yang menggabungkan MACD (Moving Average Convergence Spread Indicator) dan LRS (Linear Regression Slope). Strategi ini mengoptimumkan pengiraan indikator MACD melalui kombinasi pelbagai kaedah moving average, dan memperkenalkan analisis regresi linear untuk meningkatkan kebolehpercayaan isyarat perdagangan. Strategi ini membolehkan peniaga mempunyai pilihan yang fleksibel untuk menghasilkan isyarat perdagangan menggunakan satu indikator atau gabungan dua indikator, dan dilengkapi dengan mekanisme stop loss untuk mengawal risiko.

Prinsip Strategi

Di tengah-tengah strategi ini adalah untuk menangkap trend pasaran melalui MACD yang dioptimumkan dan penunjuk pulangan linear. Bahagian MACD menggunakan kombinasi empat kaedah purata bergerak SMA, EMA, WMA dan TEMA untuk meningkatkan kepekaan kepada trend harga. Bahagian pulangan linear untuk menilai arah dan kekuatan trend dengan mengira kemiringan dan kedudukan garis pulangan.

Kelebihan Strategik

  1. Fleksibiliti dalam kombinasi: anda boleh memilih untuk menggunakan satu atau dua kombinasi mengikut keadaan pasaran
  2. Pengiraan MACD yang lebih baik: meningkatkan ketepatan pengenalan trend melalui pelbagai kaedah purata bergerak
  3. Pengesahan trend objektif: penghakiman trend yang disokong oleh statistik matematik menggunakan regresi linear
  4. Pengurusan risiko yang lebih baik: Sistem Stop Loss Bersepadu
  5. Parameter yang boleh disesuaikan: parameter utama boleh dioptimumkan mengikut ciri-ciri pasaran yang berbeza

Risiko Strategik

  1. Sensitiviti parameter: mungkin memerlukan penyesuaian parameter yang kerap dalam keadaan pasaran yang berbeza
  2. Penangguhan isyarat: Indikator purata bergerak mempunyai keterlambatan tertentu
  3. Tidak berlaku untuk pasaran goyah: mungkin menghasilkan isyarat palsu dalam pasaran goyah mendatar
  4. Kos peluang dari pengesahan berganda: pengesahan berganda yang ketat mungkin kehilangan peluang perdagangan yang baik

Arah pengoptimuman strategi

  1. Peningkatan pengiktirafan keadaan pasaran: pengenalan penunjuk kadar turun naik untuk membezakan pasaran yang sedang tren dan bergolak
  2. Penyesuaian parameter dinamik: parameter yang menyesuaikan MACD dan regresi linear secara automatik mengikut keadaan pasaran
  3. Mengoptimumkan Stop Loss: memperkenalkan Stop Loss Dinamik, menyesuaikan secara automatik mengikut turun naik pasaran
  4. Peningkatan analisis jumlah transaksi: Gabungan penunjuk jumlah transaksi untuk meningkatkan kredibiliti isyarat
  5. Pengenalan analisis kitaran masa: pertimbangkan pengesahan kitaran masa berbilang untuk meningkatkan ketepatan urus niaga

ringkaskan

Strategi ini menggabungkan versi penambahbaikan dan kaedah statistik penunjuk klasik untuk mewujudkan sistem perdagangan yang fleksibel dan boleh dipercayai. Reka bentuk modularnya membolehkan peniaga menyesuaikan parameter strategi dan mekanisme pengesahan isyarat secara fleksibel mengikut keadaan pasaran yang berbeza. Dengan pengoptimuman dan penambahbaikan berterusan, strategi ini dijangka mengekalkan prestasi yang stabil dalam pelbagai keadaan pasaran.

Kod sumber strategi
/*backtest
start: 2024-11-10 00:00:00
end: 2024-12-09 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy('SIMPLIFIED MACD & LRS Backtest by NHBProd', overlay=false)

// Function to calculate TEMA (Triple Exponential Moving Average)
tema(src, length) =>
    ema1 = ta.ema(src, length)
    ema2 = ta.ema(ema1, length)
    ema3 = ta.ema(ema2, length)
    3 * (ema1 - ema2) + ema3

// MACD Calculation Function
macdfx(src, fast_length, slow_length, signal_length, method) =>
    fast_ma = method == 'SMA' ? ta.sma(src, fast_length) :
              method == 'EMA' ? ta.ema(src, fast_length) :
              method == 'WMA' ? ta.wma(src, fast_length) :
              tema(src, fast_length)
    slow_ma = method == 'SMA' ? ta.sma(src, slow_length) :
              method == 'EMA' ? ta.ema(src, slow_length) :
              method == 'WMA' ? ta.wma(src, slow_length) :
              tema(src, slow_length)
    macd = fast_ma - slow_ma
    signal = method == 'SMA' ? ta.sma(macd, signal_length) :
             method == 'EMA' ? ta.ema(macd, signal_length) :
             method == 'WMA' ? ta.wma(macd, signal_length) :
             tema(macd, signal_length)
    hist = macd - signal
    [macd, signal, hist]

// MACD Inputs
useMACD = input(true, title="Use MACD for Signals")
src = input(close, title="MACD Source")
fastp = input(12, title="MACD Fast Length")
slowp = input(26, title="MACD Slow Length")
signalp = input(9, title="MACD Signal Length")
macdMethod = input.string('EMA', title='MACD Method', options=['EMA', 'SMA', 'WMA', 'TEMA'])

// MACD Calculation
[macd, signal, hist] = macdfx(src, fastp, slowp, signalp, macdMethod)

// Linear Regression Inputs
useLR = input(true, title="Use Linear Regression for Signals")
lrLength = input(24, title="Linear Regression Length")
lrSource = input(close, title="Linear Regression Source") 
lrSignalSelector = input.string('Rising Linear', title='Signal Selector', options=['Price Above Linear', 'Rising Linear', 'Both'])

// Linear Regression Calculation
linReg = ta.linreg(lrSource, lrLength, 0)
linRegPrev = ta.linreg(lrSource, lrLength, 1)
slope = linReg - linRegPrev

// Linear Regression Buy Signal
lrBuySignal = lrSignalSelector == 'Price Above Linear' ? (close > linReg) :
              lrSignalSelector == 'Rising Linear' ? (slope > 0 and slope > slope[1]) :
              lrSignalSelector == 'Both' ? (close > linReg and slope > 0) : false

// MACD Crossover Signals
macdCrossover = ta.crossover(macd, signal)

// Buy Signals based on user choices
macdSignal = useMACD and macdCrossover
lrSignal = useLR and lrBuySignal

// Buy condition: Use AND condition if both are selected, OR condition if only one is selected
buySignal = (useMACD and useLR) ? (macdSignal and lrSignal) : (macdSignal or lrSignal)

// Plot MACD
hline(0, title="Zero Line", color=color.gray)
plot(macd, color=color.blue, title="MACD Line", linewidth=2)
plot(signal, color=color.orange, title="Signal Line", linewidth=2)
plot(hist, color=hist >= 0 ? color.green : color.red, style=plot.style_columns, title="MACD Histogram")

// Plot Linear Regression Line and Slope
plot(slope, color=slope > 0 ? color.purple : color.red, title="Slope", linewidth=2)
plot(linReg,title="lingreg")
// Signal Plot for Visualization
plotshape(buySignal, style=shape.labelup, location=location.bottom, color=color.new(color.green, 0), title="Buy Signal", text="Buy")

// Sell Signals for Exiting Long Positions
macdCrossunder = ta.crossunder(macd, signal)  // MACD Crossunder for Sell Signal
lrSellSignal = lrSignalSelector == 'Price Above Linear' ? (close < linReg) :
               lrSignalSelector == 'Rising Linear' ? (slope < 0 and slope < slope[1]) :
               lrSignalSelector == 'Both' ? (close < linReg and slope < 0) : false

// User Input for Exit Signals: Select indicators to use for exiting trades
useMACDSell = input(true, title="Use MACD for Exit Signals")
useLRSell = input(true, title="Use Linear Regression for Exit Signals")

// Sell condition: Use AND condition if both are selected to trigger a sell at the same time, OR condition if only one is selected
sellSignal = (useMACDSell and useLRSell) ? (macdCrossunder and lrSellSignal) : 
             (useMACDSell ? macdCrossunder : false) or 
             (useLRSell ? lrSellSignal : false)

// Plot Sell Signals for Visualization (for exits, not short trades)
plotshape(sellSignal, style=shape.labeldown, location=location.top, color=color.new(color.red, 0), title="Sell Signal", text="Sell")

// Alerts
alertcondition(buySignal, title="Buy Signal", message="Buy signal detected!")
alertcondition(sellSignal, title="Sell Signal", message="Sell signal detected!")

// Take Profit and Stop Loss Inputs
takeProfit = input.float(10.0, title="Take Profit (%)")  // Take Profit in percentage
stopLoss = input.float(0.10, title="Stop Loss (%)")        // Stop Loss in percentage

// Backtest Date Range
startDate = input(timestamp("2024-01-01 00:00"), title="Start Date")
endDate = input(timestamp("2025-12-12 00:00"), title="End Date")
inBacktestPeriod = true
// Entry Rules (Only Long Entries)
if (buySignal and inBacktestPeriod)
    strategy.entry("Buy", strategy.long)

// Exit Rules (Only for Long Positions)
strategy.exit("Exit Buy", from_entry="Buy", limit=close * (1 + takeProfit / 100), stop=close * (1 - stopLoss / 100))

// Exit Long Position Based on Sell Signals
if (sellSignal and inBacktestPeriod)
    strategy.close("Buy", comment="Exit Signal")