Стратегия двойного канала волатильности вычисляет средние, верхние и нижние полосы канала и использует индикаторы тренда и объема для определения направления и импульса рынка.
Основным показателем этой стратегии является статистически обоснованный канал волатильности линий свечей. Средняя полоса использует алгоритм скользящей средней, а верхняя и нижняя полосы используют средний истинный диапазон для динамического фиксирования границ колебаний цен. В то же время стратегия включает критерии DMI и объема, чтобы избежать ложных прорывов.
В частности, когда цена выходит из нижней рельсы в канал, линия +DI DMI превышает линию -DI и установленный эталон ADX, и объем торговли увеличивается, генерируется сигнал покупки.
Наибольшее преимущество данной стратегии заключается в том, что она позволяет зафиксировать основные направления прорыва цен. Двойной расчетный расчет может эффективно избежать боковых и шоковых рынков и уменьшить количество стоп-потерь.
Кроме того, введение вспомогательных показателей DMI и объема также играет хорошую роль фильтрации, избегая ложных сигналов.
Самый большой риск стратегии двойного прорыва заключается в том, что она не может судить о переломах на рынке. Если на рынке происходит перелом в форме буквы V, то точка остановки может быть легко задействована. Кроме того, неправильное настройка параметров также может негативно повлиять на торговую систему.
Для решения рисков, мы можем дополнительно оптимизировать параметры настройки и сузить стоп-потери, чтобы уменьшить риски.
Стратегия также имеет большой потенциал для оптимизации, который может быть улучшен в следующих аспектах:
Оптимизация параметров, например, тонкая настройка длин DMI
Увеличить условия фильтрации, например, комбинировать 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')