동적 ATR 및 이중 이동 평균 교차를 기반으로 한 적응형 위험 관리 전략

MA ATR SMA RRR UTC
생성 날짜: 2025-02-20 14:07:26 마지막으로 수정됨: 2025-02-20 14:07:26
복사: 1 클릭수: 359
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

동적 ATR 및 이중 이동 평균 교차를 기반으로 한 적응형 위험 관리 전략 동적 ATR 및 이중 이동 평균 교차를 기반으로 한 적응형 위험 관리 전략

개요

이 전략은 쌍평선 교차 신호와 동적 위험 관리를 결합한 거래 시스템이다. 단기 및 장기 이동 평균의 교차를 통해 거래 신호를 생성하고, ATR 지표를 사용하여 동적으로 중지 손실 및 이득 위치를 조정하며, 거래 품질을 최적화하기 위해 시간 필터링 및 냉각 기간을 도입한다. 이 전략에는 위험 수익률 및 거래 당 위험 비율의 관리 장치도 포함되어 있다.

전략 원칙

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

  1. 신호 생성 시스템은 단기 ((10주기) 와 장기 ((100주기) 의 간단한 이동 평균의 교차를 사용하여 거래를 촉발한다. 단기 평균선이 장기 평균선을 상향으로 통과하면 다중 신호가 발생하고, 반대로 하위 신호가 발생한다.
  2. 리스크 관리 시스템은 14주기 ATR을 1.5배의 계수로 동적 스톱 로드 거리를 설정하고, 수익 목표를 스톱 로드 거리의 2배로 설정한다.
  3. 시간 필터는 사용자가 거래의 특정 기간을 설정하여 지정된 시간 범위 내에서만 거래를 수행 할 수 있도록합니다.
  4. 거래 냉각기 메커니즘은 과도한 거래를 방지하기 위해 10 회의 대기 시간을 설정합니다.
  5. 각 거래의 위험은 계좌의 1%에 통제됩니다.

전략적 이점

  1. 동적 위험 관리: ATR 지표를 사용하여 시장의 변동성에 적응하여 다른 시장 환경에서 자동으로 중지 손실과 수익 거리를 조정합니다.
  2. 전체적인 위험 제어: 위험과 수익의 비율과 거래당 위험 비율을 설정하여 체계적인 자금 관리를 구현한다.
  3. 유연한 시간관리: 거래시간을 다른 시장의 거래시간 특성에 따라 조정할 수 있다.
  4. 과도한 거래 방지: 냉각 기간 메커니즘은 급격한 변동 기간에 과도한 거래 신호를 방지하는 데 효과적입니다.
  5. 시각화 효과: 거래 신호와 이동 평균을 그래프에 명확하게 표시하여 분석 및 최적화를 용이하게 합니다.

전략적 위험

  1. 트렌드 반전의 위험: 불안한 시장에서 가짜 브레이크 신호가 발생하여 연속적인 손실이 발생할 수 있습니다.
  2. 변수 감수성: 이동 평균 주기, ATR 배수 등의 변수의 선택은 전략의 성과에 현저하게 영향을 미칩니다.
  3. 시간 필터를 잘못 설정하면 중요한 거래 기회를 놓칠 수 있습니다.
  4. 고정된 리스크/이익 비율은 다른 시장 환경에서 충분히 유연하지 않을 수 있습니다.

전략 최적화 방향

  1. 트렌드 강도 필터를 도입: 트렌드 강도를 판단하기 위해 ADX 또는 유사한 지표를 추가할 수 있으며, 강한 트렌드 동안만 거래한다.
  2. 동적으로 조정된 위험 수익률: 시장의 변동성이나 추세 강도에 따라 자동으로 조정되는 위험 수익률.
  3. 거래량 분석: 거래량을 신호 확인의 추가적인 지표로 사용한다.
  4. 냉각 기간을 최적화 하는 장치: 냉각 기간의 길이는 시장의 변동적 동력에 따라 조정된다.
  5. 시장 환경 분류에 추가: 다른 시장 환경에서 다른 파라미터 조합을 사용한다.

요약하다

이 전략은 고전적인 기술 분석 방법과 현대적 위험 관리 관념을 결합하여 완전한 거래 시스템을 구축한다. 그것의 핵심 장점은 역동적인 위험 관리와 다중 필터링 메커니즘에 있다. 그러나 실제 응용에서 특정 시장 특성에 따라 변수를 최적화해야 한다. 전략의 성공적인 운영은 거래자가 각 구성 요소의 역할을 깊이 이해하고 시장 변화에 따라 변수를 제때 조정해야 한다.

전략 소스 코드
/*backtest
start: 2024-09-18 00:00:00
end: 2025-02-19 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Profitable Moving Average Crossover Strategy", shorttitle="Profitable MA Crossover", overlay=true)

// Input parameters for the moving averages
shortPeriod = input.int(10, title="Short Period", minval=1)
longPeriod = input.int(100, title="Long Period", minval=1)

// Input parameters for time filter
startHour = input.int(0, title="Start Hour (UTC)", minval=0, maxval=23)
startMinute = input.int(0, title="Start Minute (UTC)", minval=0, maxval=59)
endHour = input.int(23, title="End Hour (UTC)", minval=0, maxval=23)
endMinute = input.int(59, title="End Minute (UTC)", minval=0, maxval=59)

// Cooldown period input (bars)
cooldownBars = input.int(10, title="Cooldown Period (Bars)", minval=1)

// Risk management inputs
riskRewardRatio = input.float(2, title="Risk-Reward Ratio", minval=1)
riskPercent = input.float(1, title="Risk Per Trade (%)", minval=0.1)

// ATR settings
atrLength = input.int(14, title="ATR Length")
atrMultiplier = input.float(1.5, title="ATR Multiplier for Stop-Loss and Take-Profit")

// Calculate the moving averages
shortMA = ta.sma(close, shortPeriod)
longMA = ta.sma(close, longPeriod)

// Plot the moving averages
plot(shortMA, color=color.blue, title="Short MA")
plot(longMA, color=color.red, title="Long MA")

// Calculate ATR for dynamic stop-loss and take-profit
atr = ta.atr(atrLength)
stopLossOffset = atr * atrMultiplier
takeProfitOffset = stopLossOffset * riskRewardRatio

// Identify the crossover points
bullishCross = ta.crossover(shortMA, longMA)
bearishCross = ta.crossunder(shortMA, longMA)

// Get the current bar's time in UTC
currentTime = na(time("1", "UTC")) ? na : timestamp("UTC", year, month, dayofmonth, hour, minute)

// Define the start and end time in seconds from the start of the day
startTime = timestamp("UTC", year, month, dayofmonth, startHour, startMinute)
endTime = timestamp("UTC", year, month, dayofmonth, endHour, endMinute)

// Check if the current time is within the valid time range
isTimeValid = (currentTime >= startTime) and (currentTime <= endTime)

// Functions to check cooldown
var int lastSignalBar = na
isCooldownActive = (na(lastSignalBar) ? false : (bar_index - lastSignalBar) < cooldownBars)

// Handle buy signals
if (bullishCross and isTimeValid and not isCooldownActive)
    entryPrice = close
    stopLossBuy = entryPrice - stopLossOffset
    takeProfitBuy = entryPrice + takeProfitOffset
    strategy.entry("Buy", strategy.long)
    strategy.exit("TakeProfit/StopLoss", "Buy", stop=stopLossBuy, limit=takeProfitBuy)
    lastSignalBar := bar_index

// Handle sell signals
if (bearishCross and isTimeValid and not isCooldownActive)
    entryPrice = close
    stopLossSell = entryPrice + stopLossOffset
    takeProfitSell = entryPrice - takeProfitOffset
    strategy.entry("Sell", strategy.short)
    strategy.exit("TakeProfit/StopLoss", "Sell", stop=stopLossSell, limit=takeProfitSell)
    lastSignalBar := bar_index

// Plot signals on the chart
plotshape(series=bullishCross and isTimeValid and not isCooldownActive, location=location.belowbar, color=color.green, style=shape.labelup, text="Buy", title="Buy Signal", textcolor=color.white)
plotshape(series=bearishCross and isTimeValid and not isCooldownActive, location=location.abovebar, color=color.red, style=shape.labeldown, text="Sell", title="Sell Signal", textcolor=color.white)

// Strategy performance tracking
strategy.close("Buy", when=not isTimeValid)
strategy.close("Sell", when=not isTimeValid)