Kombinationshandelsstrategie aus Hall-Indikator und Stochastik-Indikator


Erstellungsdatum: 2023-10-18 12:40:23 zuletzt geändert: 2023-10-18 12:40:23
Kopie: 1 Klicks: 1028
1
konzentrieren Sie sich auf
1617
Anhänger

Kombinationshandelsstrategie aus Hall-Indikator und Stochastik-Indikator

Überblick

Die Strategie verwendet den Hall-Indikator, um die Richtung des Trends zu bestimmen, und kombiniert ihn mit dem Zufallsindikator, um den Eintritt zu erstellen. Wenn der Hall-Mittelstrahl den Eintritt durch die Unterbahn durchläuft, sieht er den Eintritt durch die Unterbahn und den Eintritt durch die Unterbahn durchläuft.

Strategieprinzip

Die Handelsstrategie verwendet hauptsächlich den Hall-Indikator, um die Richtung der Markttrends zu bestimmen, und den Zufallsindikator für einen konkreten Einstieg.

Zunächst wird in der Strategie die Berechnungsmethode für den Hall-Indikator definiert, einschließlich der Berechnungsformel für die mittlere, obere und untere Bahn. Die mittlere Bahn wird mit einem gewichteten Moving Average WMA berechnet, wobei die oberen und unteren Bahnen die Abweichung der mittleren Bahn sind.

Dann wird die Richtung des Trends anhand der Beziehung zwischen der mittleren und der oberen Bahn beurteilt. Wenn die mittlere Bahn auf der Oberseite der Bahn untergeht, stellt dies eine starke Kauf- und Verkaufstrend dar, die zu einer beherrschenden Tendenz gehört.

Darüber hinaus definiert die Strategie die Berechnungsmethode für die Zufallsindikatoren, einschließlich der Berechnungsformel für die K-Werte und die D-Werte. Die K-Werte sind die SMA-Gleichung des RSI, die D-Werte sind die erneute SMA-Gleichung des K-Wertes.

Nach der Beurteilung der Richtung des Trends, wenn ein bullish, wenn die K-Linie der Zufallsindikator durch die D-Linie unterhalb der Überverkaufszone durchquert zu tun; wenn ein bullish, wenn die K-Linie durch die D-Linie über den Überkaufszone durchquert zu tun.

Auf diese Weise kann ein relativ stabiler und präziser Einstieg in Kombination mit einer Trendbeurteilung des Hall-Indikators und einer Überkauf-Überverkauf-Beurteilung des Zufallsindikators durchgeführt werden.

Analyse der Stärken

Der größte Vorteil dieser Strategie besteht darin, dass die Kombination von Trendbeurteilung und Überkauf-Überverkauf-Beurteilung eine mehrdimensionale Analyse des Marktes ermöglicht, die eine höhere Einstiegsgenauigkeit ermöglicht.

Es gibt mehrere Vorteile:

  1. Der Hall-Indikator kann die Richtung von Markttrends auf einer großen Ebene bestimmen.

  2. Die Zufallskennzahlen können überkauft und überverkauft beurteilt werden, um die Veränderungen der Kauf- und Verkaufskräfte zu erfassen und die besten Einstiegszeiten zu erfassen.

  3. Beide Systeme können in Kombination verwendet werden, um ihre Vorteile auszuschöpfen, gegenseitig zu verifizieren und falsche Signale zu reduzieren.

  4. Durch die Anpassung der Parameter kann es sich flexibel an verschiedene Sorten und Zeiträume anpassen und ist sehr anwendbar.

  5. Mit der mittleren Bahnverschiebung wird ein Auf- und Abwärtstransfer gebaut, um mögliche Unterstützungen und Widerstände zu erkennen.

  6. STOP LOSS, EXIT ON TARGETS % verwendet, um Positionen zu skalieren

  7. Use of hull data Dictionary gives multiple asset class flexibility

  8. Die gewählte Optimierungsrichtung erhöht die Strategie-Stabilität und die Rendite

Risikoanalyse

Die Strategie birgt auch einige Risiken, die zu beachten sind:

  1. Der Hall-Indikator ist nachlässig und kann einen Trendwendepunkt verpassen, was zu unnötigen Verlusten führt.

  2. Fehlende Einstellungen der Parameter für die Zufallsmessung können zu einem Überschuss von Signalen führen. Es ist daher zu prüfen, ob die K- und die D-Linie sich in einem Kreuzungssignal befinden.

  3. Der Hall-Indikator wird in Kombination mit dem Zufalls-Indikator verwendet, und wenn die Parameter nicht korrekt abgestimmt sind, kann ein falsches Signal erzeugt werden.

  4. Eine zu große oder zu kleine Bahnbreite beeinträchtigt die Qualität des Handelssignals und erfordert sorgfältige Tests, um die optimalen Parameter zu finden.

  5. Die jüngsten Ereignisse sind unbeständig, und die mittleren und langen Indikatoren könnten nicht gut funktionieren.

  6. Data mismatches between hull and stoch causing false signals

  7. Sharp trend changes not caught by hull can cause losses

  8. Testing on more timeframes/symbols needed to verify robustness

Für diese Risiken können Optimierungen in folgenden Punkten vorgenommen werden:

  1. Eine angemessene Verkürzung der Länge des Hall-Indikators erhöht die Empfindlichkeit für Trendänderungen.

  2. Optimierung der Parameter für die Zufallsindikatoren, um falsche Signale zu reduzieren.

  3. Anpassung der Auf- und Abfahrtparameter auf die optimale Durchgangsbreite.

  4. Hinzufügen von Signalen zur Überprüfung anderer Indikatoren, wie MACD usw.

  5. Erhöhung der Stop-Loss-Strategie zur Risikokontrolle.

Optimierungsrichtung

Die Strategie kann auch in folgenden Bereichen optimiert werden:

  1. Test mehr Sorten und mehr Zeitzyklusparameter, um die Stabilität der Strategie zu überprüfen.

  2. Erhöhung der Stop-Loss-Mechanismen. So können Risiken besser kontrolliert werden, z. B. Schleppschaden, mobile Stop-Loss usw.

  3. Optimierung der Logik der Eintrittsbedingungen, strengere Filterbedingungen und weniger Falschsignale.

  4. Es wird untersucht, wie der Hall-Indikator-Kanal zur besseren Bestimmung von Unterstützungs- und Widerstandspunkten eingesetzt werden kann.

  5. Es wird geprüft, ob die Bestätigungssignale für andere Indikatoren verwendet werden können.

  6. Parameteroptimierung. Optimierung von Parametern wie der Länge des Hall-Parameters, des Zufalls-Parameters K, der Glättungsparameter von D usw.

  7. Positionsverwaltung erweitert. Positionsgröße angepasst, je nach Anzahl der Rücknahmen und Gewinnen in Folge.

  8. Ein zusätzlicher Stop-Loss- und Stop-Stop-Regel.

  9. Optimize hull length parameter for better trend sensitivity

  10. Add additional filters or confirming indicators to improve signal quality

  11. Explore using hull bands to identify dynamic support/resistance levels

  12. Parameter optimization for stoch RSI lengths, overbought/oversold levels

  13. Introduce better position sizing and risk management rules

Zusammenfassen

Insgesamt ist es eine gute Idee, die Strategie zu integrieren, um Trends zu beurteilen und Überkauf-Überverkauf-Urteile zu treffen. Die Handelssignale sind jedoch aufgrund von Problemen mit den Indikatoren selbst nicht vollständig zuverlässig und müssen weiter optimiert werden. Die Wirkung der Strategie ist zu erwarten, wenn die beste Kombination von Parametern gefunden und mit anderen validierten Indikatoren und Risikokontrollen unterstützt wird.

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