Estrategia de canal de volatilidad de doble ruptura

El autor:¿ Qué pasa?, Fecha: 2024-01-31 10:24:00
Las etiquetas:

img

Resumen general

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.

Estrategia lógica

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.

Análisis de ventajas

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.

Análisis de riesgos

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.

Direcciones de optimización

La estrategia también tiene un gran potencial de optimización, que puede mejorarse en los siguientes aspectos:

  1. Optimización de parámetros, como ajuste fino de las longitudes DI y ADX de los DMI, configuración del período y del multiplicador de los canales de volatilidad, etc.

  2. Aumentar las condiciones de filtración, como la combinación del MACD y otros indicadores para evitar falsas rupturas

  3. 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

  4. Optimizar la configuración de parámetros y las reglas de filtración para diferentes productos

Resumen de las actividades

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')



Más.