이중 이동 평균 모멘텀 추세 추종 및 반전 거래 시스템

移动平均线 RSI ADX ATR 布林带 MA BB 动量 趋势 波动率
생성 날짜: 2025-05-26 17:32:14 마지막으로 수정됨: 2025-05-26 17:32:14
복사: 0 클릭수: 270
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

이중 이동 평균 모멘텀 추세 추종 및 반전 거래 시스템 이중 이동 평균 모멘텀 추세 추종 및 반전 거래 시스템

개요

이 이중 평행동량 트렌드 추적 및 역전 거래 시스템은 트렌드 추적 및 역전 거래의 요소를 결합한 포괄적인 양적 거래 전략이다. 이 전략은 두 개의 다른 주기 ((100 및 500) 의 이동 평균을 사용하여 시장의 추세 방향을 결정하며, RSI ((상대적으로 강한 약 지수), ADX ((평균 방향 지수) 및 ATR ((진짜 파도 평균) 를 포함하여 여러 가지 기술 지표를 필터링 조건으로 통합한다. 이 시스템은 많은 방향의 거래를 허용하며, 양쪽이 할 수 있으며, 다른 시장 조건에 따라 다른 입출입 규칙이 적용됩니다. 이 전략은 특히 암호화폐와 같은 변동성이 큰 시장에 적합하며, 강한 추세에서 추세를 따라갈 수 있으며, 극심한 초매 조건에서 빈 기회를 찾습니다.

전략 원칙

전략의 핵심은 트렌드 식별과 동력 확인에 기반한 이중 검증 메커니즘입니다.

  1. 트렌드 식별전략: 100주기 및 500주기 이동 평균을 사용하여 (EMA 또는 SMA를 선택하면) 시장의 흐름을 결정합니다. MA100이 MA500 위에있을 때 상승 추세로 간주되며 반대로 하향 추세일 수 있습니다.

  2. 복수 입학 조건

    • MA100과 MA500보다 높아야 합니다.
    • 선택 가능한 트렌드 필터 조건: MA100 > MA500
    • 선택 가능한 RSI 필터 조건: RSI가 평평한 평균보다 높아야 한다
    • 선택 가능한 ADX 필터 조건: ADX는 트렌드 강도를 보장하기 위해 평평한 평균보다 높아야 합니다.
    • 선택 가능한 ATR 필터 조건: ATR은 평평한 평균보다 높아야 하며, 충분한 변동성을 보장한다
  3. 공허 입학 조건

    • MA100과 MA500보다 낮아야 합니다.
    • 가격도 부린의 하락보다 낮아야 합니다.
    • RSI가 설정된 마이너스보다 낮아야 합니다 (기본 33, 과매매를 나타냅니다)
    • 선택 가능한 ATR 필터 조건
    • 강력한 상승 추세 차단: MA100이 MA500보다 설정된 비율을 초과하면 공백으로 들어가지 않습니다 (강한 상승 추세에서 공백을 피하십시오)
  4. 위험 관리 및 퇴출 전략

    • 다중 상점 스톱: 입점 가격 이하의 비율로 설정 (설정값은 3%)
    • 다수장 추가 출전: MA500 아래로 떨어질 때
    • 빈 헤드 스톱: 입시 가격보다 높은 비율로 설정 (설정값은 3%)
    • 공허 헤드 스티드: 입시 가격 이하의 비율로 설정 (설정값 4%)
    • 자금 관리: 거래마다 기본으로 계좌 자금 100%를 사용하며, 한 번에 피라미드 가설을 허용합니다.

이 디자인은 전략이 트렌드 시장에서 큰 파동 기회를 잡을 수 있도록 해 주며, 과매도 조건에서 역전점을 찾을 수 있다.

전략적 이점

  1. 매우 적응력이 좋다전략: 여러 선택 필터들 (RSI, ADX, ATR) 을 통해 고도로 사용자 정의 할 수 있습니다. 다양한 시장 환경과 거래자의 스타일에 맞게 조정할 수 있습니다. 사용자는 현재 시장 상태에 따라 필터를 유연하게 켜거나 끌 수 있습니다.

  2. 양방향 거래이 전략은 단순한 트렌드 추적이나 반전 시스템과는 달리 두 가지 거래 방법을 결합하여 상승 추세에서 더 많이 할 수 있고 극단적인 초과 판매 조건에서 더 많이 할 수 있으며 수익을 올릴 수 있습니다.

  3. 지능 트렌드 판단: 이중 평행선 시스템 ((MA100 및 MA500) 을 사용하면 단일 평행선 시스템보다 가짜 돌파구를 더 잘 필터링 할 수 있습니다.

  4. 동적 변동률 적응ATR 필터를 통해, 전략은 시장의 변동성에 대한 변화에 자동으로 적응할 수 있으며, 낮은 변동성 환경에서 자주 거래하는 것을 방지하고 불필요한 거래 비용을 줄일 수 있습니다.

  5. 강세를 쫓는 것을 막기 위해: 공중 거래는 “강한 상향 상승 차단” 메커니즘을 설정하고, MA100이 MA500보다 설정된 비율을 초과할 때, 하락을 금지하고, 강력한 상향 상승 시 역동성으로 인한 위험을 효과적으로 피한다.

  6. 다중 인증 메커니즘: 입시 신호는 여러 기술 지표가 공동으로 확인되어야 함으로써 가짜 신호의 가능성을 크게 줄이고 전략의 안정성을 향상시킵니다.

  7. 유연한 출전 메커니즘전략: 다중 헤드 및 공허 헤드 각각에 대해 다른 출전 논리가 설계되어 있으며, 다중 헤드는 MA500을 통해 동적 스톱으로 사용할 수 있으며, 공허 헤드는 고정 스톱 목표를 가지고 있으며, 다른 방향의 거래 특성에 적합합니다.

전략적 위험

  1. 매개변수 민감도전략은 여러 가지 기술 지표와 파라미터 설정에 의존하며, 이러한 파라미터의 미세한 변화는 재검토 결과에 상당한 차이를 초래할 수 있다. 실제 거래에서 최적의 파라미터는 시장 상태의 변화에 따라 변경될 수 있으며, 역사적 데이터에 과도하게 적합할 위험이 있다. 해결 방법은 단계적 최적화와 전향 테스트를 사용하여 파라미터의 안정성을 검증하는 것이다.

  2. 지연 위험이동 평균과 같은 지표는 본질적으로 뒤처진 지표이며, 급격한 변동 시장에서 전환점을 적시에 잡지 못할 수 있으며, 진입 또는 출퇴근이 지연됩니다. 높은 변동 시장에서 이동 평균 주기를 적절히 단축하거나 다른 선도 지표를 추가하는 것이 좋습니다.

  3. 트렌드 전환기 부진: 흔들리는 시장이나 트렌드 전환 기간에, 전략은 빈번한 가짜 신호를 생성할 수 있으며, 이로 인해 연속적인 손실이 발생할 수 있다. 해결책은 시장 상태를 인식하는 메커니즘을 추가하여 흔들리는 시장이 확인되면 자동으로 포지션을 낮추거나 거래를 중단하는 것이다.

  4. 자금 관리 위험전략: 계좌의 100%의 자금을 기본으로 사용하며, 한 번 피라미드 상장을 허용하며, 불리한 상황에서는 큰 인출을 겪을 수 있습니다. 개인 위험 부담에 따라 포지션 크기를 조정하여 전체 자금을 사용하는 거래를 피하는 것이 좋습니다.

  5. 유동성 위험: 유동성이 낮은 시장이나 시간대에 미끄러짐이 증가하거나 예상된 가격으로 거래되지 않을 위험이 있습니다. 유동성이 풍부한 주류 거래 쌍과 시간대에 운영하는 전략이 권장됩니다.

  6. 블랙 스완 사건의 위험: 고정된 퍼센트 마감은 극단적인 시장 조건에서, 특히 가격이 급격히 상승하는 경우에 효과적으로 실행될 수 없습니다. 최대 손실 제한을 설정하고 옵션과 같은 파생 상품의 극단적 인 위험을 보호하는 것을 고려하는 것이 좋습니다.

전략 최적화 방향

  1. 시장 상태 분류를 도입: 현재 전략은 서로 다른 시장 상태 (트렌드, 흔들림, 높은 변동, 낮은 변동) 에서 동일한 파라미터 설정을 사용하며, 시장 상태 식별 기능을 추가하고, 서로 다른 상태에 대해 서로 다른 파라미터 조합을 최적화하는 것을 고려할 수 있습니다. 구체적인 구현은 변동률 지표 (ATR 퍼센트와 같은) 또는 트렌드 강도 지표 (ADX 절단과 같은) 를 통해 시장 상태를 구분할 수 있습니다.

  2. 자금 관리 최적화: 현재 전략은 고정 비율의 계좌 자금을 사용하며, 변동률에 기반한 동적 포지션 관리로 개선할 수 있으며, 낮은 변동률의 환경에서 포지션을 증가시키고, 높은 변동률의 환경에서 포지션을 감소시켜 위험 균형을 달성할 수 있다. ATR의 상대치를 사용하여 거래당 자금 비율을 동적으로 조정할 수 있다.

  3. 시간 필터를 추가특정 시장은 특정 기간 동안 더 나은 또는 더 나쁜 성과를 낼 수 있습니다. 시간 필터 기능을 추가하여 역사적으로 좋지 않은 기간을 피할 수 있습니다. 이것은 다른 기간 (아시아, 유럽, 미국 거래 시간 등) 의 전략적 성과를 분석하여 수행 할 수 있습니다.

  4. 다중 시간 프레임 확인: 현재 전략은 단일 시간 프레임 (시간) 에서만 실행되며, 더 높은 시간 프레임의 트렌드 확인을 추가하는 것을 고려할 수 있으며, 더 높은 시간 프레임의 트렌드 방향이 일치하는 경우에만 출전하여 승률을 높일 수 있습니다.

  5. 동적 손해 및 정지: 동적, 시장의 변동성에 기반한 중지 및 중지 고정 비율을 대체하여 전략이 다양한 변동 환경에 더 잘 적응하도록합니다. ATR의 배수를 사용하여 중지 및 중지 지점을 설정하여 변동성이 증가하면 자동으로 중지 범위를 확장 할 수 있습니다.

  6. 감정 지표 통합: 시장 감정 지표를 추가 필터로 추가하여 거래량, 투자비율 (영시 계약에 대한) 또는 선물 프리미엄을 추가하여 극심한 감정 상태에서 역전 거래하는 것을 피하십시오. 이러한 지표는 시장이 너무 뜨겁거나 너무 차가운 경고 신호로 작용 할 수 있습니다.

  7. 기계 학습 최적화: 기계 학습 알고리즘을 사용하여 동적으로 최적의 변수 조합을 선택하고, 최근 시장 상태에 따라 전략 변수를 자동으로 조정한다. 이것은 롤링 창의 변수 최적화 또는 강도 학습 방법을 구현하여 구현할 수 있다.

요약하다

쌍평선동량 트렌드 추적 및 역전 거래 시스템은 정교하게 설계된 양적 거래 전략으로, 평선 시스템, 동량 지표 및 변동률 필터를 결합하여 전략의 간결성을 유지하면서 높은 적응력과 사용자 정의 능력을 제공합니다. 이 전략의 핵심 장점은 여러 가지 확인 메커니즘과 유연한 필터링 시스템으로, 다양한 시장 환경에 적응 할 수 있습니다.

그러나, 모든 거래 전략과 마찬가지로, 그것은 또한 변수 감수성, 지연성 및 시장 상태 변화와 같은 도전을 직면합니다. 시장 상태 분류, 동적 자금 관리, 다중 시간 프레임 분석 및 기계 학습 최적화와 같은 방향의 개선을 도입함으로써 전략의 안정성과 적응력이 더욱 향상 될 것으로 예상됩니다.

무엇보다도, 거래자는 이 전략을 적용할 때 그 원칙과 제한을 충분히 이해하고, 개인의 위험 선호와 시장 경험에 따라 적절히 조정하고, 항상 엄격한 위험 관리 원칙을 준수해야합니다. 완벽한 거래 전략은 없지만, 지속적인 최적화와 신중한 적용을 통해, 이 시스템은 거래자의 도구 상자에 강력한 무기가 될 수 있습니다.

전략 소스 코드
/*backtest
start: 2024-05-26 00:00:00
end: 2025-05-25 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"SOL_USDT"}]
*/

//@version=6
strategy("Momentum Long + Short Strategy (BTC 3H)", overlay=true,
     default_qty_type=strategy.percent_of_equity,
     default_qty_value=100,
     initial_capital=1000,
     commission_type=strategy.commission.percent,
     commission_value=0.1,
     slippage=1,
     pyramiding=1)


// ==============================================================================
// === LONG TRADE SETTINGS
// ==============================================================================
enableLongs     = input.bool(true,  "Enable Long Trades", group="LONG TRADE SETTINGS")
slPercentLong   = input.float(3.0, "Long Stop Loss %", minval=0.1, group="LONG TRADE SETTINGS")

useRSIFilter     = input.bool(false, "Enable RSI Filter", group="LONG FILTER SETTINGS")
useADXFilter     = input.bool(false, "Enable ADX Filter", group="LONG FILTER SETTINGS")
useATRFilter     = input.bool(false, "Enable ATR Filter", group="LONG FILTER SETTINGS")
useTrendFilter   = input.bool(true,  "Require MA100 > MA500", group="LONG FILTER SETTINGS")

smoothType      = input.string("EMA", "Smoothing Type", options=["EMA", "SMA"], group="LONG FILTER SETTINGS")
smoothingLength = input.int(100, "Smoothing Length (for filters)", group="LONG FILTER SETTINGS")

rsiLengthLong   = input.int(14, "RSI Length", group="RSI FILTER")
adxLength       = input.int(14, "ADX Length", group="ADX FILTER")
atrLength       = input.int(14, "ATR Length", group="ATR FILTER")


// ==============================================================================
// === SHORT TRADE SETTINGS
// ==============================================================================
enableShorts         = input.bool(false, "Enable Short Trades", group="SHORT TRADE SETTINGS")
slPercentShort       = input.float(3.0, "Short Stop Loss %", minval=0.1, group="SHORT TRADE SETTINGS")
tpPercentShort       = input.float(4.0, "Short Take Profit %", minval=0.1, group="SHORT TRADE SETTINGS")
rsiLengthShort       = input.int(14, "RSI Length", group="SHORT FILTER SETTINGS")
rsiThresholdShort    = input.float(33, "RSI Threshold", minval=1, maxval=100, group="SHORT FILTER SETTINGS")
bbLength             = input.int(20, "Bollinger Band Length", group="SHORT FILTER SETTINGS")
useATRFilterShort    = input.bool(true, "Enable ATR Filter (Short)", group="SHORT FILTER SETTINGS")
useStrongUptrendBlock = input.bool(true, "Block Shorts if MA100 > MA500 by (%)", group="SHORT FILTER SETTINGS")
shortTrendGapPct     = input.float(2.0, "Threshold (%) for Blocking Shorts", minval=0.1, group="SHORT FILTER SETTINGS")


// ==============================================================================
// === COMMON INDICATORS
// ==============================================================================
ma100 = smoothType == "EMA" ? ta.ema(close, 100) : ta.sma(close, 100)
ma500 = smoothType == "EMA" ? ta.ema(close, 500) : ta.sma(close, 500)
priceAboveMAs = close > ma100 and close > ma500
trendAlignment = not useTrendFilter or ma100 > ma500

plot(ma100, title="MA 100", color=color.orange)
plot(ma500, title="MA 500", color=color.blue)


// ==============================================================================
// === LONG FILTER LOGIC
// ==============================================================================
rsiLong = ta.rsi(close, rsiLengthLong)
rsiSmooth = smoothType == "EMA" ? ta.ema(rsiLong, smoothingLength) : ta.sma(rsiLong, smoothingLength)
rsiPass = not useRSIFilter or rsiLong > rsiSmooth

dmi(len) =>
    up       = ta.change(high)
    down     = -ta.change(low)
    plusDM   = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM  = na(down) ? na : (down > up and down > 0 ? down : 0)
    trur     = ta.rma(ta.tr, len)
    plusDI   = 100 * ta.rma(plusDM, len) / trur
    minusDI  = 100 * ta.rma(minusDM, len) / trur
    dx       = 100 * math.abs(plusDI - minusDI) / (plusDI + minusDI)
    ta.rma(dx, len)

adx = dmi(adxLength)
adxSmooth = smoothType == "EMA" ? ta.ema(adx, smoothingLength) : ta.sma(adx, smoothingLength)
adxPass = not useADXFilter or adx > adxSmooth

atr = ta.atr(atrLength)
atrSmooth = smoothType == "EMA" ? ta.ema(atr, smoothingLength) : ta.sma(atr, smoothingLength)
atrPass = not useATRFilter or atr > atrSmooth


// ==============================================================================
// === SHORT FILTER LOGIC
// ==============================================================================
rsiShort = ta.rsi(close, rsiLengthShort)
bbBasis = ta.sma(close, bbLength)
bbDev   = ta.stdev(close, bbLength)
bbLower = bbBasis - bbDev * 2
priceBelowBB = close < bbLower
priceBelowMAs = close < ma100 and close < ma500
rsiOversold = rsiShort < rsiThresholdShort

atrShort = ta.atr(atrLength)
atrShortSmoothed = smoothType == "EMA" ? ta.ema(atrShort, smoothingLength) : ta.sma(atrShort, smoothingLength)
atrShortPass = not useATRFilterShort or atrShort > atrShortSmoothed

emaGapTooWide = (ma100 - ma500) / ma500 * 100 > shortTrendGapPct
strongUptrendBlock = not useStrongUptrendBlock or not emaGapTooWide


// ==============================================================================
// === ENTRY CONDITIONS
// ==============================================================================
longCondition = enableLongs and priceAboveMAs and trendAlignment and rsiPass and adxPass and atrPass
shortCondition = enableShorts and priceBelowMAs and priceBelowBB and rsiOversold and atrShortPass and strongUptrendBlock

if longCondition
    strategy.entry("Long", strategy.long)

if shortCondition
    strategy.entry("Short", strategy.short)


// ==============================================================================
// === EXIT CONDITIONS
// ==============================================================================
longStop = strategy.position_avg_price * (1 - slPercentLong / 100)
strategy.exit("SL Long", from_entry="Long", stop=longStop)

if strategy.position_size > 0 and close < ma500
    strategy.close("Long", comment="TP Below MA500")

shortStop = strategy.position_avg_price * (1 + slPercentShort / 100)
shortTP   = strategy.position_avg_price * (1 - tpPercentShort / 100)

strategy.exit("SL/TP Short", from_entry="Short", stop=shortStop, limit=shortTP)