Esta estrategia genera señales comerciales basadas en el cruce de medias móviles de 21 días y 55 días, y utiliza el indicador de supertrend para filtrar señales falsas.
El código primero define la EMA de 21 días (EMA1) y la EMA de 55 días (EMA2). Una señal de compra se genera cuando EMA1 cruza por encima de EMA2. Una señal de venta se genera cuando EMA1 cruza por debajo de EMA2.
Para filtrar señales falsas, se agrega el indicador de supertrend. El supertrend calcula la dirección de la tendencia basada en ATR y los precios altos-bajos recientes.
Por lo tanto, una señal de compra solo se genera cuando la EMA1 cruza por encima de la EMA2 durante una tendencia alcista. Una señal de venta solo se genera cuando la EMA1 cruza por debajo de la EMA2 durante una tendencia bajista. La super tendencia filtra señales falsas durante las transiciones de tendencia.
Además, los promedios móviles de 200 días y 233 días se suman para determinar la tendencia a largo plazo.
Las medias móviles dobles combinadas con la supertrend pueden identificar de manera efectiva las tendencias y filtrar las señales falsas.
Los parámetros de media móvil ajustables pueden adaptar la estrategia a las diferentes condiciones del mercado.
Las medias móviles a largo plazo evitan los riesgos de tendencias contradictorias.
Reglas claras fáciles para el comercio algorítmico.
Las señales visuales de compra/venta hacen que las decisiones comerciales sean claras.
Los promedios móviles pueden generar señales falsas alrededor de los puntos de inflexión.
Los parámetros deben ajustarse para los diferentes mercados, ya que la configuración inadecuada de los parámetros puede causar tendencias perdidas o señales falsas excesivas.
La alta frecuencia de las operaciones conduce a un aumento de los costes de transacción, que deben controlarse.
Los parámetros de supertendencia deben optimizarse para equilibrar la eficacia del filtrado y el retraso.
Los promedios a largo plazo pueden retrasarse en la generación de señales.
Prueba diferentes combinaciones de medias móviles para encontrar parámetros óptimos.
Optimizar los parámetros de supertendencia para equilibrar el filtrado y el retraso.
Añadir otros indicadores como el volumen para validar aún más las señales.
Incorpore análisis de sentimientos y noticias para identificar posibles puntos de inflexión.
Utilice el aprendizaje automático para optimizar dinámicamente los parámetros.
Esta estrategia combina los puntos fuertes de las medias móviles duales y la supertendencia en la identificación de tendencias y el filtrado de señales falsas. Se puede mejorar continuamente a través de la optimización de parámetros y la validación adicional. A pesar de ciertos riesgos, se pueden gestionar a través de técnicas de control de riesgos.
/*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)