La estrategia de canal de volatilidad de ruptura doble calcula las bandas media, superior e inferior del canal y utiliza indicadores de tendencia y volumen para determinar la dirección y el impulso del mercado.
El indicador central de esta estrategia es el canal de volatilidad basado en estadísticas de las líneas de velas. La banda media adopta el algoritmo de promedio móvil y las bandas superior e inferior adoptan el método de rango verdadero promedio para capturar dinámicamente los límites de las fluctuaciones de precios. Al mismo tiempo, la estrategia incorpora DMI y criterios de volumen para evitar roturas falsas.
Específicamente, cuando el precio rompe el carril inferior hacia el canal, la línea +DI del DMI excede la línea -DI y el punto de referencia ADX establecido, y el volumen de operaciones aumenta, se genera una señal de compra. Por el contrario, cuando el precio rompe el canal hacia abajo desde el carril superior, las reglas de juicio son opuestas a las anteriores, generando una señal de venta.
La mayor ventaja de esta estrategia es la captura de la principal dirección de ruptura de los precios. El juicio de ruptura dual puede evitar eficazmente los mercados laterales y de choque y reducir el número de pérdidas de parada. En comparación con las estrategias de promedio móvil simples, el juicio de ruptura del canal de volatilidad es más adaptable a las fluctuaciones de precios.
Además, la introducción de indicadores auxiliares DMI y volumen también desempeña un buen papel de filtrado, evitando señales falsas.
El mayor riesgo de la estrategia de ruptura dual es que no puede juzgar las reversiones del mercado. Si ocurre una reversión en forma de V en el mercado, el punto de stop loss puede desencadenarse fácilmente. Además, la configuración inadecuada de parámetros también puede afectar negativamente al sistema de negociación.
Para abordar los riesgos, podemos optimizar aún más la configuración de parámetros y reducir las pérdidas de parada para reducir los riesgos.
La estrategia también tiene un gran potencial de optimización, que puede mejorarse en los siguientes aspectos:
Optimización de parámetros, como ajuste fino de las longitudes DI y ADX de los DMI
Aumentar las condiciones de filtración, como la combinación del MACD y otros indicadores para evitar falsas rupturas
Implementar un seguimiento automático de las operaciones de toma de ganancias y de detención de pérdidas para controlar aún más los riesgos
Optimizar la configuración de parámetros y las reglas de filtración para diferentes productos
En general, la estrategia de canal de volatilidad de doble ruptura es un sistema de ruptura efectivo. Puede determinar efectivamente la dirección y el impulso de la tendencia principal, y tiene un gran potencial en optimización y control de riesgos. Si se mejora y optimiza sistemáticamente, la estrategia puede obtener ganancias constantes a largo plazo.
/*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')