Strategie zur Umkehrung

Schriftsteller:ChaoZhang, Datum: 23.11.2023
Tags:

img

Übersicht

Die Reversal-Catcher-Strategie ist eine Umkehrhandelsstrategie, die den Volatilitätsindikator Bollinger Bands und den Impulsindikator RSI verwendet.

Strategie Logik

Die Strategie verwendet Bollinger Bands als Haupttechnischen Indikator, kombiniert mit RSI und anderen Dynamikindikatoren zur Überprüfung von Handelssignalen.

  1. Verwenden Sie die 50-Tage-EMA und 21-Tage-EMA-Goldkreuz/Todkreuz, um den Trend zu bestimmen.
  2. In einem Abwärtstrend, wenn der Preis über die Bollinger-Unterband brecht, und der RSI nur aus dem überverkauften Gebiet zurückspringt und ein goldenes Kreuz bildet, zeigt er an, dass der überverkaufte Bereich bereits den Boden erreicht hat und ein Kaufsignal gibt.
  3. Bei einem Aufwärtstrend, wenn der Preis unter die obere Bollinger-Bande bricht und der RSI aus dem überkauften Bereich zurückfällt und ein totes Kreuz bildet, zeigt er an, dass der überkaufte Bereich zurückfällt und ein Verkaufssignal gibt.
  4. Die oben genannten Kauf- und Verkaufssignale müssen zusammen ausgelöst werden, um falsche Signale zu vermeiden.

Analyse der Vorteile

Zu den Vorteilen dieser Strategie gehören:

  1. Durch die Kombination von Volatilitäts- und Dynamikindikatoren werden die Signale zuverlässiger.
  2. Der Umkehrhandel ist mit geringem Risiko ausgestattet und eignet sich für den kurzfristigen Handel.
  3. Handelsregeln sind für den automatischen Handel programmierbar.
  4. Die Kombination mit dem Trendhandel verhindert die Eröffnung von Störungen während der Marktkonsolidierung.

Risikoanalyse

Zu den Risiken dieser Strategie gehören:

  1. Bollinger Bands Breakout falsches Signal Risiko, braucht RSI Filter.
  2. Das Risiko einer fehlgeschlagenen Umkehrung erfordert einen zeitnahen Stop-Loss.
  3. Das Risiko einer Umkehr des Zeitpunkts, kann zu früh eingehen oder den besten Einstiegspunkt verpassen.

Um die Risiken zu kontrollieren, können wir die Stop-Loss-Ebene festlegen, um die Risikoposition zu begrenzen, und Parameter wie Bollinger Bands Periode oder RSI-Zahlen optimieren, um die Systemleistung zu verbessern.

Optimierungsrichtlinien

Zu den wichtigsten Optimierungsschwerpunkten gehören:

  1. Optimieren Sie die Bollinger-Bänderparameter, passen Sie die Periodenlänge und die Standardabweichung an, um eine optimale Einstellung zu finden.
  2. Optimieren Sie die Periode der gleitenden Durchschnitte, um die beste Periode für die Beurteilung des Trends zu bestimmen.
  3. Anpassung der RSI-Parameter, um den besten Überkauf-/Überverkaufsbereich zu ermitteln.
  4. Fügen Sie andere Indikatoren wie KDJ, MACD hinzu, um die Einstiegssignale zu diversifizieren.
  5. Einführung von Modellen für maschinelles Lernen zur Suche nach optimierten Parametern.

Schlussfolgerung

Die Reversal-Catcher-Strategie ist insgesamt eine wirksame kurzfristige Handelsstrategie. Durch die Kombination von Trendfilterung und Umkehrsignalen kann sie falsche Signale während der Marktkonsolidierung vermeiden und den Kampf gegen den Trend vermeiden. Durch kontinuierliche Parameter und Modelloptimierung kann eine bessere Strategieleistung erzielt werden.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This is an Open source work. Please do acknowledge in case you want to reuse whole or part of this code.
// Please see the documentation to know the details about this.

//@version=5
strategy('Strategy:Reversal-Catcher', shorttitle="Reversal-Catcher", overlay=true , currency=currency.NONE, initial_capital=100000)

// Inputs
src = input(close, title="Source (close, high, low, open etc.")

BBlength = input.int(defval=20, minval=1,title="Bollinger Period Length, default 20")
BBmult = input.float(defval=1.5, minval=1.0, maxval=4, step=0.1, title="Bollinger Bands Standard Deviation, default is 1.5")

fastMovingAvg = input.int(defval=21, minval=5,title="Fast Exponential Moving Average, default 21", group = "Trends")
slowMovingAvg = input.int(defval=50, minval=8,title="Slow Exponential Moving Average, default 50", group = "Trends")

rsiLenght = input.int(defval=14, title="RSI Lenght, default 14", group = "Momentum")
overbought = input.int(defval=70, title="Overbought limit (RSI), default 70", group = "Momentum")
oversold = input.int(defval=30, title="Oversold limit (RSI), default 30", group = "Momentum")

hide = input.bool(defval=true, title="Hide all plots and legends from the chart (default: true)")


// Trade related
tradeType = input.string(defval='Both', group="Trade settings", title="Trade Type", options=['Both', 'TrendFollowing', 'Reversal'], tooltip="Consider all types of trades? Or only Trend Following or only Reversal? (default: Both).")
endOfDay = input.int(defval=1500, title="Close all trades, default is 3:00 PM, 1500 hours (integer)", group="Trade settings")
mktAlwaysOn = input.bool(defval=false, title="Markets that never closed (Crypto, Forex, Commodity)", tooltip="Some markers never closes. For those cases, make this checked. (Default: off)", group="Trade settings")


// Utils
annotatePlots(txt, val, hide) => 
    if (not hide)
        var l1 = label.new(bar_index, val, txt, style=label.style_label_left, size = size.tiny, textcolor = color.white, tooltip = txt)
        label.set_xy(l1, bar_index, val)

/////////////////////////////// Indicators /////////////////////
vwap = ta.vwap(src)
plot(hide ? na : vwap, color=color.purple, title="VWAP", style = plot.style_line)
annotatePlots('VWAP', vwap, hide)

// Bollinger Band of present time frame
[BBbasis, BBupper, BBlower] = ta.bb(src, BBlength, BBmult)
p1 = plot(hide ? na : BBupper, color=color.blue,title="Bollinger Bands Upper Line")
p2 = plot(hide ? na : BBlower, color=color.blue,title="Bollinger Bands Lower Line")
p3 = plot(hide ? na : BBbasis, color=color.maroon,title="Bollinger Bands Width", style=plot.style_circles, linewidth = 1)
annotatePlots('BB-Upper', BBupper, hide)
annotatePlots('BB-Lower', BBlower, hide)
annotatePlots('BB-Base(20-SMA)', BBbasis, hide)

// RSI
rsi = ta.rsi(src, rsiLenght)

// Trend following
ema50 = ta.ema(src, slowMovingAvg)
ema21 = ta.ema(src, fastMovingAvg)
annotatePlots('21-EMA', ema21, hide)
annotatePlots('50-EMA', ema50, hide)


// Trend conditions
upTrend = ema21 > ema50 
downTrend = ema21 < ema50


// Condition to check Special Entry: HH_LL
// Long side:
hhLLong = barstate.isconfirmed and (low > low[1]) and (high > high[1]) and (close > high[1])
hhLLShort = barstate.isconfirmed and (low < low[1]) and (high < high[1]) and (close < low[1])

longCond =  barstate.isconfirmed and (high[1] < BBlower[1]) and (close > BBlower) and (close < BBupper) and hhLLong and ta.crossover(rsi, oversold) and downTrend
shortCond = barstate.isconfirmed and (low[1] > BBupper[1]) and (close < BBupper) and (close > BBlower) and hhLLShort and ta.crossunder(rsi, overbought) and upTrend

// Trade execute
h = hour(time('1'), syminfo.timezone)
m = minute(time('1'), syminfo.timezone)
hourVal = h * 100 + m
totalTrades = strategy.opentrades + strategy.closedtrades
if (mktAlwaysOn or (hourVal < endOfDay))
    // Entry
    var float sl = na
    var float target = na
    if (longCond)
        strategy.entry("enter long", strategy.long, 1, limit=na, stop=na, comment="Long[E]")
        sl := low[1]
        target := high >= BBbasis ? BBupper : BBbasis
        alert('Buy:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)
    if (shortCond)
        strategy.entry("enter short", strategy.short, 1, limit=na, stop=na, comment="Short[E]")
        sl := high[1]
        target := low <= BBbasis ? BBlower : BBbasis
        alert('Sell:' + syminfo.ticker + ' ,SL:' + str.tostring(math.floor(sl)) + ', Target:' + str.tostring(target), alert.freq_once_per_bar)

    // Exit: target or SL
    if ((close >= target) or (close <= sl))
        strategy.close("enter long", comment=close < sl ? "Long[SL]" : "Long[T]")
    if ((close <= target) or (close >= sl))
        strategy.close("enter short", comment=close > sl ? "Short[SL]" : "Short[T]")
else if (not mktAlwaysOn)
    // Close all open position at the end if Day
    strategy.close_all(comment = "EoD[Exit]", alert_message = "EoD Exit", immediately = true)


Mehr