Estrategia de seguimiento de tendencias basada en la media móvil

El autor:¿ Qué pasa?, Fecha: 2023-10-07 15:04:00
Las etiquetas:

Resumen general

Esta estrategia identifica la dirección de la tendencia actual mediante el cálculo de promedios móviles de diferentes períodos y genera señales comerciales combinadas con el indicador RSI. Cuando el promedio móvil de corto período cruza por encima del promedio móvil de largo período, la tendencia se considera y se genera una señal de compra. Cuando el promedio móvil de corto período cruza por debajo del promedio móvil de largo período, la tendencia se considera inversa y se genera una señal de venta. El indicador RSI se utiliza para evitar señales falsas causadas por fluctuaciones menores de precios.

Estrategia lógica

  1. Calcular las medias móviles simples de 10 días, 20 días, 50 días, 100 días y 200 días.

  2. Calcule el valor del RSI de 14 días.

  3. Cuando la SMA de 10 días se cruce por encima de la SMA de 50 días, y el RSI es mayor que 30, y la SMA de 20 días es mayor o igual a la SMA de 100 días o la SMA de 50 días es mayor o igual a la SMA de 100 días, comprar.

  4. El valor de las pérdidas se calculará en función de los precios de entrada multiplicados por (1 - porcentaje de pérdidas).

  5. Vender cuando:

    • SMA de 10 días cruza por debajo de la SMA de 50 días y el cierre está por debajo de la SMA de 20 días: señal de venta de inversión de tendencia
    • El cierre está por debajo del 95% del precio de entrada: venta de pérdida de parada
    • El precio de cierre está por debajo del precio de stop loss: venta de stop loss posterior

Esta estrategia juzga la tendencia del mercado utilizando promedios móviles y establece stop loss para controlar los riesgos. El RSI filtra las falsas rupturas. Compra cuando el SMA de corto período cruza por encima del SMA de largo período, lo que indica una tendencia alcista, y establece una línea de stop loss para controlar los riesgos durante el período de retención. Vende cuando ocurre una señal de inversión de tendencia o se activa el precio de stop loss.

Análisis de ventajas

  • Usando medias móviles para determinar la dirección de la tendencia, comprar durante la tendencia alcista evita el comercio en mercados de rango
  • El uso de medias móviles de varios períodos evita ser engañado por las fluctuaciones de precios a corto plazo
  • La combinación con el RSI filtra las señales falsas
  • Establecimiento de controles de pérdidas de parada para el riesgo a la baja para cada operación
  • Utilizando el stop loss para bloquear las ganancias

Análisis de riesgos

  • Las medias móviles tienen retraso y pueden perder el mejor momento para la inversión de precios
  • El valor de las pérdidas de cierre establecidas demasiado sueltas puede dar lugar a grandes pérdidas para operaciones únicas
  • La configuración de stop loss demasiado apretada puede provocar activadores de stop loss demasiado frecuentes.
  • La pérdida de parada de seguimiento puede salir demasiado pronto sin obtener mayores ganancias

La optimización se puede hacer mediante el ajuste de los períodos de promedio móvil, los niveles de stop loss, etc. También considere combinar con otros indicadores para mejorar la precisión.

Direcciones de optimización

  • Ajuste de los períodos de media móvil para adaptarse a las diferentes condiciones del mercado
  • Optimizar los parámetros del índice de rentabilidad para identificar mejor las condiciones de sobrecompra/sobreventa
  • Establecer niveles razonables de pérdida de frenado estático y de frenado de trayectoria basados en las características del instrumento
  • Añadir otros indicadores para evitar señales falsas
  • Ajuste dinámico del stop loss en función de la volatilidad, etc.
  • Optimización automática de parámetros mediante aprendizaje automático

Resumen de las actividades

La estrategia tiene una lógica clara en general, utilizando promedios móviles para la determinación de tendencias y la configuración de stop loss para controlar riesgos. Es una estrategia típica de seguimiento de tendencias. Se pueden lograr mejoras adicionales a través del ajuste de parámetros y la adición de otros indicadores.


/*backtest
start: 2022-09-30 00:00:00
end: 2023-10-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("MA_Script", overlay=true)

// STEP 1:
// Configure trail stop level with input options (optional)
longTrailPerc=input(title="Trail Long Loss (%)", type=input.float, minval=0.0, step=0.05, defval=0.1)

// Configure backtest start date with inputs
startDate=input(title="Start Date", type=input.integer, defval=1, minval=1, maxval=31)
startMonth=input(title="Start Month", type=input.integer, defval=1, minval=1, maxval=12)
startYear=input(title="Start Year", type=input.integer, defval=2020, minval=1800, maxval=2100)

// See if this bar's time happened on/after start date
afterStartDate=(time >=timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0))

// Calculate Relative Strength Index
rsiValue=rsi(close, 14)

// Calculate moving averages
MA10_Val =sma(close, 10)
//plot(MA10_Val, color=color.yellow, linewidth=1)

MA20_Val =sma(close, 20)
plot(MA20_Val, color=color.green, linewidth=1)

MA50_Val =sma(close, 50)
plot(MA50_Val, color=color.red, linewidth=1)

MA100_Val =sma(close, 100)
plot(MA100_Val, color=color.blue, linewidth=1) 

MA200_Val =sma(close, 200)
plot(MA200_Val, color=color.purple, linewidth=1) 

// Calculate candlestick
C_BodyHi = max(close, open)
C_BodyLo = min(close, open)
C_Body = C_BodyHi - C_BodyLo
C_UpShadow = high - C_BodyHi
C_DnShadow = C_BodyLo - low

// STEP 2:
// Calculate entry trading conditions
buyCondition_1=crossover(MA10_Val, MA50_Val) and (rsiValue > 30) and ((MA20_Val >=  MA100_Val) or (MA50_Val >=  MA100_Val))
avg_price = (close + open)/2

// First Entry
if (afterStartDate)
    strategy.entry(id="Entry_Trade_1", long=true, limit=avg_price, when=buyCondition_1)

plotchar(afterStartDate and crossover(MA10_Val, MA50_Val), textcolor = color.blue, text = 'MA\n')

// Determine trail stop loss prices
longStopPrice=0.0

longStopPrice :=if (strategy.position_size > 0)
    stopValue=C_BodyHi * (1 - longTrailPerc)
    max(stopValue, longStopPrice[1])
else
    0
plot(longStopPrice, color=color.orange, linewidth=1)

bought_1=strategy.position_size[0] > strategy.position_size[1]
entry_Point_1=valuewhen(bought_1, avg_price, 0)

// STEP 3:
// Calculate exit trading conditions
sellCondition_2=crossunder(MA10_Val, MA50_Val) and (close < MA20_Val)
sellCondition_3_temp=valuewhen((C_BodyHi >= entry_Point_1*1.2), 1, 0)
sellCondition_1=(entry_Point_1*0.95 > close) and (sellCondition_3_temp != 1)
sellCondition_3=(sellCondition_3_temp == 1) and (strategy.position_size > 0) and close <= longStopPrice
plotchar((sellCondition_3 == 1) and (strategy.position_size > 0) and close <= longStopPrice, textcolor = color.red, text = 'TS\n', show_last = 11)
plotchar(crossunder(MA10_Val, MA50_Val), textcolor = color.red, text = 'MA\n')

id_val = ""
stop_val = close
condition = false

if sellCondition_1
    id_val := "Exit By Stop Loss At 7%"
    stop_val := entry_Point_1*0.93
    condition := true
else if sellCondition_2
    id_val := "Exit By Take Profit based on MA"
    stop_val := close
    condition := true
else if sellCondition_3
    id_val := "Exit By Trailing Stop"
    stop_val := longStopPrice
    condition := true

// Submit exit orders for trail stop loss price
if (strategy.position_size > 0)
    //strategy.exit(id="Exit By Stop Loss At 7%", from_entry="Entry_Trade_1", stop=entry_Point_1*0.93, when=sellCondition_1)
    //strategy.exit(id="Exit By Take Profit based on MA", from_entry="Entry_Trade_1", stop=close, when=sellCondition_2)
    strategy.exit(id=id_val, from_entry="Entry_Trade_1", stop=stop_val, when=condition)
    
    


Más.