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


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

Tổng quan

Chiến lược này được thiết kế một hệ thống giao dịch có chức năng theo dõi xu hướng dựa trên độ dao động trung bình thực sự (ATR) và chỉ số tương đối mạnh (RSI). Hệ thống này có thể tự động nhận biết hướng xu hướng và có chức năng dừng lỗ và dừng.

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

  1. Xác định ATR và RSI. ATR phản ánh mức biến động giá trung bình trong một khoảng thời gian gần đây. RSI phản ánh sức mạnh của hai bên.

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

  3. Khi RSI cao hơn đường mua quá mức, bạn sẽ mua nhiều hơn; khi RSI thấp hơn vùng bán quá mức, bạn sẽ mua ít hơn.

  4. Sau khi thực hiện nhiều, hãy nhân tỷ lệ cố định với điểm cao để theo dõi điểm dừng. Sau khi thực hiện ngắn hạn, hãy nhân tỷ lệ cố định với điểm thấp để theo dõi điểm dừng.

  5. Tỷ lệ lợi nhuận giảm.

Phân tích lợi thế

  1. Theo dõi dừng lỗ có thể tối đa hóa lệnh dừng lỗ và giảm tổn thất.

  2. RSI có thể đánh giá hiệu quả sức mạnh của forex và tránh mở nhiều lần các vị trí trong tình trạng biến động.

  3. ATR là một chỉ số biến động, có thể lọc ra các biến động và chỉ giao dịch theo xu hướng.

  4. Tỷ lệ lợi nhuận có thể bị khóa một phần lợi nhuận.

Phân tích rủi ro

  1. ATR và RSI đều là các chỉ số chậm trễ, có thể gây ra sự lệch thời điểm vào. Các tham số có thể được tối ưu hóa thích hợp để hệ thống nhạy cảm hơn.

  2. Lợi nhuận cố định so với lỗ hổng dừng có thể được tối ưu hóa quá mức, nên được thiết lập cẩn thận kết hợp với kết quả phản hồi.

  3. Trong các biến động chu kỳ lớn, ATR có thể lớn hơn trung bình di chuyển trong thời gian dài, dẫn đến giao dịch quá mức. Các điều kiện lọc khác có thể được thêm vào.

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

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

  2. Thêm các chỉ số như MA để đánh giá xu hướng, tránh bị mắc kẹt trong tình trạng chấn động.

  3. Thử sử dụng tỷ lệ dừng lỗ động, thay vì thiết lập cố định.

  4. Xem xét thêm các biện pháp kiểm soát khối lượng giao dịch.

Tóm tắt

Chiến lược này tích hợp các lợi thế của hai chỉ số ATR và RSI, thiết kế một hệ thống giao dịch theo dõi xu hướng đơn giản và thực tế. Bằng cách tối ưu hóa tham số và tăng điều kiện lọc, có thể tăng thêm sự ổn định của hệ thống. Nhìn chung, chiến lược này có giá trị ứng dụng thực tế mạnh mẽ.

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