Sumber dimuat naik... memuat...

Strategi Penangkapan Trend Kuantitatif Lanjutan dengan Penapis Julat Dinamik

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

img

Ringkasan

Strategi ini adalah sistem perdagangan kuantitatif canggih yang menggabungkan purata bergerak dengan penapis julat dinamik. Ia mengenal pasti trend pasaran dengan menganalisis hubungan antara pergerakan harga dan jumlah dagangan, sambil menggunakan penapis julat untuk menghapuskan isyarat palsu dan meningkatkan ketepatan perdagangan. Strategi ini menggunakan kaedah pengiraan adaptif untuk menentukan sempadan kecairan pasaran dan menggabungkan purata bergerak cepat dan perlahan untuk mengesahkan arah trend.

Prinsip Strategi

Logik teras strategi ini adalah berdasarkan pengiraan utama berikut:

  1. Analisis Kecairan: Menilai kecairan pasaran dengan mengira nisbah jumlah kepada pergerakan harga dan menetapkan sempadan kecairan dinamik.
  2. Pengesahan Trend: Menggunakan Purata Bergerak Eksponensial (EMA) 50 tempoh dan 100 tempoh untuk mengesahkan hala tuju trend.
  3. Penapisan Julat: Menggunakan tempoh pengambilan sampel 50 tempoh dan pengganda julat 3x untuk membina julat perdagangan dinamik.
  4. Generasi Isyarat: Menghasilkan isyarat perdagangan apabila harga memecahkan penapis julat dan penunjuk EMA menunjukkan trend yang konsisten.

Kelebihan Strategi

  1. Kebolehsesuaian yang kuat: Strategi dapat menyesuaikan parameter secara dinamik berdasarkan keadaan pasaran, menyesuaikan diri dengan persekitaran pasaran yang berbeza.
  2. Isyarat yang boleh dipercayai: Mengurangkan isyarat palsu dengan berkesan dengan menggabungkan pelbagai penunjuk teknikal dan penapis.
  3. Pengurusan Risiko Komprehensif: Mengintegrasikan pengiraan automatik kedudukan stop-loss untuk kawalan risiko yang berkesan.
  4. Fungsi Backtesting Lengkap: Termasuk tetapan backtesting terperinci untuk pengoptimuman strategi.

Risiko Strategi

  1. Sensitiviti Parameter: Pelbagai parameter memerlukan penyesuaian halus dan terdedah kepada pengoptimuman berlebihan.
  2. Kesan slippage: Mungkin menghadapi risiko slippage yang ketara di pasaran yang sangat tidak menentu.
  3. Kebolehsesuaian pasaran: Boleh menghasilkan isyarat palsu yang kerap di pasaran yang berbeza.
  4. Pengurusan Modal: Kaedah peruntukan modal tetap mungkin tidak sesuai dengan semua keadaan pasaran.

Arahan Pengoptimuman Strategi

  1. Penyesuaian parameter: Memperkenalkan mekanisme penyesuaian parameter adaptif untuk penyesuaian parameter automatik berdasarkan keadaan pasaran.
  2. Pengiktirafan keadaan pasaran: Tambah modul pengenalan keadaan pasaran untuk menggunakan strategi perdagangan yang berbeza di bawah keadaan pasaran yang berbeza.
  3. Pengoptimuman Pengurusan Modal: Melaksanakan saiz kedudukan dinamik berdasarkan turun naik pasaran.
  4. Peningkatan Penapis Isyarat: Tambah lebih banyak penunjuk teknikal untuk menapis isyarat palsu.

Ringkasan

Strategi ini membina sistem perdagangan kuantitatif yang lengkap dengan menggabungkan analisis kecairan, mengikuti trend, dan penapisan julat. Kekuatannya terletak pada keupayaannya untuk menyesuaikan diri dengan perubahan pasaran dan memberikan isyarat perdagangan yang boleh dipercayai, sambil memerlukan perhatian kepada pengoptimuman parameter dan pengurusan risiko. Melalui pengoptimuman dan peningkatan yang berterusan, strategi menunjukkan janji dalam mengekalkan prestasi yang stabil di pelbagai persekitaran pasaran.


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