Estrategia de obtención de ganancias y de detención de pérdidas de media móvil triple exponencial

El autor:¿ Qué pasa?, Fecha: 2024-02-04 10:38:42
Las etiquetas:

img

Resumen general

La estrategia de toma de ganancias y parada de pérdidas de la media móvil exponencial triple es una estrategia de seguimiento de tendencias basada en tres promedios móviles exponenciales con diferentes períodos para la entrada y salida del mercado.

Estrategia lógica

La estrategia utiliza tres promedios móviles exponenciales: línea rápida, línea media y línea lenta. Va largo cuando la línea media cruza por encima de la línea lenta, y cierra la posición cuando la línea rápida cruza por debajo de la línea media. Esta es una estrategia típica de seguimiento de tendencias que determina la direccionalidad de la tendencia a través del cruce de los tres promedios móviles.

Al mismo tiempo, la estrategia aprovecha el indicador Average True Range para calcular los niveles de toma de ganancias y stop-loss. Específicamente, la toma de ganancias para posiciones largas es el precio de entrada + Average True Range * factor de ganancia, y para posiciones cortas es el precio de entrada - Average True Range * factor de ganancia. La lógica de stop loss es similar. Esto limita efectivamente el riesgo de grandes pérdidas.

Análisis de ventajas

  1. Los indicadores de decisión son intuitivos y fáciles de entender.
  2. Es sistemático y fácil de automatizar.
  3. Equilibra el seguimiento de tendencias y el control de riesgos.

Análisis de riesgos

  1. Hay cierto retraso e incapacidad para capturar las reversiones a tiempo.
  2. Tendencia a detener pérdidas en mercados variados.
  3. El ajuste de parámetros necesita optimización, de lo contrario los resultados pueden ser pobres.

Las medidas de mitigación del riesgo incluyen: acortar los períodos de media móvil, optimizar el factor de ganancia/detención y añadir indicadores auxiliares.

Direcciones de optimización

  1. Prueba combinaciones de medias móviles para encontrar parámetros óptimos.
  2. Añadir otros indicadores técnicos como MACD, RSI, etc.
  3. Utilice el aprendizaje automático para optimizar los parámetros.
  4. Ajuste dinámico del nivel de ganancia/detención basado en el rango real.
  5. Incluye sentimientos para evitar la superpoblación.

Conclusión

En general, esta es una estrategia de seguimiento de tendencias efectiva con un rendimiento estable y una implementación fácil a través de parámetros simples. La toma de ganancias dinámica y el stop loss basado en el Rango Verdadero Medio limita el riesgo por lado. Pero la optimización de parámetros y las combinaciones de indicadores deben hacerse cuidadosamente para evitar el sobreajuste o el retraso en la decisión. En balance, esta estrategia tiene un buen perfil de riesgo-recompensación y vale la pena considerar.


/*backtest
start: 2024-01-04 00:00:00
end: 2024-02-03 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//© Densz
strategy("3EMA with TP & SL (ATR)", overlay=true )

// INPUTS
startTime           =       input(title="Start Time", type = input.time, defval = timestamp("01 Jan 2017 00:00 +0000"))
endTime             =       input(title="End Time", type = input.time, defval = timestamp("01 Jan 2022 00:00 +0000"))

slowEMALength       =       input(title="Slow EMA Length", type = input.integer, defval = 55)
middleEMALength     =       input(title="Middle EMA Length", type = input.integer, defval = 21)
fastEMALength       =       input(title="Fast EMA Length", type = input.integer, defval = 9)

trendMALength       =       input(title="Trend indicator MA Length", type = input.integer, defval = 200)

atrLength           =       input(title="ATR Length", type = input.integer, defval = 14)
tpATRMult           =       input(title="Take profit ATR multiplier", type = input.integer, defval = 3)
slATRMult           =       input(title="Stop loss ATR multiplier", type = input.integer, defval = 2)

rsiLength           =       input(title="RSI Length", type = input.integer, defval = 14)

// Indicators
slowEMA             =       ema(close, slowEMALength)
middEMA             =       ema(close, middleEMALength)
fastEMA             =       ema(close, fastEMALength)
atr                 =       atr(atrLength)

rsiValue            =       rsi(close, rsiLength)
isRsiOB             =       rsiValue >= 80
isRsiOS             =       rsiValue <= 20

sma200              =       sma(close, trendMALength)

inDateRange         =       true

// Plotting
plot(slowEMA, title="Slow EMA", color=color.red, linewidth=2, transp=50)
plot(middEMA, title="Middle EMA", color=color.orange, linewidth=2, transp=50)
plot(fastEMA, title="Fast EMA", color=color.green, linewidth=2, transp=50)

plot(sma200, title="SMA Trend indicator", color=color.purple, linewidth=3, transp=10)
plotshape(isRsiOB, title="Overbought", location=location.abovebar, color=color.red, transp=0, style=shape.triangledown, text="OB")
plotshape(isRsiOS, title="Oversold", location=location.belowbar, color=color.green, transp=0, style=shape.triangledown, text="OS")

float takeprofit    =       na
float stoploss      =       na

var line tpline     =       na
var line slline     =       na

if strategy.position_size != 0
    takeprofit := takeprofit[1]
    stoploss := stoploss[1]
    line.set_x2(tpline, bar_index)
    line.set_x2(slline, bar_index)
    line.set_extend(tpline, extend.none)
    line.set_extend(slline, extend.none)
    
// STRATEGY
goLong  = crossover(middEMA, slowEMA) and inDateRange
closeLong = crossunder(fastEMA, middEMA) and inDateRange


if goLong
    takeprofit := close + atr * tpATRMult
    stoploss := close - atr * slATRMult
    // tpline := line.new(bar_index, takeprofit, bar_index, takeprofit, color=color.green, width=2, extend=extend.right, style=line.style_dotted)
    // slline := line.new(bar_index, stoploss, bar_index, stoploss, color=color.red, width=2, extend=extend.right, style=line.style_dotted)
    // label.new(bar_index, takeprofit, "TP", style=label.style_labeldown)
    // label.new(bar_index, stoploss, "SL", style=label.style_labelup)
    strategy.entry("Long", strategy.long, when = goLong)
    strategy.exit("TP/SL", "Long", stop=stoploss, limit=takeprofit)
if closeLong
    takeprofit := na
    stoploss := na
    strategy.close(id = "Long", when = closeLong)

if (not inDateRange)
    strategy.close_all()


Más.