Range Filter Breakout Strategi perdagangan jangka pendek

Penulis:ChaoZhang, Tanggal: 2023-09-21 21:17:40
Tag:

Gambaran umum

Strategi perdagangan jangka pendek ini menghasilkan sinyal beli dan jual berdasarkan rentang fluktuasi harga. Ini menghitung rentang pergerakan harga selama periode dan menggunakannya sebagai filter untuk sinyal perdagangan. Sinyal dipicu ketika harga keluar dari rentang.

Logika Strategi

Indikator inti adalah rentang fluktuasi harga.

  1. Menghitung kisaran tinggi-rendah selama periode N terakhir sebagai amplitudo harga

  2. Meratakan amplitudo menggunakan rata-rata bergerak untuk memperoleh filter kisaran

  3. Sinyal beli dihasilkan ketika harga naik di atas filter rentang

  4. Sinyal jual dihasilkan ketika harga turun di bawah filter rentang

Dengan cara ini, penyebaran kisaran harga digunakan untuk menentukan arah tren dan menyaring kebisingan untuk sinyal yang lebih bersih.

Keuntungan

  • Kisaran harga mudah untuk menilai breakouts
  • Jangkauan yang halus secara efektif menyaring kebisingan
  • Sinyal pecah menangkap tren jangka pendek
  • Frekuensi perdagangan yang lebih tinggi cocok untuk jangka pendek
  • Parameter yang dapat disesuaikan mudah dioptimalkan

Risiko

  • Penembusan rentang rentan terhadap whipsaws
  • Membutuhkan data historis yang cukup untuk menghitung rentang
  • Parameter yang buruk menyebabkan sensitivitas berlebihan atau kelelahan
  • Tidak ada pemberhentian yang efektif, penarikan besar
  • Kinerja dipengaruhi oleh biaya karena frekuensi tinggi

Risiko dapat dikurangi dengan:

  • Koefisien volatilitas filter rentang relaksasi
  • Optimasi parameter untuk pengaturan ideal
  • Mengimplementasikan stop loss atau trailing stop
  • Mengurangi frekuensi perdagangan untuk biaya yang lebih rendah
  • Pengujian parameter spesifik produk

Arah Peningkatan

Strategi dapat ditingkatkan dengan:

  1. Pengujian periode perhitungan rentang yang berbeda

  2. Mengoptimalkan koefisien volatilitas filter rentang

  3. Menambahkan indikator konfirmasi seperti MACD

  4. Menggunakan gerakan atau penghentian belakang

  5. Parameter penyesuaian khusus untuk setiap produk

  6. Mengoptimalkan sistem ukuran posisi

Ringkasan

Strategi ini menggunakan price breaking out of ranges untuk menghasilkan sinyal jangka pendek, secara efektif menangkap tren sementara. Tetapi risiko seperti whipsaws ada. Perbaikan dapat dilakukan melalui optimasi parameter, stop loss, menambahkan filter dll untuk mengendalikan risiko sambil mempertahankan efektivitas. fine-tuning parameter oleh karakteristik produk juga penting. Optimasi terus menerus mengarah pada ketahanan.


/*backtest
start: 2023-08-21 00:00:00
end: 2023-09-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Range Filter Buy and Sell 5min [Strategy]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, slippage=0)

// === INPUT BACKTEST RANGE ===
useDate = input(true,     title='---------------- Use Date ----------------', type=bool)
FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 25, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true  // create function "within window of time"
// === INPUT BACKTEST RANGE ===


sources = input(defval=close, title="Source")
isHA = input(false, "Use HA Candles", bool)
src = isHA ? security(heikenashi(tickerid), period, sources) : sources
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters

per = input(defval=50, minval=1, title="Sampling Period")

// Range Multiplier

mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range

smoothrng(x, t, m)=>
    wper      = (t*2) - 1
    avrng     = ema(abs(x - x[1]), t)
    smoothrng = 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

// Colors

filtcolor = upward > 0 ? lime : downward > 0 ? red : orange
barcolor  = (src > filt) and (src > src[1]) and (upward > 0) ? lime : (src > filt) and (src < src[1]) and (upward > 0) ? green : 
   (src < filt) and (src < src[1]) and (downward > 0) ? red : (src < filt) and (src > src[1]) and (downward > 0) ? maroon : orange

filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")

// Target

hbandplot = plot(hband, color=aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=fuchsia, transp=100, title="Low Target")

// Fills

fill(hbandplot, filtplot, color=aqua, title="High Target Range")
fill(lbandplot, filtplot, color=fuchsia, title="Low Target Range")

// Bar Color

//barcolor(barcolor)

// Break Outs 

longCond = na
shortCond = na
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

//Alerts

plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = white, style=shape.labelup, size = size.normal, location=location.belowbar, color = green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = red, transp = 0)

//strategy.entry("Long", strategy.long, stop = hband, when = window() , comment="Long")
//strategy.entry("Short", strategy.short, stop = lband, when = window() , comment="Short")

strategy.entry("Long", strategy.long, when = longCondition and window() , comment="Long")
strategy.entry("Short", strategy.short, when = shortCondition and window() , comment="Short")



// === Stop LOSS ===
useStopLoss = input(false, title='----- Use Stop Loss / Take profit -----', type=bool)
sl_inp = input(100, title='Stop Loss %', type=float, step=0.25)/100
tp_inp = input(1.5, title='Take Profit %', type=float, step=0.25)/100
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
stop_level_short = strategy.position_avg_price * (1 + sl_inp)
take_level_short = strategy.position_avg_price * (1 - tp_inp)
// === Stop LOSS ===

if useStopLoss
    strategy.exit("Stop Loss/Profit Long","Long", stop=stop_level, limit=take_level)
    strategy.exit("Stop Loss/Profit Short","Short", stop=stop_level_short, limit=take_level_short)


Lebih banyak