Handelsstrategie für den Dual-Range-Filter-Impuls

Schriftsteller:ChaoZhang, Datum: 04.01.2024
Tags:

img

Übersicht

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.

Strategieprinzip

  1. Berechnen Sie glatte Bereiche für schnelle und langsame Perioden. Der schnelle Bereich verwendet eine kürzere Periode und ein kleineres Vielfaches, während der langsame Bereich eine längere Periode und ein größeres Vielfaches verwendet.
  2. Verwenden Sie den Durchschnitt der schnellen und langsamen Bereiche als Gesamtbereichsfilter (TRF).
  3. Bestimmen Sie Auf- und Abwärtstrends, indem Sie den aktuellen Preis mit dem vorherigen Preis vergleichen.
  4. Die dynamischen oberen (FUB) und unteren (FLB) Bands werden als Referenz für den Trend berechnet.
  5. Erstellen Sie Kauf- und Verkaufssignale auf der Grundlage der Beziehung zwischen dem Schlusskurs und dem TRF.
  6. Stellen Sie vier Gradient-Take-Profit-Levels und eine Stop-Loss-Level fest, die verschiedenen Positionsprozentsätzen und Gewinn/Verlustprozentsätzen entsprechen.

Analyse der Vorteile

  1. Der Dual-Range-Filter verbindet schnelle und langsame Perioden, so dass sich die Strategie an unterschiedliche Marktgeschwindigkeiten anpassen und mehr Handelschancen nutzen kann.
  2. Das Design dynamischer Ober- und Unterbänder hilft der Strategie, sich an den aktuellen Trend anzupassen und falsche Signale zu reduzieren.
  3. Die vier Gradient-Take-Profit-Level ermöglichen es der Strategie, mehr Gewinne zu erzielen, wenn der Trend anhält, während bei einer Umkehr des Trends teilweise Gewinne erzielt werden.
  4. Die Stop-Loss-Einstellung hilft, den maximalen Verlust pro Handel zu kontrollieren und schützt die Sicherheit des Kontos.

Risikoanalyse

  1. Während von Marktschwankungen oder Bereichsbedingungen kann die Strategie viele falsche Signale erzeugen, was zu häufigen Handels- und Provisionsverlusten führt.
  2. Die Gradient-Take-Profit-Einstellungen können dazu führen, dass einige Gewinne vorzeitig eingeschlossen werden und die Strategie nicht vollständig von Trendbewegungen profitieren kann.
  3. Die Einstellung des Stop-Loss verhindert möglicherweise nicht vollständig extreme Verluste, die durch schwarze Schwanereignisse verursacht werden.

Optimierungsrichtung

  1. Es sollte in Erwägung gezogen werden, mehr technische Indikatoren oder Marktstimmungsindikatoren als Hilfsbedingungen für die Trendbestimmung einzubeziehen, um falsche Signale zu reduzieren.
  2. Für die Einstellungen von Take-Profit und Stop-Loss müssen diese dynamisch an unterschiedliche Marktumgebungen und Handelsinstrumente angepasst werden, um die Anpassungsfähigkeit der Strategie zu verbessern.
  3. Auf der Grundlage der Ergebnisse des Backtesting werden die Parameter-Einstellungen wie die Auswahl von schnellen und langsamen Bereichszeiten sowie die Prozentsatz-Einstellungen für Take-Profit- und Stop-Loss-Level weiter optimiert, um die Stabilität und Rentabilität der Strategie zu verbessern.

Zusammenfassung

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)



Mehr