Estrategia de seguimiento de tendencias del canal de equilibrio de impulso

El autor:¿ Qué pasa?, Fecha: 2023-12-12 18:07:31
Las etiquetas:

img

Resumen general

Esta estrategia identifica las formaciones de tendencia mediante el cálculo de canales e indicadores de impulso para lograr el comercio de seguimiento de tendencia.

Principio de la estrategia

La estrategia utiliza principalmente los dos indicadores siguientes para el juicio:

  1. Indicador de impulso (DMI): Juzga la tendencia larga y corta en el mercado y genera señales comerciales cuando el índice es mayor que el umbral establecido.

  2. Canal de equilibrio (canal de Keltner): Determina el área de tendencia. Cuando el precio rompe el carril superior, es hora de comprar, y cuando el precio cae por debajo del carril medio, es una señal para cerrar la posición.

La lógica de negociación específica es: cuando el indicador de impulso +DI es mayor que el umbral establecido (default 32), se determina que se ha formado una tendencia alcista. En este momento, si el precio rompe el carril superior del canal de equilibrio, se genera una señal de compra; después de eso, se utiliza el canal de equilibrio. El carril medio se utiliza como una línea de stop loss para rastrear el stop loss y lograr la protección de ganancias.

Esta estrategia combina las ventajas de dos indicadores, utiliza indicadores de impulso para determinar la dirección de la tendencia y utiliza canales de equilibrio para determinar el tiempo de entrada y las áreas de stop loss.

Análisis de ventajas

  1. La estrategia utiliza indicadores de impulso para determinar la etapa inicial de las tendencias del mercado, que es más eficiente que los indicadores atrasados como las medias móviles simples.

  2. El uso del canal de equilibrio para determinar el rango específico de negociación puede bloquear efectivamente la zona de ganancias.

  3. Los parámetros de los indicadores y las reglas de negociación son rigurosos y razonables, y los datos de las pruebas de retroceso funcionan bien y verifican el efecto de combate real.

  4. La estrategia es relativamente simple y clara, fácil de entender e implementar, y adecuada para que los principiantes en el comercio cuantitativo aprendan.

  5. El riesgo de la estrategia es controlable y adopta un stop loss dinámico con la línea mediana para controlar eficazmente la pérdida única.

Análisis de riesgos

  1. La estrategia solo es adecuada para mercados de tendencia y no para mercados de consolidación y fluctuación. Si el canal QtCore aumenta y la pérdida de parada del tren medio es demasiado floja, no puede controlar la pérdida.

  2. El indicador DMI tiene un cierto retraso y no puede determinar la confirmación de la tendencia.

  3. El método de stop loss de porcentaje fijo tiene riesgos: no puede volver a intervenir en las tendencias después de una fuerte fluctuación, por lo que se pierden las tendencias posteriores.

  4. Existen suficientes datos de pruebas previas, pero todavía se requiere una ejecución a largo plazo para verificar la estabilidad de los parámetros en el comercio real.

Optimización

  1. Se pueden probar diferentes métodos de stop loss, tales como ATR stop loss, movimiento de stop loss, etc., para reemplazar el stop loss porcentual fijo.

  2. Se pueden añadir indicadores de confirmación secundarios, como la amplificación del volumen, para garantizar la entrada después de la confirmación de la tendencia.

  3. Se pueden probar diferentes combinaciones de parámetros para encontrar la combinación óptima de parámetros.

  4. La robustez de los parámetros se puede verificar mediante optimización gradual y pruebas avanzadas.

Resumen de las actividades

Esta estrategia logra una captura eficiente de los mercados de tendencia mediante el uso de juicios de indicadores dobles. La estrategia es relativamente simple e intuitiva con lógica clara y buen rendimiento de prueba de retroceso. Puede servir como una de las estrategias de entrada para el comercio cuantitativo. Pero todavía se requiere una verificación suficiente de los datos comerciales reales y la optimización de parámetros para reducir las pérdidas comerciales reales. Este será el foco del trabajo futuro.


/*backtest
start: 2023-11-11 00:00:00
end: 2023-12-11 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Original Idea by: @Wunderbit


//@version=4
strategy("Keltner Channel [LINKUSDT] 1H", overlay=true, initial_capital=3000,pyramiding = 0, currency="USD", default_qty_type=strategy.percent_of_equity, default_qty_value=100,  commission_type=strategy.commission.percent,commission_value=0.1)


/// TREND
trend_cond = input(true, title="Enable Ribbon Filter")
ribbon_period = input(30, "Ribbon 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(80, "KELTNER Period", step=1, minval=1)
mult         = input(3.0,"KELTNER Multiple", step=0.1)

// Calculate Keltner Channel
ma      = ema(source, length)
range   = useTrueRange ? tr : high - low
rangema = ema(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 //

lensig = input(14, title="ADX Smoothing", minval=1, maxval=50)
len = input(14, minval=1, title="DI Length")
up = change(high)
down = -change(low)
plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
trur = rma(tr, len)
plus = fixnan(100 * rma(plusDM, len) / trur)
minus = fixnan(100 * rma(minusDM, len) / trur)
sum = plus + minus
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)

trig_level=input(title="+DI Trigger Level", defval=32, minval=1,step=1)
//trig_level_adx=input(title="ADX Trigger Level", defval=30, minval=1,step=1)

//plot(adx, color=#FF006E, title="ADX")
//plot(plus, color=#0094FF, title="+DI")
//plot(minus, color=#FF6A00, title="-DI")
// plot(trig_level, 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(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
    
///// Component Code Stop //////////////////////////////////////////

//////////////// STRATEGY EXECUTION //////////////////////////

// STRATEGY CONDITION
// LONG

long = ((open > lower and open < upper) and close > upper) and plus > minus and plus > trig_level and volume[0] > volume[1]
entry_long = trend_cond ? long and UT : long
exit_long = (close < ma) //or low < SL_long

//LONG SET UP
// Take Profit / Stop Loss

entry_price_long=valuewhen(entry_long,close,0)
//SL_long = entry_price_long * (1 - long_sl_inp)

long_tp1_inp = input(8, title='Long Take Profit 1 Target %', step=0.1)/100
long_tp1_qty = input(20, title="Long Take Profit 1 Qty %", step=1)

long_tp2_inp = input(16, title='Long Take Profit 2 Target %', step=0.1)/100
long_tp2_qty = input(30, 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 EXECUTION
if testPeriod()

    // LONG
    
    strategy.entry(id="Long", long=true, when=entry_long, comment = "INSERT ENTRY 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.