Chiến lược giao dịch xu hướng EMA và RSI

Tác giả:ChaoZhang, Ngày: 2023-09-20 14:21:16
Tags:

Tổng quan

Chiến lược này kết hợp các chỉ số EMA và RSI để xác định hướng xu hướng và đưa ra quyết định giao dịch. Nó đi dài khi giá trên EMA và RSI dưới điểm mua, và đi ngắn khi giá dưới EMA và RSI trên điểm bán. Nó cũng sử dụng mối quan hệ giữa hai lần đóng nến cuối cùng để xác định hướng xu hướng cho giao dịch xu hướng.

Chiến lược logic

  1. Tính toán 200 ngày EMA như là chỉ số đường xu hướng. EMA phản ứng nhanh chóng với sự thay đổi giá và xác định hiệu quả hướng xu hướng.

  2. Tính toán chỉ số RSI 14 ngày để đánh giá các điều kiện mua quá mức và bán quá mức. Chỉ số RSI dưới 50 được coi là bán quá mức, trong khi trên 50 là mua quá mức. Cũng sử dụng xu hướng tăng hoặc giảm của chỉ số RSI để xác định thời gian vào và ra.

  3. So sánh mối quan hệ kích thước giữa hai lần đóng nến cuối cùng để xác định hướng xu hướng.

  4. Khi trong một xu hướng tăng, giá trên 200 ngày EMA, và RSI dưới 50 và tăng, một tín hiệu mua được tạo ra.

  5. Khi trong xu hướng giảm, giá dưới đường EMA 200 ngày, và chỉ số RSI trên 50 và giảm, một tín hiệu bán được tạo ra.

  6. ATR và giá cao nhất / thấp nhất của 14 ngọn nến cuối cùng được sử dụng để tính stop loss và take profit.

  7. Dùng chiến lược dừng lại để quản lý rủi ro.

Phân tích lợi thế

  1. Sự kết hợp của hai chỉ số cải thiện độ chính xác trong việc xác định hướng xu hướng. EMA đánh giá xu hướng chính và mối quan hệ RSI&Candle đánh giá xu hướng địa phương và thời gian vào / ra.

  2. RSI có hiệu quả tránh phá vỡ sai. tình trạng mua quá mức / bán quá mức RSI tránh các giao dịch không cần thiết do EMA chậm lại.

  3. Chặn sau hiệu quả kiểm soát tổn thất gây ra bởi biến động âm thanh lớn đôi khi.

  4. Sự kết hợp các tham số tối ưu hóa tăng cường độ bền.

Phân tích rủi ro

  1. EMA và RSI có khả năng tạo ra các tín hiệu không chính xác trong các thị trường chiều cao lớn, nên tránh.

  2. Mất dừng quá chật sẽ gây ra dừng thường xuyên trong khi mất dừng quá rộng không thể kiểm soát mất mát.

  3. Khả năng rút lui sau khi đột phá là cao. Parameter RSI nên được thư giãn để tránh mất xu hướng.

Hướng dẫn cải thiện

  1. Điều chỉnh tham số ATR và khoảng cách dừng để tìm điểm dừng mất mát tốt hơn.

  2. Tối ưu hóa các thông số EMA và RSI để tìm kết hợp các thông số tốt hơn.

  3. Thêm các chỉ số khác để lọc, như MACD, Bollinger Bands vv, để cải thiện độ chính xác tín hiệu.

  4. Sự khác biệt trong các thông số thử nghiệm giữa các sản phẩm khác nhau để tăng cường độ bền hơn nữa.

  5. Cố gắng vô hiệu hóa chiến lược trong khoảng thời gian cụ thể để tránh các giờ tín hiệu sai.

Tóm lại

Chiến lược tổng thể khá ổn định với lợi nhuận ổn định, tỷ lệ rút tối đa và tỷ lệ Sharpe. Nó có thể được cải thiện hơn nữa bằng cách tối ưu hóa tham số và điều chỉnh dừng lỗ. Ngoài ra cần phải cảnh giác với các tín hiệu sai trong điều kiện thị trường cụ thể và tránh chúng thông qua các chỉ số phụ trợ hoặc bộ lọc thời gian. Chiến lược này có tiềm năng trở thành một chiến lược ổn định dài hạn thông qua tối ưu hóa liên tục.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-08-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// strategy("EMA RSI Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=1)


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Author       : AJ Rupasinghege
// Date         : 06/11/2022
// Release      : v6.0
// Description  : If the last two closes are in ascending order, the rsi is below 50 and ascending, and the current candle is above 200 ema, then LONG. 
//                If the last two closes are in descending order, the rsi is above 50 and descending, and the current candle is below 200 ema, then SHORT. 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// INPUTS //////////////////////////////////////////////////////////////

ema_length = input(200, "EMA Length")
rsi_buy_value = input(50, "RSI Buy Value")
rsi_sell_value = input(50, "RSI Sell Value")
show_data = input.bool(0, "Show Data")


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// VARIABLES //////////////////////////////////////////////////////////

var stop_loss = 0.0
var last_trade_entry_price = 0.0
var low_value= 0.0
var atr = 0.0
var high_value = 0.0
var stop_loss_points = 0.0
var limit = 0.0
var bar_id_entry = 0


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// FUNCTIONS //////////////////////////////////////////////////////////

getTradeConditionsLong() =>
    //@function         Used to calculate stop_loss, stop_loss points, limit and label values for long trades
    //@param direction  (float) // strategy.poistion.size
    //@returns          stop_loss, stop_loss_points, limit
    //@Dependancies     low_value, atr, last_trade_entry_price,bar_id_entry
    _stop_loss = low_value - atr
    _stop_lossPoints = (last_trade_entry_price - _stop_loss) *100000
    _limit = last_trade_entry_price + (last_trade_entry_price - low_value + atr) 
    value = "OpenValue: " + str.tostring(last_trade_entry_price) + 
         "\n OpenBarIndex: " + str.tostring(bar_id_entry) + 
         "\n LowValue: " + str.tostring(low_value) + 
         "\n atr: " + str.tostring(atr) + "\n stop_loss: " + 
         str.tostring(_stop_loss) + "\n Limit: " +
         str.tostring(_limit)

    [_stop_loss,_stop_lossPoints,_limit, value]

getTradeConditionsShort() =>
    //@function         Used to calculate stop_loss, stop_loss points, limit and label values for short trades
    //@param direction  (float) // strategy.poistion.size
    //@returns          stop_loss, stop_loss_points, limit
    //@Dependancies     high_value, atr, last_trade_entry_price,bar_id_entry
    _stop_loss = high_value + atr
    _stop_lossPoints = (_stop_loss  -last_trade_entry_price) * 100000
    _limit = last_trade_entry_price - (high_value - last_trade_entry_price + atr)
    value = "OpenValue: " + str.tostring(last_trade_entry_price) + 
         "\n OpenBarIndex: " + str.tostring(bar_id_entry) + 
         "\n HighValue: " + str.tostring(high_value) + 
         "\n atr: " + str.tostring(atr) + "\n stop_loss: " + 
         str.tostring(_stop_loss)  + "\n Limit: " +
         str.tostring(_limit)
    [_stop_loss,_stop_lossPoints,_limit, value]




/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// SIGNALS //////////////////////////////////////////////////////////

ema = ta.ema(close,ema_length)
rsi = ta.rsi(close,14)

ema_buy_signal = ema < low
ema_sell_signal = ema > high


rsi_buy_signal = rsi < rsi_buy_value and rsi[1] < rsi[0]
rsi_sell_signal = rsi > rsi_sell_value and rsi[1] > rsi[0]

trend_buy_signal = close[2] < close[1] and close[1] < close[0]
trend_sell_signal = close[2] > close[1] and close[1] > close[0]

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// TRADES //////////////////////////////////////////////////////////
long = trend_buy_signal 
         and ema_buy_signal 
         and rsi_buy_signal
short = trend_sell_signal 
         and ema_sell_signal  
         and rsi_sell_signal

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// STRATEGY //////////////////////////////////////////////////////////



if long 
    strategy.entry("Long", strategy.long)

if short 
    strategy.entry("Short", strategy.short)
   

// Calculate Trade Entry Variables
last_trade_entry_price := strategy.opentrades.entry_price(strategy.opentrades - 1)
bar_id_entry := strategy.opentrades.entry_bar_index(strategy.opentrades - 1) 
atr := ta.atr(14) 
low_value := ta.lowest(14)
high_value := ta.highest(14)


// Exit Strategy for Long Positions 
if (strategy.position_size[1] != strategy.position_size and strategy.position_size>0)
    [_stop_loss,_stop_loss_points, _limit, value] = getTradeConditionsLong()
    stop_loss := _stop_loss
    stop_loss_points := _stop_loss_points
    limit := _limit
    

    if show_data
        label.new(bar_id_entry,stop_loss - 0.005,str.tostring(value),xloc = xloc.bar_index,yloc = yloc.price,style = label.style_none) 
    strategy.exit("Long Exit", "Long", trail_offset = stop_loss_points/2, trail_points = stop_loss_points/2 , stop = stop_loss , limit = limit   )


// Exit Strategy for Short Positions 
if (strategy.position_size[1] != strategy.position_size and strategy.position_size<0)
    [_stop_loss,_stop_loss_points, _limit, value] = getTradeConditionsShort()
    stop_loss := _stop_loss
    stop_loss_points := _stop_loss_points
    limit := _limit

    if show_data
        label.new(bar_id_entry,stop_loss + 0.005,str.tostring(value),xloc = xloc.bar_index,yloc = yloc.price,style = label.style_none) 
    strategy.exit("Short Exit", "Short", trail_offset = stop_loss_points/2, trail_points = stop_loss_points/2 , stop = stop_loss , limit = limit )


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////// PLOTS //////////////////////////////////////////////////////////

plot(ema, "SMA", color = color.blue, linewidth = 2 )


p1 = plot(strategy.position_size>0? stop_loss:na, style = plot.style_linebr , color = color.rgb(82, 240, 42) )
p2 = plot(strategy.position_size<0? stop_loss:na, style = plot.style_linebr , color = color.rgb(223, 85, 85) )
p3 = plot(strategy.position_size!=0?limit : na, style = plot.style_linebr , color = color.rgb(94, 85, 223, 100) )


fill(p1, p3, color = color.new(color.green, 90))
fill(p2, p3, color = color.new(#e98787, 90))

Thêm nữa