Strategi tangkapan arah aliran kuantitatif lanjutan digabungkan dengan penapis julat dinamik

EMA MA RF VOL SMA HA
Tarikh penciptaan: 2024-12-17 14:31:11 Akhirnya diubah suai: 2024-12-17 14:31:11
Salin: 4 Bilangan klik: 420
1
fokus pada
1617
Pengikut

Strategi tangkapan arah aliran kuantitatif lanjutan digabungkan dengan penapis julat dinamik

Gambaran keseluruhan

Strategi ini adalah sistem dagangan kuantitatif lanjutan yang menggabungkan purata bergerak dan penapis julat dinamik. Ia mengiktiraf trend pasaran dengan menganalisis hubungan antara perubahan harga dan jumlah transaksi, sambil menggunakan penapis julat untuk menapis isyarat palsu dan meningkatkan ketepatan perdagangan.

Prinsip Strategi

Logik utama strategi ini adalah berdasarkan beberapa pengiraan utama:

  1. Analisis kecairan: menilai kecairan pasaran dengan mengira perbandingan jumlah transaksi dengan perubahan harga, dan menetapkan had kecairan yang dinamik.
  2. Pengesahan trend: Menggunakan purata bergerak indeks 50 dan 100 kitaran ((EMA) untuk mengesahkan arah trend.
  3. Penapisan julat: Membina julat dagangan dinamik dengan menggunakan kitaran sampel 50 kitaran dan 3 kali ganda julat.
  4. Penjanaan isyarat: Menjana isyarat perdagangan apabila harga menembusi penapis julat dan penunjuk EMA menunjukkan trend yang konsisten.

Kelebihan Strategik

  1. Adaptif: Strategi dapat menyesuaikan parameter secara dinamik mengikut keadaan pasaran, menyesuaikan diri dengan persekitaran pasaran yang berbeza.
  2. Kebolehpercayaan isyarat: Mengurangkan isyarat palsu dengan berkesan dengan menggabungkan pelbagai petunjuk teknikal dan penapis.
  3. Pengurusan risiko yang sempurna: Mengintegrasikan pengiraan automatik kedudukan berhenti untuk mengawal risiko dengan berkesan.
  4. Fungsi pengulangan lengkap: mengandungi tetapan pengulangan terperinci untuk memudahkan pengoptimuman strategi.

Risiko Strategik

  1. Sensitiviti parameter: Pelbagai parameter strategi memerlukan penyesuaian yang halus dan mudah dioptimumkan.
  2. Kesan tergelincir: Dalam pasaran yang bergelincir tinggi, risiko tergelincir mungkin lebih besar.
  3. Kebolehan beradaptasi pasaran: Isyarat palsu mungkin berlaku di pasaran horizontal.
  4. Pengurusan dana: Pengedaran dana tetap mungkin tidak sesuai untuk semua keadaan pasaran.

Arah pengoptimuman strategi

  1. Parameter penyesuaian diri: mekanisme penyesuaian parameter penyesuaian diri boleh diperkenalkan, supaya parameter dapat disesuaikan secara automatik mengikut keadaan pasaran.
  2. Pengenalan keadaan pasaran: Tambah modul penilaian keadaan pasaran, menggunakan strategi perdagangan yang berbeza dalam keadaan pasaran yang berbeza.
  3. Pengurusan dana yang dioptimumkan: Pengenalan pengurusan kedudukan yang dinamik, menyesuaikan saiz perdagangan mengikut turun naik pasaran.
  4. Penapisan isyarat dipertingkatkan: lebih banyak petunjuk teknikal boleh ditambah untuk menapis isyarat palsu.

ringkaskan

Strategi ini membina sistem perdagangan kuantitatif yang lengkap dengan menggabungkan analisis kecairan, pengesanan trend dan penapis julat. Kelebihannya adalah dapat menyesuaikan diri dengan perubahan pasaran dan memberikan isyarat perdagangan yang boleh dipercayai, tetapi juga memerlukan perhatian terhadap pengoptimuman parameter dan pengurusan risiko. Dengan pengoptimuman dan penambahbaikan berterusan, strategi ini dijangka dapat mengekalkan prestasi yang stabil dalam pelbagai keadaan pasaran.

Kod 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!")