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.
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.
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.
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.
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.
Lấy lợi nhuận theo tỷ lệ lợi nhuận.
Việc dừng lỗ có thể tối đa hóa lệnh dừng lỗ để giảm lỗ.
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.
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.
Tỷ lệ lợi nhuận theo lợi nhuận có thể khóa trong một số lợi nhuận.
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.
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.
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.
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.
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.
Hãy thử dừng lỗ động và lấy tỷ lệ lợi nhuận, thay vì cài đặt cố định.
Xem xét thêm các biện pháp kiểm soát quy mô giao dịch.
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)