Chiến lược này được đặt tên là Chiến lược xu hướng dựa trên thanh khoản. Nó nhằm mục đích xác định hướng xu hướng giá trên các khung thời gian khác nhau và đưa ra các quyết định dài hoặc ngắn tương ứng. Chiến lược sử dụng một hệ thống trung bình động kép để xác định xu hướng và sử dụng sự khác biệt giữa các giá trị chỉ số sức mạnh tương đối (RSI) trên nhiều khung thời gian để phản ứng kịp thời với những thay đổi xu hướng.
Khái niệm cốt lõi của chiến lược này dựa trên chỉ số CHOP, trong đó hệ thống trung bình động đánh giá hướng xu hướng tổng thể. Cụ thể, chiến lược tính toán các giá trị RSI của đường nhanh (Dài = 20) và đường chậm (Dài = 50) trên khung thời gian cao hơn, và tính toán sự khác biệt giữa hai đường RSI. Khi đường nhanh RSI vượt qua đường chậm RSI, nó báo hiệu xu hướng tăng và kích hoạt tín hiệu dài. Ngược lại, nếu đường nhanh RSI vượt qua đường chậm RSI, nó chỉ ra xu hướng giảm và tạo ra tín hiệu ngắn. Sự khác biệt RSI thay đổi do giá tăng và giảm có thể xác định một cách nhạy cảm các điểm thay đổi xu hướng.
Chiến lược cũng giới thiệu một cơ chế nhiều khung thời gian: nó tính toán sự khác biệt RSI trên các khung thời gian cao hơn (ví dụ: hàng ngày) để xác định hướng xu hướng tổng thể, và sau đó thực hiện các lệnh mua và bán thực tế trên các khung thời gian thấp hơn (ví dụ: 5 phút) dựa trên phán đoán xu hướng khung thời gian cao hơn. Sự kết hợp của nhiều khung thời gian này tính đến cả các quyết định xu hướng khung thời gian cao và sự linh hoạt của việc thực hiện khung thời gian thấp.
Giải pháp:
Chiến lược này tận dụng sự khác biệt của chỉ số RSI để nắm bắt một cách nhạy cảm các bước ngoặt tiềm năng của xu hướng. Ứng dụng nhiều khung thời gian đảm bảo đánh giá xu hướng tổng thể trong khi giữ cho việc thực hiện giao dịch cụ thể linh hoạt. So với các chiến lược theo xu hướng khác, chiến lược này đơn giản hơn, trực quan trong điều chỉnh tham số và dễ tối ưu hóa.
/*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"}] */ //@version=3 strategy("Flow Trend Indicator Strategy", "FlowTI", overlay=true, calc_on_every_tick=true) isTimeFrame(timeFrame) => timeFrame == timeframe.period ? true : false Htf() => isTimeFrame("12") ? "60" : isTimeFrame("60") ? "300" : isTimeFrame("300") ? "D" : isTimeFrame("D") ? "W" : isTimeFrame("W") ? "M" : isTimeFrame("M") ? "5M" : "D" TrendIndication() => trendFastLength = 20 trendSlowLength = 50 upFastHtf = request.security(syminfo.tickerid, Htf(), rma(max(change(close), 0), trendFastLength), barmerge.gaps_off, barmerge.lookahead_on) downFastHtf = request.security(syminfo.tickerid, Htf(), rma(-min(change(close), 0), trendFastLength), barmerge.gaps_off, barmerge.lookahead_on) rsiFastHtf = downFastHtf == 0 ? 100 : upFastHtf == 0 ? 0 : 100 - (100 / (1 + upFastHtf / downFastHtf)) upSlowHtf = request.security(syminfo.tickerid, Htf(), rma(max(change(close), 0), trendSlowLength), barmerge.gaps_off, barmerge.lookahead_on) downSlowHtf = request.security(syminfo.tickerid, Htf(), rma(-min(change(close), 0), trendSlowLength), barmerge.gaps_off, barmerge.lookahead_on) rsiSlowHtf = downSlowHtf == 0 ? 100 : upSlowHtf == 0 ? 0 : 100 - (100 / (1 + upSlowHtf / downSlowHtf)) rsiDiff = rsiFastHtf - rsiSlowHtf crossover(rsiDiff, 0) ? true : crossunder(rsiDiff, 0) ? false : na if (TrendIndication() == true) strategy.entry("Long", strategy.long) if (TrendIndication() == false) strategy.entry("Short", strategy.short)