Strategi Perdagangan Momentum Dual Range Filter

Penulis:ChaoZhang, Tanggal: 2024-04-01 10:54:47
Tag:

img

Gambaran umum

Strategi ini adalah strategi perdagangan momentum yang didasarkan pada filter rentang ganda. Strategi ini menghitung rentang halus untuk periode cepat dan lambat untuk mendapatkan filter rentang komprehensif, yang digunakan untuk menentukan tren harga saat ini. Ketika harga melintasi di atas / di bawah rentang ini, strategi menghasilkan sinyal beli / jual. Selain itu, strategi menetapkan empat gradien tingkat mengambil keuntungan dan satu tingkat stop-loss untuk mengontrol risiko dan mengunci keuntungan.

Prinsip Strategi

  1. Menghitung rentang halus untuk periode cepat dan lambat. rentang cepat menggunakan periode yang lebih pendek dan kelipatan yang lebih kecil, sedangkan rentang lambat menggunakan periode yang lebih lama dan kelipatan yang lebih besar.
  2. Gunakan rata-rata kisaran cepat dan lambat sebagai filter kisaran komprehensif (TRF).
  3. Tentukan tren naik dan turun dengan membandingkan harga saat ini dengan harga sebelumnya.
  4. Menghitung dinamika band atas (FUB) dan bawah (FLB) sebagai referensi untuk tren.
  5. Membuat sinyal beli dan jual berdasarkan hubungan antara harga penutupan dan TRF.
  6. Tetapkan empat tingkat profit take gradient dan satu level stop loss, yang sesuai dengan persentase posisi yang berbeda dan persentase profit/loss.

Analisis Keuntungan

  1. Filter dual range menggabungkan periode cepat dan lambat, memungkinkan strategi untuk beradaptasi dengan kecepatan pasar yang berbeda dan menangkap lebih banyak peluang perdagangan.
  2. Desain band atas dan bawah yang dinamis membantu strategi sejajar dengan tren saat ini dan mengurangi sinyal palsu.
  3. Empat tingkat keuntungan gradien memungkinkan strategi untuk mengamankan lebih banyak keuntungan ketika tren berlanjut sementara mengunci keuntungan parsial ketika tren berbalik.
  4. Pengaturan stop-loss membantu mengontrol kerugian maksimum per perdagangan dan melindungi keamanan akun.

Analisis Risiko

  1. Selama fluktuasi pasar atau kondisi yang terikat kisaran, strategi dapat menghasilkan banyak sinyal palsu, yang menyebabkan kerugian perdagangan dan komisi yang sering terjadi.
  2. Pengaturan take profit gradien dapat menyebabkan beberapa keuntungan terkunci lebih awal, mencegah strategi untuk sepenuhnya mendapatkan keuntungan dari pergerakan tren.
  3. Pengaturan stop loss mungkin tidak sepenuhnya menghindari kerugian ekstrim yang disebabkan oleh peristiwa angsa hitam.

Arah Optimalisasi

  1. Pertimbangkan untuk memasukkan lebih banyak indikator teknis atau indikator sentimen pasar sebagai kondisi tambahan untuk penentuan tren untuk mengurangi sinyal palsu.
  2. Untuk pengaturan take profit dan stop loss, sesuaikan secara dinamis sesuai dengan lingkungan pasar dan instrumen perdagangan yang berbeda untuk meningkatkan kemampuan adaptasi strategi.
  3. Berdasarkan hasil backtesting, lebih lanjut mengoptimalkan pengaturan parameter, seperti pemilihan periode rentang cepat dan lambat, dan pengaturan persentase untuk tingkat take profit dan stop-loss, untuk meningkatkan stabilitas dan profitabilitas strategi.

Ringkasan

Strategi perdagangan momentum filter dua rentang membangun filter komprehensif menggunakan rentang halus dari periode cepat dan lambat, dikombinasikan dengan band atas dan bawah dinamis untuk menentukan tren harga dan menghasilkan sinyal beli / jual. Strategi ini juga menetapkan empat tingkat take profit gradien dan satu level stop-loss untuk mengendalikan risiko dan mengunci keuntungan. Strategi ini cocok untuk digunakan di pasar yang sedang tren tetapi dapat menghasilkan lebih banyak sinyal palsu di pasar yang berfluktuasi.


/*backtest
start: 2024-03-01 00:00:00
end: 2024-03-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
//@version=5
strategy(title='2"Twin Range Filter', overlay=true)
strat_dir_input = input.string(title='İşlem Yönü', defval='Alis', options=['Alis', 'Satis', 'Tum'])
strat_dir_value = strat_dir_input == 'Alis' ? strategy.direction.long : strat_dir_input == 'Satis' ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

////////////////////////////

// Backtest inputs
BaslangicAy = input.int(defval=1, title='İlk ay', minval=1, maxval=12)
BaslangicGun = input.int(defval=1, title='İlk Gün', minval=1, maxval=31)
BaslangicYil = input.int(defval=2023, title='İlk Yil', minval=2000)
SonAy = input.int(defval=1, title='Son Ay', minval=1, maxval=12)
SonGun = input.int(defval=1, title='Son Gün', minval=1, maxval=31)
SonYil = input.int(defval=9999, title='Son Yıl', minval=2000)

start = timestamp(BaslangicYil, BaslangicAy, BaslangicGun, 00, 00)  // backtest start window
finish = timestamp(SonYil, SonAy, SonGun, 23, 59)  // backtest finish window
window() => true

source = input(defval=close, title='Source')
showsignals = input(title='Show Buy/Sell Signals ?', defval=true)
per1 = input.int(defval=27, minval=1, title='Fast period')
mult1 = input.float(defval=1.6, minval=0.1, title='Fast range')
per2 = input.int(defval=55, minval=1, title='Slow period')
mult2 = input.float(defval=2, minval=0.1, title='Slow 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
smrng1 = smoothrng(source, per1, mult1)
smrng2 = smoothrng(source, per2, mult2)
smrng = (smrng1 + smrng2) / 2
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(source, smrng)
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])
STR = filt + smrng
STS = filt - smrng
FUB = 0.0
FUB := STR < nz(FUB[1]) or close[1] > nz(FUB[1]) ? STR : nz(FUB[1])
FLB = 0.0
FLB := STS > nz(FLB[1]) or close[1] < nz(FLB[1]) ? STS : nz(FLB[1])
TRF = 0.0
TRF := nz(TRF[1]) == FUB[1] and close <= FUB ? FUB : nz(TRF[1]) == FUB[1] and close >= FUB ? FLB : nz(TRF[1]) == FLB[1] and close >= FLB ? FLB : nz(TRF[1]) == FLB[1] and close <= FLB ? FUB : FUB
al = ta.crossover(close, TRF)
sat = ta.crossunder(close, TRF)
plotshape(showsignals and al, title='Long', text='BUY', style=shape.labelup, textcolor=color.white, size=size.tiny, location=location.belowbar, color=color.rgb(0, 19, 230))
plotshape(showsignals and sat, title='Short', text='SELL', style=shape.labeldown, textcolor=color.white, size=size.tiny, location=location.abovebar, color=color.rgb(0, 19, 230))
alertcondition(al, title='Long', message='Long')
alertcondition(sat, title='Short', message='Short')
Trfff = plot(TRF)
mPlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0)
longFillColor = close > TRF ? color.green : na
shortFillColor = close < TRF ? color.red : na
fill(mPlot, Trfff, title='UpTrend Highligter', color=longFillColor, transp=90)
fill(mPlot, Trfff, title='DownTrend Highligter', color=shortFillColor, transp=90)

//////////////////////



renk1 = input(true, "Mum Renk Ayarları?")
mumrenk = input(true,title="Trend Bazlı Mum Rengi Değişimi?")
htaColor = renk1 ? (al ? color.rgb(224, 230, 57) : #E56337) : #c92626
barcolor(color = mumrenk ? (renk1 ? htaColor : na) : na)
if (al) and window()
    strategy.entry("Al", strategy.long)
if (sat) and window()
    strategy.entry("Sat", strategy.short)


per1(pcnt) =>
    strategy.position_size != 0 ? math.round(pcnt / 100 * strategy.position_avg_price / syminfo.mintick) : float(na)
zarkesmgb = input.float(title='Zarar Kes Yüzdesi', defval=100, minval=0.01)
zarkeslos = per1(zarkesmgb)
q1 = input.int(title='Satış Lot Sayısı 1.Kısım %', defval=5, minval=1)
q2 = input.int(title='Satış Lot Sayısı 2.Kısım %', defval=8, minval=1)
q3 = input.int(title='Satış Lot Sayısı 3.Kısım %', defval=13, minval=1)
q4 = input.int(title='Satış Lot Sayısı 4.Kısım %', defval=21, minval=1)
tp1 = input.float(title='Kar Yüzdesi 1.Kısım', defval=13, minval=0.01)
tp2 = input.float(title='Kar Yüzdesi 2.Kısım', defval=21, minval=0.01)
tp3 = input.float(title='Kar Yüzdesi 3.Kısım', defval=29, minval=0.01)
tp4 = input.float(title='Kar Yüzdesi 4.Kısım', defval=34, minval=0.01)
strategy.exit('✨KS1', qty_percent=q1, profit=per1(tp1), loss=zarkeslos)
strategy.exit('✨KS2', qty_percent=q2, profit=per1(tp2), loss=zarkeslos)
strategy.exit('✨KS3', qty_percent=q3, profit=per1(tp3), loss=zarkeslos)
strategy.exit('✨KS4', qty_percent=q4, profit=per1(tp4), loss=zarkeslos)



Lebih banyak