Estrategia de seguimiento de tendencias del canal de equilibrio de impulso


Fecha de creación: 2023-12-12 18:07:31 Última modificación: 2023-12-12 18:07:31
Copiar: 0 Número de Visitas: 621
1
Seguir
1621
Seguidores

Estrategia de seguimiento de tendencias del canal de equilibrio de impulso

Descripción general

La estrategia permite el seguimiento de la tendencia mediante el cálculo de canales y indicadores dinámicos, la identificación de formas de tendencia y la realización de operaciones de seguimiento de tendencias. En concreto, combina el indicador dinámico y el indicador de canal de equilibrio, utilizando ambos en combinación, y al mismo tiempo que interviene en las tendencias a largo plazo, utiliza el canal de equilibrio para bloquear las zonas de ganancias múltiples.

Principio de estrategia

La estrategia se basa principalmente en los siguientes dos indicadores:

  1. Indicador de dinámica (DMI): para determinar la tendencia de mercado en el vacío, el indicador es mayor que la señal de negociación cuando se establece el umbral.

  2. El canal de equilibrio (Keltner Channel): para determinar la zona de tendencia, el precio se convierte en una oportunidad de compra cuando se rompe la trayectoria, y se convierte en una señal de posición cerrada cuando el precio se cae en la trayectoria media.

La lógica de negociación específica es: cuando el indicador de movimiento + DI es mayor que el umbral establecido (default 32), se considera que se forma una tendencia múltiple, en este momento el precio rompe el canal de equilibrio en la vía, generando una señal de compra; luego utiliza el canal de equilibrio en la vía media como línea de parada, para rastrear el stop loss y obtener protección de ganancias.

La estrategia combina las ventajas de los dos indicadores para determinar la dirección de la tendencia, utilizando el indicador de dinámica, y el canal de equilibrio para determinar el momento de entrada y la zona de parada. La combinación de los dos indicadores permite a la estrategia entrar de manera eficiente en la detección temprana de la tendencia, mientras que el indicador de canal se usa para bloquear ganancias y pérdidas.

Análisis de las ventajas

  1. Las estrategias que utilizan indicadores de movimiento para determinar las tendencias del mercado a principios de la misma son mucho más eficaces que los indicadores atrasados como las medias móviles simples.

  2. El uso de canales equilibrados para determinar zonas de negociación específicas permite un bloqueo eficaz de las zonas de ganancias.

  3. Los parámetros de los indicadores y las reglas de negociación son rigurosos y razonables, los datos de retrospectiva funcionan bien y se verifican en el disco.

  4. Las estrategias son simples, claras y fáciles de entender, y son adecuadas para los principiantes en el trading cuantitativo.

  5. El riesgo de la estrategia es controlado, se utiliza el stop loss dinámico de la línea media de la vía, para controlar eficazmente las pérdidas individuales.

Análisis de riesgos

  1. La estrategia solo se aplica a la tendencia, no se aplica a la liquidación de mercados volátiles, en el caso de que el canal QtCore crezca y el stop loss de la vía media sea demasiado relajado para controlar las pérdidas.

  2. El indicador DMI está un poco atrasado, no se puede determinar la confirmación de la tendencia, y la intervención temprana en la tendencia puede traer pérdidas.

  3. El riesgo de que el método de stop loss porcentual fijo no pueda volver a intervenir en la tendencia después de una gran sacudida es que se pierda el seguimiento.

  4. Los datos de detección son abundantes, pero el disco duro todavía necesita mucho tiempo para verificar la estabilidad de los parámetros.

Dirección de optimización

  1. Se pueden probar diferentes métodos de detención, como la detención ATR, la detención móvil, etc., en lugar de la detención porcentual fija.

  2. Se pueden agregar indicadores de confirmación secundarios, como un aumento en el volumen de transacciones, para asegurar la entrada después de la confirmación de la tendencia.

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

  4. La estabilidad de los parámetros se puede verificar mediante optimización por etapas y retroalimentación por movimiento.

Resumir

Esta estrategia utiliza un doble criterio de evaluación para capturar la tendencia de manera eficiente. La estrategia es más simple, intuitiva, lógica clara, mejor rendimiento de retroalimentación, y puede ser una de las estrategias de entrada para el comercio cuantitativo. Sin embargo, aún se necesitan datos de verificación y parámetros de optimización de la bolsa real para reducir el riesgo de pérdidas en la bolsa real.

Código Fuente de la Estrategia
/*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")