Chiến lược giao dịch kết hợp trung bình động và chỉ số RSI ngẫu nhiên

Tác giả:ChaoZhang, Ngày: 2023-10-18 12:40:23
Tags:

img

Tổng quan

Chiến lược này sử dụng trung bình động Hull để xác định hướng xu hướng và kết hợp nó với chỉ số RSI Stochastic cho các tín hiệu nhập cảnh. Các giao dịch dài được thực hiện khi đường trung tâm HMA vượt qua trên đường dưới, và các giao dịch ngắn khi nó vượt qua dưới đường trên. Ngoài ra, các giao dịch dài được nhập khi đường RSI Stochastic K vượt qua dưới đường D từ vùng mua quá mức, trong khi các giao dịch ngắn được nhập trên các đường vượt qua trên vùng bán quá mức.

Chiến lược logic

Các thành phần chính của chiến lược này là Trung bình Di chuyển Hull cho hướng xu hướng và chỉ số RSI Stochastic cho các tín hiệu nhập cảnh thời gian.

Đầu tiên, tính toán Hull MA bao gồm công thức cho các dải giữa, trên và dưới. Dải giữa sử dụng đường trung bình động cân nhắc, trong khi các dải trên và dưới được dịch chuyển từ đường giữa.

Hướng xu hướng được xác định bởi mối quan hệ giữa dải giữa và dải trên / dưới. Một đường chéo lên của đường giữa cho thấy áp lực mua và xu hướng tăng, trong khi một đường chéo xuống báo hiệu tăng áp lực bán và xu hướng giảm.

Tính toán Stochastic RSI cũng được xác định, bao gồm các giá trị Smoothed K và D. Giá trị K sử dụng một SMA smoothing trên RSI, trong khi giá trị D là một SMA smoothing thứ hai trên K.

Sau khi định hướng xu hướng, giao dịch dài được thực hiện khi đường Stoch RSI K vượt qua dưới đường D từ khu vực mua quá mức trong một xu hướng tăng.

Kết hợp bộ lọc xu hướng Hull và Stoch RSI quá mua / quá bán phân tích cung cấp một cách tiếp cận đa yếu tố mạnh mẽ để tham gia giao dịch.

Ưu điểm

Lợi ích chính của chiến lược này là:

  1. Hull MA xác định hiệu quả hướng xu hướng thị trường tổng thể.

  2. Stoch RSI xác định mức mua quá mức / bán quá mức cho các mục thời gian.

  3. Sử dụng cả hai cùng nhau làm giảm tín hiệu sai và kết hợp các điểm mạnh.

  4. Tính linh hoạt để tối ưu hóa các tham số cho các biểu tượng và khung thời gian khác nhau.

  5. Các dải thân xác xác định khả năng hỗ trợ và kháng động tiềm năng.

  6. Bao gồm các quy tắc về kích thước vị trí và quản lý rủi ro.

  7. Khả năng đa năng thông qua từ điển dữ liệu thân tàu.

  8. Các thành phần có thể tối ưu hóa để cải thiện lợi nhuận và giảm sử dụng.

Rủi ro

Một số rủi ro cần xem xét:

  1. Hull MA có sự chậm trễ và có thể bỏ lỡ những thay đổi xu hướng.

  2. Stoch RSI có thể tạo ra các tín hiệu quá mức nếu các thông số không được tối ưu hóa.

  3. Sự không phù hợp giữa các thông số Hull và Stoch có thể gây ra tín hiệu xấu.

  4. Các dải thân quá rộng hoặc hẹp sẽ ảnh hưởng đến chất lượng tín hiệu.

  5. Các thị trường biến động gần đây thách thức các chỉ số trung hạn / dài hạn.

  6. Dữ liệu không phù hợp giữa Hull và Stoch gây ra tín hiệu sai.

  7. Sự thay đổi xu hướng mạnh mà Hull không nhận ra có thể gây ra tổn thất.

  8. Cần mở rộng thử nghiệm trên nhiều khung thời gian và biểu tượng.

Một số cách để giải quyết:

  1. Giảm chiều dài MA Hull để có độ nhạy xu hướng cao hơn.

  2. Tối ưu hóa Stoch RSI để lọc các chữ thập giả.

  3. Tìm ra chiều rộng kênh Hull band tối ưu.

  4. Thêm các chỉ số xác nhận bổ sung như MACD.

  5. Bao gồm các chiến lược dừng lỗ để kiểm soát rủi ro.

Cơ hội tối ưu hóa

Một số cách để cải thiện chiến lược này:

  1. Kiểm tra nhiều biểu tượng hơn trên các khung thời gian khác nhau để xác minh độ bền.

  2. Kết hợp cơ chế dừng lỗ như dừng lại hoặc trung bình động.

  3. Tối ưu hóa các quy tắc nhập cảnh, thiết lập các bộ lọc nghiêm ngặt hơn để giảm tín hiệu sai.

  4. Khám phá việc sử dụng các dải Hull để xác định tốt hơn hỗ trợ và kháng cự.

  5. Đánh giá các chỉ số xác nhận bổ sung để cải thiện độ tin cậy tín hiệu.

  6. Tối ưu hóa tham số cho chiều dài, mức mua quá mức / bán quá mức, vv.

  7. Đưa ra quy mô vị trí và quản lý rủi ro tốt hơn.

  8. Thêm vào, dừng lỗ và lấy lợi nhuận quy tắc thiết yếu cho giao dịch trực tiếp.

  9. Tối ưu hóa chiều dài thân tàu để có độ nhạy xu hướng tốt hơn.

  10. Thêm bộ lọc hoặc chỉ số xác nhận để cải thiện chất lượng tín hiệu.

  11. Khám phá các dải vỏ để tìm mức hỗ trợ / kháng động.

  12. Tối ưu hóa các thông số Stoch RSI như dài, mua quá mức / bán quá mức.

  13. Thực hiện quy mô vị trí tiên tiến và quản lý rủi ro.

Kết luận

Tuy nhiên, các điểm yếu của chỉ số vốn có có nghĩa là các tín hiệu không nên được tin tưởng một cách mù quáng mà không cần tối ưu hóa và kiểm soát rủi ro thêm. Với các thông số tinh chỉnh, bộ lọc bổ sung và dừng lỗ, chiến lược này mang lại tiềm năng.


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

Thêm nữa