Chiến lược đảo ngược Hulk Retracement


Ngày tạo: 2023-10-17 15:23:49 sửa đổi lần cuối: 2023-10-17 15:23:49
sao chép: 0 Số nhấp chuột: 697
1
tập trung vào
1617
Người theo dõi

Chiến lược đảo ngược Hulk Retracement

Tổng quan

Chiến lược kéo ngược King of Spades là một chiến lược sử dụng các chỉ số như đường trung bình, MACD, RSI và ADX để nắm bắt xu hướng và đảo ngược, trong giai đoạn kéo ngược. Nó được sử dụng đặc biệt cho các vị vua của loại Radical, sử dụng các tính năng kéo ngược phổ biến của nó để thực hiện các hoạt động đảo ngược.

Nguyên tắc chiến lược

Chiến lược này sử dụng đường trung bình của EMA để xác định hướng của xu hướng tổng thể và xây dựng khu vực yếu mạnh của xu hướng. Khi giá từ khu vực mạnh trở lại khu vực yếu, chiến lược xác định xu hướng có cơ hội đảo ngược.

Để lọc sai lầm, chiến lược thêm chỉ số MACD để đánh giá tín hiệu đảo ngược ngắn hạn. Khi giá trị tuyệt đối của MACD lớn hơn một mức độ nhất định, cho rằng cơ hội đảo ngược tăng lên. Đồng thời, yêu cầu giá trị ADX cao hơn một mức độ nhất định, đảm bảo rằng hiện tại đang ở thị trường xu hướng chứ không phải là thị trường tổng hợp.

Cuối cùng, chỉ số RSI hoạt động để tránh mua vào khu vực quá mua và bán khu vực quá bán. Chỉ khi giá trị RSI bị giới hạn trong một phạm vi nhất định, tín hiệu sẽ được tạo ra.

Mỗi lần giao dịch EMA trung bình, số giao dịch chiến lược được xóa bằng 0. Ngoài ra, bạn có thể đặt số giao dịch tối đa cho mỗi lần giao dịch để tránh giao dịch lặp lại.

Khi điều kiện được đáp ứng, đặt lệnh theo tỷ lệ dừng lỗ và dừng lại, giao dịch đảo ngược.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là sử dụng các khu vực yếu mạnh được xây dựng bởi EMA để nắm bắt các tính năng kéo lùi của các nhà lãnh đạo cực đoan. Việc sử dụng nhiều bộ lọc chỉ số để lọc sự xâm nhập sai lệch, độ tin cậy cao.

Chiến lược này, kết hợp với sự phán đoán xu hướng, có thể giảm sự đảo ngược không cần thiết so với chỉ số chấn động đơn lẻ. Đồng thời kiểm soát số lượng giao dịch tối đa mỗi lần giao dịch EMA, có thể tránh tổn thất lớn khi giao dịch lặp lại.

Phân tích rủi ro

Rủi ro lớn nhất của chiến lược này nằm ở trường hợp vua ngọc không rút lui. Nếu vua ngọc trực tiếp phá vỡ EMA và tiếp tục tăng hoặc giảm, chiến lược này sẽ tạo ra tín hiệu sai và quay ngược. Tại thời điểm này, cần dừng lỗ để kiểm soát tổn thất.

Ngoài ra, tham số chỉ số không hợp lý cũng có thể dẫn đến giảm chất lượng tín hiệu. Cần thử nghiệm lặp lại các tham số tối ưu hóa để phù hợp với các tình huống thị trường khác nhau.

Cuối cùng, việc thiết lập mức dừng quá lớn hoặc tiếp tục chấn động mạnh sau khi đảo ngược có thể làm tăng tổn thất đơn lẻ. Điều này đòi hỏi phải dừng hợp lý và quản lý rủi ro mạnh mẽ hơn.

Hướng tối ưu hóa

Chiến lược này có thể được tối ưu hóa bằng cách:

  1. Thử nghiệm các thị trường khác nhau và các tham số để EMA có thể đánh giá chính xác hơn các xu hướng;

  2. Tối ưu hóa các tham số MACD để làm cho tín hiệu đảo ngược chính xác và đáng tin cậy hơn;

  3. Điều chỉnh phạm vi RSI để tránh các khu vực quá mua quá bán quá mạnh;

  4. Tối ưu hóa tỷ lệ dừng lỗ và giảm rủi ro lỗ đơn.

Tóm tắt

Chiến lược quay ngược King King được thực hiện để quay ngược đặc biệt cho các đặc điểm quay ngược của King King cực đoan, có thể nắm bắt hiệu quả cơ hội đảo ngược ngắn hạn. Nó sử dụng nhiều bộ lọc EMA để xác định hướng và sức mạnh của xu hướng; và sử dụng các chỉ số như MACD, RSI để xác nhận nhập cảnh, độ tin cậy cao.

Mã nguồn chiến lược
/*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)