Estrategia de negociación del sistema de media móvil

El autor:¿ Qué pasa?, Fecha: 2024-01-05 15:36:00
Las etiquetas:

img

Resumen general

Este artículo analiza una estrategia de negociación basada en un promedio móvil simple. La estrategia compara el precio de cierre con un promedio móvil de 17 períodos, yendo largo cuando el precio de cierre cruza por encima del promedio móvil y va corto cuando cruza por debajo.

Estrategia lógica

Cálculo de la media móvil

La estrategia utiliza los siguientes parámetros para calcular la media móvil:

  • Fuente del MA: Descomposición de la media de OHLC (OHLC4)
  • Tipo de M.A.: Default a media móvil simple (M.A.)
  • Duración del MA: por defecto a 17

Basándose en estos parámetros, se llama a la función getMAType() para calcular la SMA de 17 períodos de los precios de cierre.

Generación de señales comerciales

A continuación, comparar la relación entre el precio de cierre y la media móvil:

  • Cierre > Promedio móvil: señal larga
  • Cierre < media móvil: señal corta

Cuando el precio de cierre cruza por encima de la media móvil desde abajo, se genera una señal larga.

Ejecución de las operaciones

Durante el período de backtest, abrir posiciones largas cuando aparecen señales largas y abrir posiciones cortas cuando aparecen señales cortas.

Análisis de ventajas

La mayor ventaja de esta estrategia es que la lógica es muy simple y clara. Con solo un indicador, juzga la inversión de tendencia en función del cambio de dirección del indicador. La estrategia es fácil de entender e implementar, adecuada para que los principiantes aprendan.

Además, las medias móviles pertenecen a indicadores de tendencia, que pueden realizar un seguimiento eficaz de los cambios de tendencia y evitar interferencias del ruido del mercado a corto plazo.

Al ajustar los parámetros, puede adaptarse a diferentes ciclos y diferentes productos.

Análisis de riesgos

En primer lugar, esta estrategia se basa únicamente en un indicador, por lo que los criterios de evaluación son relativamente únicos, lo que puede generar más señales falsas.

Además, como sistema de seguimiento de tendencias, no funciona bien en los mercados de rango y laterales.

Además, sin stop loss o take profit, existe el riesgo de que las pérdidas se extiendan.

Las soluciones son incorporar otros indicadores, optimizar las combinaciones de parámetros para reducir las señales falsas, agregar stop loss y take profit para controlar los riesgos y optimizar los drawdowns.

Direcciones de optimización

Aquí hay algunas ideas para optimizar la estrategia:

  1. Ajustar los parámetros de la media móvil, optimizar los números de períodos, por ejemplo, cambiar a 30 o 50 períodos.

  2. Pruebe diferentes tipos de promedios móviles, como EMA, VIDYA, etc. Tienen una sensibilidad variable a los cambios de precios.

  3. Añadir otros indicadores en combinación, por ejemplo, MACD para evaluar la fortaleza; RSI para reducir las señales falsas.

  4. Añadir mecanismos de stop loss: establecer un porcentaje fijo o una pérdida de stop de seguimiento basada en ATR para controlar el monto de la pérdida de una sola operación.

  5. Agregue mecanismos de toma de ganancias. Establezca el porcentaje de ganancias objetivo para maximizar las ganancias.

Estas optimizaciones pueden hacer que el rendimiento de la estrategia sea más estable y evitar reducciones excesivas.

Resumen de las actividades

Este artículo analiza una estrategia de trading simple basada en una media móvil de 17 períodos. La estrategia tiene fuentes de señal simples, fáciles de entender e implementar, pertenecientes a un sistema típico de seguimiento de tendencias. A través de una interpretación en profundidad de la estrategia, se analizan sus pros y contras, y se proponen múltiples dimensiones de ideas de optimización. Se cree que a través de la optimización y enriquecimiento continuos, esta estrategia puede evolucionar gradualmente y lograr retornos estables también en el comercio en vivo.


/*backtest
start: 2023-12-05 00:00:00
end: 2024-01-04 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Simple 17 BF 🚀", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.0)

/////////////// Time Frame ///////////////
testStartYear = input(2012, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Moving Average /////////////
source = input(title="MA Source", defval=ohlc4)
maType = input(title="MA Type", defval="sma", options=["sma", "ema", "swma", "wma", "vwma", "rma"])
length = input(title="MA Length", defval=17)

///////////// Get MA Function /////////////
getMAType(maType, sourceType, maLen) => 
    res = sma(close, 1)
    
    if maType == "ema"
        res := ema(sourceType, maLen)
    if maType == "sma"
        res := sma(sourceType, maLen)
    if maType == "swma"
        res := swma(sourceType)
    if maType == "wma"
        res := wma(sourceType, maLen)
    if maType == "vwma"
        res := vwma(sourceType, maLen)
    if maType == "rma"
        res := rma(sourceType, maLen)
    res
    
MA = getMAType(maType, source, length)

/////////////// Strategy ///////////////
long = close > MA
short = close < MA

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

/////////////// Execution /////////////// 
if testPeriod()
    strategy.entry("L", strategy.long, when=long_signal)
    strategy.entry("S", strategy.short, when=short_signal)

/////////////// Plotting /////////////// 
p1 = plot(MA, color = long ? color.lime : color.red, linewidth=2)
p2 = plot(close, linewidth=2)
fill(p1, p2, color=strategy.position_size > 0 ? color.lime : strategy.position_size < 0 ? color.red : color.white, transp=80)

Más.