듀얼 지표 모멘텀 트렌드 정량적 전략 시스템

RSI MA ATR TP/SL
생성 날짜: 2025-01-17 16:40:55 마지막으로 수정됨: 2025-01-17 16:41:17
복사: 0 클릭수: 545
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

듀얼 지표 모멘텀 트렌드 정량적 전략 시스템

개요

이 전략은 상대 강도 지수(RSI)와 이동 평균(MA)을 결합하여 두 지표의 시너지 효과를 통해 시장 동향과 거래 기회를 파악하는 정량적 거래 시스템입니다. 이 시스템은 거래 신호의 신뢰성을 높이기 위해 거래량 및 변동성 필터도 통합했습니다. 이 전략의 핵심 아이디어는 빠르게 움직이는 평균선과 느리게 움직이는 평균선의 교차를 통해 추세 방향을 파악하고, RSI를 사용하여 모멘텀을 확인하여 궁극적으로 완전한 거래 결정 프레임워크를 형성하는 것입니다.

전략 원칙

이 전략은 이중 계층 신호 확인 메커니즘을 채택합니다.

  1. 추세 확인 레이어: 빠르게 이동 평균선(FastMA)과 느리게 이동 평균선(SlowMA)의 교차점을 사용하여 시장 추세를 확인합니다. 빠른 선이 느린 선을 아래에서 돌파하면 상승 추세가 성립한 것으로 간주되고, 빠른 선이 느린 선을 위에서 아래로 떨어지면 하락 추세가 성립한 것으로 간주됩니다.
  2. 모멘텀 확인 레이어: RSI 지표를 모멘텀 확인 도구로 사용하세요. 상승 추세에서는 RSI가 50 미만이어야 하는데, 이는 시장이 여전히 상승할 여지가 있음을 나타냅니다. 하락 추세에서는 RSI가 50 이상이어야 하는데, 이는 시장이 여전히 하락할 여지가 있음을 나타냅니다.
  3. 트레이딩 필터: 거래량 및 ATR 변동성에 대한 최소 임계값을 설정하여 유동성이나 변동성이 부족한 트레이딩 신호를 걸러냅니다.

전략적 이점

  1. 다차원 신호 확인: 추세 지표와 모멘텀 지표를 결합함으로써 잘못된 신호의 발생 확률이 줄어듭니다.
  2. 완벽한 위험 관리: 손절매 및 이익실현 기능이 통합되어 있어, 비율에 따라 위험 관리 포인트를 설정할 수 있습니다.
  3. 유연한 필터링 메커니즘: 볼륨 및 변동성 필터는 시장 상황에 따라 유연하게 켜거나 끌 수 있습니다.
  4. 자동 폐쇄 메커니즘: 과도한 보유를 방지하기 위해 반전 신호가 나타나면 자동으로 포지션을 폐쇄합니다.

전략적 위험

  1. 변동성이 큰 시장의 위험: 횡보장이고 변동성이 큰 시장에서는 잘못된 돌파 신호가 자주 나타날 수 있습니다.
  2. 슬리피지 위험: 시장이 격렬하게 변동하는 경우, 실제 거래 가격은 신호 발동 가격과 크게 달라질 수 있습니다.
  3. 매개변수 민감도: 전략의 효과는 매개변수 설정에 크게 좌우되며, 시장 환경에 따라 매개변수 조합도 달라질 수 있습니다.

전략 최적화 방향

  1. 동적 매개변수 조정: 적응형 매개변수 메커니즘을 도입하여 시장 변동에 따라 이동 평균 기간과 RSI 임계값을 동적으로 조정할 수 있습니다.
  2. 신호 가중치 시스템: 신호 강도 점수 시스템을 구축하고 다양한 지표의 성과에 따라 다른 가중치를 할당합니다.
  3. 시장 환경 분류: 시장 환경 식별 모듈을 추가하고 다양한 시장 상황에서 다양한 거래 전략을 사용합니다.
  4. 강화된 위험 관리: 시장 변동성에 따라 자동으로 손절매 포지션을 조정하는 동적 손절매 메커니즘을 도입합니다.

요약하다

이 전략은 추세 지표와 모멘텀 지표를 종합적으로 활용하여 비교적 완전한 거래 시스템을 구축합니다. 본 시스템의 장점은 다단계 신호 확인 메커니즘과 완벽한 리스크 관리 시스템에 있지만, 실제 적용에서는 시장 환경이 전략 성과에 미치는 영향에 주의를 기울이고 실제 상황에 따라 매개변수를 최적화하는 것이 필요합니다. 지속적인 개선과 최적화를 통해 이 전략은 다양한 시장 환경에서도 안정적인 성과를 유지할 것으로 기대됩니다.

전략 소스 코드
/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-16 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

// © Boba2601
//@version=5
strategy("RSI-MA Synergy", overlay=true, margin_long=100, margin_short=100)

// === Налаштування індикаторів ===
length_rsi = input.int(14, title="RSI Period", group="Індикатори")
fastMALength = input.int(9, title="Fast MA Length", group="Індикатори")
slowMALength = input.int(21, title="Slow MA Length", group="Індикатори")

// === Налаштування стоп-лосу і тейк-профіту ===
useStopLossTakeProfit = input.bool(true, title="Використовувати стоп-лос і тейк-профіт", group="Стоп-лос і Тейк-профіт")
stopLossPercent = input.float(2.0, title="Стоп-лос (%)", minval=0.1, step=0.1, group="Стоп-лос і Тейк-профіт")
takeProfitPercent = input.float(4.0, title="Тейк-профіт (%)", minval=0.1, step=0.1, group="Стоп-лос і Тейк-профіт")

// === Налаштування об'єму та волатильності ===
useVolumeFilter = input.bool(false, title="Використовувати фільтр об'єму", group="Об'єм та Волатильність")
volumeThreshold = input.int(50000, title="Мінімальний об'єм", group="Об'єм та Волатильність")
useVolatilityFilter = input.bool(false, title="Використовувати фільтр волатильності", group="Об'єм та Волатильність")
atrLength = input.int(14, title="Період ATR для волатильності", group="Об'єм та Волатильність")
volatilityThreshold = input.float(1.5, title="Мінімальна волатильність (ATR)", step=0.1, group="Об'єм та Волатильність")


// === Розрахунок індикаторів ===
rsiValue = ta.rsi(close, length_rsi)
fastMA = ta.sma(close, fastMALength)
slowMA = ta.sma(close, slowMALength)

// === Розрахунок об'єму та волатильності ===
averageVolume = ta.sma(volume, 20)
atrValue = ta.atr(atrLength)

// === Умови входу в позицію ===
longCondition = ta.crossover(fastMA, slowMA) and rsiValue < 50
if useVolumeFilter
    longCondition := longCondition and volume > volumeThreshold
if useVolatilityFilter
    longCondition := longCondition and atrValue > volatilityThreshold

shortCondition = ta.crossunder(fastMA, slowMA) and rsiValue > 50
if useVolumeFilter
    shortCondition := shortCondition and volume > volumeThreshold
if useVolatilityFilter
    shortCondition := shortCondition and atrValue > volatilityThreshold

// === Логіка входу та виходу з позиції ===
if (longCondition)
    strategy.entry("Long", strategy.long)
    if (useStopLossTakeProfit)
        stopLossPrice = close * (1 - stopLossPercent / 100)
        takeProfitPrice = close * (1 + takeProfitPercent / 100)
        strategy.exit("Exit Long", "Long", stop = stopLossPrice, limit = takeProfitPrice)

if (shortCondition)
    strategy.entry("Short", strategy.short)
    if (useStopLossTakeProfit)
        stopLossPrice = close * (1 + stopLossPercent / 100)
        takeProfitPrice = close * (1 - takeProfitPercent / 100)
        strategy.exit("Exit Short", "Short", stop = stopLossPrice, limit = takeProfitPrice)

// === Закриття позицій за зворотнім сигналом ===
if (strategy.position_size > 0 and (ta.crossunder(fastMA, slowMA) or rsiValue > 50))
    strategy.close("Long", comment="Закрито по сигналу")

if (strategy.position_size < 0 and (ta.crossover(fastMA, slowMA) or rsiValue < 50))
    strategy.close("Short", comment="Закрито по сигналу")