Estrategia basada en la tendencia del canal Keltner

El autor:¿ Qué pasa?, Fecha: 2023-11-03 16:59:39
Las etiquetas:

img

Resumen general

Esta estrategia se basa en tres indicadores principales: el indicador de tendencia, el canal Keltner y el indicador DM.

El indicador de tendencia se compone de SMA y EMA. El canal Keltner se utiliza para determinar el precio de apertura y cierre de las velas. El indicador DM es para juzgar la dirección de largo y corto.

La señal de entrada se activará cuando:

  1. La EMA cruza la SMA, lo que confirma la tendencia alcista
  2. La vela se abre por encima de la banda superior y se cierra dentro del canal
  3. El indicador DM está por encima del valor de referencia

La estrategia tiene dos niveles de toma de ganancias y un nivel de stop loss.

Principios de estrategia

Identificación de las tendencias

Las intersecciones de SMA y EMA se utilizan para determinar la dirección de la tendencia.

Canal de Keltner

El canal tiene tres líneas: media, superior e inferior. La línea media es SMA de precio cerrado con longitud de 81. Las bandas superior e inferior se colocan en un múltiplo del rango verdadero por encima y por debajo de la línea media. Aquí usamos 2.5 veces el rango verdadero.

El canal de Keltner muestra niveles de soporte y resistencia.

Indicador del DM

El indicador DM contiene ADX, +DI y -DI. +DI mide la fuerza de la tendencia alcista mientras que -DI mide la fuerza de la tendencia bajista.

Cuando +DI cruza por encima del índice de referencia (default 27), indica una fuerte tendencia alcista y es buena para una entrada larga.

Análisis de ventajas

Esta estrategia combina indicadores de tendencia, canal e impulso para determinar eficazmente las acciones de los precios y la dirección largo/corto.

  1. La identificación de tendencias es relativamente precisa para evitar operaciones contra tendencias.

  2. El canal Keltner muestra niveles claros de soporte y resistencia.

  3. El indicador DM mide el impulso largo/cortísimo para asegurar la dirección.

  4. Reglas estrictas de entrada ayudan a filtrar las fugas falsas.

  5. Los puntos de toma de ganancias y stop loss permiten capturar ganancias.

Análisis de riesgos

También hay algunos riesgos a tener en cuenta:

  1. La tendencia puede revertirse cuando la EMA cruza por debajo de la SMA, así que salga a tiempo.

  2. El canal puede fallar en tendencias fuertes, no en soporte/resistencia estricto.

  3. DM puede generar señales falsas, comprobar la acción del precio.

  4. Una fuga falsa puede desencadenar la entrada pero rápidamente regresa, usa un stop loss razonable.

  5. Las operaciones de toma de ganancias y stop loss necesitan una optimización continua para adaptarse a las condiciones cambiantes del mercado.

Direcciones de optimización

Algunas maneras de optimizar aún más la estrategia:

  1. Ajustar los parámetros y probar diferentes métodos de identificación de tendencias.

  2. Optimice los parámetros del canal para que se ajusten mejor al rango verdadero.

  3. Prueba diferentes parámetros DM y encuentra la combinación óptima.

  4. Añadir más filtros de entrada como el volumen.

  5. Trata de dejar atrás la pérdida para obtener más ganancias.

  6. Prueba por separado para diferentes productos para encontrar los mejores conjuntos de parámetros.

Conclusión

La estrategia integra múltiples indicadores para determinar tendencia, soporte/resistencia e impulso, lo que permite detectar de manera efectiva las tendencias y controlar los riesgos.


/*backtest
start: 2022-10-27 00:00:00
end: 2023-11-02 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: Wunderbit Trading

//@version=4
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(46, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = 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(81, step=1, minval=1)
mult         = input(2.5, step=0.1)

// Calculate Keltner Channel
ma      = sma(source, length)
range   = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult

plot(ma, title="Middle", color=color.orange)
p1=plot(upper, title="Upper", color=color.orange)
p2=plot(lower, title="Lower", color=color.orange)
fill(p1,p2)


// 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 = change(high)
	down = -change(low)
	truerange = rma(tr, len)
	plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange)
	minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange)
	[plus, minus]

adx(dilen, adxlen) =>
	[plus, minus] = dirmov(dilen)
	sum = plus + minus
	adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen)
	[adx, plus, minus]

[sig, up, down] = adx(dilen, adxlen)

benchmark=input(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(4.5, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(20, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(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(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=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", long=true, 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.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")

Más.