Chiến lược giao dịch theo xu hướng dựa trên EMA và RSI


Ngày tạo: 2023-09-20 14:21:16 sửa đổi lần cuối: 2023-09-20 14:21:16
sao chép: 0 Số nhấp chuột: 894
1
tập trung vào
1617
Người theo dõi

Tổng quan

Chiến lược này kết hợp hai chỉ số EMA và RSI để xác định hướng xu hướng và thực hiện giao dịch. Khi giá ở trên EMA và RSI thấp hơn điểm mua, giá sẽ tăng; Khi giá ở dưới EMA và RSI cao hơn điểm bán, giá sẽ giảm.

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

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

  2. Tính RSI 14 ngày để xác định xem có quá mua hay quá bán không. RSI thấp hơn 50 được coi là quá bán, cao hơn 50 được coi là quá mua. Đồng thời kết hợp xu hướng tăng xuống của RSI để xác định thời gian mua và bán.

  3. So sánh giá đóng cửa của hai đường K cuối cùng với tỷ lệ lớn và nhỏ để xác định xu hướng. Hai đường đóng cửa cuối cùng được coi là xu hướng tăng lên và xu hướng giảm.

  4. Một tín hiệu mua được phát ra khi giá trên đường EMA 200 ngày và RSI dưới 50 và tăng.

  5. Một tín hiệu bán được phát ra khi giá đang trong xu hướng giảm, dưới 200 ngày EMA và RSI trên 50 và giảm.

  6. ATR và giá cao nhất, giá thấp nhất của 14 đường K gần đây nhất được sử dụng để tính toán điểm dừng và điểm dừng.

  7. Sử dụng chiến lược dừng lỗ di động để kiểm soát rủi ro.

Phân tích lợi thế

  1. Chỉ số kép kết hợp để xác định hướng xu hướng, tăng độ chính xác. EMA để xác định xu hướng chính, RSI và mối quan hệ đường K để xác định xu hướng địa phương và thời gian mua và bán.

  2. Chỉ số RSI có hiệu quả trong việc tránh phá vỡ giả. Do trạng thái trống rỗng của RSI, nó tránh được các giao dịch không cần thiết do EMA bị tụt lại.

  3. Hạn chế di chuyển có hiệu quả trong việc kiểm soát tổn thất do biến động lớn của một số đơn vị.

  4. Sự kết hợp các tham số được tối ưu hóa làm cho tham số chiến lược trở nên mạnh mẽ hơn.

Phân tích rủi ro

  1. Trong trường hợp dao động lớn, EMA và RSI có khả năng tạo ra tín hiệu sai, nên tránh các trường hợp như vậy.

  2. Điểm dừng quá nhỏ dễ gây ra dừng quá thường xuyên; điểm dừng quá lớn khó kiểm soát tổn thất. Các tham số ATR nên được điều chỉnh thích hợp.

  3. Có nhiều khả năng điều chỉnh lại sau khi phá vỡ EMA vào ban ngày, tại thời điểm này các tham số RSI nên được nới lỏng một cách thích hợp để tránh bỏ lỡ xu hướng.

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

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

  2. Tối ưu hóa các tham số của chỉ số EMA và RSI để tìm các tham số phù hợp hơn.

  3. Thêm các chỉ số phụ trợ khác để lọc, chẳng hạn như MACD, băng tần Brin, để tăng độ chính xác của tín hiệu.

  4. Có thể kiểm tra sự khác biệt của các thiết lập tham số của các giống khác nhau, để tăng thêm sự ổn định của tham số.

  5. Bạn có thể cố gắng tắt chiến lược trong một khoảng thời gian nhất định, tránh các khoảng thời gian có thể tạo ra tín hiệu sai.

Tóm tắt

Chiến lược này khá ổn định, thu nhập ổn định, tối đa rút lui và tỷ lệ Sharp cũng rất tốt. Bằng cách tối ưu hóa tham số và điều chỉnh điểm dừng lỗ, hiệu quả của chiến lược có thể được nâng cao hơn nữa. Đồng thời, cần phải cảnh giác với các tín hiệu sai có thể được tạo ra trong một tình huống cụ thể, bằng cách sử dụng các chỉ số phụ trợ hoặc lọc thời gian để tránh những tình huống này.

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