Estrategia de coincidencia de dos promedios móviles basada en bandas de Bollinger

El autor:¿ Qué pasa?, Fecha: 2023-11-24 15:32:57
Las etiquetas:

img

Resumen general

La doble estrategia de coincidencia de promedios móviles basada en bandas de Bollinger es una estrategia de seguimiento de tendencias que se ejecuta con el precio y el volumen en el mercado.

Principio de la estrategia

Esta estrategia se basa principalmente en las señales de cruce del indicador de Bollinger Bands y el indicador de promedio móvil para el comercio. Específicamente, utiliza el tren medio, el tren superior de Bollinger Bands y 7 promedios móviles con longitudes de 5 a 200 días al mismo tiempo.

Además, la estrategia también introduce el indicador moveToFract para juzgar las posiciones largas y cortas. Este indicador determina si la tendencia actual del mercado es al alza o a la baja mediante el cálculo del orden de disposición de los promedios móviles a corto y largo plazo, evitando así generar señales erróneas en los mercados de rango. Finalmente, combinado con reglas de stop profit y stop loss configurables, forma una tendencia más completa después de la estrategia de negociación.

Análisis de ventajas

  1. Configuración flexible que puede personalizar las combinaciones de parámetros para adaptarse a diferentes entornos de mercado
  2. Combinar dos indicadores diferentes como filtros puede reducir las señales erróneas
  3. El indicador de evaluación de tendencias puede evitar operaciones inversas en mercados volátiles
  4. El seguimiento de la configuración de stop loss maximiza las ganancias

Análisis de riesgos

  1. Los parámetros deben ajustarse adecuadamente para adaptarse a ciclos de diferentes plazos para evitar el exceso de negociación
  2. El seguimiento del stop loss puede aumentar las pérdidas en una rápida disminución
  3. Debe garantizar fondos suficientes, de lo contrario no podrá soportar el riesgo de pérdidas continuas

Direcciones de optimización

  1. Añadir cruces de oro y cruces de muerte para optimizar aún más
  2. Diferentes variedades tienen diferentes parámetros, considerar el aprendizaje automático para los parámetros óptimos
  3. Combinar con el índice de volatilidad para determinar la volatilidad de la tendencia y reforzar el control del riesgo

Conclusión

En general, esta es una estrategia muy práctica de seguimiento de tendencias. Utiliza el cruce de indicadores para la toma de decisiones, y también incorpora un módulo de evaluación de tendencias para filtrar eficazmente las señales incorrectas. Después de configurar el stop profit y el stop loss, puede seguir completamente las tendencias para la negociación y obtener buenos rendimientos. Al ajustar las combinaciones de parámetros y agregar más filtros, esta estrategia puede optimizarse aún más para adaptarse a más entornos de mercado, y tiene un gran margen de mejora y perspectivas de aplicación.


/*backtest
start: 2023-10-24 00:00:00
end: 2023-11-23 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_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/
// © HeWhoMustNotBeNamed

//@version=4
strategy("BuyTheDip", overlay=true, initial_capital = 100000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01, calc_on_order_fills = true)

MAType = input(title="Moving Average Type", defval="sma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
exitType = input(title="Exit Strategy", defval="Signal", options=["Signal", "TrailingStop", "Both"])
LookbackPeriod = input(30, minval=10,step=10)

BBStdDev = input(2, minval=1, maxval=10, step=0.5)
BBLength = input(60, minval=5, step=5)

atrLength = input(22)
atrMult = input(6)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.all, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)
includePartiallyAligned = true
f_getMovingAverage(source, MAType, length)=>
    ma = sma(source, length)
    if(MAType == "ema")
        ma := ema(source,length)
    if(MAType == "hma")
        ma := hma(source,length)
    if(MAType == "rma")
        ma := rma(source,length)
    if(MAType == "vwma")
        ma := vwma(source,length)
    if(MAType == "wma")
        ma := wma(source,length)
    ma

f_getTrailingStop(atr, atrMult)=>
    stop = close - atrMult*atr
    stop := strategy.position_size > 0 ? max(stop, stop[1]) : stop
    stop

f_getMaAlignment(MAType, includePartiallyAligned)=>
    ma5 = f_getMovingAverage(close,MAType,5)
    ma10 = f_getMovingAverage(close,MAType,10)
    ma20 = f_getMovingAverage(close,MAType,20)
    ma30 = f_getMovingAverage(close,MAType,30)
    ma50 = f_getMovingAverage(close,MAType,50)
    ma100 = f_getMovingAverage(close,MAType,100)
    ma200 = f_getMovingAverage(close,MAType,200)

    upwardScore = 0
    upwardScore := close > ma5? upwardScore+1:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1:upwardScore
    
    upwards = close > ma5 and ma5 > ma10 and ma10 > ma20 and ma20 > ma30 and ma30 > ma50 and ma50 > ma100 and ma100 > ma200
    downwards = close < ma5 and ma5 < ma10 and ma10 < ma20 and ma20 < ma30 and ma30 < ma50 and ma50 < ma100 and ma100 < ma200
    upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 5? 0.5: upwardScore < 2?-0.5:upwardScore>3?0.25:-0.25) : 0
    
inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

exitBySignal = exitType == "Signal" or exitType == "Both"
exitByTrailingStop = exitType == "TrailingStop" or exitType == "Both"
maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
atr = atr(atrLength)

trailingStop = f_getTrailingStop(atr, atrMult)
maAligned = highest(maAlignment,LookbackPeriod)
[middle, upper, lower] = bb(close, BBLength, BBStdDev)

buyCondition = maAligned == 1 and (crossover(close, lower) or crossover(close, middle))
buyExitCondition = crossunder(close, upper)

strategy.entry("Buy", strategy.long, when=buyCondition and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=buyExitCondition and exitBySignal)
strategy.exit("ExitBuy", "Buy", stop = trailingStop, when=exitByTrailingStop )




Más.