모멘텀 브레이크아웃 트레이딩 전략 (Momentum Breakout Trading Strategy) 은 주요 지지/저항 수준을 초과한 가격 브레이크아웃을 탐지함으로써 트레이딩 신호를 생성하는 트렌드 추종 전략이다. 이 전략은 돈치안 채널 지표를 활용하여 주요 지지/저항 수준을 동적으로 식별하고 잘못된 거래를 피하기 위해 이동 평균으로 신호를 필터링한다.
이 전략의 핵심 지표는 돈치안 채널이다. 돈치안 채널은 정해진 기간 동안 가장 높은 가격, 가장 낮은 가격 및 중간 가격으로 구성되어 있다. 채널의 상부 및 하부 대역은 룩백 기간 동안 가장 높은 가격과 가장 낮은 가격을 각각 연결한다. 가격이 상부 대역 이상으로 넘어가면 긴 신호가 생성되며, 하부 대역 아래로 넘어가면 짧은 신호가 생성되며 시장 추진력의 변화를 반영한다.
이동 평균은 트렌드 방향을 측정하는 데 사용됩니다. 통합을 피하기 위해 이동 평균 이상의 가격으로 구매 신호만 취합니다.
구체적으로, 진입 조건은: 가격이 돈치안 채널 상단역을 넘어서고 이동 평균보다 닫는다. 출구 조건은: 가격이 돈치안 채널 하단역을 넘어서다.
스톱 손실은 돈치안 채널 하단 밴드를 따라가며, 트렌드와 함께 스톱 손실이 더 높게 조정되도록 합니다.
이 전략은 트렌드 방향과 동력을 판단하기 위해 두 가지 지표를 효과적으로 결합하여 잘못된 브레이크아웃 신호로 인한 잘못된 거래를 피합니다. 한편, 트레일링 스톱은 트렌드를 따라 수익을 극대화 할 수 있습니다.
특히 이점은 다음과 같습니다.
돈치안 채널은 트렌드 전환점을 식별하여 주요 지지/저항 수준을 동적으로 결정합니다.
이동평균은 통폐합을 필터링하고 불필요한 윙사 (whispsaws) 를 피합니다.
돈치안 채널 하단역을 따라가면 이윤을 극대화할 수 있습니다.
합리적인 매개 변수는 다양한 시장 환경에서 유연성을 제공합니다.
주요 위험은 다음과 같습니다.
실패한 파업 위험 - 가격이 상단 범위를 초과한 파업 이후의 추진력을 유지할 수 없습니다.
트렌드 역전 위험 - 트레일링 스톱 로스를 달성하기 전에 가격이 역전됩니다.
매개 변수 최적화 위험 - 비효율적인 매개 변수는 과도한 거래 또는 불충분한 신호로 이어집니다.
완화하기 위해, 부피 확인, 이동 평균 조정, 합리적인 정지 거리 같은 요소가 포함되어야 합니다.
추가 최적화:
부피 필터를 추가해서 높은 추진력을 확보해
기기 특성에 대한 이동 평균 기간을 최적화합니다.
가격 변동 역학에 기반한 적응적인 스톱 로스 메커니즘
초기 정지 후 재입구 메커니즘, 추가 트렌드 재개 움직임을 포착하기 위해.
제품 뉘앙스에 따라 매개 변수를 식별하기 위해 강력한 멀티 시장 테스트.
모멘텀 브레이크아웃 트레이딩 전략은 트렌드 및 모멘텀 강도를 효과적으로 측정하기 위해 지표를 결합하여 블라인드 엔트리에 관한 트렌드 시스템이 직면하는 일반적인 문제를 피합니다. 합리적으로 최적화된 매개 변수, 적응 메커니즘 및 다양한 환경 및 제품에 대한 견고한 테스트는 이것을 다재다능하고 실용적인 브레이크아웃 시스템으로 만듭니다.
/*backtest start: 2022-12-12 00:00:00 end: 2023-12-18 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 // Revision: 1 // Author: @millerrh // Strategy: // Entry: Buy when Donchian Channel breaks out // Exit: Trail a stop with the lower Donchian Channel band // Conditions/Variables: // 1. Can add a filter to only take setups that are above a user-defined moving average (helps avoid trading counter trend) // 2. Manually configure which dates to back test // 3. User-Configurable DC Channel length // === CALL STRATEGY/STUDY, PROGRAMATICALLY ENTER STRATEGY PARAMETERS HERE SO YOU DON'T HAVE TO CHANGE THEM EVERY TIME YOU RUN A TEST === // (STRATEGY ONLY) - Comment out srategy() when in a study() strategy("Donchian Breakout", overlay=true, initial_capital=10000, currency='USD', default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1) // (STUDY ONLY) - Comment out study() when in a strategy() //study("Donchian Breakout", overlay=true) // === BACKTEST RANGE === From_Year = input(defval = 2019, title = "From Year") From_Month = input(defval = 1, title = "From Month", minval = 1, maxval = 12) From_Day = input(defval = 1, title = "From Day", minval = 1, maxval = 31) To_Year = input(defval = 9999, title = "To Year") To_Month = input(defval = 1, title = "To Month", minval = 1, maxval = 12) To_Day = input(defval = 1, title = "To Day", minval = 1, maxval = 31) Start = timestamp(From_Year, From_Month, From_Day, 00, 00) // backtest start window Finish = timestamp(To_Year, To_Month, To_Day, 23, 59) // backtest finish window // == INPUTS == trigInput = input(title = "Execute Trades On...", defval = "Wick", options=["Wick","Close"]) // Useful for comparing standing stop orders vs. waiting for candle closes prior to action stopTrail = input(title = "Trail Stops On...", defval = "ATR", options = ["ATR","Bottom of DC Channel","Midline of DC Channel","Tightest of ATR/Bot DC Channel"]) dcPeriod = input(title="DC period", type=input.integer, defval=20) // === PLOT THE DONCHIAN CHANNEL === // Logic dcUpper = highest(high, dcPeriod) dcLower = lowest(low, dcPeriod) dcMid = avg(dcUpper, dcLower) // Plotting dcUplot = plot(dcUpper, color=color.blue, linewidth=1, title="Upper Channel Line") dcLplot = plot(dcLower, color=color.blue, linewidth=1, title="Lower Channel Line") dcMidPlot = plot(dcMid, color=color.gray, linewidth=1, title="Mid-Line Average") fill(dcUplot, dcLplot, color=color.gray, transp=90) // == FILTERING == // Inputs useMaFilter = input(title = "Use MA for Filtering?", type = input.bool, defval = true) maType = input(defval="SMA", options=["EMA", "SMA"], title = "MA Type For Filtering") maLength = input(defval = 100, title = "MA Period for Filtering", minval = 1) // Declare function to be able to swap out EMA/SMA ma(maType, src, length) => maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc) maFilter = ma(maType, close, maLength) plot(maFilter, title = "Trend Filter MA", color = color.green, linewidth = 3, style = plot.style_line, transp = 50) // Check to see if the useMaFilter check box is checked, this then inputs this conditional "maFilterCheck" variable into the strategy entry maFilterCheck = if useMaFilter == true maFilter else 0 // == ENTRY AND EXIT CRITERIA == // Trigger stop based on candle close or High/Low (i.e. Wick) - If doing daily timeframe, can do candle close. Intraday should use wick. trigResistance = trigInput == "Close" ? close : trigInput == "Wick" ? high : na trigSupport = trigInput == "Close" ? close : trigInput == "Wick" ? low : na buySignal = trigResistance >= dcUpper[1] // The [1] looks at the previous bar's value as it didn't seem to be triggering correctly without it (likely) DC moves with each bar sellSignal = trigSupport <= dcLower[1] buy = buySignal and dcUpper[1] > maFilterCheck // All these conditions need to be met to buy // (STRATEGY ONLY) Comment out for Study // This string of code enters and exits at the close if (trigInput == "Close") strategy.entry("Long", strategy.long, when = buy) strategy.close("Long", when = sellSignal) // This string of code enters and exits at the wick (i.e. with pre-set stops) if (trigInput == "Wick") strategy.entry("Long", strategy.long, stop = dcUpper[1], when = time > Start and time < Finish and dcUpper[1] > maFilterCheck) strategy.exit("Exit Long", from_entry = "Long", stop = dcLower[1])