듀얼 브레이크아웃 변동성 채널 전략은 채널의 중부, 상부 및 하부 밴드를 계산하고 트렌드 및 볼륨 지표를 사용하여 시장 방향과 동력을 결정합니다. 채널의 양쪽에 브레이크아웃 신호를 설정하여 낮은 구매와 높은 판매의 목표를 달성합니다.
이 전략의 핵심 지표는 촛불 라인의 통계적으로 기반한 변동성 채널이다. 중간 밴드는 이동 평균 알고리즘을 채택하고 상위 및 하부 밴드는 가격 변동의 경계를 동적으로 포착하기 위해 평균 진정한 범위 방법을 채택합니다. 동시에 전략은 잘못된 브레이크오웃을 피하기 위해 DMI 및 볼륨 기준을 통합합니다.
구체적으로, 가격이 하부 레일에서 채널로 넘어갈 때, DMI의 +DI 라인은 -DI 라인과 설정된 ADX 벤치마크를 초과하고 거래량이 증가하면 구매 신호가 생성됩니다. 반대로, 가격이 상부 레일에서 아래로 채널을 통과 할 때 판단 규칙은 위와 반대이며 판매 신호를 생성합니다.
이 전략의 가장 큰 장점은 가격의 주요 돌파 방향을 포착하는 것입니다. 이중 브레이크아웃 판단은 측면 및 쇼크 시장을 효과적으로 피할 수 있으며 스톱 손실 수를 줄일 수 있습니다. 간단한 이동 평균 전략과 비교하면 변동 채널 브레이크아웃 판단은 가격 변동에 더 적응적입니다.
또한, 보조 지표 DMI와 부피의 도입은 또한 잘못된 신호를 피하는 좋은 필터링 역할을 수행합니다. 그래서 승률과 이익 손실 비율의 관점에서 전략은 몇 가지 장점이 있습니다.
이중 브레이크아웃 전략의 가장 큰 위험은 시장 반전을 판단할 수 없다는 것입니다. 시장에서 V 모양의 반전이 발생하면 스톱 로스 포인트가 쉽게 유발 될 수 있습니다. 또한 부적절한 매개 변수 설정은 거래 시스템에 부정적인 영향을 줄 수 있습니다.
위험을 해결하기 위해, 우리는 추가로 매개 변수 설정을 최적화하고 위험을 줄이기 위해 중지 손실을 좁힐 수 있습니다. 물론, 거래 시스템은 손실을 완전히 피할 수 없습니다, 열쇠는 위험을 제어하는 것입니다.
이 전략은 또한 다음과 같은 측면에서 개선 될 수있는 최적화 잠재력이 있습니다.
파라미터 최적화, 예를 들어 DMI의 DI와 ADX 길이의 정밀 조정, 변동 채널의 기간 및 곱셈 설정 등.
가짜 브레이크오웃을 피하기 위해 MACD와 다른 지표를 결합하는 것과 같은 필터링 조건을 높여
수익을 취하고 손실을 멈추는 자동 추적을 구현하여 위험을 더 제어합니다.
다양한 제품에 대한 매개 변수 설정 및 필터링 규칙을 최적화
일반적으로, 이중 브레이크아웃 변동성 채널 전략은 효과적인 브레이크아웃 시스템이다. 주요 트렌드 방향과 추진력을 효과적으로 결정할 수 있으며 최적화 및 위험 통제에 큰 잠재력을 가지고 있다. 체계적으로 개선 및 최적화되면 전략은 장기적으로 꾸준히 수익을 낼 수 있다.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //Original Idea by: Wunderbit Trading //@version=5 strategy('Keltner Channel ETH/USDT 1H', overlay=true, initial_capital=1000, pyramiding=0, currency='USD', default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.07) /// TREND ribbon_period = input.int(46, 'Period', step=1) leadLine1 = ta.ema(close, ribbon_period) leadLine2 = ta.sma(close, ribbon_period) // p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1) // p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1) // fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c) //Upward Trend UT = leadLine2 < leadLine1 DT = leadLine2 > leadLine1 ///////////////////////////////////////INDICATORS // KELTNER // source = close useTrueRange = input(true) length = input.int(81, step=1, minval=1) mult = input.float(2.5, step=0.1) // Calculate Keltner Channel ma = ta.sma(source, length) range_1 = useTrueRange ? ta.tr : high - low rangema = ta.sma(range_1, length) upper = ma + rangema * mult lower = ma - rangema * mult plot(ma, title='Middle', color=color.new(color.orange, 0)) p1 = plot(upper, title='Upper', color=color.new(color.orange, 0)) p2 = plot(lower, title='Lower', color=color.new(color.orange, 0)) fill(p1, p2, transp=90) // DMI INDICATOR // adxlen = 10 // input(10, title="ADX Smoothing") dilen = input(19, title='DI Length') keyLevel = 23 // input(23, title="key level for ADX") dirmov(len) => up = ta.change(high) down = -ta.change(low) truerange = ta.rma(ta.tr, len) plus = fixnan(100 * ta.rma(up > down and up > 0 ? up : 0, len) / truerange) minus = fixnan(100 * ta.rma(down > up and down > 0 ? down : 0, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * ta.rma(math.abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) [adx, plus, minus] [sig, up, down] = adx(dilen, adxlen) benchmark = input.int(title='DMI Benchmark', defval=27, minval=1, step=1) // plot(sig, color=color.red, title="ADX") // plot(up, style=plot.style_histogram, color=color.green, title="+DI") // plot(down, style=plot.style_histogram, color=color.red, title="-DI") // plot(keyLevel, color=color.white, title="Key Level") /////////////////////////////////////////////////////////// ////////////////////////////////////////////////////Component Code Start testStartYear = input(2019, 'Backtest Start Year') testStartMonth = input(1, 'Backtest Start Month') testStartDay = input(1, 'Backtest Start Day') testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0) testStopYear = input(9999, 'Backtest Stop Year') testStopMonth = input(12, 'Backtest Stop Month') testStopDay = input(31, 'Backtest Stop Day') testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0) testPeriod() => true ///// Component Code Stop ////////////////////////////////////////// //////////////// STRATEGY EXECUTION ////////////////////////// //LONG SET UP // Take Profit / Stop Loss long_tp1_inp = input.float(4.5, title='Long Take Profit 1 %', step=0.1) / 100 long_tp1_qty = input.int(15, title='Long Take Profit 1 Qty', step=1) long_tp2_inp = input.float(20, title='Long Take Profit 2%', step=0.1) / 100 long_tp2_qty = input.int(100, title='Long Take Profit 2 Qty', step=1) long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp) long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp) long_sl_inp = input.float(4, title='Long Stop Loss %', step=0.1) / 100 long_stop_level = strategy.position_avg_price * (1 - long_sl_inp) // STRATEGY CONDITION // LONG entry_long = open > lower and open < upper and close > upper and up > down and up > benchmark // and volume[0] > volume[1] entry_price_long = ta.valuewhen(entry_long, close, 0) SL_long = entry_price_long * (1 - long_sl_inp) exit_long = close < lower or low < SL_long // STRATEGY EXECUTION if testPeriod() // LONG if UT strategy.entry(id='Long', direction=strategy.long, when=entry_long, comment='INSERT ENTER LONG COMMAND') strategy.exit('TP1', 'Long', qty_percent=long_tp1_qty, limit=long_take_level_1) // PLACE TAKE PROFIT IN WBT BOT SETTINGS strategy.exit('TP2', 'Long', qty_percent=long_tp2_qty, limit=long_take_level_2) // PLACE TAKE PROFIT IN WBT BOT SETTINGS strategy.close(id='Long', when=exit_long, comment='INSERT EXIT LONG COMMAND') //PLOT FIXED SLTP LINE // LONG POSITION plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='1st Long Take Profit') plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.new(color.green, 0), linewidth=1, title='2nd Long Take Profit') plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.new(color.red, 0), linewidth=1, title='Long Stop Loss')