Estrategia de cruce de la media móvil de impulso

El autor:¿ Qué pasa?, Fecha: 2023-09-21 21:29:22
Las etiquetas:

Resumen general

Esta estrategia utiliza los principios de cruce entre los promedios móviles rápidos y lentos para determinar las direcciones de tendencia del mercado y generar señales de compra y venta.

Estrategia lógica

La estrategia emplea dos promedios móviles, una línea rápida y una línea lenta. La línea rápida utiliza EMA de 3 días y la línea lenta utiliza EMA de 15 días. Cuando la línea rápida cruza por encima de la línea lenta desde abajo, indica una tendencia al alza y da una señal de compra. Por el contrario, cuando la línea rápida cruza por debajo de la línea lenta desde arriba, señala una tendencia a la baja y da una señal de venta.

La estrategia también establece una EMA de 3 días más rápida como la línea de salida rápida. Cuando el precio se rompe por debajo de esta línea de salida rápida, juzga que la tendencia se ha invertido y debe salir de la posición larga existente. Del mismo modo, cuando el precio se rompe por encima de la línea de salida, indica una tendencia alcista renovada y da una señal para volver a entrar en la posición larga.

Las señales de funcionamiento específicas se establecen como:

  1. La línea rápida cruza por encima de la línea lenta desde abajo, ir largo

  2. La línea rápida cruza por debajo de la línea lenta desde arriba, corta

  3. Brechas del precio por debajo de la línea de salida rápida, cierre de la posición larga

  4. El precio vuelve por encima de la línea de salida rápida, vuelve a entrar largo

Ventajas

  • Simple de usar, sólo necesita configurar dos parámetros de media móvil, fácil de implementar

  • Datos suficientes de backtesting, con indicadores comunes para evaluar la viabilidad

  • Muchos parámetros configurables para la optimización

  • Adopta la línea de salida rápida como stop loss para controlar mejor el riesgo

  • Lógica de estrategia clara, señales explícitas de compra y venta

  • Frecuencia de operación adecuada, evita el exceso de negociación

Los riesgos

  • Es propenso a más señales falsas cuando la tendencia no es clara como la tendencia sigue la estrategia

  • Las medias móviles tienen un carácter retrasado, pueden perder puntos de inflexión

  • Los parámetros fijos no pueden adaptarse a los cambios del mercado, necesitan optimización

  • El stop loss puede ser demasiado suave, incapaz de detener la pérdida a tiempo

  • Las señales frecuentes pueden conducir a mayores costes comerciales

  • Las señales pueden divergir y necesitan confirmación con otros indicadores

Los riesgos se pueden gestionar mediante la optimización de parámetros, la adición de filtros, la relajación del stop loss, la actualización oportuna de parámetros, etc.

Mejoramiento

  • Prueba y optimización de los parámetros para adaptarlos mejor a las condiciones del mercado

  • Introducir más indicadores para formar un sistema sólido

  • Construir ajustes de parámetros adaptativos basados en el mercado en tiempo real

  • Aplicar modelos de aprendizaje automático para una optimización más inteligente

  • Establecer un stop loss dinámico o de seguimiento para un mejor control del riesgo

  • Combinar los indicadores de volumen para evitar divergencias

Conclusión

Esta es una estrategia de cruce de promedios móviles duales relativamente simple. Determina la tendencia del mercado y las señales comerciales basadas en la interacción entre promedios móviles rápidos y lentos. La estrategia es fácil de implementar y se puede adaptar a través de la optimización. Pero también tiene algunos riesgos. Se necesitan más filtros para confirmar las señales y gestionar los riesgos. Cuando se optimiza adecuadamente y se aplica al comercio a mediano plazo, puede convertirse en un sistema comercial cuantitativo muy práctico.


/*backtest
start: 2023-01-01 00:00:00
end: 2023-02-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © ehaarjee, ECHKAY, JackBauer007

//@version=4
//study(title="Tale_indicators", overlay=true)
strategy("Tale Indicators Strategy", overlay=true, precision=8, max_bars_back=200, pyramiding=0, initial_capital=20000, commission_type="percent", commission_value=0.1)

len_fast = input(3, minval=1, title="FAST EMA")
src_fast = input(close, title="Source for Fast")
fastMA = ema(src_fast, len_fast)
plot(fastMA, title="Slow EMA", color=color.orange)

len_slow = input(15, minval=1, title="SLOW EMA")
src_slow = input(close, title="Source for Slow")
slowMA = ema(src_slow, len_slow)
plot(slowMA, title="Fast EMA", color=color.blue)

len_fast_exit = input(3, minval=1, title="FAST EMA Exit")
src_fast_exit = input(close, title="Source for Fast Exit")
fastMAE = ema(src_fast_exit, len_fast_exit)
plot(fastMAE, title="Fast EMA Ex", color=color.red)


src_slow_enter_short = input(low, title="Source for Short Entry")
slowMASEn = ema(src_slow_enter_short, len_slow)

src_slow_enter_long = input(high, title="Source for Long Entry")
slowMALEn = ema(src_slow_enter_long, len_slow)

src_slow_exit_short = input(low, title="Source for Short Exit")
slowMASEx = ema(src_slow_enter_short, len_slow)

src_slow_exit_long = input(high, title="Source for Long Exit")
slowMALEx = ema(src_slow_enter_long, len_slow)

enter_long = crossover(fastMA, slowMALEn)
enter_short = crossunder(fastMA, slowMASEn)
exit_long = crossunder(fastMAE, slowMALEx)
exit_short = crossover(fastMAE, slowMALEx)

out_enter = iff(enter_long == true, 1, iff(enter_short == true, -1, 0))
plotarrow(out_enter, "Plot Enter Points", colorup=color.green, colordown=color.red, maxheight = 30)

bull = fastMA > slowMALEn
bear = fastMA < slowMASEn

c = bull ? color.green : bear ? color.red  : color.white
bgcolor(c)

exit_tuner = input(0.005, title="Exit Tuner to touch slowEMA")

bull_exit = (bull and (low>(fastMAE*(1+exit_tuner)))) or exit_long or (not(bear) and (fastMAE>high))
bear_exit = (bear and ((fastMAE*(1-exit_tuner))>high)) or exit_short or (not(bull) and (low>fastMAE))

bull_r = (bull and ((bull_exit[1]) or (bull_exit[2] and bull_exit[1])) and (low<=fastMAE))
bear_r = (bear and ((bear_exit[1]) or (bull_exit[2] and bull_exit[1])) and (fastMAE<=high))

bull_re = (bull and (low<slowMALEn)) and not(enter_long)
bear_re = (bear and (high>slowMASEn)) and not(enter_short)

bull_ree = (bull and ((low<slowMALEn) and not(bull_re[1] or enter_long[1]))) 
bear_ree = (bear and ((high>slowMASEn) and not(bear_re[1] or enter_short[1])))

bull_reenter =  (bull_r) and not(enter_long)
bear_reenter =  (bear_r) and not(enter_short)

plotshape(bull_exit, "Plot Bull Exit", style = shape.arrowdown, color=color.green, size=size.small, text="ExL", location=location.abovebar)
plotshape(bear_exit, "Plot Bear Exit", style = shape.arrowup, color=color.red, size=size.small, text="ExS", location=location.belowbar)

plotshape(bull_reenter, "Plot Bull ReEnter", style = shape.arrowup, color=color.green, size=size.small, text="ReL", location=location.belowbar)
plotshape(bear_reenter, "Plot Bear ReEnter", style = shape.arrowdown, color=color.red, size=size.small, text="ReS", location=location.abovebar)

run_strategy = input(true, title="Run Strategy")
// === INPUT BACKTEST RANGE ===
fromMonth = input(defval = 1,    title = "From Month",      type = input.integer, minval = 1, maxval = 12)
fromDay   = input(defval = 1,    title = "From Day",        type = input.integer, minval = 1, maxval = 31)
fromYear  = input(defval = 2020, title = "From Year",       type = input.integer, minval = 2000)
thruMonth = input(defval = 1,    title = "Thru Month",      type = input.integer, minval = 1, maxval = 12)
thruDay   = input(defval = 1,    title = "Thru Day",        type = input.integer, minval = 1, maxval = 31)
thruYear  = input(defval = 2100, title = "Thru Year",       type = input.integer, minval = 2000)

// === INPUT SHOW PLOT ===
showDate  = input(defval = true, title = "Show Date Range", type = input.bool)
// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)        // backtest start window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)        // backtest finish window
window()  => true       // create function "within window of time"

var long_position_open = false
var short_position_open = false


if (enter_long and not(bull_exit) and not(long_position_open))
//    strategy.entry("LO", strategy.long, qty=4)
    long_position_open := true
    if (short_position_open)
//        strategy.close("SO")
        short_position_open := false

if (bull_reenter and not(long_position_open))  
//    strategy.entry("LO", strategy.long, qty=1)
    long_position_open := true

if (bull_exit and long_position_open)
//  strategy.close("LO")
    long_position_open := false
    
if (enter_short and not(bear_exit) and not(short_position_open))
//    strategy.entry("SO", strategy.short, qty=4)
    short_position_open := true
    if(long_position_open)
//        strategy.close("LO")
        long_position_open := false

if (bear_reenter and not(short_position_open))  
//    strategy.entry("SO", strategy.long, qty=1)
    long_position_open := true

if (bear_exit and short_position_open)
//    strategy.close("SO")
    short_position_open := false

if(run_strategy)
    strategy.entry("LO", strategy.long, when=(window() and enter_long), qty=4)
    strategy.entry("LO", strategy.long, when=(window() and bull_reenter and not(long_position_open)), qty=1)
    strategy.close("LO", when=(window() and bull_exit and long_position_open))
    strategy.entry("SO", strategy.short, when=(window() and enter_short), qty=4)
    strategy.entry("SO", strategy.short, when=(window() and bear_reenter and not(short_position_open)), qty=1)
    strategy.close("SO", when=(window() and bear_exit and short_position_open))


Más.