Strategi penangkapan tren kuantitatif tingkat lanjut dikombinasikan dengan filter rentang dinamis

EMA MA RF VOL SMA HA
Tanggal Pembuatan: 2024-12-17 14:31:11 Akhirnya memodifikasi: 2024-12-17 14:31:11
menyalin: 4 Jumlah klik: 420
1
fokus pada
1617
Pengikut

Strategi penangkapan tren kuantitatif tingkat lanjut dikombinasikan dengan filter rentang dinamis

Ringkasan

Strategi ini adalah sistem perdagangan kuantitatif canggih yang menggabungkan moving average dan filter rentang dinamis. Ini terutama mengidentifikasi tren pasar dengan menganalisis hubungan antara perubahan harga dan volume transaksi, sambil menggunakan filter rentang untuk menyaring sinyal palsu dan meningkatkan akurasi perdagangan. Strategi ini menggunakan metode komputasi yang disesuaikan untuk menentukan batas-batas likuiditas pasar, dan menggabungkan rata-rata bergerak cepat dan lambat untuk mengkonfirmasi arah tren.

Prinsip Strategi

Logika inti dari strategi ini didasarkan pada beberapa perhitungan kunci berikut:

  1. Analisis likuiditas: menilai likuiditas pasar dengan menghitung rasio volume transaksi terhadap perubahan harga, dan menetapkan batas likuiditas yang dinamis.
  2. Konfirmasi tren: Menggunakan 50 siklus dan 100 siklus rata-rata bergerak indeks ((EMA) untuk mengkonfirmasi arah tren.
  3. Filter Range: Membangun zona perdagangan dinamis dengan periode sampling 50 siklus dan tiga kali lipat dari rentang.
  4. Sinyal Generasi: Sinyal perdagangan dihasilkan ketika harga menembus filter kisaran dan indikator EMA menunjukkan tren yang konsisten.

Keunggulan Strategis

  1. Adaptif: Strategi dapat secara dinamis menyesuaikan parameternya sesuai dengan kondisi pasar dan beradaptasi dengan lingkungan pasar yang berbeda.
  2. Keandalan sinyal: Mengurangi sinyal palsu secara efektif dengan menggabungkan beberapa indikator teknis dan filter.
  3. Pengelolaan risiko yang sempurna: Mengintegrasikan perhitungan otomatis dari posisi stop loss, yang dapat mengontrol risiko secara efektif.
  4. Fungsi pengembalian lengkap: berisi pengaturan pengembalian terperinci untuk mengoptimalkan strategi.

Risiko Strategis

  1. Sensitivitas Parameter: Beberapa parameter dari strategi memerlukan penyesuaian yang sangat halus dan mudah untuk dioptimalkan.
  2. Dampak slippage: Dalam pasar yang sangat berfluktuasi, risiko slippage mungkin lebih besar.
  3. Adaptasi pasar: Sering terjadi sinyal palsu di pasar horizontal.
  4. Pengelolaan dana: Alokasi dana tetap mungkin tidak sesuai dengan semua kondisi pasar.

Arah optimasi strategi

  1. Parameter beradaptasi: mekanisme penyesuaian parameter beradaptasi dapat diperkenalkan, sehingga parameter dapat disesuaikan secara otomatis sesuai dengan kondisi pasar.
  2. Identifikasi kondisi pasar: Tambahkan modul penilaian kondisi pasar, menggunakan strategi perdagangan yang berbeda dalam kondisi pasar yang berbeda.
  3. Pengelolaan dana yang optimal: Pengelolaan posisi yang dinamis diperkenalkan untuk menyesuaikan skala transaksi sesuai dengan volatilitas pasar.
  4. Peningkatan filter sinyal: Anda dapat menambahkan lebih banyak indikator teknis untuk memfilter sinyal palsu.

Meringkaskan

Strategi ini menggabungkan analisis likuiditas, pelacakan tren, dan filter rentang untuk membangun sistem perdagangan kuantitatif yang lengkap. Keunggulan strategi ini adalah kemampuan untuk beradaptasi dengan perubahan pasar dan memberikan sinyal perdagangan yang andal, tetapi juga memerlukan perhatian pada pengoptimalan parameter dan manajemen risiko.

Kode Sumber Strategi
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Killer Coin V2 + Range Filter Strategy", shorttitle="KC-RF Strategy", overlay=true
         )

// === INPUT BACKTEST RANGE ===
useDate = input(true, title='---------------- Use Date ----------------', group="Backtest Settings")
FromMonth = input.int(7, title="From Month", minval=1, maxval=12, group="Backtest Settings")
FromDay = input.int(25, title="From Day", minval=1, maxval=31, group="Backtest Settings")
FromYear = input.int(2019, title="From Year", minval=2017, group="Backtest Settings")
ToMonth = input.int(1, title="To Month", minval=1, maxval=12, group="Backtest Settings")
ToDay = input.int(1, title="To Day", minval=1, maxval=31, group="Backtest Settings")
ToYear = input.int(9999, title="To Year", minval=2017, group="Backtest Settings")
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)
window() => time >= start and time <= finish

// === KILLER COIN V2 INPUTS ===
outlierThreshold = input.int(10, "Outlier Threshold Length", group="Killer Coin Settings")
fastMovingAverageLength = input.int(50, "Fast MA length", group="Killer Coin Settings")
slowMovingAverageLength = input.int(100, "Slow MA length", group="Killer Coin Settings")

// === RANGE FILTER INPUTS ===
sources = input(close, "Source", group="Range Filter Settings")
isHA = input(false, "Use HA Candles", group="Range Filter Settings")
per = input.int(50, "Sampling Period", minval=1, group="Range Filter Settings")
mult = input.float(3.0, "Range Multiplier", minval=0.1, group="Range Filter Settings")

// === KILLER COIN V2 CALCULATIONS ===
priceMovementLiquidity = volume / math.abs(close - open)
liquidityBoundary = ta.ema(priceMovementLiquidity, outlierThreshold) + ta.stdev(priceMovementLiquidity, outlierThreshold)
var liquidityValues = array.new_float(5)

if ta.crossover(priceMovementLiquidity, liquidityBoundary)
    array.insert(liquidityValues, 0, close)

fastEMA = ta.ema(array.get(liquidityValues, 0), fastMovingAverageLength)
slowEMA = ta.ema(array.get(liquidityValues, 0), slowMovingAverageLength)

// === RANGE FILTER CALCULATIONS ===
src = isHA ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, sources) : sources

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t*2) - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    smoothrng = ta.ema(avrng, wper)*m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])
downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// === PLOTTING ===
// Killer Coin V2 Plots
bullColor = color.new(#00ffbb, 50)
bearColor = color.new(#800080, 50)
fastPlot = plot(fastEMA, "Fast EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
slowPlot = plot(slowEMA, "Slow EMA", color = fastEMA > slowEMA ? bullColor : bearColor)
fill(fastPlot, slowPlot, color = fastEMA > slowEMA ? bullColor : bearColor)

// Range Filter Plots
filtcolor = upward > 0 ? color.new(color.lime, 0) : downward > 0 ? color.new(color.red, 0) : color.new(color.orange, 0)
filtplot = plot(filt, "Range Filter", color=filtcolor, linewidth=3)
hbandplot = plot(hband, "High Target", color=color.new(color.aqua, 90))
lbandplot = plot(lband, "Low Target", color=color.new(color.fuchsia, 90))
fill(hbandplot, filtplot, color=color.new(color.aqua, 90))
fill(lbandplot, filtplot, color=color.new(color.fuchsia, 90))

// === STRATEGY CONDITIONS ===
// Range Filter Conditions
longCond = ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0))
shortCond = ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

// Combined Conditions
finalLongSignal = longCondition and fastEMA > slowEMA and window()
finalShortSignal = shortCondition and fastEMA < slowEMA and window()

// === PLOTTING SIGNALS ===
plotshape(finalLongSignal, "Buy Signal", text="BUY", textcolor=color.white, 
         style=shape.labelup, size=size.normal, location=location.belowbar, 
         color=color.new(color.green, 0))
         
plotshape(finalShortSignal, "Sell Signal", text="SELL", textcolor=color.white, 
         style=shape.labeldown, size=size.normal, location=location.abovebar, 
         color=color.new(color.red, 0))

// === STRATEGY ENTRIES ===
if finalLongSignal
    strategy.entry("Long", strategy.long, stop=hband)
    
if finalShortSignal
    strategy.entry("Short", strategy.short, stop=lband)

// === ALERTS ===
alertcondition(finalLongSignal, "Strong Buy Signal", "🚨 Buy - Both Indicators Aligned!")
alertcondition(finalShortSignal, "Strong Sell Signal", "🚨 Sell - Both Indicators Aligned!")