Diese Strategie ist eine Dynamikhandelsstrategie, die auf einem doppelten Bereichsfilter basiert. Die Strategie berechnet glatte Bereiche für schnelle und langsame Perioden, um einen umfassenden Bereichsfilter zu erhalten, der zur Bestimmung des aktuellen Preistrends verwendet wird. Wenn der Preis über/unter diesen Bereich geht, erzeugt die Strategie Kauf/Verkaufsignale. Darüber hinaus setzt die Strategie vier Gradient-Take-Profit-Level und eine Stop-Loss-Level, um das Risiko zu kontrollieren und Gewinne zu erzielen.
Die Dual-Range-Filter-Momentum-Handelsstrategie konstruiert einen umfassenden Filter, der glatte Bereiche aus schnellen und langsamen Perioden verwendet, kombiniert mit dynamischen oberen und unteren Bands, um Preistrends zu bestimmen und Kauf-/Verkaufssignale zu generieren. Die Strategie legt auch vier Gradient-Take-Profit-Level und eine Stop-Loss-Level fest, um das Risiko zu kontrollieren und Gewinne zu sperren. Diese Strategie eignet sich für den Einsatz in Trendmärkten, kann aber mehr falsche Signale in schwankenden Märkten erzeugen. In Zukunft sollten Sie mehr Indikatoren einführen, die Optimierung der Take-Profit- und Stop-Loss-Einstellungen und die dynamische Anpassung von Parametern berücksichtigen, um die Anpassungsfähigkeit und Stabilität der Strategie zu verbessern.
/*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)