Kurzfristige Handelsstrategie für den Breakout-Range Filter

Schriftsteller:ChaoZhang, Datum: 21.09.2023
Tags:

Übersicht

Diese kurzfristige Handelsstrategie erzeugt Kauf- und Verkaufssignale basierend auf dem Kursschwankungsbereich. Sie berechnet den Kursbewegungsbereich über einen Zeitraum und verwendet diesen als Filter für Handelssignale.

Strategie Logik

Der Kernindikator ist die Preisschwankungsbreite.

  1. Berechnen Sie den hohen-niedrigen Bereich in den vergangenen N-Perioden als die Preisamplitude

  2. Vergleichen Sie die Amplitude mit gleitenden Durchschnitten, um den Bereich Filter abzuleiten

  3. Ein Kaufsignal wird erzeugt, wenn der Preis über den Bereich Filter steigt

  4. Ein Verkaufssignal wird erzeugt, wenn der Preis unter den Bereich Filter fällt

Auf diese Weise werden Ausbrüche der Preisspanne verwendet, um die Trendrichtung zu bestimmen und Lärm für sauberere Signale zu filtern.

Vorteile

  • Preisspanne leicht zu beurteilen Breakouts
  • Glatte Reichweite filtert Geräusche effektiv
  • Breakout-Signale erfassen kurzfristige Trends
  • Höhere Handelsfrequenz für kurzfristige Geschäfte
  • Einstellbare Parameter leicht zu optimieren

Risiken

  • Streckenbrechungen, anfällig für Schlagsägen
  • Benötigt ausreichende historische Daten zur Berechnung der Reichweite
  • Schlechte Parameter verursachen Überempfindlichkeit oder Trägheit
  • Keine wirksamen Stopps, große Abzüge
  • Leistung, die durch Gebühren aufgrund hoher Frequenz beeinflusst wird

Die Risiken können gemildert werden, indem

  • Flüchtigkeitskoeffizient des Filters für den Relaxerbereich
  • Optimierung der Parameter für ideale Einstellungen
  • Einführung von Stop-Loss- oder Trailing-Stops
  • Verringerung der Handelsfrequenz durch niedrigere Gebühren
  • Produktspezifische Parameterprüfung

Anweisungen zur Verbesserung

Die Strategie kann verbessert werden, indem

  1. Prüfung verschiedener Berechnungszeiten für die Bereiche

  2. Optimierung des Volatilitätskoeffizienten des Bereichsfilters

  3. Hinzufügen von Bestätigungsindikatoren wie MACD

  4. Verwendung von Bewegungs- oder Rückhaltstationen

  5. Spezifische Abstimmungsparameter für jedes Produkt

  6. Optimierung des Positionsgrößensystems

Zusammenfassung

Diese Strategie nutzt das Ausbrechen von Preisen aus den Bandbreiten, um kurzfristige Signale zu generieren, um temporäre Trends effektiv zu erfassen. Es gibt jedoch Risiken wie Whipsaws. Verbesserungen können durch Parameteroptimierung, Stop-Losses, Filter usw. vorgenommen werden, um Risiken zu kontrollieren und gleichzeitig die Wirksamkeit zu erhalten. Eine Feinabstimmung von Parametern nach Produktmerkmalen ist ebenfalls wichtig. Kontinuierliche Optimierungen führen zu Robustheit.


/*backtest
start: 2023-08-21 00:00:00
end: 2023-09-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Range Filter Buy and Sell 5min [Strategy]", overlay=true, commission_type=strategy.commission.percent, commission_value=0.025, default_qty_type=strategy.cash, default_qty_value=10000, initial_capital=10000, slippage=0)

// === INPUT BACKTEST RANGE ===
useDate = input(true,     title='---------------- Use Date ----------------', type=bool)
FromMonth = input(defval = 7, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 25, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2019, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true  // create function "within window of time"
// === INPUT BACKTEST RANGE ===


sources = input(defval=close, title="Source")
isHA = input(false, "Use HA Candles", bool)
src = isHA ? security(heikenashi(tickerid), period, sources) : sources
// Sampling Period
// Settings for 5min chart, BTCUSDC. For Other coin, change the paremeters

per = input(defval=50, minval=1, title="Sampling Period")

// Range Multiplier

mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range

smoothrng(x, t, m)=>
    wper      = (t*2) - 1
    avrng     = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper)*m
    smoothrng
smrng = smoothrng(src, per, mult)

// Range Filter

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(src, smrng)

// Filter Direction

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])

// Target Bands

hband = filt + smrng
lband = filt - smrng

// Colors

filtcolor = upward > 0 ? lime : downward > 0 ? red : orange
barcolor  = (src > filt) and (src > src[1]) and (upward > 0) ? lime : (src > filt) and (src < src[1]) and (upward > 0) ? green : 
   (src < filt) and (src < src[1]) and (downward > 0) ? red : (src < filt) and (src > src[1]) and (downward > 0) ? maroon : orange

filtplot = plot(filt, color=filtcolor, linewidth=3, title="Range Filter")

// Target

hbandplot = plot(hband, color=aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=fuchsia, transp=100, title="Low Target")

// Fills

fill(hbandplot, filtplot, color=aqua, title="High Target Range")
fill(lbandplot, filtplot, color=fuchsia, title="Low Target Range")

// Bar Color

//barcolor(barcolor)

// Break Outs 

longCond = na
shortCond = na
longCond := ((src > filt) and (src > src[1]) and (upward > 0)) or ((src > filt) and (src < src[1]) and (upward > 0)) 
shortCond := ((src < filt) and (src < src[1]) and (downward > 0)) or ((src < filt) and (src > src[1]) and (downward > 0))

CondIni = 0
CondIni := longCond ? 1 : shortCond ? -1 : CondIni[1]
longCondition = longCond and CondIni[1] == -1
shortCondition = shortCond and CondIni[1] == 1

//Alerts

plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor = white, style=shape.labelup, size = size.normal, location=location.belowbar, color = green, transp = 0)
plotshape(shortCondition, title = "Sell Signal", text ="SELL", textcolor = white, style=shape.labeldown, size = size.normal, location=location.abovebar, color = red, transp = 0)

//strategy.entry("Long", strategy.long, stop = hband, when = window() , comment="Long")
//strategy.entry("Short", strategy.short, stop = lband, when = window() , comment="Short")

strategy.entry("Long", strategy.long, when = longCondition and window() , comment="Long")
strategy.entry("Short", strategy.short, when = shortCondition and window() , comment="Short")



// === Stop LOSS ===
useStopLoss = input(false, title='----- Use Stop Loss / Take profit -----', type=bool)
sl_inp = input(100, title='Stop Loss %', type=float, step=0.25)/100
tp_inp = input(1.5, title='Take Profit %', type=float, step=0.25)/100
stop_level = strategy.position_avg_price * (1 - sl_inp)
take_level = strategy.position_avg_price * (1 + tp_inp)
stop_level_short = strategy.position_avg_price * (1 + sl_inp)
take_level_short = strategy.position_avg_price * (1 - tp_inp)
// === Stop LOSS ===

if useStopLoss
    strategy.exit("Stop Loss/Profit Long","Long", stop=stop_level, limit=take_level)
    strategy.exit("Stop Loss/Profit Short","Short", stop=stop_level_short, limit=take_level_short)


Mehr