Hulk Retracement Reversal-Strategie


Erstellungsdatum: 2023-10-17 15:23:49 zuletzt geändert: 2023-10-17 15:23:49
Kopie: 0 Klicks: 697
1
konzentrieren Sie sich auf
1617
Anhänger

Hulk Retracement Reversal-Strategie

Überblick

Die Rückzieher-Rückzieher-König-Strategie ist eine Strategie, bei der die Trendwende in der Rückziehphase mit Hilfe von Kennzahlen wie der Mittellinie, MACD, RSI und ADX erfasst wird. Sie richtet sich speziell an die Radikalen-Könige und nutzt die üblichen Rückzieher-Eigenschaften für die Umkehroperation.

Strategieprinzip

Die Strategie nutzt die EMA-Gleichung, um die Richtung des Gesamttrends zu bestimmen, und um Trendstärken zu konstruieren. Wenn der Preis von einer starken Zone in eine schwache Zone zurückgezogen wird, wird die Strategie die Möglichkeit einer Trendwende beurteilen.

Um Fehltritte zu filtern, wird die Strategie in die MACD-Anzeige aufgenommen, um ein kurzfristiges Umkehrsignal zu beurteilen. Die MACD-Absolutewerte werden größer als ein gewisses Maß betrachtet, um die Chance auf eine Umkehr zu erhöhen. Gleichzeitig wird die ADX-Wertung höher als ein gewisses Niveau verlangt, um sicherzustellen, dass die aktuelle Situation in einem Trendmarkt und nicht in einem Faltmarkt ist.

Schließlich ist der RSI-Indikator dazu da, um zu vermeiden, in Überkaufzonen zu kaufen und in Überverkaufzonen zu verkaufen. Der RSI-Wert erzeugt nur dann ein Signal, wenn er in einer bestimmten Bandbreite begrenzt ist.

Bei jedem EMA-Gewinnkreuz wird die Strategie mit Null gehandelt. Die maximale Anzahl der Transaktionen pro Kreuzung kann festgelegt werden, um Wiederholungen zu vermeiden.

Wenn die Bedingungen erfüllt sind, wird ein Auftrag nach Stop-Loss-Verhältnis festgelegt und ein Umkehrhandel durchgeführt.

Analyse der Stärken

Der größte Vorteil dieser Strategie besteht darin, die von der EMA erstellten Schwachstellen zu nutzen, um die Rückzugsmerkmale des radikalen Weichen Königs zu erfassen. Die Verwendung von mehreren Indikatoren filtert Fehlinteressen und ist zuverlässig.

Die Strategie, die Trendbeurteilung im Vergleich zu einem einzigen Swing-Indikator beinhaltet, reduziert unnötige Umkehrungen. Gleichzeitig wird die maximale Anzahl von Geschäften, die bei jeder EMA-Kreuzung erfolgen, kontrolliert, um zu vermeiden, dass wiederholte Geschäfte zu hohen Verlusten führen.

Risikoanalyse

Das größte Risiko besteht darin, dass der König nicht zurückzieht. Wenn der König die EMA direkt durchbricht und weiter steigt oder fällt, erzeugt die Strategie ein falsches Signal und geht rückwärts.

Außerdem können unzumutbare Kennzahlen zu einer Verringerung der Signalqualität führen. Optimierungsparameter müssen wiederholt getestet werden, um sie für verschiedene Marktbedingungen geeignet zu machen.

Schließlich kann ein zu hoher Stop-Loss-Wert oder eine weitere Radikalisation nach der Umkehrung die Einzelschäden vergrößern. Dies erfordert einen angemessenen Stop-Loss und ein stärkeres Risikomanagement.

Optimierungsrichtung

Diese Strategie kann optimiert werden durch:

  1. Die EMA hat sich bemüht, die Entwicklung der Märkte und der Parameter zu erforschen, damit sie Trends besser beurteilen kann.

  2. Optimierung der MACD-Parameter, um die Umkehrsignale genauer und zuverlässiger zu machen;

  3. Die RSI-Parameter werden angepasst, um zu aggressive Überkauf-Überverkaufszonen zu vermeiden.

  4. Optimierung der Stop-Loss-Stopp-Ratio und Verringerung des Einmalverlustrisikos.

Zusammenfassen

Die Rückwärts-Rückwärts-Rückwärts-Rückwärts-Strategie ist speziell für die Rückwärtsbewegung der Radikalen-Rückwärts-König-Charakteristik konzipiert und kann kurzfristige Rückwärts-Gelegenheiten effektiv ergreifen. Sie verwendet mehrere EMA-Filter, um die Richtung und die Stärke des Trends zu bestimmen; und mit MACD, RSI und anderen Indikatoren für die Eintrittsbestätigung ist die Zuverlässigkeit hoch. Durch Parametertest und -Optimierung kann sie sich an verschiedene Marktumstände anpassen.

Strategiequellcode
/*backtest
start: 2023-09-16 00:00:00
end: 2023-10-16 00:00:00
period: 3h
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/
// © npietronuto1

//@version=5
strategy("Hulk Scalper x35 Leverage", shorttitle = "Smash Pullback Strat", overlay=true, initial_capital=100, default_qty_type=strategy.percent_of_equity, default_qty_value=100)


//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//RSI
rsiLength = input.int(20)
RsiTopInput = input.int(2)
RsiBotInput = input.int(-2)

// toprsiLine = hline(RsiTopInput, title = "Rsi Top Line", linestyle = hline.style_solid)
// botrsiLine = hline(RsiBotInput, title = "Rsi Bottom Line", linestyle = hline.style_solid)

rsi = ta.rsi(close, rsiLength)
rsiWeighted = rsi - 50 //Zeros Rsi to look nicer


//------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
adxlen = input(14, title="ADX Smoothing")
dilen = input(14, title="DI Length")
dirmov(len) =>
	up = ta.change(high)
	down = -ta.change(low)
	plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
	minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
	truerange = ta.rma(ta.tr, len)
	plus = fixnan(100 * ta.rma(plusDM, len) / truerange)
	minus = fixnan(100 * ta.rma(minusDM, len) / truerange)
	[plus, minus]
adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
sig = adx(dilen, adxlen)

ADXfilterlevel = input.int(33, title = "ADX filter amount")

// plot(sig, color=color.red, title="ADX")
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//MACD
FastMacdLength = input.int(12, group = "MACD") 
SlowMacdLength = input.int(26, group = "MACD")
SignalLength = input.int(11, group = "MACD")
MacdTickAmountNeeded = input.float(5.45, title = "Tick Amount for entry", group = "MACD")

res = input.timeframe("1", group = "MACD")


// bullishgrow_col = input.color(defval = #3179f5)
// bullishweaken_col = input.color(defval = #00e1ff)
// bearishweaken_col = input.color(defval = #ff01f1)
// bearishgrow_col = input.color(defval = #9d00e5)


[FastMacd, SlowMacd, Macdhist] = ta.macd(close, FastMacdLength, SlowMacdLength, SignalLength)

//Pull MACD from Lower timeframe
MACD = request.security(syminfo.tickerid, res, Macdhist, gaps = barmerge.gaps_on)


//Grow and Fall Color
// getgrow_fall_col(Value) =>
//     if Value >= 0
    
//         if Value >= Value[1]
//             color.new(bullishgrow_col, transp = 10)
            
//         else if Value <= Value[1]
//             color.new(bullishweaken_col, transp = 10)
            
//     else if Value <= 0
    
//         if Value <= Value[1]
//             color.new(bearishgrow_col, transp = 10)
            
//         else if Value >= Value[1]
//             color.new(bearishweaken_col, transp = 10)
            
    
    
//CONDITIONS that check if MACD is overbought or oversold
MACDisAboveBand = MACD > MacdTickAmountNeeded
MACDisBelowBand = MACD < MacdTickAmountNeeded*-1
    
    
    
//Plot
// plot(MACD, style = plot.style_columns, color = getgrow_fall_col(MACD))
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------






//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//EMAs
//Inputs
EmaFastLength = input.int(50, title = "Ema Fast Length")
EmaSlowLength = input.int(200, title = "Ema Slow Length")

StrongUpTrendCol = input.color(color.rgb(74, 255, 163))
//WeakUptrend = input.color(color.rgb(74, 255, 163, 50))
StrongDownTrendCol = input.color(color.rgb(255, 71, 84))
//WeakDownTrend = input.color(color.rgb(255, 71, 84, 50))

//Calculations


emaFast= ta.ema(close, EmaFastLength)

emaSlow= ta.ema(close, EmaSlowLength)

emaDist=emaFast-emaSlow
EmaLengthFraction = emaDist/4

emafrac5 = emaSlow + EmaLengthFraction
emafrac4 = emaSlow + EmaLengthFraction*2
emafrac3 = emaSlow + EmaLengthFraction*3
emafrac2 = emaSlow + EmaLengthFraction*4


UptrendCol_DowntrendCol= emaFast>=emaSlow ? StrongUpTrendCol:StrongDownTrendCol
//Plot
ema1p = plot(emaFast, color = color.new(#000000, transp = 100))
ema2p = plot(emafrac2, color = color.new(#000000, transp = 100))
ema3p = plot(emafrac3, color = color.new(#000000, transp = 100))
ema4p = plot(emafrac4, color = color.new(#000000, transp = 100))
ema5p = plot(emafrac5, color = color.new(#000000, transp = 100))
ema6p = plot(emaSlow, color = color.new(#000000, transp = 100))


fill(ema2p,ema3p, color = color.new(UptrendCol_DowntrendCol, 70))
fill(ema3p,ema4p, color = color.new(UptrendCol_DowntrendCol, 60))
fill(ema4p,ema5p, color = color.new(UptrendCol_DowntrendCol, 50))
fill(ema5p,ema6p, color = color.new(UptrendCol_DowntrendCol, 40))


//Conditons
FastEma_above_SlowEma = emaFast > emaSlow  
FastEma_below_SlowEma = emaFast < emaSlow

emaCrossEvent = ta.crossover(emaFast, emaSlow) or ta.crossover(emaSlow, emaFast)





//------------------------------------------------------------------------------------------------------------------------------------------------------------------------





//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//Trade Cap per EMA X
//Inputs
MaxTrades_PerCross_Checkbox = input.bool(true, "Limit Trades Per Cross", group = "Filters")



TrdCount = 0//Variable that keeps current trade count

if(TrdCount[1] > 0)//Passes variable on to current candle
    TrdCount := TrdCount[1]
    
    
//Reset trade count if EMAs X    
emaXevent = ta.crossover(emaFast, emaSlow) or ta.crossover(emaSlow, emaFast) // Check for EMA cross
if(emaXevent)
    TrdCount := 0
    

//Conditions
MaxTrades = input.int(6)

IsMaxTrades_BelowCap = TrdCount[1] < MaxTrades //Condition that applies max trade count

if(not MaxTrades_PerCross_Checkbox)
    IsMaxTrades_BelowCap := true
//------------------------------------------------------------------------------------------------------------------------------------------------------------------------




//------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//STRATEGY LOGIC

//Parameters
TakeProfitInput = input.float(0.0135, title = "Take Profit %", group = "TP/SL")
StopLossInput = input.float(0.011, title = "Stop Loss %", group = "TP/SL")


//TP/SL calculations
Long_takeProfit = close * (1 + TakeProfitInput)
Long_stopLoss = close * (1 - StopLossInput)

Short_takeProfit = close * (1 - TakeProfitInput)
Short_stopLoss = close * (1 + StopLossInput)


//LONG and Short
LongConditionPt1 = close > emaSlow and MACDisBelowBand and  sig > ADXfilterlevel
LongConditionPt2 = FastEma_above_SlowEma and IsMaxTrades_BelowCap and strategy.position_size == 0
//Checks if Rsi Inbetween Lines
LongConditionPt3 = rsiWeighted < RsiTopInput and rsiWeighted > RsiBotInput



ShortConditionPt1 = close < emaSlow and MACDisAboveBand and sig > ADXfilterlevel
ShortConditionPt2 = FastEma_below_SlowEma and IsMaxTrades_BelowCap and strategy.position_size == 0
//Checks if Rsi Inbetween Lines
ShortConditionPt3 = rsiWeighted < RsiTopInput and rsiWeighted > RsiBotInput





// longCondition = FastEma_above_SlowEma and MACDisBelowBand and IsMaxTrades_BelowCap and rsiWeighted < RsiTopInput and strategy.position_size == 0
longCondition = LongConditionPt1 and LongConditionPt2 and LongConditionPt3
if(longCondition)

    strategy.entry("long", strategy.long)
    strategy.exit("exit", "long", limit = Long_takeProfit, stop = Long_stopLoss)
    
    TrdCount := TrdCount + 1//ADD to Max Trades Count
    
    alert("Go Long with TP at" + str.tostring(Long_takeProfit) + "and SL at" + str.tostring(Long_stopLoss), alert.freq_once_per_bar_close)





shortCondition = ShortConditionPt1 and ShortConditionPt2 and ShortConditionPt3
if(shortCondition )
    
    strategy.entry("short", strategy.short)
    strategy.exit("exit", "short", limit = Short_takeProfit, stop = Short_stopLoss)

    TrdCount := TrdCount + 1 //ADD to Max Trades Count
    
    alert("Go Short with TP at" + str.tostring(Short_takeProfit) + "and SL at" + str.tostring(Short_stopLoss), alert.freq_once_per_bar_close)