Xu hướng dựa trên ATR và RSI sau chiến lược giao dịch

Tác giả:ChaoZhang, Ngày: 2023-10-09 15:18:10
Tags:

Tổng quan

Chiến lược này thiết kế một hệ thống giao dịch với chức năng theo xu hướng dựa trên Average True Range (ATR) và Relative Strength Index (RSI). Nó có thể tự động xác định hướng xu hướng và có các tính năng dừng lỗ và lấy lợi nhuận.

Chiến lược logic

  1. Tính toán ATR và RSI. ATR phản ánh sự biến động giá trung bình trong một khoảng thời gian. RSI phản ánh sự so sánh sức mạnh giữa bò và gấu.

  2. Khi ATR lớn hơn trung bình động của nó, nó được coi là một giai đoạn biến động cao phù hợp để giao dịch.

  3. Khi chỉ số RSI ở trên đường mua quá mức, mua dài. Khi chỉ số RSI ở dưới đường bán quá mức, mua ngắn.

  4. Sau khi dài, sử dụng điểm cao nhân tỷ lệ cố định như là giá dừng lỗ sau. Sau khi ngắn, sử dụng điểm thấp nhân tỷ lệ cố định như là giá dừng lỗ sau.

  5. Lấy lợi nhuận theo tỷ lệ lợi nhuận.

Phân tích lợi thế

  1. Việc dừng lỗ có thể tối đa hóa lệnh dừng lỗ để giảm lỗ.

  2. RSI có thể đánh giá hiệu quả sức mạnh của bò và gấu để tránh mở nhiều lần các vị trí trong các thị trường giới hạn phạm vi.

  3. Là một chỉ số biến động, ATR có thể lọc các thị trường giới hạn trong phạm vi và chỉ giao dịch trên các thị trường xu hướng.

  4. Tỷ lệ lợi nhuận theo lợi nhuận có thể khóa trong một số lợi nhuận.

Phân tích rủi ro

  1. Cả ATR và RSI đều là các chỉ số chậm, có thể dẫn đến thời gian nhập muộn. Các tham số có thể được tối ưu hóa để làm cho hệ thống nhạy cảm hơn.

  2. Tỷ lệ lợi nhuận và lỗ cố định cho dừng lỗ và lấy lợi nhuận có xu hướng tối ưu hóa quá mức, nên được thiết lập một cách thận trọng dựa trên kết quả backtest.

  3. Trong các thị trường phạm vi chu kỳ lớn, ATR có thể cao hơn trung bình động trong một thời gian dài, dẫn đến giao dịch quá mức.

Hướng dẫn tối ưu hóa

  1. Tối ưu hóa các thông số của ATR và RSI để làm cho hệ thống nhạy cảm hơn.

  2. Thêm MA và các chỉ số khác để xác định hướng xu hướng, tránh nhầm lẫn vào thị trường giới hạn phạm vi.

  3. Hãy thử dừng lỗ động và lấy tỷ lệ lợi nhuận, thay vì cài đặt cố định.

  4. Xem xét thêm các biện pháp kiểm soát quy mô giao dịch.

Tóm lại

Chiến lược này tích hợp các lợi thế của các chỉ số ATR và RSI và thiết kế một xu hướng đơn giản và thực tế sau hệ thống giao dịch. Cải thiện hơn nữa sự ổn định của hệ thống bằng cách tối ưu hóa các tham số và thêm các bộ lọc. Nhìn chung, chiến lược này có giá trị thực tế mạnh mẽ cho giao dịch trực tiếp.


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

// © liwei666
//@version=5
// # ========================================================================= #
// #                   |   Strategy  |
// # ========================================================================= #
strategy(
 title                = "ATR_RSI_Strategy v2[liwei666]",
 shorttitle           = "ATR_RSI_Strategy",
 overlay              =  true,
 max_lines_count                 =  500, 
 max_labels_count                =  500, 
 max_boxes_count                 =  500,
 max_bars_back = 5000,
 initial_capital = 10000,
 default_qty_type=strategy.percent_of_equity, 
 default_qty_value=50, commission_type=strategy.commission.percent, pyramiding=1, 
 commission_value=0.05
 )
// # ========================================================================= #
// #                   |   Strategy  |
// # ========================================================================= #

atr_length = input.int(26, "atr_length", minval = 6, maxval = 100, step=1)
atr_ma_length = input.int(45, "atr_ma_length", minval = 6, maxval = 100, step=1)
rsi_length = input.int(15, "rsi_length", minval = 6, maxval = 100, step=1)
rsi_entry = input.int(10, "rsi_entry", minval = 6, maxval = 100, step=1)
atr_ma_norm_min = input.float(0.3, "atr_ma_norm_min", minval = 0.1, maxval = 0.5, step=0.1)
atr_ma_norm_max = input.float(0.7, "atr_ma_norm_max", minval = 0.5, maxval = 1, step=0.1)
trailing_percent= input.float(1.5, "trailing_percent", minval = 0.1, maxval = 2, step=0.1)

var rsi_buy = 50 + rsi_entry
var rsi_sell = 50 - rsi_entry

sma_norm_h_45() => 
    source = high
    n = 45
    sma = ta.sma(source, n) 
    sma_norm = (sma - ta.lowest(sma, n)) / (ta.highest(sma,n) - ta.lowest(sma, n))
    sma_norm

atr_value = ta.atr(atr_length)
atr_ma = ta.sma(atr_value, atr_ma_length) 
rsi_value = ta.rsi(close, length = rsi_length) 
atr_ma_norm = atr_ma / close * 100
sma_norm = sma_norm_h_45()

var intra_trade_high = 0.0
var intra_trade_low = 0.0

if strategy.position_size == 0
    intra_trade_high := high
    intra_trade_low := low

    if atr_ma_norm >= atr_ma_norm_min and atr_ma_norm <= atr_ma_norm_max
        if atr_value > atr_ma
            if rsi_value > rsi_buy
                strategy.entry("B1", strategy.long, limit = close + 5 )
            else if rsi_value < rsi_sell
                strategy.entry("S1", strategy.short, limit = close - 5 )
else if strategy.position_size > 0
    intra_trade_high := math.max(intra_trade_high, high)
    intra_trade_low := low

    long_tp = intra_trade_high * (1 - trailing_percent / 100)
    strategy.exit("Exit B1", from_entry="B1", stop = long_tp, limit = strategy.position_avg_price * 1.03)

else if strategy.position_size < 0
    intra_trade_high := high
    intra_trade_low := math.min(intra_trade_low, low) 

    short_tp = intra_trade_low * (1 + trailing_percent / 100)
    strategy.exit("Exit S1", from_entry="S1", stop = short_tp, limit = strategy.position_avg_price * 0.94)

Thêm nữa