Chiến lược này dựa trên chỉ số RSI (Relative Strength Index) để xác định các điều kiện mua quá mức và bán quá mức. Nó có các vị trí chống xu hướng khi RSI đạt đến mức mua quá mức hoặc bán quá mức để mua thấp và bán cao. Chiến lược này đơn giản và hiệu quả, hưởng lợi từ các kịch bản mua quá mức và bán quá mức trong thời gian ngắn trên thị trường.
Chiến lược này chỉ sử dụng chỉ số RSI như là tín hiệu đầu vào. Nó đi dài khi RSI vượt qua dưới điểm thấp (thất định 20), và đi ngắn khi RSI vượt qua điểm cao (thất định 80). Nó giao dịch với số tiền cố định mỗi lần (thất định 100 USD) và nhắm mục tiêu lợi nhuận 1% bất kể điều kiện thị trường. Nếu lỗ đạt 3%, nó dừng lại. Để kiểm soát tần suất giao dịch, chiến lược ngừng giao dịch trong 24 thanh sau khi thua một giao dịch.
Lý luận cốt lõi là:
Như chúng ta có thể thấy, chiến lược rất đơn giản và cơ học. Có hầu như không có không gian cho tối ưu hóa tham số. Nó chỉ khai thác các tính chất toán học của RSI để có các vị trí chống xu hướng xung quanh các khu vực mua quá mức / bán quá mức.
Ưu điểm lớn nhất của chiến lược này là sự đơn giản và hiệu quả.
Nó cũng thực hiện tỷ lệ dừng lỗ / lấy lợi nhuận để khóa lợi nhuận và kiểm soát rủi ro, cũng như đình chỉ giao dịch để giảm tần suất.
Những rủi ro chính của chiến lược này xuất phát từ:
Không thể kiếm lợi nhuận trong thị trường có xu hướng mạnh. RSI có thể ở trong khu vực mua quá mức / bán quá mức trong thời gian dài khi xu hướng tiếp tục.
Stop loss quá rộng có thể dẫn đến mất mát quá mức.
Tần suất giao dịch cao có thể dẫn đến giao dịch quá mức sau khi thắng.
Chỉ cần tập trung rủi ro 100 đô la, nên tối ưu hóa thành % vốn.
Dựa trên phân tích, chiến lược có thể được cải thiện theo những cách sau:
Thêm bộ lọc xu hướng như MA để tạm dừng giao dịch khi xu hướng không rõ ràng.
Tối ưu hóa tỷ lệ dừng lỗ / lấy lợi nhuận. Giảm dừng lỗ xuống 1-2% và sử dụng lợi nhuận năng động.
Giới hạn tần suất giao dịch, chẳng hạn như tối đa 2 giao dịch mỗi khoảng thời gian.
Kích thước giao dịch dựa trên % vốn thay vì cố định $ 100.
Tối ưu hóa các thông số RSI như thời gian, mức mua quá mức / bán quá mức.
Thêm kích thước vị trí để không tăng kích thước khi vốn tăng.
Với những tối ưu hóa này, các rủi ro có thể được giảm và sự ổn định được cải thiện đáng kể.
Tóm lại, đây là một chiến lược đơn giản và thẳng thắn sử dụng chỉ số RSI để giao dịch theo điều kiện mua quá mức / bán quá mức để đảo ngược trung bình ngắn hạn. Những ưu điểm là sự đơn giản, hiệu quả, không cần dự đoán, logic rõ ràng, dễ kiểm tra.
/*backtest start: 2023-11-02 00:00:00 end: 2023-11-09 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash) open_pos = input.int(50000, title = "每次开单资金(usdt)") rsi_period = input.int(14, title = "rsi周期") rsi_line = input.float(20.0, title='RSI触发线', step=0.05) stop_rsi_top_line = input.float(70, title = "顶部rsi止损线") stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线") stop_loss_perc = input.float(0.03, title = "止损线") stop_profit = input.float(0.01, title = "止盈") loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易") rsiParam = ta.rsi(close, rsi_period) var int failedTimes = 0 var bool stopTrade = false // plot(rsiParam) if stopTrade failedTimes += 1 if failedTimes == loss_stop_trade_k failedTimes := 0 stopTrade := false // 获取当前持仓方向 checkCurrentPosition() => strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0 curPosition = checkCurrentPosition() // 当前持仓成本价 position_avg_price = strategy.position_avg_price // 当前持单, 触达反向的rsi线,清仓 if curPosition > 0 and rsiParam >= stop_rsi_top_line strategy.close_all(comment = "closebuy") if curPosition < 0 and rsiParam <= stop_rsi_bottom_line strategy.close_all(comment = "closesell") // 止盈止损清仓 if curPosition > 0 // if (position_avg_price - close) / close >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closebuy") // stopTrade := true if (close - position_avg_price) / position_avg_price >= stop_profit // 止盈 strategy.close_all(comment = "closebuy") if curPosition < 0 // if (close - position_avg_price) / position_avg_price >= stop_loss_perc // // 止损 // strategy.close_all(comment = "closesell") // stopTrade := true if (position_avg_price - close) / close >= stop_profit // 止盈 strategy.close_all(comment = "closesell") a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1) if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0 stopTrade := true var float openPrice = 0.0 if rsiParam <= rsi_line and stopTrade == false strategy.entry("long", strategy.long, open_pos / close, comment = "long") if curPosition == 0 openPrice := close strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy") if rsiParam >= 100 - rsi_line and stopTrade == false strategy.entry("short", strategy.short, open_pos / close, comment = "short") if curPosition == 0 openPrice := close strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell") plot(failedTimes)