Momentum ADX với chiến lược dừng RSI

Tác giả:ChaoZhang, Ngày: 2023-10-09 15:36:07
Tags:

Tổng quan

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ỗ.

Làm thế nào nó hoạt động

Nhập với Momentum ADX và RSI

  • 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.

Chặn kéo điều chỉnh

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í.

Ưu điểm

  • 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

Rủi ro và giảm thiểu

  • ADX có thể báo hiệu đột phá sai

    • Điều chỉnh các thông số ADX để phát hiện các chuyển động xu hướng thực sự
  • RSI có thể cung cấp nhiều tín hiệu sai

    • Điều chỉnh mức mua quá mức / bán quá mức để giảm whipsaws
  • Các thông số dừng kéo không tốt

    • Tối ưu hóa các tham số để tìm mức dừng tốt nhất
  • Khoảng cách có thể gây ra các điểm dừng bị bỏ lỡ

    • Xem xét sử dụng lệnh dừng giới hạn

Cơ hội tối ưu hóa

  • 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

Kết luận

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)


Thêm nữa