Chiến lược này kết hợp các chỉ số động lực với Chỉ số Sức mạnh Tương đối (RSI) cùng với một cơ chế dừng lại động để nắm bắt hướng xu hướng trong khi kiểm soát rủi ro. Nó đi dài khi có động lực tăng mạnh và đi ngắn khi có động lực giảm mạnh. Chiến lược cũng thiết lập các điều kiện lấy lợi nhuận và dừng lỗ bằng cách sử dụng dừng lại để khóa lợi nhuận và giảm lỗ.
Sử dụng chỉ số ADX để xác định hướng xu hướng giá
ADX trên 20 cho thấy xu hướng hiện diện
+DI vượt trên -DI là tín hiệu dài
- DI vượt dưới + DI là tín hiệu ngắn
Chỉ số RSI để xác định quá mua / quá bán
Chỉ số RSI trên 70 cho thấy mua quá mức, tín hiệu ngắn
Chỉ số RSI dưới 30 cho thấy quá bán, tín hiệu dài
Lấy các vị trí dài / ngắn khi ADX hiển thị xu hướng + tín hiệu xác nhận RSI.
Chiến lược sử dụng một cơ chế dừng kéo dài năng động với hai thông số:
Mức kích hoạt: Kích hoạt dừng kéo theo khi giá đạt tỷ lệ phần trăm sau khi nhập
Tỷ lệ phần trăm theo dõi: Các đường mòn dừng ở mức độ đặt phần trăm từ lợi nhuận cao nhất
Một khi được kích hoạt, lệnh dừng kéo theo sẽ theo mức lợi nhuận cao nhất. Khi giá quay trở lại, mức dừng di chuyển xuống thấp hơn. Nếu tăng trở lại vượt quá tỷ lệ phần trăm, lệnh dừng sẽ được kích hoạt đóng tất cả các vị trí.
Momentum ADX xác định hướng xu hướng, tránh những sự đột phá sai
Xác nhận RSI đảm bảo không bỏ lỡ cơ hội đảo ngược
Chế độ dừng kéo dài có thể điều chỉnh khóa lợi nhuận và giảm thiểu tổn thất
Đơn giản và rõ ràng chiến lược logic, dễ hiểu
Áp dụng cho các thị trường và khung thời gian khác nhau
ADX có thể báo hiệu đột phá sai
RSI có thể cung cấp nhiều tín hiệu sai
Các thông số dừng kéo không tốt
Khoảng cách có thể gây ra các điểm dừng bị bỏ lỡ
Kiểm tra sự kết hợp ADX/RSI để tối ưu hóa các mục
Kiểm tra lại các mức kích hoạt khác nhau và tỷ lệ phần trăm dấu vết
Thêm các bộ lọc bổ sung để cải thiện chất lượng tín hiệu
Kiểm tra trên các thị trường khác nhau để tìm các thông số vững chắc
Chiến lược này tích hợp phân tích động lực, RSI và trailing stops để xác định hiệu quả hướng xu hướng, đảo ngược tại chỗ và kiểm soát rủi ro. Logic đơn giản làm cho nó đơn giản để thực hiện trên thị trường chứng khoán, ngoại hối, tiền điện tử và các thị trường xu hướng khác.
/*backtest start: 2023-10-01 00:00:00 end: 2023-10-03 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Trailing Stop with RSI", overlay=true) length = input.int(12, "Momentum Length") price = close momentum(seria, length) => mom = seria - seria[length] mom mom0 = momentum(price, length) mom1 = momentum(mom0, 1) rsiLength = input.int(14, "RSI Length") rsiOverbought = input(70, "RSI Overbought Level") rsiOversold = input(30, "RSI Oversold Level") rsiValue = ta.rsi(close, rsiLength) tsact = input.float(0.0, "Trailing Stop Activation (%)", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100 tsact := tsact ? tsact : na ts = input.float(0.0, "Position Trailing Stop (%)", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100 ts := ts ? ts : na in_long = strategy.position_size > 0 in_short = strategy.position_size < 0 var ts_ = array.new_float() ts_size = array.size(ts_) ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0 if in_long if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if not tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if in_short if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) if not tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na if (mom0 > 0 and mom1 > 0) strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE") else strategy.cancel("MomLE") if (mom0 < 0 and mom1 < 0) strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE") else strategy.cancel("MomSE") tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na if trail strategy.close_all() if not strategy.opentrades array.clear(ts_) rsiOverboughtCondition = rsiValue >= rsiOverbought rsiOversoldCondition = rsiValue <= rsiOversold if rsiOverboughtCondition strategy.close("SHORT", "SX") strategy.entry("LONG", strategy.long) if rsiOversoldCondition strategy.close("LONG", "LX") strategy.entry("SHORT", strategy.short) plotchar(ts_get, "GET", "") plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross) plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross) plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)