Estrategia de doble media móvil y supertendencia


Fecha de creación: 2023-09-28 15:12:50 Última modificación: 2023-09-28 15:12:50
Copiar: 0 Número de Visitas: 923
1
Seguir
1617
Seguidores

Descripción general

La estrategia se basa en el cruce de las medias móviles de los días 21 y 55 para generar señales de compra y venta, mientras que se combina con un indicador de supertrend para filtrar las falsas señales de seguimiento de tendencias.

Principio de estrategia

El código define primero el promedio móvil entre la línea 21 ((EMA1)) y la línea 55 ((EMA2). Cuando EMA1 atraviesa EMA2 genera una señal de compra; cuando EMA1 atraviesa EMA2 genera una señal de venta.

Para filtrar las falsas señales, el código incluye un indicador de tendencia súper. El indicador de tendencia súper se basa en la amplitud real promedio ATR, combinando los máximos y mínimos más recientes de los precios para determinar la dirección de la tendencia.

De esta manera, sólo se genera una señal de compra al atravesar EMA2 en EMA1 cuando la tendencia es ascendente; y una señal de venta al atravesar EMA2 en EMA1 cuando la tendencia es descendente. Mediante el filtro de indicadores de supertrend, se puede evitar la falsa señal que se produce cuando la tendencia cambia.

Además, se añaden líneas de 200 días y 233 días en el código para juzgar las tendencias a largo plazo, generando señales de negociación solo cuando la dirección de las tendencias a largo plazo coincide.

Ventajas estratégicas

  1. La línea media móvil doble, combinada con un indicador de tendencia súper, permite identificar eficazmente la dirección de la tendencia y filtrar las señales falsas.

  2. Al ajustar los parámetros de la media móvil, se puede ajustar la sensibilidad de la estrategia para adaptarse a diferentes entornos de mercado.

  3. La adición de la mediana a largo plazo evita el riesgo de inconsistencia en las tendencias a corto plazo.

  4. Las reglas son claras y fáciles de entender, los parámetros son fáciles de ajustar, y son adecuados para el comercio cuantitativo.

  5. Las señales de compra y venta son visibles y las operaciones son claras.

Riesgo estratégico

  1. Las estrategias de doble línea media móvil son propensas a generar señales erróneas en los puntos de cambio de tendencia. Se debe tener cuidado para identificar posibles giros.

  2. La configuración incorrecta de los parámetros de la línea media móvil puede perder la tendencia o generar demasiadas señales erróneas. Se requiere ajustar los parámetros para diferentes mercados.

  3. La frecuencia de las transacciones puede ser alta, por lo que es necesario controlar los costos de las transacciones.

  4. Los parámetros del indicador de tendencia súper necesitan ser optimizados, de lo contrario, pueden filtrar la señal correcta o almacenar la señal errónea.

  5. La línea media a largo plazo puede ser un signo de retraso, por lo que es necesario tener una buena idea del momento en que la tendencia cambia.

Optimización de la estrategia

  1. Prueba diferentes combinaciones de líneas medias móviles para encontrar el mejor parámetro.

  2. Optimización de los parámetros de los indicadores de tendencias súper, equilibrando los efectos de filtración y la latencia.

  3. Añadir otros indicadores auxiliares, como el indicador de volumen de transacciones, para verificar aún más la señal.

  4. Los puntos de inflexión potenciales se pueden evaluar en combinación con los indicadores de emoción, la página de noticias y otros factores.

  5. Parámetros de optimización dinámica con el método de aprendizaje automático.

Resumir

La estrategia integra las ventajas de los indicadores de las medias móviles duales y de las tendencias súper, ya que puede descubrir tendencias y filtrar señales erróneas. Se puede mejorar continuamente el efecto de la estrategia mediante la optimización de parámetros y la verificación de indicadores auxiliares. Aunque existe cierto riesgo, se puede controlar mediante medios de gestión de riesgos.

Código Fuente de la Estrategia
/*backtest
start: 2022-09-21 00:00:00
end: 2023-09-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"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/
// © bhavikmota

//@version=4
strategy("EMA & Supertrend", overlay = true)

//length = input(9, minval=1)
//ema1 = ema(close, length)
//ema2 = ema(ema1, length)
//ema3 = ema(ema2, length)

//shortest = ema(close, 20)
//short = ema(close, 50)
//longer = ema(close, 100)
//longest = ema(close, 200)


//for Ema1
len1 = input(21, minval=1)
//src1 = input(close)
ema1 = ema(close,len1)
plot(ema1, color=color.red, linewidth=1)

//for Ema2
len2 = input(55, minval=1)
//src2 = input(close)
ema2 = ema(close,len2)
plot(ema2, color=color.green, linewidth=1)

//for Ema3
len3 = input(200, minval=1)
//src3 = input(close)
ema3 = ema(close,len3)
plot(ema3, color=color.blue, linewidth=1)

//for Ema4
len4 = input(233, minval=1)
//src4 = input(close)
ema4 = ema(close,len4)
plot(ema4, color=color.black, linewidth=1)


Periods = input(title="ATR Period", type=input.integer, defval=10)
src = input(hl2, title="Source")
Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0)
changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true)
showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=true)
highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true)
atr2 = sma(tr, Periods)
atr= changeATR ? atr(Periods) : atr2
up=src-(Multiplier*atr)
up1 = nz(up[1],up)
up := close[1] > up1 ? max(up,up1) : up
dn=src+(Multiplier*atr)
dn1 = nz(dn[1], dn)
dn := close[1] < dn1 ? min(dn, dn1) : dn
trend = 1
trend := nz(trend[1], trend)
trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend
upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green)
buySignal = trend == 1 and trend[1] == -1
plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0)
plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0)
dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red)
sellSignal = trend == -1 and trend[1] == 1
plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0)
plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0)
mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0)
longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white
shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white
fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor)
fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor)
alertcondition(buySignal, title="SuperTrend Buy", message="SuperTrend Buy!")
alertcondition(sellSignal, title="SuperTrend Sell", message="SuperTrend Sell!")
changeCond = trend != trend[1]
alertcondition(changeCond, title="SuperTrend Direction Change", message="SuperTrend has changed direction!")


//Trading logic

Enterlong = crossover(ema1,ema2) or (close>ema1 and close>ema2 and ema1>ema2) and close>ema4// positive ema crossover
Exitlong = crossunder(close,ema2) // candle closes below supertrend

Entershort = crossunder(ema1,ema2) or (close<ema1 and close<ema2 and ema2<ema1) and close<ema4// negative ema crossover
Exitshort = crossover(close,ema2) // candle closes above supertrend

//Execution Logic - Placing Order

start = timestamp(2008,1,1,0,0)

if time>= start
    strategy.entry("long", strategy.long, when=Enterlong)
    strategy.close("long",when=Exitlong)
//strategy.entry("short",strategy.short,100,when=Entershort)
//strategy.close("short",when=Exitshort)