Filter rentang beli dan jual strategi perdagangan jangka pendek


Tanggal Pembuatan: 2023-09-21 21:17:40 Akhirnya memodifikasi: 2023-09-21 21:17:40
menyalin: 0 Jumlah klik: 854
1
fokus pada
1617
Pengikut

Ringkasan

Strategi ini didasarkan pada rentang fluktuasi harga untuk menentukan kapan membeli dan menjual. Strategi ini menghitung rentang fluktuasi harga dalam periode tertentu dan menghasilkan sinyal perdagangan dengan rentang ini sebagai kondisi penyaringan. Strategi ini menghasilkan sinyal beli atau jual ketika harga melampaui rentang fluktuasi.

Prinsip Strategi

Indikator utama dari strategi ini adalah kisaran fluktuasi harga.

  1. Perhitungan perbedaan harga tertinggi dan terendah dalam N siklus terakhir sebagai kenaikan harga

  2. Pengolahan rata-rata dari pergerakan harga, mendapatkan filter kisaran

  3. Ketika kenaikan harga melampaui filter jangkauan, sinyal beli dihasilkan

  4. Sinyal jual dihasilkan ketika harga turun di atas filter jangkauan

Dengan cara ini, Anda dapat menggunakan harga untuk memutuskan arah tren, menyaring kebisingan perdagangan, dan mendapatkan sinyal perdagangan yang lebih jelas.

Keunggulan Strategis

  • Penggunaan rentang harga untuk menilai terobosan
  • Pengolahan rentang fluktuasi yang halus, noise filter yang efektif
  • Sinyal-sinyal penembusan, mudah menangkap tren garis pendek
  • Frekuensi transaksi yang lebih tinggi, cocok untuk operasi garis pendek
  • Parameter yang dapat disesuaikan, mudah dioptimalkan untuk varietas yang berbeda

Risiko Strategis

  • Jarak terobosan rentan terhadap lonjakan dan penurunan
  • Dibutuhkan data historis yang lebih panjang
  • Parameter yang disetel dengan tidak benar akan terlalu sensitif atau lambat
  • Tidak ada pengendalian kerugian yang efektif, ada penarikan besar
  • Efeknya mungkin dipengaruhi oleh biaya transaksi

Langkah-langkah berikut dapat mengurangi risiko:

  • Koefisien Fluktuasi Filter Rentang yang Disesuaikan
  • Mengoptimalkan parameter untuk menemukan kombinasi optimal
  • Setting Stop Loss Line Stop atau Move Stop
  • Mengurangi frekuensi dan biaya transaksi
  • Parameter pengujian berdasarkan varietas yang berbeda

Arah optimasi

Strategi ini dapat dioptimalkan dalam beberapa hal:

  1. Parameter periode yang berbeda dalam kisaran perhitungan tes

  2. Koefisien Fluktuasi Filter Rentang Optimasi

  3. Menambahkan MACD dan lain-lain untuk konfirmasi kedua

  4. Menggunakan Stop Loss Mobile atau Tracking Stop Loss

  5. Parameter penyesuaian yang berbeda berdasarkan varietas

  6. Pertimbangkan untuk mengoptimalkan sistem manajemen posisi

Meringkaskan

Strategi ini menggunakan rentang harga untuk membuat sinyal perdagangan garis pendek. Ini dapat mengidentifikasi peluang tren jangka pendek secara efektif. Tetapi juga rentan terhadap risiko lonjakan. Kita dapat memperbaiki sistem strategi dengan cara mengoptimalkan parameter, mengatur aturan stop loss, menambahkan filter indikator, dan lain-lain.

Kode 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)