Penapis julat beli dan jual strategi dagangan jangka pendek


Tarikh penciptaan: 2023-09-21 21:17:40 Akhirnya diubah suai: 2023-09-21 21:17:40
Salin: 0 Bilangan klik: 854
1
fokus pada
1617
Pengikut

Gambaran keseluruhan

Strategi ini berdasarkan kepada rentang turun naik harga untuk menentukan masa membeli dan menjual. Ia mengira rentang turun naik harga dalam tempoh tertentu, dan menghasilkan isyarat perdagangan dengan rentang itu sebagai syarat penapis. Ia menghasilkan isyarat membeli atau menjual apabila harga melebihi rentang turun naik.

Prinsip Strategi

Indikator utama strategi ini ialah pergerakan harga.

  1. Mengira perbezaan harga tertinggi dan terendah dalam tempoh N kitaran lalu sebagai kenaikan harga

  2. Pengolahan rata-rata pelepasan harga untuk mendapatkan penapis julat

  3. Apabila kenaikan harga melebihi penapis julat, ia menghasilkan isyarat beli

  4. Apabila harga turun melebihi penapis julat, menghasilkan isyarat jual

Dengan cara ini, anda boleh menggunakan harga untuk meneroka pergerakan untuk menentukan arah trend, menyaring perdagangan bising, dan mendapatkan isyarat perdagangan yang lebih jelas.

Kelebihan Strategik

  • Menggunakan Julat Entiti Harga untuk Menentukan Penembusan
  • Pengendalian yang lancar dalam julat gelombang, penapis bunyi yang berkesan
  • Sinyal terobosan, mudah untuk menangkap trend garis pendek
  • Frekuensi dagangan yang lebih tinggi, sesuai untuk operasi garis pendek
  • Parameter yang boleh disesuaikan, mudah dioptimumkan untuk pelbagai jenis

Risiko Strategik

  • Penembusan julat mudah berlakunya lonjakan dan penurunan
  • Memerlukan pengiraan data sejarah yang lebih panjang
  • Tetapan parameter yang tidak betul akan menjadi terlalu sensitif atau lambat
  • Tidak dapat mengawal kerugian secara berkesan, terdapat penarikan balik yang lebih besar
  • Kesan mungkin dipengaruhi oleh yuran urus niaga

Anda boleh mengurangkan risiko dengan mengambil langkah-langkah berikut:

  • Koefisien Fluktuasi Penapisan Julat yang Sesuai
  • Mengoptimumkan parameter, mencari kombinasi parameter yang optimum
  • Tetapkan hentian hentian atau hentian bergerak
  • Mengurangkan frekuensi dan kos transaksi
  • Parameter ujian mengikut jenis yang berbeza

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Parameter kitaran yang berbeza dalam skop pengiraan ujian

  2. Koefisien Fluktuasi Saringan Julat Optimum

  3. Menambahkan MACD dan lain-lain untuk pengesahan kedua

  4. Menggunakan Stop Loss Mobile atau Stop Loss Tracking

  5. Parameter penyesuaian yang berbeza mengikut jenis

  6. Pertimbangkan untuk mengoptimumkan sistem pengurusan kedudukan

ringkaskan

Strategi ini menggunakan julat penembusan harga untuk menghasilkan isyarat perdagangan garis pendek. Ini dapat mengenal pasti peluang trend jangka pendek dengan berkesan. Tetapi juga mudah terkena risiko kejatuhan. Kita dapat memperbaiki sistem strategi dengan mengoptimumkan parameter, menetapkan peraturan berhenti-rugi, menambahkan penapis indikator dan sebagainya.

Kod sumber strategi
/*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)