조정 가능한 트레일링 스톱 전략과 결합된 모멘텀 ADX 및 RSI


생성 날짜: 2023-10-09 15:36:07 마지막으로 수정됨: 2023-10-09 15:36:07
복사: 1 클릭수: 711
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략은 동력 지표와 상대적으로 강한 지표 ((RSI) 를 결합하여, 트렌드 방향을 잡는 동시에 위험을 제어하기 위한 수동적 인 스톱 손실 메커니즘을 지원합니다. 가격이 강한 유동성이있을 때, 더 많이 구입하고, 가격이 약한 유동성이있을 때, 공백을 판매합니다. 전략은 동시에 스톱 손실 조건을 설정하여, 스톱 손실을 사용하여 최대 수익 수준을 추적하여 이익을 잠금하고 손실을 줄일 수 있습니다.

전략 원칙

동력선과 RSI 지표가 진입을 판단한다

  • 동력 지표 ADX를 사용하여 가격 경향 방향을 판단

    • ADX가 20보다 크면 트렌드가 나타납니다.

    • +DI 라인에서 -DI 라인을 통과할 때 신호

    • -DI 라인이 +DI 라인을 통과할 때 하향 신호

  • RSI 지표는 과매매를 판단합니다.

    • RSI 70 이상은 초고 구매 지역이며, 하향 신호입니다.

    • RSI가 30보다 낮으면 초과지점입니다.

ADX가 트렌드가 존재한다고 판단하고 RSI가 확인 신호를 내면, 그에 따른 다공간 연산을 수행하십시오.

수시적으로 연동되는 상쇄장치

이 전략은 동적으로 조정할 수 있는 후속 손실 제도를 사용하며, 두 가지 변수를 포함합니다:

  • 활성화 비율: 포지션을 개시한 후 가격이 설정된 비율에 도달하면 활성화 후속 손실

  • 추적 비율: 가장 최근 최고 수익률에서 추적 중단 손실의 비율

가격이 활성화 조건에 도달 한 후, 추적 중지 라인은 최대 수익 수준을 추적한다. 가격이 돌아 오면, 중지 라인은 따라 이동한다. 만약 돌아가는 폭이 설정된 추적 비율을 초과하면, 중지 라인은 촉발되어 모든 포지션을 닫는다.

우위 분석

  • 동력 지표는 트렌드 방향을 판단하고, 기업들의 노력을 막는 것을 방지합니다.

  • RSI 지표는 역전 기회를 놓치지 않도록 합니다.

  • 이윤을 고정하고 손실을 줄일 수 있는, 손해지기를 따라 할 수 있는

  • 전략이 명확하고 간결하며, 실행이 이해하기 쉽습니다.

  • 다양한 시장과 시간대에 널리 적용할 수 있습니다.

위험과 대책

  • ADX는 가짜 침입이 잘못된 신호를 발생시킨다고 판단했다.

    • ADX 파라미터를 조정하여 실제 트렌드 브레이크를 보장합니다.
  • RSI는 여러 개의 가짜 신호를 발생 시켰습니다.

    • 과매매를 방지하기 위한 과매매 변수를 조정합니다.
  • 조정할 수 있는 손상 변수가 잘못 설정되어 있습니다.

    • 최적화 매개 변수, 최적의 정지수준
  • 큰 폭의 폭파로

    • 한계 가격을 고려하여 손실을 방지하십시오.

더 나은 생각

  • 다양한 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)