Una estrategia de negociación de varios períodos basada en promedios móviles

El autor:¿ Qué pasa?, Fecha: 2023-12-26 10:13:34
Las etiquetas:

img

Resumen general

Esta estrategia combina tres indicadores: promedios móviles, bandas de Bollinger e índice de fuerza relativa (RSI) para el comercio de acciones de varios períodos. Considera los cruces de promedios móviles rápidos y lentos, RSI por debajo de 50 y precio de cierre por debajo de la banda media BB al comprar. Considera RSI por encima de 70 y precio de cierre por encima de la banda superior BB al vender.

Estrategia lógica

La estrategia utiliza principalmente tres indicadores para la toma de decisiones. En primer lugar, el indicador MACD se compone de promedios móviles rápidos y lentos. Los cruces de la línea rápida por encima de la línea lenta generan señales de compra. En segundo lugar, las bandas de Bollinger con bandas medias, superiores e inferiores. Los precios cerca de la banda inferior presentan oportunidades de compra en los mínimos de oscilación, mientras que los precios cerca de la banda superior presentan oportunidades de venta en los máximos de oscilación. Por último, el RSI refleja la velocidad y la tasa de cambio de la acción del precio e identifica los máximos y mínimos de oscilación potenciales.

Específicamente, la estrategia primero requiere el cruce de la media móvil rápida por encima de la media móvil lenta, lo que indica un fortalecimiento de la tendencia alcista que sugiere comprar. También requiere un RSI por debajo de 50, lo que muestra que el precio puede estar en niveles de sobreventa y presentar oportunidades de compra. Además, requiere el precio cerrado por debajo de la banda media BB, lo que indica el precio de oscilación bajo y un buen punto de entrada.

Para la toma de ganancias y el stop loss, cuando el RSI se eleva por encima de 70, indica que el precio puede estar en niveles de sobrecompra y que el impulso de la tendencia alcista está disminuyendo, adecuado para tomar ganancias.

Ventajas

La estrategia combina los puntos fuertes de las medias móviles, las bandas de Bollinger y el RSI para determinar con mayor precisión los puntos de entrada y salida.

  1. Los promedios móviles determinan el impulso de la tendencia alcista de los precios. La banda media BB señala los mínimos de oscilación para la entrada. El RSI evita comprar en picos de precios. Los tres juntos proporcionan oportunidades de compra relativamente ideales durante las tendencias alcistas de los precios.

  2. La combinación de la banda superior del RSI y BB captura bien los máximos de oscilación de precios para obtener ganancias para evitar condiciones de sobrecompra.

  3. Las evaluaciones de varios períodos permiten capturar oportunidades comerciales a través de marcos de tiempo para maximizar los beneficios.

  4. Las reglas de negociación lógicas hacen que la estrategia sea fácilmente comprensible para inversiones a medio y largo plazo.

Los riesgos

A pesar de la combinación de indicadores para mejorar la precisión de las decisiones, existen riesgos clave:

  1. Los parámetros para los indicadores necesitan un ajuste empírico.

  2. En los mercados bajistas, la velocidad de la caída de los precios puede hacer que las pérdidas de parada sean ineficaces.

  3. Los riesgos de las acciones individuales persisten a pesar de la cartera.

  4. Frecuencia potencialmente excesiva de las operaciones: el ajuste óptimo de los parámetros puede dar lugar a operaciones frecuentes, lo que entraña mayores costes y impuestos de las transacciones.

Soluciones:

  1. Ajustar los parámetros basados en las pruebas de retroceso para lograr una frecuencia de señal adecuada.

  2. Ajuste los períodos de media móvil a una frecuencia de entrada moderada y minimice las pérdidas.

  3. Diversificar las inversiones en más activos para minimizar los riesgos de una sola acción.

  4. Relajar moderadamente los criterios de compra y obtención de beneficios para reducir la frecuencia del comercio.

Oportunidades de mejora

Queda todavía espacio para las optimizaciones:

  1. Añadir más filtros como el volumen para garantizar volúmenes amplificados en las compras, mejorando la precisión de la decisión.

  2. Incorporar módulos de dimensionamiento de posiciones para dimensionar dinámicamente las posiciones según las condiciones del mercado.

  3. Utilice algoritmos de aprendizaje profundo para ajustar automáticamente los parámetros a través de entrenamientos en grandes conjuntos de datos.

  4. Introducir más plazos para las sentencias para ampliar su aplicabilidad.

Conclusión

En general, la estrategia tiene una lógica clara y fácil de entender, sinergizando indicadores para reducir las señales falsas. El ajuste adicional de parámetros y la adición de indicadores pueden continuar mejorando la robustez y la precisión de la decisión. Es adecuado para inversiones a medio y largo plazo y comercio cuantitativo. Sin embargo, ninguna estrategia elimina por completo los riesgos del mercado.


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

//
//@author Alorse
//@version=4
strategy("MACD + BB + RSI [Alorse]", shorttitle="BB + MACD + RSI [Alorse]", overlay=true, pyramiding=0, currency=currency.USD, default_qty_type=strategy.percent_of_equity, initial_capital=1000, default_qty_value=20, commission_type=strategy.commission.percent, commission_value=0.01) 

txtVer = "1.0.1"
version = input(title="Version", type=input.string, defval=txtVer, options=[txtVer], tooltip="This is informational only, nothing will change.")
src = input(title="Source", type=input.source, defval=close)

// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=12, group="MACD")
slow_length = input(title="Slow Length", type=input.integer, defval=26, group="MACD")
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9, group="MACD")
sma_source = input(title="Oscillator MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
sma_signal = input(title="Signal Line MA Type", type=input.string, defval="EMA", options=["SMA", "EMA"], group="MACD")
fast_ma = sma_source == "SMA" ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source == "SMA" ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? sma(macd, signal_length) : ema(macd, signal_length)

// Bollinger Bands
bbGroup = "Bollindger Bands"
length = input(20, title="Length", group=bbGroup)
mult = input(2.0, title="StdDev", minval=0.001, maxval=5, group=bbGroup)

basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev

// RSI
rsiGroup = "RSI"
lenRSI = input(14, title="Length", minval=1, group=rsiGroup)
// lessThan = input(50, title="Less than", minval=1 , maxval=100, group=rsiGroup)
RSI = rsi(src, lenRSI)

// Strategy Conditions
buy = crossover(macd, signal) and RSI < 50 and close < basis
sell = RSI > 70 and close > upper


// Stop Loss
slGroup = "Stop Loss"
useSL = input(false, title="╔══════   Enable   ══════╗", group=slGroup, tooltip="If you are using this strategy for Scalping or Futures market, we do not recommend using Stop Loss.")
SLbased = input(title="Based on", type=input.string, defval="Percent", options=["ATR", "Percent"], group=slGroup, tooltip="ATR: Average True Range\nPercent: eg. 5%.")
multiATR = input(10.0, title="ATR   Mult", type=input.float, group=slGroup, inline="atr")
lengthATR = input(14, title="Length", type=input.integer, group=slGroup, inline="atr")
SLPercent = input(10, title="Percent", type=input.float, group=slGroup) * 0.01

longStop = 0.0
shortStop = 0.0

if SLbased == "ATR"
    longStop := valuewhen(buy, low, 0) - (valuewhen(buy, rma(tr(true), lengthATR), 0) * multiATR)
    longStopPrev = nz(longStop[1], longStop)
    longStop := close[1] > longStopPrev ? max(longStop, longStopPrev) : longStop

    shortStop := (valuewhen(sell, rma(tr(true), lengthATR), 0) * multiATR) + valuewhen(sell, high, 0)
    shortStopPrev = nz(shortStop[1], shortStop)
    shortStop := close[1] > shortStopPrev ? max(shortStop, shortStopPrev) : shortStop
if SLbased == "Percent"
    longStop  := strategy.position_avg_price * (1 - SLPercent)
    shortStop := strategy.position_avg_price * (1 + SLPercent)

strategy.entry("Long", true, when=buy)
strategy.close("Long", when=sell, comment="Exit")

if useSL
    strategy.exit("Stop Loss", "Long", stop=longStop)


Más.