EMA/SMA 추세 추종 및 스윙 트레이딩 전략과 볼륨 필터링, 퍼센트 손절매 및 이익 실현 시스템을 결합

EMA SMA
생성 날짜: 2024-12-11 15:12:35 마지막으로 수정됨: 2024-12-11 15:12:35
복사: 1 클릭수: 444
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

EMA/SMA 추세 추종 및 스윙 트레이딩 전략과 볼륨 필터링, 퍼센트 손절매 및 이익 실현 시스템을 결합

개요

이 전략은 종합적인 거래 시스템으로, 트렌드 추적과 대역 거래 방법을 결합하여, EMA와 SMA 평선 교차, 대역 높은 낮은 지점 식별, 대역량 필터링 및 비율 중지 및 추적 중지 메커니즘을 통해 완전한 거래 시스템을 구축합니다. 전략 설계는 다차원 신호 수치를 확인하고, 기술 지표의 조화 작용을 통해 거래의 정확성과 신뢰성을 향상시킵니다.

전략 원칙

이 전략은 다단계 신호 필터링 메커니즘을 사용하며, 먼저 EMA (~10) 와 SMA (~21) 의 교차 형성 기본 트렌드를 판단하고, 그 다음 왼쪽과 왼쪽의 6 개의 K 선의 고저점 돌파를 통해 진입 시기를 결정하며, 거래량이 200 주기 이동 평균보다 크기를 요구하며, 유동성이 풍부한 환경에서 거래하는 것을 보장합니다. 시스템은 2%의 비율의 스톱과 1%의 추적 스톱로스를 사용하여 위험을 관리합니다. 가격이 파장의 고점을 돌파하고 거래량 조건을 충족하면, 시스템은 더 많은 주문을 열고; 가격이 파장의 저점을 돌파하고 거래량 조건을 충족하면, 시스템은 더 많은 주문을 열습니다.

전략적 이점

  1. 여러 신호 확인 메커니즘 거짓 신호를 줄여: 평평선 트렌드, 가격 돌파 및 거래량으로 트리플 검증을 강화하여 거래 신뢰도를 높인다.
  2. 유연한 스톱스트로드 메커니즘: 스톱스트로드를 비율로 설정하고, 스톱스트로드를 추적하여 수익을 잠금합니다.
  3. 완벽한 시각화 시스템: 거래 모니터링을 위한 평평선, 돌파점의 그래픽 표시를 제공합니다
  4. 고도의 사용자 정의: 핵심 매개 변수 모두 다양한 시장 환경에 적응할 수 있습니다.
  5. 체계화된 위험 관리: 미리 설정된 스톱 로즈와 스톱 포지션으로 위험을 제어

전략적 위험

  1. 수평 시장에서 빈번한 가짜 돌파구가 발생할 수 있습니다.
  2. 거래량 필터는 유효한 신호를 일부 놓쳤을 수 있습니다.
  3. 고정 퍼센티지 스티커가 강세를 보인다면 조기 퇴장할 수 있다.
  4. 급격한 시장 전환에 미흡한 일차 시스템
  5. 거래 비용이 전략 수익에 미치는 영향을 고려해야 합니다.

전략 최적화 방향

  1. 변동률 자조 메커니즘을 도입하여 스톱 손실 파라미터를 동적으로 조정합니다.
  2. 트렌드 강도를 필터링하여 약한 트렌드에서 거래하는 것을 피하십시오.
  3. 상대적인 거래량 변화를 고려한 거래량 필터링 알고리즘을 최적화
  4. 불리한 시간에 거래하는 것을 방지하기 위해 시간 필터링을 추가합니다.
  5. 시장 환경 분류를 고려하고, 다른 시장에 대한 다른 매개 변수를 적용합니다.

요약하다

이 전략은 평선 시스템, 가격 돌파 및 거래량 검증을 통해 전체 거래 시스템을 구축하여 중장기 트렌드 추적에 적합하다. 시스템의 장점은 다중 신호 확인과 개선된 위험 관리 장치에 있다. 그러나横盘 시장에서의 성과에 대해서도 주의를 기울여야 한다. 제안된 최적화 방향을 통해 전략은 개선할 여지가 있으며, 특히 적응성 측면에서 개선하면 전략의 안정성을 높이는 데 도움이 될 것이다.

전략 소스 코드
/*backtest
start: 2019-12-23 08:00:00
end: 2024-12-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// Strategy combining EMA/SMA Crossover, Swing High/Low, Volume Filtering, and Percentage TP & Trailing Stop
strategy("Swing High/Low Strategy with Volume, EMA/SMA Crossovers, Percentage TP and Trailing Stop", overlay=true)

// --- Inputs ---
source = close
TITLE = input(false, title='Enable Alerts & Background Color for EMA/SMA Crossovers')
turnonAlerts = input(true, title='Turn on Alerts?')
colorbars = input(true, title="Color Bars?")
turnonEMASMA = input(true, title='Turn on EMA1 & SMA2?')
backgroundcolor = input(false, title='Enable Background Color?')

// EMA/SMA Lengths
emaLength = input.int(10, minval=1, title='EMA Length')
smaLength = input.int(21, minval=1, title='SMA Length')
ema1 = ta.ema(source, emaLength)
sma2 = ta.sma(source, smaLength)

// Swing High/Low Lengths
leftBars = input.int(6, title="Left Bars for Swing High/Low", minval=1)
rightBars = input.int(6, title="Right Bars for Swing High/Low", minval=1)

// Volume MA Length
volMaLength = input.int(200, title="Volume Moving Average Length")

// Percentage Take Profit with hundredth place adjustment
takeProfitPercent = input.float(2.00, title="Take Profit Percentage (%)", minval=0.01, step=0.01) / 100

// Trailing Stop Loss Option
useTrailingStop = input.bool(true, title="Enable Trailing Stop Loss?")
trailingStopPercent = input.float(1.00, title="Trailing Stop Loss Percentage (%)", minval=0.01, step=0.01) / 100

// --- Swing High/Low Logic ---
pivotHigh(_leftBars, _rightBars) =>
    ta.pivothigh(_leftBars, _rightBars)

pivotLow(_leftBars, _rightBars) =>
    ta.pivotlow(_leftBars, _rightBars)

ph = fixnan(pivotHigh(leftBars, rightBars))
pl = fixnan(pivotLow(leftBars, rightBars))

// --- Volume Condition ---
volMa = ta.sma(volume, volMaLength)

// Declare exit conditions as 'var' so they are initialized
var bool longExitCondition = na
var bool shortExitCondition = na

// --- Long Entry Condition: Close above Swing High & Volume >= 200 MA ---
longCondition = (close > ph and volume >= volMa)
if (longCondition)
    strategy.entry("Long", strategy.long)

// --- Short Entry Condition: Close below Swing Low & Volume >= 200 MA ---
shortCondition = (close < pl and volume >= volMa)
if (shortCondition)
    strategy.entry("Short", strategy.short)

// --- Take Profit and Trailing Stop Logic ---

// For long position: Set take profit at the entry price + takeProfitPercent
longTakeProfitLevel = strategy.position_avg_price * (1 + takeProfitPercent)
shortTakeProfitLevel = strategy.position_avg_price * (1 - takeProfitPercent)

// --- Long Exit Logic ---
if (useTrailingStop)
    // Trailing Stop for Long
    strategy.exit("Long Exit", "Long", stop=na, trail_offset=strategy.position_avg_price * trailingStopPercent, limit=longTakeProfitLevel)
else
    // Exit Long on Take Profit only
    strategy.exit("Long Exit", "Long", limit=longTakeProfitLevel)

// --- Short Exit Logic ---
if (useTrailingStop)
    // Trailing Stop for Short
    strategy.exit("Short Exit", "Short", stop=na, trail_offset=strategy.position_avg_price * trailingStopPercent, limit=shortTakeProfitLevel)
else
    // Exit Short on Take Profit only
    strategy.exit("Short Exit", "Short", limit=shortTakeProfitLevel)

// --- Plot Swing High/Low ---

plot(ph, style=plot.style_circles, linewidth=1, color=color.blue, offset=-rightBars, title="Swing High")
plot(ph, style=plot.style_line, linewidth=1, color=color.blue, offset=0, title="Swing High")
plot(pl, style=plot.style_circles, linewidth=1, color=color.red, offset=-rightBars, title="Swing High")
plot(pl, style=plot.style_line, linewidth=1, color=color.red, offset=0, title="Swing High")
// --- Plot EMA/SMA ---
plot(turnonEMASMA ? ema1 : na, color=color.green, title="EMA")
plot(turnonEMASMA ? sma2 : na, color=color.orange, title="SMA")

// --- Alerts ---
alertcondition(longCondition, title="Long Entry", message="Price closed above Swing High with Volume >= 200 MA")
alertcondition(shortCondition, title="Short Entry", message="Price closed below Swing Low with Volume >= 200 MA")

// --- Bar Colors for Visualization ---
barcolor(longCondition ? color.green : na, title="Long Entry Color")
barcolor(shortCondition ? color.red : na, title="Short Entry Color")
bgcolor(backgroundcolor ? (ema1 > sma2 ? color.new(color.green, 50) : color.new(color.red, 50)) : na)