RSI 트레일링 스톱 전략과 함께 모멘텀 ADX

저자:차오장, 날짜: 2023-10-09 15:36:07
태그:

전반적인 설명

이 전략은 상대적 강도 지수 (RSI) 와 동적 트레일링 스톱 메커니즘을 결합하여 위험을 제어하는 동시에 트렌드 방향을 파악합니다. 강한 상승 동력이있을 때 길고 강한 하락 동력이있을 때 짧습니다. 이 전략은 또한 수익을 취하고 손실을 줄이기 위해 트레일링 스톱을 사용하여 수익을 취하고 손실을 줄이는 조건을 설정합니다.

어떻게 작동 합니까?

모멘텀 ADX와 RSI와 함께 진입

  • ADX 지표를 사용하여 가격 트렌드 방향을 결정합니다.

    • ADX 20 이상 트렌드가 나타납니다.

    • +DI가 -DI보다 높으면 신호가 길어집니다.

    • -DI +DI 아래로 넘어가면 신호가 짧습니다.

  • 과잉 매수/ 과잉 판매를 식별하는 RSI

    • 70 이상인 RSI는 과잉 매입, 단축 신호를 나타냅니다.

    • 30 이하의 RSI는 지나친 판매, 긴 신호를 나타냅니다.

ADX가 트렌드 + RSI 확인 신호를 표시할 때 긴/단 포지션을 취합니다.

조절 가능한 후속 정지

이 전략은 두 개의 매개 변수를 가진 동적 트레일링 스톱 메커니즘을 사용합니다.

  • 활성화 레벨: 가격이 진입 후 설정된 비율에 도달하면 트레일링 스톱을 활성화합니다.

  • 트레일링 비율: 가장 높은 수익에서 정지 레벨 트레일 설정 비율

트레일링 스톱이 활성화되면 가장 높은 수익 수준을 따르게 됩니다. 가격이 리트레이스를 할 때, 스톱 레벨은 낮아집니다. 리트레이싱이 트레일 퍼센트를 초과하면 모든 포지션을 닫는 스톱이 트리거됩니다.

장점

  • 모멘텀 ADX는 트렌드 방향을 결정하고 거짓 브레이크를 피합니다.

  • RSI 확인은 역전 기회를 놓치지 않도록 보장합니다.

  • 조정 가능한 후속 스톱은 수익을 차단하고 손실을 최소화합니다.

  • 간단하고 명확한 전략 논리, 이해하기 쉽다

  • 다양한 시장과 시간대에 적용됩니다.

위험 및 완화

  • ADX는 거짓 파기 신호를 보낼 수 있습니다.

    • 실제 트렌드 움직임을 감지하기 위해 ADX 매개 변수를 조정합니다.
  • RSI는 여러 가지 잘못된 신호를 줄 수 있습니다.

    • 과잉 구매/ 과잉 판매 수치를 조정하여 윙사 (whipsaws) 를 줄이십시오.
  • 저하 스톱 매개 변수

    • 최적의 정지 수준을 찾기 위해 매개 변수를 최적화
  • 간격은 놓친 정차로 이어질 수 있습니다.

    • 스톱 리미트 오더를 사용하는 것을 고려하십시오

최적화 기회

  • 입력을 최적화하기 위해 ADX/RSI 조합을 테스트합니다

  • 다양한 활성화 수준과 추적 비율을 백테스트합니다.

  • 신호 품질을 향상시키기 위해 추가 필터를 추가합니다

  • 견고한 매개 변수를 찾기 위해 다른 시장에서 테스트

결론

이 전략은 동력 분석, RSI 및 트레일링 스톱을 통합하여 트렌드 방향, 스포트 역전 및 위험을 효과적으로 결정합니다. 간결한 논리는 주식, 외환, 암호화폐 및 기타 트렌딩 시장에서 구현하는 것을 간단하게 만듭니다. 파라미터 최적화 및 필터를 추가함으로써 추가 개선이 가능합니다. 전반적으로 거래자에게 강력한 양적 거래 프레임워크를 제공합니다.


/*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)


더 많은