Strategi Dagangan Momentum Dual Range Filter

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

img

Ringkasan

Strategi ini adalah strategi perdagangan momentum berdasarkan penapis julat ganda. Strategi ini mengira julat halus untuk tempoh yang cepat dan perlahan untuk mendapatkan penapis julat yang komprehensif, yang digunakan untuk menentukan trend harga semasa. Apabila harga melintasi di atas / di bawah julat ini, strategi menghasilkan isyarat beli / jual. Di samping itu, strategi menetapkan empat tahap mengambil keuntungan gradien dan satu tahap stop-loss untuk mengawal risiko dan mengunci keuntungan.

Prinsip Strategi

  1. Mengira julat halus untuk tempoh cepat dan perlahan Julat cepat menggunakan tempoh yang lebih pendek dan kelipatan yang lebih kecil, manakala julat perlahan menggunakan tempoh yang lebih lama dan kelipatan yang lebih besar.
  2. Gunakan purata julat cepat dan perlahan sebagai penapis julat komprehensif (TRF).
  3. Tentukan trend menaik dan menurun dengan membandingkan harga semasa dengan harga sebelumnya.
  4. Mengira jalur dinamik atas (FUB) dan bawah (FLB) sebagai rujukan untuk trend.
  5. Menghasilkan isyarat beli dan jual berdasarkan hubungan antara harga penutupan dan TRF.
  6. Tetapkan empat tahap mengambil keuntungan gradien dan satu tahap stop-loss, yang sepadan dengan peratusan kedudukan yang berbeza dan peratusan keuntungan / kerugian.

Analisis Kelebihan

  1. Penapis julat dua menggabungkan tempoh yang cepat dan perlahan, membolehkan strategi untuk menyesuaikan diri dengan kadar pasaran yang berbeza dan menangkap lebih banyak peluang perdagangan.
  2. Reka bentuk jalur atas dan bawah dinamik membantu strategi sejajar dengan trend semasa dan mengurangkan isyarat palsu.
  3. Empat tahap mengambil keuntungan gradien membolehkan strategi untuk mendapatkan lebih banyak keuntungan apabila trend berterusan sambil mengunci keuntungan separa apabila trend berbalik.
  4. Tetapan stop-loss membantu mengawal kerugian maksimum setiap perdagangan dan melindungi keselamatan akaun.

Analisis Risiko

  1. Semasa turun naik pasaran atau keadaan terhad julat, strategi boleh menghasilkan banyak isyarat palsu, yang membawa kepada kerugian perdagangan dan komisen yang kerap.
  2. Tetapan mengambil keuntungan gradien boleh menyebabkan beberapa keuntungan dikunci sebelum masa, menghalang strategi daripada mendapat manfaat sepenuhnya dari pergerakan trend.
  3. Tetapan stop-loss mungkin tidak sepenuhnya mengelakkan kerugian yang melampau yang disebabkan oleh peristiwa black swan.

Arah pengoptimuman

  1. Pertimbangkan untuk memasukkan lebih banyak penunjuk teknikal atau penunjuk sentimen pasaran sebagai syarat tambahan untuk penentuan trend untuk mengurangkan isyarat palsu.
  2. Untuk tetapan mengambil keuntungan dan berhenti rugi, sesuaikan secara dinamik mengikut persekitaran pasaran dan instrumen perdagangan yang berbeza untuk meningkatkan kesesuaian strategi.
  3. Berdasarkan hasil backtesting, lebih mengoptimumkan tetapan parameter, seperti pemilihan tempoh julat yang cepat dan perlahan, dan tetapan peratusan untuk tahap mengambil keuntungan dan hentian kerugian, untuk meningkatkan kestabilan dan keuntungan strategi.

Ringkasan

Strategi perdagangan momentum penapis dua julat membina penapis komprehensif menggunakan julat yang lancar dari tempoh yang cepat dan perlahan, digabungkan dengan jalur atas dan bawah dinamik untuk menentukan trend harga dan menghasilkan isyarat beli / jual. Strategi ini juga menetapkan empat tahap mengambil keuntungan gradien dan satu tahap stop-loss untuk mengawal risiko dan mengunci keuntungan. Strategi ini sesuai untuk digunakan di pasaran yang sedang berkembang tetapi mungkin menghasilkan lebih banyak isyarat palsu di pasaran yang berfluktuasi. Pada masa akan datang, pertimbangkan untuk memperkenalkan lebih banyak penunjuk, mengoptimumkan tetapan mengambil keuntungan dan stop-loss, dan menyesuaikan parameter secara dinamik untuk meningkatkan daya adaptasi dan kestabilan strategi.


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