Handelsstrategie für die Kombination von Hull Moving Average und Stochastic RSI

Schriftsteller:ChaoZhang, Datum: 2023-10-18 12:40:23
Tags:

img

Übersicht

Diese Strategie verwendet den Hull Moving Average, um die Trendrichtung zu bestimmen und kombiniert ihn mit dem Stochastic RSI für Einstiegssignale. Long Trades werden getätigt, wenn die HMA-Mittellinie oberhalb der unteren Linie kreuzt, und Short Trades, wenn sie unterhalb der oberen Linie kreuzt. Darüber hinaus werden Long Trades eingegeben, wenn die Stochastic RSI K-Linie unterhalb der D-Linie aus der Überkaufszone kreuzt, während Short Trades bei Kreuzungen oberhalb der Überverkaufszone eingegeben werden.

Strategie Logik

Die wichtigsten Komponenten dieser Strategie sind der Hull Moving Average für die Trendrichtung und der Stochastische RSI für die Zeitrahmen-Eintrittssignale.

Erstens enthält die Hull-MA-Berechnung Formeln für die mittlere, obere und untere Bands.

Die Trendrichtung wird durch die Beziehung zwischen dem mittleren Band und den oberen/unteren Banden bestimmt. Ein aufwärts gerichteter Crossover der mittleren Linie zeigt Kaufdruck und einen Aufwärtstrend an, während ein abwärts gerichteter Crossover einen erhöhten Verkaufsdruck und einen Abwärtstrend anzeigt.

Die Stochastic RSI Berechnung ist auch definiert, einschließlich der Glätteten K und D Werte. Der K Wert verwendet eine SMA Glättung auf dem RSI, während der D Wert eine zweite SMA Glättung auf dem K ist.

Nachdem die Trendrichtung bestimmt ist, werden lange Trades getätigt, wenn die Stoch RSI K-Linie während eines Aufwärtstrends unter die D-Linie aus der Überkaufzone überschreitet. Kurze Trades werden getätigt, wenn die K-Linie während eines Abwärtstrends über die D-Linie aus dem Überverkaufszone überschreitet.

Die Kombination des Hull-Trendfilters und der Stoch-RSI-Überkauf/Überverkaufsanalyse bietet einen soliden Mehrfaktor-Ansatz für den Handel.

Vorteile

Die wichtigsten Vorteile dieser Strategie sind:

  1. Der Hull-MA zeigt effektiv die allgemeine Marktentwicklung.

  2. Der Stoch RSI bestimmt die Überkauf-/Überverkaufswerte zu Zeiteinträgen.

  3. Beide zusammen zu verwenden, reduziert falsche Signale und verbindet Stärken.

  4. Flexibilität bei der Optimierung von Parametern für verschiedene Symbole und Zeitrahmen.

  5. Rumpfbänder identifizieren potenzielle dynamische Unterstützung und Widerstand.

  6. Die Risikopositionsgröße und die Risikomanagementregeln sind enthalten.

  7. Multi-Asset-Fähigkeit durch Rumpfdaten-Wörterbuch.

  8. Optimierbare Komponenten zur Steigerung der Rentabilität und zur Verringerung der Abzüge.

Risiken

Einige Risiken zu berücksichtigen:

  1. Hull MA hat Verzögerungen und kann Trendänderungen verpassen.

  2. Der Stoch RSI kann übermäßige Signale erzeugen, wenn die Parameter nicht optimiert werden.

  3. Fehlende Übereinstimmung zwischen Hull- und Stochparametern kann zu schlechten Signalen führen.

  4. Zu breite oder schmale Rumpfbänder beeinträchtigen die Signalqualität.

  5. Die jüngsten volatilen Märkte stellen mittelfristige und langfristige Indikatoren in Frage.

  6. Datenfehler zwischen Hull und Stoch verursachen falsche Signale.

  7. Scharfe Trendveränderungen, die Hull nicht erfasst, können Verluste verursachen.

  8. Wir müssen mehrere Zeitrahmen und Symbole testen.

Einige Möglichkeiten, dies zu tun:

  1. Verkürzung der Hull-MA-Länge für eine höhere Trendempfindlichkeit.

  2. Optimieren Sie den Stoch-RSI, um falsche Kreuzungen auszufiltern.

  3. Finden Sie die optimale Hull-Band-Kanalbreite.

  4. Hinzufügen zusätzlicher Bestätigungsindikatoren wie MACD.

  5. Einbeziehung von Stop-Loss-Strategien zur Risikokontrolle.

Optimierungsmöglichkeiten

Einige Möglichkeiten, wie diese Strategie verbessert werden könnte:

  1. Testen Sie mehr Symbole in verschiedenen Zeitrahmen, um die Robustheit zu überprüfen.

  2. Einbeziehen Sie Stop-Loss-Mechanismen wie Trailing-Stops oder gleitende Durchschnitte.

  3. Optimieren Sie die Eintrittsregeln, setzen Sie strengere Filter, um falsche Signale zu reduzieren.

  4. Erforschen Sie die Verwendung von Hull-Bändern, um Unterstützung und Widerstand besser zu definieren.

  5. Bewertung zusätzlicher Bestätigungsindikatoren zur Verbesserung der Signalzuverlässigkeit.

  6. Parameteroptimierung für Längen, Überkauf-/Überverkaufswerte usw.

  7. Einführung einer besseren Positionsgröße und eines besseren Risikomanagements.

  8. Zusätzliche Einstiegs-, Stop-Loss- und Take-Profit-Regeln sind für den Live-Handel unerlässlich.

  9. Optimieren Sie die Rumpfläche für eine bessere Trendempfindlichkeit.

  10. Hinzufügen von Filtern oder Bestätigungsindikatoren zur Verbesserung der Signalqualität.

  11. Erforschen Sie die Rumpfbänder auf dynamische Unterstützungs-/Widerstandsniveaus.

  12. Optimieren Sie die RSI-Parameter wie Länge, Überkauf/Überverkauf.

  13. Einführung fortschrittlicher Positionsgrößen und Risikomanagement.

Schlussfolgerung

Insgesamt ist dies ein effektiver Ansatz, der Trend und Dynamik kombiniert. Allerdings bedeuten die inhärenten Indikatorschwächen, dass Signale ohne weitere Optimierung und Risikokontrolle nicht blind vertraut werden sollten. Mit verfeinerten Parametern, zusätzlichen Filtern und Stop-Losses bietet diese Strategie Potenzial. Für Parameter, Risikomanagement und Positionsgröße sind umfangreichere Tests erforderlich, um sie robust und profitabel für den Live-Handel zu machen.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-10-17 00:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//Basic Hull Ma Pack tinkered by InSilico 
//Converted to Strategy by DashTrader
strategy("Hull Suite + Stoch RSI Strategy v1.1", overlay=true, pyramiding=1, initial_capital=100, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0.023)
strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2016, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

stoch_upper_input = input(88, "Stoch Upper Threshold", type=input.float)
stoch_lower_input = input(5, "Stoch Lower Threshold", type=input.float)
sl = input(0.7, "SL %", type=input.float, step=0.1)
tp = input(2.1, "TP %", type=input.float, step=0.1)
// slowEMA = ema(close, slowEMA_input)

// vwap = vwap(close)
// rsi = rsi(close, rsi_input)


// stoch rsi
smoothK = 3
smoothD = 3
lengthRSI = 14
lengthStoch = 14
rsi1 = rsi(close, 14)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK)
d = sma(k, smoothD)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title="Source")
modeSwitch = input("Hma", title="Hull Variation", options=["Hma", "Thma", "Ehma"])
length = input(180, title="Length(180-200 for floating S/R , 55 for swing entry)")
switchColor = input(true, "Color Hull according to trend?")
candleCol = input(false,title="Color candles based on Hull's Trend?")
visualSwitch  = input(true, title="Show as a Band?")
thicknesSwitch = input(1, title="Line Thickness")
transpSwitch = input(40, title="Band Transparency",step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>  wma(2 * wma(_src, _length / 2) - wma(_src, _length), round(sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>  ema(2 * ema(_src, _length / 2) - ema(_src, _length), round(sqrt(_length)))
//THMA    
THMA(_src, _length) =>  wma(wma(_src,_length / 3) * 3 - wma(_src, _length / 2) - wma(_src, _length), _length)
    
//SWITCH
Mode(modeSwitch, src, len) =>
      modeSwitch == "Hma"  ? HMA(src, len) :
      modeSwitch == "Ehma" ? EHMA(src, len) : 
      modeSwitch == "Thma" ? THMA(src, len/2) : na
      
//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? (HULL > HULL[2] ? #00ff00 : #ff0000) : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title="MHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title="SHULL", color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title="Band Filler", color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color = candleCol ? (switchColor ? hullColor : na) : na)

bgcolor(color = k < stoch_lower_input  and crossover(k, d) ? color.green : na)
bgcolor(color = d > stoch_upper_input and crossover(d, k) ? color.red : na)

notInTrade = strategy.position_size == 0

if notInTrade and HULL[0] > HULL[2] and testPeriod() and k < stoch_lower_input and crossover(k, d)
// if HULL[0] > HULL[2] and testPeriod()
    stopLoss = close * (1 - sl / 100) 
    profit25 = close * (1 + (tp / 100) * 0.25)
    profit50 = close * (1 + (tp / 100) * 0.5)
    takeProfit = close * (1 + tp / 100)
    
    
    strategy.entry("long", strategy.long, alert_message="buy")
    strategy.exit("exit long 25%", "long", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit long 50%", "long", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit long", "long", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

    
if notInTrade and HULL[0] < HULL[2] and testPeriod() and d > stoch_upper_input and crossover(d, k)
// if HULL[0] < HULL[2] and testPeriod()
    stopLoss = close * (1 + sl / 100)
    profit25 = close * (1 - (tp / 100) * 0.25)
    profit50 = close * (1 - (tp / 100) * 0.5)
    takeProfit = close * (1 - tp / 100)
    
    

    strategy.entry("short", strategy.short, alert_message="sell")
    strategy.exit("exit short 25%", "short", stop=stopLoss, limit=profit25, qty_percent=25, alert_message="profit_25")
    strategy.exit("exit short 50%", "short", stop=stopLoss, limit=profit50, qty_percent=25, alert_message="profit_50")
    strategy.exit("exit short", "short", stop=stopLoss, limit=takeProfit)
    
    // line.new(bar_index, profit25, bar_index + 4, profit25, color=color.green)
    // line.new(bar_index, profit50, bar_index + 4, profit50, color=color.green)
    // box.new(bar_index, stopLoss, bar_index + 4, close, border_color=color.red, bgcolor=color.new(color.red, 80))
    // box.new(bar_index, close, bar_index + 4, takeProfit, border_color=color.green, bgcolor=color.new(color.green, 80))

// var table winrateDisplay = table.new(position.bottom_right, 1, 1)
// table.cell(winrateDisplay, 0, 0, "Winrate: " + tostring(strategy.wintrades / strategy.closedtrades * 100, '#.##')+" %", text_color=color.white)

Mehr