Momentum-Trading-Strategie mit Doppelintervallfilter


Erstellungsdatum: 2024-04-01 10:54:47 zuletzt geändert: 2024-04-01 10:54:47
Kopie: 3 Klicks: 590
1
konzentrieren Sie sich auf
1617
Anhänger

Momentum-Trading-Strategie mit Doppelintervallfilter

Überblick

Die Strategie ist eine dynamische Handelsstrategie, die auf einem doppelten Spannungsfilter basiert. Die Strategie erhält einen integrierten Spannungsfilter, der die aktuelle Kursentwicklung durch die Berechnung eines Gleitbereichs mit zwei Zyklen von schneller und langsamer Bewegung ermittelt. Die Strategie erzeugt ein Kauf-/Verkaufssignal, wenn der Preis diesen Bereich überschreitet. Die Strategie bietet außerdem vier Steigstopps und einen Stop-Loss, um Risiken zu kontrollieren und Gewinne zu sperren.

Strategieprinzip

  1. Berechnen Sie den glatten Abstand zwischen den beiden Perioden schnell und langsam. Der schnelle Abstand verwendet kürzere Perioden und kleinere Multiplikate, der langsame Abstand verwendet längere Perioden und größere Multiplikate.
  2. Die Mittelwerte der schnellen und langsamen Bereiche werden als Gesamtbereichsfilter ((TRF)) verwendet.
  3. Berechnen Sie die Beziehung zwischen dem aktuellen Preis und dem vorherigen Preis, um einen Aufwärtstrend (upward) und einen Abwärtstrend (downward) zu bestimmen.
  4. Berechnung der dynamischen Oberbahn (FUB) und Unterbahn (FLB) als Referenz für Trends.
  5. Die Verknüpfung des Kurses mit dem TRF erzeugt Kauf- und Verkaufssignale.
  6. Vier Grad-Stopps und ein Stop-Loss sind für verschiedene Positionsquoten und Gewinn-/Verlust-Prozentsätze vorgesehen.

Analyse der Stärken

  1. Der Doppel-Bereich-Filter kombiniert schnelle und langsame Zyklen und ist in der Lage, sich an unterschiedliche Marktrhythmen anzupassen, um mehr Handelsmöglichkeiten zu erfassen.
  2. Die dynamische Ein- und Ausfahrt der Schienen hilft bei der Bewältigung aktueller Trends und verringert die Anzahl falscher Signale.
  3. Die Einrichtung von vier Verlaufshaltungen ermöglicht es, mehr Gewinne zu erzielen, wenn der Trend fortgesetzt wird, und gleichzeitig einen Teil der Gewinne zu sperren, wenn der Trend umgekehrt wird.
  4. Die Stop-Loss-Einstellung hilft bei der Kontrolle des maximalen Verlusts für einzelne Transaktionen und schützt die Sicherheit des Kontos.

Risikoanalyse

  1. Bei Marktschwankungen oder Zwischenbewegungen kann diese Strategie zu einer erhöhten Anzahl von Falschsignalen führen, was zu häufigen Transaktionen und Verlusten bei den Gebühren führt.
  2. Die Einstellung einer Verlaufshemmung kann dazu führen, dass ein Teil der Gewinne vorzeitig gesperrt wird und die Trends nicht voll genutzt werden können.
  3. Schadensbegrenzungen können die extremen Schäden des Black Swan-Vorfalls nicht vollständig vermeiden.

Optimierungsrichtung

  1. Es kann in Betracht gezogen werden, mehr technische Indikatoren oder Marktstimmungskennzahlen einzuführen, die als zusätzliche Voraussetzungen für die Trendbeurteilung dienen, um falsche Signale zu reduzieren.
  2. Die Einstellungen für Stop-Off und Stop-Loss können dynamisch an unterschiedliche Marktbedingungen und Handelsarten angepasst werden, um die Anpassungsfähigkeit der Strategie zu verbessern.
  3. Auf der Grundlage der Rückmessung können weitere Optimierungen der Parameter-Einstellungen, wie z. B. die Auswahl der Zyklen zwischen schnellen und langsamen Zyklen, die Einstellung des Prozentsatzes von Stopps und Stoppverlusten, zur Steigerung der Stabilität und Profitabilität der Strategie vorgenommen werden.

Zusammenfassen

Die Binary-Band-Rampen-Strategie erzeugt ein Buy-Sell-Signal, indem sie einen Komplex-Filter mit schnellen und schleifen Zwei-Zyklus-Rampen erzeugt und gleichzeitig die dynamische Auf- und Abwärtsbewegung kombiniert, um die Preisentwicklung zu beurteilen. Die Strategie bietet auch vier Steigungsstopps und einen Stop-Loss, um Risiken zu kontrollieren und Gewinne zu sperren. Die Strategie ist für Trendbewegungen geeignet, kann aber in einem bewegten Markt mehr falsche Signale erzeugen.

Strategiequellcode
/*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)