Strategi perdagangan mengikuti tren dinamis regresi multi-inti

DR MKR ATR SMA MA200 TP SL
Tanggal Pembuatan: 2025-02-24 09:27:50 Akhirnya memodifikasi: 2025-02-24 09:27:50
menyalin: 0 Jumlah klik: 805
2
fokus pada
319
Pengikut

Strategi perdagangan mengikuti tren dinamis regresi multi-inti Strategi perdagangan mengikuti tren dinamis regresi multi-inti

Ringkasan

Ini adalah strategi perdagangan pelacakan tren yang menggabungkan Reaktor Tren Dinamis dan Regressi Multi-Kernel. Strategi ini menghitung garis dukungan / resistensi dinamis melalui ATR dan SMA, dan menggunakan kemunduran gabungan dari inti Goss dan inti Epanechnikov untuk mengidentifikasi tren pasar.

Prinsip Strategi

Strategi ini terdiri dari empat bagian utama:

  1. Reaktor tren dinamis ((DR): menggunakan ATR dan SMA untuk membangun jalur dukungan / resistensi dinamis, menilai arah tren berdasarkan posisi harga. Gunakan jalur bawah sebagai dukungan dalam tren naik, gunakan jalur atas sebagai resistensi dalam tren turun.

  2. Multicore Regression (MKR): Pengembalian harga dengan kombinasi Gaussian dan Epanechnikov kernel, untuk mencapai kombinasi optimal dari dua fungsi inti dengan parameter berat yang dapat disesuaikan. Metode ini lebih baik menangkap karakteristik dinamis dari pergerakan harga.

  3. Filter tren MA200: Menggunakan garis rata-rata harian 200 sebagai indikator tren jangka panjang, memungkinkan perdagangan hanya jika harga membentuk tren yang jelas dengan MA200, dan mengidentifikasi periode pengelompokan dengan parameter ConsolidationRange.

  4. Sistem Manajemen Uang: Menggunakan tiga target keuntungan ((1.5%, 3.0%, 4.5%) dan 1% Stop Loss), alokasi posisi dalam rasio 33% -33% -34%, untuk memaksimalkan keuntungan sambil mengontrol risiko.

Keunggulan Strategis

  1. Reliabilitas pengidentifikasian tren: Dengan pengesahan ganda DR dan MKR, peningkatan akurasi penilaian tren.
  2. Integritas manajemen risiko: Menggunakan kombinasi keuntungan yang terpotong dan penghentian kerugian yang seragam, untuk melindungi keuntungan dan membatasi kerugian.
  3. Adaptabilitas: Metode regresi multi-inti lebih mudah beradaptasi dengan kondisi pasar yang berbeda.
  4. Sinyal perdagangan jelas: titik-titik perubahan tren memiliki indikasi grafis yang jelas.
  5. Mekanisme penyaringan disempurnakan: identifikasi MA200 dan periode penyusunan untuk mengecualikan kondisi pasar yang tidak menguntungkan.

Risiko Strategis

  1. Risiko Optimasi Parameter: Optimasi berlebihan dapat menyebabkan overfitting dan menurunkan kinerja strategi.
  2. Risiko keterbelakangan: rata-rata dan regresi indikator memiliki keterbelakangan, mungkin kehilangan titik balik penting.
  3. Ketergantungan pada kondisi pasar: Performa mungkin kurang baik dalam pasar yang sangat berfluktuasi atau horizontal.
  4. Risiko Eksekusi: Multiple Stop Loss Order mungkin tidak dapat sepenuhnya dieksekusi karena masalah likuiditas.

Arah optimasi strategi

  1. Penyesuaian parameter dinamis: dapat secara otomatis menyesuaikan perkalian ATR dan siklus regresi sesuai dengan fluktuasi pasar.
  2. Penguatan konfirmasi sinyal: dapat ditambahkan indikator tambahan seperti volume lalu lintas, tingkat fluktuasi dan lain-lain untuk meningkatkan keandalan sinyal.
  3. Optimasi manajemen posisi: Mengelola posisi dinamis berdasarkan volatilitas.
  4. Klasifikasi lingkungan pasar: menambahkan modul pengenalan status pasar, menggunakan pengaturan parameter yang berbeda dalam lingkungan pasar yang berbeda.

Meringkaskan

Strategi ini membangun sistem perdagangan yang lengkap dengan menggabungkan berbagai indikator teknis dan metode statistik yang canggih. Keunggulan strategi ini adalah ketajaman tren yang akurat dan sistem manajemen risiko yang baik, tetapi juga perlu memperhatikan optimasi parameter dan masalah adaptasi pasar. Dengan arah optimasi yang disarankan, strategi ini masih memiliki ruang untuk ditingkatkan.

Kode Sumber Strategi
/*backtest
start: 2024-02-25 00:00:00
end: 2024-08-07 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("DR + Multi Kernel Regression + Signals + MA200 with TP/SL (Optimized)", overlay=true, shorttitle="DR+MKR+Signals+MA200_TP_SL_Opt", pyramiding=0, default_qty_type=strategy.percent_of_equity, default_qty_value=10)

// =====================================================================
// PARTEA 1: Dynamic Reactor – linie unică colorată în funcție de trend
// =====================================================================
// Parametri pentru Dynamic Reactor
atrLength  = input.int(14, title="Lungimea ATR", minval=1)
smaLength  = input.int(20, title="Lungimea SMA", minval=1)
multiplier = input.float(1.5, title="Multiplicator ATR", minval=0.1, step=0.1)
// Calculăm ATR și SMA
atrValue = ta.atr(atrLength)
smaValue = ta.sma(close, smaLength)
// Benzile de bază
basicUpper = smaValue + atrValue * multiplier
basicLower = smaValue - atrValue * multiplier
// Calculăm benzile finale (similar cu SuperTrend)
var float finalUpper = basicUpper
var float finalLower = basicLower
if bar_index > 0
    finalUpper := close[1] > finalUpper[1] ? math.max(basicUpper, finalUpper[1]) : basicUpper
    finalLower := close[1] < finalLower[1] ? math.min(basicLower, finalLower[1]) : basicLower
// Determinăm trendul curent:
// - Dacă prețul curent este peste finalUpper din bara anterioară → uptrend (1)
// - Dacă prețul este sub finalLower din bara anterioară → downtrend (-1)
// - Altfel, păstrăm trendul precedent.
var int trend = 1
if bar_index > 0
    trend := close > finalUpper[1] ? 1 : close < finalLower[1] ? -1 : nz(trend[1], 1)
// Linia Dynamic Reactor:
// - În uptrend se utilizează finalLower (nivel de suport)
// - În downtrend se utilizează finalUpper (nivel de rezistență)
drLine = trend == 1 ? finalLower : finalUpper
// Plotăm linia Dynamic Reactor
p_dr = plot(drLine, color=trend == 1 ? color.green : color.red, title="Dynamic Reactor", linewidth=2)


// =====================================================================
// PARTEA 2: Multi Kernel Regression
// =====================================================================
// Parametri pentru regresia cu kernel
regLength = input.int(50, title="Perioada regresiei", minval=1)
h1        = input.float(10.0, title="Bandă Gaussiană (h1)", minval=0.1)
h2        = input.float(10.0, title="Bandă Epanechnikov (h2)", minval=0.1)
alpha     = input.float(0.5, title="Pondere Kernel Gaussian (0-1)", minval=0, maxval=1)
// Funcție: regresie cu kernel Gaussian
f_gaussian_regression(bw) =>
    num = 0.0
    den = 0.0
    for i = 0 to regLength - 1
        // Kernel Gaussian: K(x) = exp(-0.5 * (i/bw)^2)
        weight = math.exp(-0.5 * math.pow(i / bw, 2))
        num += close[i] * weight
        den += weight
    num / (den == 0 ? 1 : den)
// Funcție: regresie cu kernel Epanechnikov
f_epanechnikov_regression(bw) =>
    num = 0.0
    den = 0.0
    for i = 0 to regLength - 1
        ratio = i / bw
        // Kernel Epanechnikov: K(u) = 1 - u^2 pentru |u| <= 1, altfel 0
        weight = math.abs(ratio) <= 1 ? (1 - math.pow(ratio, 2)) : 0
        num += close[i] * weight
        den += weight
    num / (den == 0 ? 1 : den)
// Calculăm regresiile pentru fiecare kernel
regGauss = f_gaussian_regression(h1)
regEpan  = f_epanechnikov_regression(h2)
// Combinăm rezultatele celor două regresii
multiKernelRegression = alpha * regGauss + (1 - alpha) * regEpan
// Plotăm linia Multi Kernel Regression
p_mkr = plot(multiKernelRegression, color=trend == 1 ? color.green : color.red, title="Multi Kernel Regression", linewidth=2)

// Adăugăm ceata (fill) între Dynamic Reactor și Multi Kernel Regression
fillColor = trend == 1 ? color.new(color.green, 80) : color.new(color.red, 80)
fill(p_dr, p_mkr, color=fillColor, title="Trend Fill")


// =====================================================================
// PARTEA 2.1: MA 200 și evidențierea consolidării
// =====================================================================
// Calculăm MA 200 pentru trend pe termen lung
ma200 = ta.sma(close, 200)
p_ma200 = plot(ma200, color=color.blue, title="MA 200", linewidth=2)
// Parametru pentru detectarea consolidării (cât de aproape trebuie să fie prețul de MA200, în %)
consolidationRange = input.float(1.0, title="Consolidation Range (%)", minval=0.1, step=0.1)
// Determinăm dacă suntem într-o fază de consolidare (prețul este în interiorul unui interval mic în jurul MA200)
isConsolidation = (math.abs(close - ma200) / ma200 * 100) < consolidationRange
// Colorăm fundalul graficului cu un gri translucid atunci când e consolidare
bgcolor(isConsolidation ? color.new(color.gray, 90) : na, title="Consolidation BG")


// =====================================================================
// PARTEA 3: Semnale Buy și Sell
// =====================================================================
// Semnale de intrare:
// - Buy Signal: când linia Multi Kernel Regression trece peste linia Dynamic Reactor
// - Sell Signal: când linia Multi Kernel Regression trece sub linia Dynamic Reactor
buySignal  = ta.crossover(multiKernelRegression, drLine)
sellSignal = ta.crossunder(multiKernelRegression, drLine)

// Plotăm semnalele pe grafic
plotshape(buySignal, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny, title="Buy Signal")
plotshape(sellSignal, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, title="Sell Signal")

// Setăm condiții de alertă
alertcondition(buySignal, title="Buy Alert", message="Buy Signal: Kernel is above Dynamic Reactor")
alertcondition(sellSignal, title="Sell Alert", message="Sell Signal: Kernel is below Dynamic Reactor")


// =====================================================================
// PARTEA 4: Trade Management – Intrări, 3 TP și 1 SL
// =====================================================================
// Parametrii pentru TP și SL (valori ajustate pentru un raport risc-recompensă mai favorabil)
tp1Perc = input.float(1.5, title="TP1 (%)", minval=0.1, step=0.1)
tp2Perc = input.float(3.0, title="TP2 (%)", minval=0.1, step=0.1)
tp3Perc = input.float(4.5, title="TP3 (%)", minval=0.1, step=0.1)
slPerc  = input.float(1.0, title="Stop Loss (%)", minval=0.1, step=0.1)

// ---- Intrări de tranzacționare cu filtrare suplimentară pe baza trendului MA200 și consolidării ----
// Pentru poziții long, intrăm doar când prețul este peste MA200 și nu este în consolidare.
// Pentru poziții short, intrăm doar când prețul este sub MA200 și nu este în consolidare.
if (buySignal and close > ma200 and not isConsolidation)
    strategy.entry("Long", strategy.long)

if (sellSignal and close < ma200 and not isConsolidation)
    strategy.entry("Short", strategy.short)

// ---- Gestionarea ordinelor pentru poziții long ----
if (strategy.position_size > 0)
    entryPrice = strategy.position_avg_price
    // Calculăm nivelurile de TP și SL pentru poziția long
    long_sl = entryPrice * (1 - slPerc / 100)
    long_tp1 = entryPrice * (1 + tp1Perc / 100)
    long_tp2 = entryPrice * (1 + tp2Perc / 100)
    long_tp3 = entryPrice * (1 + tp3Perc / 100)
    
    // Plasăm TP-urile (alocări: 33%, 33% și 34%)
    strategy.exit("Long_TP1", from_entry="Long", limit=long_tp1, qty_percent=33, comment="TP1")
    strategy.exit("Long_TP2", from_entry="Long", limit=long_tp2, qty_percent=33, comment="TP2")
    strategy.exit("Long_TP3", from_entry="Long", limit=long_tp3, qty_percent=34, comment="TP3")
    
    // Plasăm ordinul de SL pentru poziția long
    strategy.exit("Long_SL", from_entry="Long", stop=long_sl, comment="SL")

// ---- Gestionarea ordinelor pentru poziții short ----
if (strategy.position_size < 0)
    entryPrice = strategy.position_avg_price
    // Calculăm nivelurile de TP și SL pentru poziția short
    short_sl = entryPrice * (1 + slPerc / 100)
    short_tp1 = entryPrice * (1 - tp1Perc / 100)
    short_tp2 = entryPrice * (1 - tp2Perc / 100)
    short_tp3 = entryPrice * (1 - tp3Perc / 100)
    
    // Plasăm TP-urile (alocări: 33%, 33% și 34%)
    strategy.exit("Short_TP1", from_entry="Short", limit=short_tp1, qty_percent=33, comment="TP1")
    strategy.exit("Short_TP2", from_entry="Short", limit=short_tp2, qty_percent=33, comment="TP2")
    strategy.exit("Short_TP3", from_entry="Short", limit=short_tp3, qty_percent=34, comment="TP3")
    
    // Plasăm ordinul de SL pentru poziția short
    strategy.exit("Short_SL", from_entry="Short", stop=short_sl, comment="SL")