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.
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:
La línea rápida cruza por encima de la línea lenta desde abajo, ir largo
La línea rápida cruza por debajo de la línea lenta desde arriba, corta
Brechas del precio por debajo de la línea de salida rápida, cierre de la posición larga
El precio vuelve por encima de la línea de salida rápida, vuelve a entrar largo
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
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.
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
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))