Estrategia de ruptura de impulso siguiendo tendencias


Fecha de creación: 2023-11-15 11:09:21 Última modificación: 2023-11-15 11:09:21
Copiar: 0 Número de Visitas: 584
1
Seguir
1617
Seguidores

Estrategia de ruptura de impulso siguiendo tendencias

Descripción general

La estrategia de ruptura de movimiento es una estrategia de negociación cuantitativa que sigue la tendencia del mercado. Para capturar la tendencia de la línea media del mercado, calcula los indicadores de movimiento de los precios históricos y determina la tendencia y la intensidad del movimiento de los precios del mercado.

Principio de estrategia

La estrategia se basa principalmente en el indicador de la dinámica. El indicador de la dinámica es el precio de cierre del ciclo actual menos el precio de cierre antes del ciclo N. Cuando el precio de cierre de la línea K más reciente es superior al precio de cierre antes del ciclo N, la dinámica es positiva, lo que indica un impulso al alza; cuando el precio de cierre de la línea K más reciente es inferior al precio de cierre antes del ciclo N, la dinámica es negativa, lo que indica un impulso a la baja.

La estrategia primero calcula la dinámica de la longitud de 18 ciclos, es decir, el precio de cierre actual menos el precio de cierre anterior a los 18 ciclos, para obtener mom0 ⋅ y luego calcula la dinámica de un ciclo de mom0 para obtener mom1 ⋅.

Cuando mom0>0 y mom1>0 produce una señal de hacer más, esto indica que el precio está en un momento de fuerte alza; cuando mom0 y mom1 produce una señal de hacer menos, esto indica que el precio está en un momento de fuerte caída.

La estrategia registra el tiempo de las últimas señales de compra y venta, y mantiene una posición de compra cuando el tiempo de compra es mayor que el tiempo de venta.

Análisis de las ventajas

La estrategia tiene las siguientes ventajas:

  1. La estrategia es clara, sencilla y fácil de entender, y es adecuada para los principiantes en el comercio cuantitativo.

  2. Los indicadores de dinámica son capaces de capturar la tendencia y la fuerza del mercado, y el seguimiento de las tendencias de línea media larga tiene una alta tasa de éxito.

  3. El uso de un doble filtro de potencia permite filtrar parte de los daños causados por la falsa brecha.

  4. Una vez producidas las señales de negociación, se aumenta la posición para establecer posiciones de tendencia, lo que permite obtener ganancias adicionales de la tendencia.

  5. La retirada oportuna del stop-loss puede controlar las pérdidas individuales y evitar que se produzcan pérdidas excesivas por la inversión.

Análisis de riesgos

La estrategia también tiene algunos riesgos a tener en cuenta:

  1. El ajuste a corto plazo en el mercado de múltiples titulares produce un retiro de pérdidas que no puede capturar el mercado de todo el ciclo. Se puede relajar adecuadamente el rango de pérdidas.

  2. La existencia de posiciones abiertas y cerradas con frecuencia en situaciones de crisis puede aumentar los costos de transacción y la pérdida de puntos de deslizamiento. Se pueden relajar adecuadamente las condiciones de filtración y reducir la frecuencia de las transacciones.

  3. La inversión de la tendencia sigue manteniendo posiciones en la dirección original, lo que genera una expansión de las pérdidas. Se puede combinar con los indicadores de tendencia para determinar la reversión de la tendencia.

  4. La configuración inadecuada de los parámetros puede causar señales de negociación erróneas o generar señales erróneas. Es necesario ajustar los parámetros para diferentes mercados.

Dirección de optimización

La estrategia puede ser optimizada en los siguientes aspectos:

  1. Optimización de los parámetros de potencia, calculación de la longitud de la potencia para diferentes ciclos y ajustes del mercado, mejora de la calidad de la señal.

  2. Se añaden filtros para otros indicadores, como MACD, KD, etc., para evitar pérdidas de inversión de tendencia.

  3. Optimización de las estrategias de stop loss, con la adecuada flexibilización de los stop loss en las tendencias de negociación; y el adecuado endurecimiento de los stop loss en los mercados fuera de tendencia.

  4. Aumentar la estrategia de gestión de posiciones, reducir las posiciones en situaciones no tendenciales; aumentar las posiciones en situaciones de tendencia para obtener más ganancias.

  5. Optimización de los parámetros para las diferentes variedades y mejora de la adaptabilidad de los parámetros.

  6. El uso de algoritmos de aprendizaje automático para optimizar los parámetros de la estrategia.

Resumir

La estrategia de ruptura de la dinámica general es una estrategia de seguimiento de tendencias simple e intuitiva. Puede capturar de manera efectiva las tendencias de la línea media del mercado y obtener mejores ganancias en las situaciones de tendencia. También debe prestar atención al control del riesgo, optimizar la estrategia de stop loss y ayudar a juzgar la tendencia con otros indicadores.

Código Fuente de la Estrategia
/*backtest
start: 2023-10-15 00:00:00
end: 2023-11-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close

momentum(seria, length) =>
    mom = seria - seria[length]
    mom

mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

/////////////// Strategy /////////////// 
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Stop Losses Long ///////////////
_5 = input(false,  "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1l = atr(atrLkbl)

longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]

slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na

/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1s = atr(atrLkbs)

shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]

slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na

_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")

/////////////// Execution ///////////////
if testPeriod()
    if useLongs
        strategy.entry("L", strategy.long, when=long)
        strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
    if useShorts
        strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
        strategy.entry("S", strategy.short, when=short)
    if not useShorts
        strategy.close("L", when=short)
    if not useLongs
        strategy.close("S", when=long)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)