Đây là một chiến lược đơn giản chỉ sử dụng chỉ số RSI để xác định mức mua quá mức và bán quá mức. Chúng tôi đã tăng cường nó bằng cách thêm stop loss và take profit, và tích hợp mô-đun xác suất vào giao dịch củng cố chỉ khi xác suất giao dịch có lợi gần đây lớn hơn hoặc bằng 51%. Điều này cải thiện đáng kể hiệu suất chiến lược bằng cách tránh các giao dịch có khả năng thua lỗ.
Chiến lược sử dụng chỉ số RSI để đánh giá điều kiện mua quá mức và bán quá mức trên thị trường. Cụ thể, nó đi dài khi RSI vượt qua dưới giới hạn dưới của khu vực bán quá mức; và đóng vị trí khi RSI vượt qua giới hạn trên của khu vực mua quá mức. Ngoài ra, chúng tôi đặt tỷ lệ dừng lỗ và lấy lợi nhuận.
Điều quan trọng là chúng tôi tích hợp một mô-đun đánh giá xác suất. Mô-đun này tính toán tỷ lệ phần trăm lợi nhuận của các giao dịch dài trong các giai đoạn gần đây (được xác định bởi tham số nhìn lại). Nó chỉ cho phép nhập vào nếu xác suất giao dịch có lợi nhuận gần đây lớn hơn hoặc bằng 51%.
Là một chiến lược RSI tăng cường xác suất, nó có những lợi thế dưới đây so với các chiến lược RSI đơn giản:
Vẫn còn một số rủi ro trong chiến lược này:
Giải pháp:
Chiến lược có thể được tối ưu hóa thêm trong các khía cạnh sau:
Đây là một chiến lược RSI đơn giản được tăng cường bởi mô-đun xác suất tích hợp. So với các chiến lược RSI vanila, nó lọc ra một số giao dịch thua lỗ và cải thiện tỷ lệ rút và lợi nhuận tổng thể. Bước tiếp theo có thể cải thiện nó bằng cách thêm tối ưu hóa ngắn, năng động vv để làm cho nó mạnh mẽ hơn.
/*backtest start: 2023-11-19 00:00:00 end: 2023-12-19 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © thequantscience //@version=5 strategy("Reinforced RSI", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 1, currency = currency.EUR, initial_capital = 1000, commission_type = strategy.commission.percent, commission_value = 0.07) lenght_rsi = input.int(defval = 14, minval = 1, title = "RSI lenght: ") rsi = ta.rsi(close, length = lenght_rsi) rsi_value_check_entry = input.int(defval = 35, minval = 1, title = "Oversold: ") rsi_value_check_exit = input.int(defval = 75, minval = 1, title = "Overbought: ") trigger = ta.crossunder(rsi, rsi_value_check_entry) exit = ta.crossover(rsi, rsi_value_check_exit) entry_condition = trigger TPcondition_exit = exit look = input.int(defval = 30, minval = 0, maxval = 500, title = "Lookback period: ") Probabilities(lookback) => isActiveLong = false isActiveLong := nz(isActiveLong[1], false) isSellLong = false isSellLong := nz(isSellLong[1], false) int positive_results = 0 int negative_results = 0 float positive_percentage_probabilities = 0 float negative_percentage_probabilities = 0 LONG = not isActiveLong and entry_condition == true CLOSE_LONG_TP = not isSellLong and TPcondition_exit == true p = ta.valuewhen(LONG, close, 0) p2 = ta.valuewhen(CLOSE_LONG_TP, close, 0) for i = 1 to lookback if (LONG[i]) isActiveLong := true isSellLong := false if (CLOSE_LONG_TP[i]) isActiveLong := false isSellLong := true if p[i] > p2[i] positive_results += 1 else negative_results -= 1 positive_relative_probabilities = positive_results / lookback negative_relative_probabilities = negative_results / lookback positive_percentage_probabilities := positive_relative_probabilities * 100 negative_percentage_probabilities := negative_relative_probabilities * 100 positive_percentage_probabilities probabilities = Probabilities(look) lots = strategy.equity/close var float e = 0 var float c = 0 tp = input.float(defval = 1.00, minval = 0, title = "Take profit: ") sl = input.float(defval = 1.00, minval = 0, title = "Stop loss: ") if trigger==true and strategy.opentrades==0 and probabilities >= 51 e := close strategy.entry(id = "e", direction = strategy.long, qty = lots, limit = e) takeprofit = e + ((e * tp)/100) stoploss = e - ((e * sl)/100) if exit==true c := close strategy.exit(id = "c", from_entry = "e", limit = c) if takeprofit and stoploss strategy.exit(id = "c", from_entry = "e", stop = stoploss, limit = takeprofit)