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.
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.
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.
Solo tomar entradas largas y usar pantalones cortos para salidas reduce la frecuencia de las operaciones y reduce los costos de transacción.
Los ajustes flexibles de los parámetros de impulso se adaptan a diferentes entornos de mercado.
Estructura de código limpia, fácil de entender y modificar.
Mensajes de comercio habilitados, se integra bien con los sistemas de comercio automático.
El doble impulso puede pasar por alto las señales de tendencia más débiles mientras reduce las falsas señales.
Perdiendo oportunidades comerciales cortas con sólo entradas largas.
Los parámetros de impulso incorrectos conducen a un exceso de operaciones o a señales retrasadas.
Los datos insuficientes de las pruebas de retroceso provocan un sobreajuste de parámetros.
La confirmación doble reduce pero no elimina las señales falsas, necesita vigilar la validez en el comercio en vivo.
Prueba combinaciones de parámetros de longitud y porcentaje para encontrar el óptimo.
Considere agregar señales de comercio corto después de la confirmación de la tendencia para capturar más operaciones.
Pruebe diferentes cálculos de impulso como ROC, RSI, etc. para obtener mejores resultados.
Agregue filtros de tendencias para evitar los mercados de la sierra.
Optimizar el stop loss para obtener la máxima rentabilidad dentro de los límites de riesgo.
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")