Sumber daya yang dimuat... Pemuatan...

Strategi Penangkapan Tren Kuantitatif Lanjutan dengan Filter Jangkauan Dinamis

Penulis:ChaoZhang, Tanggal: 2024-12-17 14:31:11
Tag:EMAMARFVOLSMAHA

img

Gambaran umum

Strategi ini adalah sistem perdagangan kuantitatif canggih yang menggabungkan rata-rata bergerak dengan filter kisaran dinamis. Ini mengidentifikasi tren pasar dengan menganalisis hubungan antara pergerakan harga dan volume perdagangan, sambil menggunakan filter kisaran untuk menghilangkan sinyal palsu dan meningkatkan akurasi perdagangan. Strategi ini menggunakan metode perhitungan adaptif untuk menentukan batas likuiditas pasar dan menggabungkan rata-rata bergerak cepat dan lambat untuk mengkonfirmasi arah tren.

Prinsip Strategi

Logika inti dari strategi ini didasarkan pada perhitungan kunci berikut:

  1. Analisis likuiditas: Mengevaluasi likuiditas pasar dengan menghitung rasio volume terhadap pergerakan harga dan menetapkan batas likuiditas dinamis.
  2. Konfirmasi Tren: Menggunakan 50-periode dan 100-periode Eksponensial Moving Averages (EMA) untuk mengkonfirmasi arah tren.
  3. Range Filtering: Menggunakan periode sampling 50 periode dan pengganda rentang 3x untuk membangun rentang perdagangan dinamis.
  4. Generasi Sinyal: Menghasilkan sinyal perdagangan ketika harga menembus filter rentang dan indikator EMA menunjukkan tren yang konsisten.

Keuntungan Strategi

  1. Kemampuan beradaptasi yang kuat: Strategi dapat menyesuaikan parameter secara dinamis berdasarkan kondisi pasar, beradaptasi dengan lingkungan pasar yang berbeda.
  2. Sinyal yang dapat diandalkan: Mengurangi sinyal palsu secara efektif dengan menggabungkan beberapa indikator teknis dan filter.
  3. Manajemen Risiko Komprehensif: Mengintegrasikan perhitungan otomatis posisi stop-loss untuk pengendalian risiko yang efektif.
  4. Fungsi Backtesting Lengkap: Termasuk pengaturan backtesting rinci untuk optimasi strategi.

Risiko Strategi

  1. Sensitivitas Parameter: Beberapa parameter membutuhkan penyetelan halus dan cenderung terlalu dioptimalkan.
  2. Dampak slippage: Dapat menghadapi risiko slippage yang signifikan di pasar yang sangat volatile.
  3. Kemampuan adaptasi pasar: Dapat menghasilkan sinyal palsu yang sering terjadi di berbagai pasar.
  4. Manajemen Modal: Metode alokasi modal tetap mungkin tidak sesuai dengan semua kondisi pasar.

Arah Optimasi Strategi

  1. Adaptasi parameter: Memperkenalkan mekanisme penyesuaian parameter adaptif untuk penyesuaian parameter otomatis berdasarkan kondisi pasar.
  2. Pengakuan keadaan pasar: Tambahkan modul identifikasi keadaan pasar untuk menerapkan strategi perdagangan yang berbeda dalam kondisi pasar yang berbeda.
  3. Optimasi Manajemen Modal: Melaksanakan ukuran posisi dinamis berdasarkan volatilitas pasar.
  4. Peningkatan Filter Sinyal: Tambahkan lebih banyak indikator teknis untuk menyaring sinyal palsu.

Ringkasan

Strategi ini membangun sistem perdagangan kuantitatif yang lengkap dengan menggabungkan analisis likuiditas, mengikuti tren, dan penyaringan kisaran. Kekuatannya terletak pada kemampuannya untuk beradaptasi dengan perubahan pasar dan memberikan sinyal perdagangan yang dapat diandalkan, sementara membutuhkan perhatian pada optimasi parameter dan manajemen risiko. Melalui optimasi dan perbaikan terus-menerus, strategi menunjukkan janji dalam mempertahankan kinerja yang stabil di berbagai lingkungan pasar.


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

Berkaitan

Lebih banyak