Chiến lược này sử dụng chỉ số chỉ số sức mạnh tương đối (RSI) để xác định mức mua quá mức và bán quá mức cho ngắn và dài. Đây là một chiến lược giao dịch đảo ngược RSI điển hình. Chiến lược cũng kết hợp tối ưu hóa tham số, dừng lỗ vv để thích nghi với các điều kiện thị trường khác nhau.
Logic cốt lõi bao gồm:
Chỉ số RSI cho thấy quá mua trên 70 và quá bán dưới 30 điều kiện thị trường. Chiến lược sử dụng logic cổ điển này để xác định các mục dài / ngắn dựa trên giá trị RSI so với giới hạn đã đặt trước. Các tham số có thể tùy chỉnh cũng cho phép tối ưu hóa giới hạn, dừng lỗ v.v.v. để thích nghi với thị trường.
Hạn chế:
Chiến lược có thể được tăng cường thông qua:
Học máy để tối ưu hóa mức RSI tự động
Xác nhận khối lượng để tránh sự đột phá sai
Các yếu tố bổ sung như trung bình động cho xác nhận đa yếu tố
Đánh giá về giá trị giá trị
Phân tích khối lượng để đo lường dòng chảy/dòng chảy của quỹ
Kết hợp với các chiến lược không tương quan để giảm thu hút danh mục đầu tư
Đây là một chiến lược đảo ngược trung bình đơn giản và thực tế sử dụng chỉ số RSI để phát hiện quá mua / quá bán. Các tham số có thể tùy chỉnh cho phép thích nghi với thị trường thay đổi. Các cải tiến như dừng thích nghi, xác nhận đa yếu tố và tối ưu hóa tham số có thể làm cho chiến lược mạnh mẽ hơn.
/*backtest start: 2023-08-19 00:00:00 end: 2023-09-18 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("4All V3", shorttitle="Strategy", overlay=true) /////////////// Component Code Start /////////////// testStartYear = input(2011, "Backtest Start Year") testStartMonth = input(8, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testStopYear = input(2018, "Backtest Stop Year") testStopMonth = input(9, "Backtest Stop Month") testStopDay = input(29, "Backtest Stop Day") // testStopDay = testStartDay + 1 testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) // A switch to control background coloring of the test period testPeriodBackground = input(title="Color Background?", type=bool, defval=true) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true /////////////// Component Code Stop /////////////// src = close len = input(4, minval=1, title="Length") up = rma(max(change(src), 0), len) down = rma(-min(change(src), 0), len) rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down)) rsin = input(5) sn = 100 - rsin ln = 0 + rsin /////////////// STRATEGY /////////////// ts = input(99999, "Trailing Stop") / 10000 tp = input(15, "Take Profit") / 10000 sl = input(23, "Stop Loss") / 10000 pyr = input(1, "Pyramiding") short = crossover(rsi, sn) long = crossunder(rsi, ln) totalLongs = 0 totalLongs := nz(totalLongs[1]) totalShorts = 0 totalShorts := nz(totalShorts[1]) totalLongsPrice = 0 totalLongsPrice := nz(totalLongsPrice[1]) totalShortsPrice = 0 totalShortsPrice := nz(totalShortsPrice[1]) sectionLongs = 0 sectionLongs := nz(sectionLongs[1]) sectionShorts = 0 sectionShorts := nz(sectionShorts[1]) if long sectionLongs := sectionLongs + 1 sectionShorts := 0 if short sectionLongs := 0 sectionShorts := sectionShorts + 1 longCondition = long and sectionLongs >= pyr shortCondition = short and sectionShorts >= pyr last_long = na last_short = na last_long := longCondition ? time : nz(last_long[1]) last_short := shortCondition ? time : nz(last_short[1]) long_signal = crossover(last_long, last_short) short_signal = crossover(last_short, last_long) last_open_long_signal = na last_open_short_signal = na last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1]) last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1]) last_long_signal = na last_short_signal = na last_long_signal := long_signal ? time : nz(last_long_signal[1]) last_short_signal := short_signal ? time : nz(last_short_signal[1]) in_long_signal = last_long_signal > last_short_signal in_short_signal = last_short_signal > last_long_signal last_high = na last_low = na last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1]) last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1]) long_ts = not na(last_high) and high <= (last_high - ts) //and high >= last_open_long_signal short_ts = not na(last_low) and low >= (last_low + ts) //and low <= last_open_short_signal long_tp = high >= (last_open_long_signal + tp) short_tp = low <= (last_open_short_signal - tp) long_sl = low <= (last_open_long_signal - sl) short_sl = high >= (last_open_short_signal + sl) leverage = input(1, "Leverage") long_call = last_open_long_signal - (0.8 + 0.2 * (1/leverage)) / leverage * last_open_long_signal short_call = last_open_short_signal + (0.78 + 0.2 * (1/leverage)) / leverage * last_open_short_signal long_call_signal = low <= long_call short_call_signal = high >= short_call if testPeriod() strategy.entry("Long", strategy.long, when=longCondition) strategy.entry("Short", strategy.short, when=shortCondition) strategy.close("Long", when=long_call_signal) strategy.close("Short", when=short_call_signal) strategy.close("Long", when=long_tp) strategy.close("Short", when=short_tp) strategy.close("Long", when=long_sl) strategy.close("Short", when=short_sl) strategy.close("Long", when=long_ts) strategy.close("Short", when=short_ts)