EMA 크로스오버와 볼린저 밴드 듀얼 진입 전략: 추세 추적과 변동성 돌파를 결합한 양적 거래 시스템

EMA BB ATR
생성 날짜: 2024-07-29 17:14:32 마지막으로 수정됨: 2024-07-29 17:14:32
복사: 0 클릭수: 604
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

EMA 크로스오버와 볼린저 밴드 듀얼 진입 전략: 추세 추적과 변동성 돌파를 결합한 양적 거래 시스템

개요

EMA와 부린 띠의 쌍입입 전략은 트렌드 추적과 변동적 돌파구를 결합한 양적 거래 시스템이다. 이 전략은 주로 지수 이동 평균 (EMA) 의 교차를 사용하여 시장 흐름을 판단하고 부린 띠 (Bollinger Bands) 를 사용하여 잠재적인 돌파 기회를 식별한다. 이 방법은 강력한 시장 흐름을 포착하고 부린 띠의 돌파구를 통해 추가적인 입점을 제공하여 거래 기회를 증가시키고 자금 관리를 최적화한다.

전략 원칙

  1. EMA 교차: 전략은 12주기 및 26주기 EMA를 사용하여 트렌드 방향을 결정한다. 빠른 EMA ((12주기) 위에 느린 EMA ((26주기) 를 횡단할 때, 다중 신호를 생성한다. 반대로 공백 신호를 생성한다.

  2. 브린 밴드: 전략은 55주기, 0.9 표준 차이의 브린 밴드 설정을 사용합니다. 가격이 궤도를 돌파 할 때, 이미 다중 트렌드에 있다면 추가적인 진입 기회를 제공합니다.

  3. 입력 논리:

    • 메이저 진입: EMA 크로스 또는 가격 돌파 브린 띠를 선로에 올린다.
    • 추가 입점: 이미 다수 상위 포지션을 보유하고 있다면, 브린 띠 돌파할 때 포지션을 추가한다.
  4. 출전 논리:

    • 빠른 EMA 아래에서 느린 EMA를 통과할 때 탈퇴한다.
    • 부린 반도 중간 궤도보다 가격이 닫히면 탈퇴할 수 있다.
  5. 손해 방지 설정:

    • 14주기 ATR (Average True Rate) 을 사용하여 동적 설정을 중지한다.
    • 지난 5일 최저점을 선택해서 스톱로드를 사용해도 됩니다.
  6. 위험 관리:

    • 매 거래의 기본 리스크 3%의 계정 자금 (조정 가능)
    • ATR을 사용하여 시장의 변동에 적응하기 위해 스톱로스를 동적으로 조정합니다.
    • 부린 벨트 중도선보다 가격이 낮으면 거래 중지할 수 있다.

전략적 이점

  1. 다차원 분석: 트렌드 추적 (EMA) 과 변동성 돌파 (Brin Belt) 전략이 결합되어 거래 신호의 신뢰성을 향상시킵니다.

  2. 유연한 진입 메커니즘: 주요 EMA 교차 신호 이외에, 부린 벨트 돌파구를 이용하여 추가 진입 기회를 제공하여 전략의 적응력을 증가시킨다.

  3. 동적 위험 관리: ATR을 사용하여 스톱로드를 설정하고 포지션 크기를 조정하여 전략이 다양한 시장 조건의 변동성에 더 잘 적응할 수 있도록합니다.

  4. 시장상태를 감지: 브린带中轨를 통해 시장상태를 판단하고, 불리한 조건에서 거래를 중지하여 위험을 줄일 수 있다.

  5. 자금 관리 최적화: 비율 위험 관리 및 ATR 동적으로 포지션 크기를 조정하여 더 정밀한 자금 통제를 구현한다.

  6. 커스터마이징성: EMA 주기, 브린 벨트 설정, ATR 배수 등과 같은 여러 파라미터를 조정할 수 있어, 전략이 다른 거래 품종과 시장 환경에 적응할 수 있다.

전략적 위험

  1. 트렌드 반전 위험: 강한 트렌드 시장에서 잘 작동하지만, 흔들리는 시장에서 종종 가짜 브레이크 신호가 발생할 수 있습니다.

  2. 과도한 거래 위험: 브린 띠의 뚫림으로 인해 과도한 거래 신호가 발생하여 거래 비용이 증가할 수 있습니다.

  3. 미끄러지는 위험: 높은 변동성 시장에서 입출금 가격이 예상보다 크게 오차 할 수 있습니다.

  4. 매개 변수 민감성: 전략 성능은 EMA 주기, 브린 벨트 설정 등 매개 변수 변화에 민감할 수 있으며, 신중한 최적화와 재검토가 필요합니다.

  5. 시장 환경 의존성: 전략은 다른 시장 주기 및 변동 환경 하에서 일관되게 작동하지 않을 수 있다.

  6. 자금 관리 위험: 백분율 위험 관리가 사용되더라도, 연속적인 손실이 발생하면 큰 계좌 철회에 직면할 수 있습니다.

전략 최적화 방향

  1. 다중 시간 프레임 분석: 거짓 신호를 줄이기 위해 더 긴 기간의 트렌드 확인, 예를 들어 주선 또는 달선 EMA를 도입하십시오.

  2. 변동률 필터: 낮은 변동률 환경에서 브린 밴드 매개 변수를 조정하거나 교역을 중지하여横盘 시장에서 과도한 거래를 피한다.

  3. 동력 지표: RSI 또는 MACD와 같은 동력 지표는 트렌드 강도를 확인하고 잠재적인 역전 신호를 확인하기 위해 사용됩니다.

  4. 출전 메커니즘을 최적화하십시오. 수익을 더 잘 고정하기 위해 스톱 로스를 추적하거나 ATR 기반의 동적 수익 목표를 사용하는 것을 고려하십시오.

  5. 시장 상태 분류: 다른 시장 상태에서 다른 파라미터 설정을 사용하는 시장 환경 분류 시스템을 개발한다.

  6. 기계 학습 최적화: 기계 학습 알고리즘을 사용하여 다양한 시장 조건에 맞게 전략 매개 변수를 동적으로 조정합니다.

  7. 연관성 분석: 다중 품종 거래 시, 종목 간의 연관성을 고려하여 전체 포트폴리오의 위험-수익 특성을 최적화하십시오.

  8. 기본 요소를 도입: 주식이나 상품의 경우, 관련 기본 지표를 추가하여 입시 신호의 질을 향상시키는 것을 고려하십시오.

요약하다

EMA 교차와 부린 띠 이중 입문 전략은 트렌드 추적과 변동 돌파의 개념을 결합한 양적 거래 시스템이다. EMA 교차를 통해 주요 트렌드를 포착하고 부린 띠 돌파를 활용하여 추가 입문 기회를 제공하며, 동적 위험 관리 방법을 사용하여 자금 사용을 최적화한다. 이 전략의 장점은 다차원 분석 방법과 유연한 위험 관리에 있지만, 트렌드 반전과 과잉 거래 위험도 직면한다.

다중 시간 프레임 분석, 변동률 필터링, 동력 지표 등의 방법으로 이 전략에 큰 최적화 공간이 남아있다. 특히 기계 학습 알고리즘과 시장 상태 분류 시스템을 도입하면 전략의 적응성과 안정성을 크게 향상시킬 수 있다. 그러나 실제 응용에서는 여전히 전면적인 피드백과 전향 테스트가 필요하며 특정 거래 유형과 시장 환경에 따라 세밀한 파라미터 조정이 필요합니다.

종합적으로, 이것은 합리적으로 설계된, 잠재적인 양적 거래 전략 프레임 워크입니다. 지속적인 최적화와 신중한 관리를 통해, 이것은 트렌드를 포착하면서 위험을 통제하려는 투자자에게 적합한 안정적인 거래 시스템으로 발전할 잠재력을 가지고 있습니다.

전략 소스 코드
/*backtest
start: 2023-07-23 00:00:00
end: 2024-07-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("EMA Crossover with BB Double Entry", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=100)

// Input parameters
fastLength = input.int(12, "Fast EMA Length")
slowLength = input.int(26, "Slow EMA Length")
atrPeriod = input.int(14, "ATR Period")
atrMultiplier = input.float(1.0, "ATR Multiplier")
useATRStopLoss = input.bool(true, "Use ATR Stop Loss")
stopLossDays = input.int(5, "Number of days for stop loss", minval=1, maxval=50)
riskPerTrade = input.float(3.0, "Risk per trade (%)", minval=0.1, maxval=5, step=0.1)
bbRiskPerTrade = input.float(1.5, "Risk for BB breakout trade (%)", minval=0.1, maxval=5, step=0.1)

// Bollinger Bands parameters
bbLength = input.int(55, "BB Length")
bbMult = input.float(0.9, "BB Standard Deviation")
useBBPauseResume = input.bool(false, "Use BB for Pause/Resume trading")

// Backtesting dates
startDate = input(timestamp("2020-01-01"), "Start Date")
endDate = input(timestamp("9999-12-31"), "End Date")

// Calculate EMAs
fastEMA = ta.ema(close, fastLength)
slowEMA = ta.ema(close, slowLength)

// Calculate ATR
atr = ta.atr(atrPeriod)

// Calculate Bollinger Bands
bbBasis = ta.sma(close, bbLength)
bbDev = bbMult * ta.stdev(close, bbLength)
bbUpper = bbBasis + bbDev
bbLower = bbBasis - bbDev

// Define trading conditions
longCondition = ta.crossover(fastEMA, slowEMA)
shortCondition = ta.crossunder(fastEMA, slowEMA)
bullish = fastEMA > slowEMA
bearish = fastEMA < slowEMA

// Bollinger Bands breakout
bbBreakout = close > bbUpper and close[1] <= bbUpper[1]

// Calculate lowest low for stop loss
lowestLow = ta.lowest(low, stopLossDays)

// Variables to store entry price and stop loss
var float entryPrice = na
var float stopLoss = na
var bool inPosition = false
var bool pauseTrading = false

// Entry logic
entryConditions = (longCondition or (bbBreakout and bullish)) and
                  (not useBBPauseResume or close > bbBasis) and
                  not pauseTrading

if entryConditions and not inPosition
    entryPrice := close
    atrStopLoss = close - (atr * atrMultiplier)
    lowStopLoss = lowestLow
    stopLoss := useATRStopLoss ? atrStopLoss : lowStopLoss
    
    riskAmount = strategy.equity * (riskPerTrade / 100)
    positionSize = riskAmount / (close - stopLoss)
    
    strategy.entry("Long", strategy.long, qty=positionSize)
    inPosition := true
    pauseTrading := false
    
    alert("BUY," + syminfo.ticker + ",EntryPrice=" + str.tostring(close) + ",StopLoss=" + str.tostring(stopLoss) + ",PositionSize=" + str.tostring(positionSize), alert.freq_once_per_bar_close)

// Additional entry on BB breakout
if inPosition and bbBreakout and bullish and (not useBBPauseResume or close > bbBasis)
    bbRiskAmount = strategy.equity * (bbRiskPerTrade / 100)
    bbPositionSize = bbRiskAmount / (close - stopLoss)
    
    strategy.entry("Long_BB", strategy.long, qty=bbPositionSize)
    
    alert("ADD," + syminfo.ticker + ",EntryPrice=" + str.tostring(close) + ",StopLoss=" + str.tostring(stopLoss) + ",PositionSize=" + str.tostring(bbPositionSize), alert.freq_once_per_bar_close)

// Exit logic
if shortCondition or (useBBPauseResume and inPosition and close < bbBasis)
    if shortCondition
        strategy.close_all(comment="EMA Crossdown")
        inPosition := false
        pauseTrading := false
        alert("SELL," + syminfo.ticker + ",Reason=EMA_Crossdown", alert.freq_once_per_bar_close)
    else if useBBPauseResume
        strategy.close_all(comment="Close under BB basic")
        pauseTrading := true
        alert("SELL," + syminfo.ticker + ",Reason=Below_BB_Basic", alert.freq_once_per_bar_close)
    
    entryPrice := na
    stopLoss := na

// Resume trading if price closes above BB basic
if useBBPauseResume and pauseTrading and close > bbBasis
    pauseTrading := false
    alert("RESUME," + syminfo.ticker, alert.freq_once_per_bar_close)

// Stop loss
if strategy.position_size > 0
    strategy.exit("Stop Loss", "Long", stop=stopLoss)
    strategy.exit("Stop Loss", "Long_BB", stop=stopLoss)
    if close <= stopLoss
        alert("SELL," + syminfo.ticker + ",Reason=Stop_Loss", alert.freq_once_per_bar_close)

// Plotting
plot(fastEMA, color=color.new(color.blue, 0), title="Fast EMA")
plot(slowEMA, color=color.new(color.red, 0), title="Slow EMA")
plot(bbUpper, color=color.new(color.green, 50), title="BB Upper")
plot(bbLower, color=color.new(color.green, 50), title="BB Lower")
plot(bbBasis, color=color.new(color.yellow, 50), title="BB Basic")
plot(strategy.position_size > 0 ? stopLoss : na, color=color.red, style=plot.style_cross, linewidth=2, title="Stop Loss")

// Alert conditions
alertcondition(entryConditions, title="Buy Alert", message="Buy {{ticker}}")
alertcondition(bbBreakout and inPosition and bullish and (not useBBPauseResume or close > bbBasis), title="Add Position Alert", message="Add Position {{ticker}}")
alertcondition(shortCondition, title="Sell Alert (EMA)", message="Sell {{ticker}} (EMA crossdown)")
alertcondition(useBBPauseResume and inPosition and close < bbBasis, title="Pause Alert", message="Pause trading {{ticker}} (Close under BB basic)")
alertcondition(useBBPauseResume and pauseTrading and close > bbBasis, title="Resume Alert", message="Resume trading {{ticker}} (Close above BB basic)")