볼륨 필터링 전략과 결합된 고급 양적 거래 다중 이동 평균 교차 시스템

MA EMA SMA VOL TP SL
생성 날짜: 2025-02-21 14:50:59 마지막으로 수정됨: 2025-02-21 14:50:59
복사: 5 클릭수: 464
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

볼륨 필터링 전략과 결합된 고급 양적 거래 다중 이동 평균 교차 시스템 볼륨 필터링 전략과 결합된 고급 양적 거래 다중 이동 평균 교차 시스템

개요

이 전략은 3개의 다른 기간의 이동 평균을 (빠른 EMA, 느린 EMA 및 트렌드 SMA) 를 핵심 지표로 사용하고 거래 신호의 유효성을 확인하기 위해 교차 필터를 결합합니다. 이 전략은 또한 손실 및 중지 기능을 통합하여 위험을 효과적으로 제어합니다.

전략 원칙

이 전략은 다음과 같은 핵심 요소를 기반으로 합니다.

  1. 9주기 및 21주기 지수 이동 평균 ((EMA) 을 사용하여 교차 판단을 하여 초기 거래 신호를 형성한다
  2. 50주기 간단한 이동 평균 ((SMA) 을 트렌드 필터로 도입하여 거래 방향이 주 트렌드와 일치하도록합니다.
  3. 20주기 평균 거래량의 1.5배를 거래량 필터링 조건으로 사용하여 거래 활성을 보장합니다.
  4. 가격 돌파구에서 합성 거래량이 확인 신호의 유효성을 강화한다
  5. 리스크/이익 비율을 조절하기 위해 1%의 스톱로스와 400%의 스톱 스톱을 설정합니다.

전략적 이점

  1. 다중 확인 메커니즘: 신속하고 느린 평균선 교차, 트렌드 라인 필터링 및 교량 확인 삼중 메커니즘으로 신호의 신뢰성이 크게 향상
  2. 리스크 제어: 합리적인 스톱 스 비율을 설정하여 회수를 효과적으로 제어할 수 있습니다.
  3. 강한 트렌드 추적성: 장기 평균 선 필터링을 통해 거래 방향이 주 트렌드와 일치하도록합니다.
  4. 신호 품질: 교류량 필터링으로 가짜 침입을 효과적으로 방지할 수 있다.
  5. 매개 변수 유연성: 각 지표 매개 변수는 시장 특성에 따라 최적화 될 수 있습니다.

전략적 위험

  1. 변동 시장 위험: 변동 시장에서 거래 신호가 자주 발생하여 거래 비용이 증가할 수 있습니다.
  2. 슬라이드 위험: 유동성이 부족할 때 더 큰 슬라이드 위험에 직면할 수 있습니다.
  3. 가짜 돌파구 위험: 거래량 필터링에도 불구하고 가짜 돌파구가 발생할 수 있습니다.
  4. 매개 변수 최적화 위험: 과도한 최적화가 과부응으로 이어질 수 있다
  5. 시장 환경 의존성: 전략이 트렌드가 뚜렷한 시장에서 더 잘 작동하고 다른 시장 환경에서는 좋지 않을 수 있습니다.

전략 최적화 방향

  1. 변동률 지표를 도입: ATR 지표를 추가하여 스톱 포지션을 동적으로 조정할 수 있습니다.
  2. 최적화된 트랜지먼트 필터링: 절대적인 트랜지먼트보다는 상대적인 트랜지먼트를 필터링 조건으로 고려할 수 있다
  3. 트렌드 강도 확인을 추가: 트렌드 강도를 확인하기 위해 ADX와 같은 지표를 도입할 수 있습니다.
  4. 더 나은 스톱 메커니즘: 더 나은 수익을 위해 동적 스톱을 설계할 수 있습니다.
  5. 시간 필터를 추가하세요: 낮은 변동성 시점에 거래하는 것을 피하세요.

요약하다

이 전략은 여러 기술 지표의 결합을 통해 비교적 완벽한 거래 시스템을 구축한다. 전략의 핵심 장점은 다중 확인 메커니즘과 완벽한 위험 제어에 있다. 그러나 실제 시장 상황에 따라 변수 최적화 및 전략 개선을 여전히 필요로 한다. 합리적인 최적화 및 위험 통제를 통해 이 전략은 추세 시장에서 안정적인 수익을 얻을 것으로 보인다.

전략 소스 코드
/*backtest
start: 2024-02-22 00:00:00
end: 2024-12-17 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("Optimized Moving Average Crossover Strategy with Volume Filter", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Inputs for Moving Averages
fastLength = input.int(9, title="Fast MA Length")
slowLength = input.int(21, title="Slow MA Length")
trendFilterLength = input.int(50, title="Trend Filter Length")

// Risk Management Inputs
stopLossPercent = input.float(1, title="Stop Loss (%)", step=0.1)
takeProfitPercent = input.float(400, title="Take Profit (%)", step=0.1)

// Volume Filter Input
volumeMultiplier = input.float(1.5, title="Volume Multiplier", step=0.1)  // Multiplier for average volume

// Moving Averages
fastMA = ta.ema(close, fastLength)
slowMA = ta.ema(close, slowLength)
trendMA = ta.sma(close, trendFilterLength)  // Long-term trend filter

// Volume Calculation
avgVolume = ta.sma(volume, 20)  // 20-period average volume
volumeCondition = volume > avgVolume * volumeMultiplier  // Volume must exceed threshold

// Plotting Moving Averages
plot(fastMA, color=color.blue, title="Fast MA")
plot(slowMA, color=color.red, title="Slow MA")
plot(trendMA, color=color.green, title="Trend Filter MA")

// Entry Conditions (Filtered by Trend and Volume)
longCondition = ta.crossover(fastMA, slowMA) and close > trendMA and volumeCondition
shortCondition = ta.crossunder(fastMA, slowMA) and close < trendMA and volumeCondition

// Execute Trades
if (longCondition)
    strategy.entry("Long", strategy.long)

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

// Exit Conditions: Stop Loss and Take Profit
if (strategy.position_size > 0)
    strategy.exit("Exit Long", "Long", stop=strategy.position_avg_price * (1 - stopLossPercent / 100), limit=strategy.position_avg_price * (1 + takeProfitPercent / 100))

if (strategy.position_size < 0)
    strategy.exit("Exit Short", "Short", stop=strategy.position_avg_price * (1 + stopLossPercent / 100), limit=strategy.position_avg_price * (1 - takeProfitPercent / 100))

// Additional Alerts
alertcondition(longCondition, title="Long Signal", message="Go Long!")
alertcondition(shortCondition, title="Short Signal", message="Go Short!")

// Debugging Labels
if (longCondition)
    label.new(bar_index, close, "Long", style=label.style_label_up, color=color.green, textcolor=color.white)

if (shortCondition)
    label.new(bar_index, close, "Short", style=label.style_label_down, color=color.red, textcolor=color.white)