Estrategia de ruptura de doble impulso

El autor:¿ Qué pasa?, Fecha: 2023-11-16 17:00:54
Las etiquetas:

img

Resumen general

Esta es una estrategia de ruptura de impulso dual. Utiliza dos indicadores de impulso con diferentes configuraciones de parámetros y genera señales comerciales cuando ambos indicadores de impulso rompen la línea cero.

Estrategia lógica

El código establece primero propiedades de estrategia como tipo de orden, esquema de comisión, etc. Luego calcula dos indicadores de impulso:

// Momentum settings
****
i_len           = input(defval = 12, title = "Length", minval = 1)
i_src           = input(defval = close, title = "Source")  
i_percent       = input(defval = true, title = "Percent?")
i_mom           = input(defval = "MOM2", title = "MOM Choice", options = ["MOM1", "MOM2"])

// Momentum code 

mom0 = momentum(i_src, i_len, i_percent)
mom1 = momentum(mom0, 1, i_percent) 
mom2 = momentum(i_src, 1, i_percent)

momX = mom1   

if i_mom == "MOM2"
    momX := mom2

mom0 es el indicador de momento base con longitud i_len, fuente de datos i_src, si se calcula el porcentaje se decide por i_percent.

mom1 es el indicador de momento con mom0 como fuente de datos y longitud 1.

mom2 es el indicador de momento con datos originales i_src como fuente y longitud 1.

El indicador de momento final momX por defecto a mom1, también puede elegir mom2.

Cuando mom0 y momX ambos rompen por encima de la línea 0, ir largo.

Ventajas de la estrategia

  1. El uso de dos indicadores de momento con diferentes ajustes mejora la fiabilidad de la señal con doble confirmación y menos señales falsas.

  2. Solo tomar entradas largas y usar pantalones cortos para salidas reduce la frecuencia de las operaciones y reduce los costos de transacción.

  3. Los ajustes flexibles de los parámetros de impulso se adaptan a diferentes entornos de mercado.

  4. Estructura de código limpia, fácil de entender y modificar.

  5. Mensajes de comercio habilitados, se integra bien con los sistemas de comercio automático.

Riesgos de la estrategia

  1. El doble impulso puede pasar por alto las señales de tendencia más débiles mientras reduce las falsas señales.

  2. Perdiendo oportunidades comerciales cortas con sólo entradas largas.

  3. Los parámetros de impulso incorrectos conducen a un exceso de operaciones o a señales retrasadas.

  4. Los datos insuficientes de las pruebas de retroceso provocan un sobreajuste de parámetros.

  5. La confirmación doble reduce pero no elimina las señales falsas, necesita vigilar la validez en el comercio en vivo.

Direcciones de optimización

  1. Prueba combinaciones de parámetros de longitud y porcentaje para encontrar el óptimo.

  2. Considere agregar señales de comercio corto después de la confirmación de la tendencia para capturar más operaciones.

  3. Pruebe diferentes cálculos de impulso como ROC, RSI, etc. para obtener mejores resultados.

  4. Agregue filtros de tendencias para evitar los mercados de la sierra.

  5. Optimizar el stop loss para obtener la máxima rentabilidad dentro de los límites de riesgo.

Conclusión

Esta es una estrategia típica de ruptura de doble impulso. Utiliza doble confirmación para reducir las señales falsas y solo entradas largas para reducir la frecuencia de negociación. Las ventajas son la simplicidad y la facilidad de implementación, con mucho espacio para mejoras en la optimización de parámetros y el control de riesgos. En general, sirve como un marco de ruptura de impulso razonable, pero necesita ajustes y optimizaciones específicos del mercado para una negociación en vivo rentable.


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

//@version=4
strategy("Momentum Long Strategy", overlay = false, precision = 2, initial_capital = 10000, default_qty_value = 10000, default_qty_type = strategy.cash, commission_type = strategy.commission.percent, commission_value = 0, calc_on_every_tick = true)

// There will be no short entries, only exits from long.
strategy.risk.allow_entry_in(strategy.direction.long)

// Calculate start/end date and time condition
startDate  = input(timestamp("2021-01-02T00:00:00"), title = "Start Date", type = input.time)
finishDate = input(timestamp("2021-12-31T00:00:00"), title = "End Date",type = input.time)
 
time_cond  =true

// Momentum settings

i_len           =       input(defval = 12,      title = "Length",       minval = 1)
i_src           =       input(defval = close,   title = "Source")
i_percent       =       input(defval = true,    title = "Percent?")
i_mom           =       input(defval = "MOM2",  title = "MOM Choice",   options = ["MOM1", "MOM2"])

// Messages for buy and sell
message_buy  = input("{{strategy.order.alert_message}}", title="Buy message")
message_sell = input("{{strategy.order.alert_message}}", title="Sell message")

// Momentum code

momentum(seria, length, percent) =>
	_mom        =       percent ? ( (seria / seria[length]) - 1) * 100 : seria - seria[length]
	_mom

mom0        =       momentum(i_src, i_len, i_percent)
mom1        =       momentum(mom0, 1, i_percent)
mom2        =       momentum(i_src, 1, i_percent)

momX        =       mom1

if i_mom == "MOM2"
    momX    :=     mom2
    
// Strategy Alerts    

if (mom0 > 0 and momX > 0 and time_cond)
    strategy.entry("MomLE", strategy.long, stop = high + syminfo.mintick, comment = "MomLE", alert_message = message_buy)
else
	strategy.cancel("MomLE")
if (mom0 < 0 and momX < 0 and time_cond)
	strategy.entry("MomExit", strategy.short, stop = low - syminfo.mintick, comment = "MomSE", alert_message = message_sell)
else
	strategy.cancel("MomExit")
	
// Plotting

plot(0, color = #5d606b, title = "ZERO")
plot(mom0, color = #00bcd4, title = "MOM")
plot(mom1, color = #00FF00, title = "MOM1", display = display.none)
plot(mom2, color = #00FF00, title = "MOM2")

Más.