Range Filter Breakout Strategi Dagangan Jangka Pendek

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

Ringkasan

Strategi perdagangan jangka pendek ini menghasilkan isyarat beli dan jual berdasarkan julat turun naik harga. Ia mengira julat pergerakan harga dalam tempoh dan menggunakannya sebagai penapis untuk isyarat perdagangan. Isyarat dicetuskan apabila harga keluar dari julat.

Logika Strategi

Penunjuk teras adalah julat turun naik harga.

  1. Mengira julat tinggi-rendah selama N tempoh yang lalu sebagai amplitudo harga

  2. Lemparkan amplitudo menggunakan purata bergerak untuk mendapatkan penapis julat

  3. Isyarat beli dihasilkan apabila harga meningkat di atas penapis julat

  4. Isyarat jual dihasilkan apabila harga jatuh di bawah penapis julat

Dengan cara ini, pecah julat harga digunakan untuk menentukan arah trend dan menapis bunyi bising untuk isyarat yang lebih bersih.

Kelebihan

  • Julat harga mudah untuk menilai breakouts
  • Julat yang halus menyaring bunyi secara berkesan
  • Isyarat pecah menangkap trend jangka pendek
  • Frekuensi perdagangan yang lebih tinggi sesuai untuk jangka pendek
  • Parameter yang boleh diselaraskan mudah dioptimumkan

Risiko

  • Penembusan julat terdedah kepada whipsaws
  • Perlu data sejarah yang mencukupi untuk mengira julat
  • Parameter yang buruk menyebabkan hipersensitiviti atau kelembapan
  • Tiada hentian yang berkesan, pengeluaran yang besar
  • Prestasi yang dipengaruhi oleh yuran kerana frekuensi tinggi

Risiko boleh dikurangkan dengan:

  • Koefisien volatiliti penapis julat relaks
  • Pengoptimuman parameter untuk tetapan ideal
  • Pelaksanaan stop loss atau trailing stop
  • Mengurangkan kekerapan perdagangan untuk bayaran yang lebih rendah
  • Ujian parameter khusus produk

Arahan Peningkatan

Strategi ini boleh ditingkatkan dengan:

  1. Ujian tempoh pengiraan julat yang berbeza

  2. Mengoptimumkan pekali volatiliti penapis julat

  3. Menambah penunjuk pengesahan seperti MACD

  4. Menggunakan perhentian bergerak atau belakang

  5. Parameter penyesuaian khusus untuk setiap produk

  6. Mengoptimumkan sistem saiz kedudukan

Ringkasan

Strategi ini menggunakan harga pecah dari julat untuk menjana isyarat jangka pendek, dengan berkesan menangkap trend sementara. Tetapi risiko seperti whipsaws wujud. Penambahbaikan boleh dibuat melalui pengoptimuman parameter, menghentikan kerugian, menambah penapis dan lain-lain untuk mengawal risiko sambil mengekalkan keberkesanan.


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