Estrategia de negociación de pares de medias móviles de bandas de Bollinger


Fecha de creación: 2023-11-24 15:32:57 Última modificación: 2023-11-24 15:32:57
Copiar: 0 Número de Visitas: 706
1
Seguir
1617
Seguidores

Estrategia de negociación de pares de medias móviles de bandas de Bollinger

Descripción general

La estrategia de trading de pares de líneas medias de Brines es una estrategia de seguimiento de tendencias que funciona con el precio de mercado. Utiliza el cruce de bandas de Brines y líneas medias móviles como señal de negociación, lo que permite una estrategia cuantitativa que identifica automáticamente las tendencias del mercado y opera con reglas de stop loss.

Principio de estrategia

La estrategia se basa principalmente en señales cruzadas del indicador de la banda de Brin y el indicador de la línea media móvil. En concreto, utiliza al mismo tiempo el medio de la banda de Brin, el medio de la banda de Brin y 7 medias móviles de 5 a 200 días de longitud. Se produce una señal de compra cuando el precio se rompe el medio de la banda de Brin y el medio de la banda de Brin de abajo hacia arriba; se produce una señal de venta cuando el precio se rompe el medio de la banda de Brin de arriba hacia abajo, lo que permite el seguimiento de la tendencia.

Además, la estrategia también introdujo el indicador de juicio múltiple de moveToFract. Este indicador determina si el mercado está subiendo o bajando en la actualidad mediante el cálculo de la secuencia de las medias móviles a corto y largo plazo, lo que evita la generación de señales erróneas en situaciones de crisis. Finalmente, combinado con una regla de stop loss configurable, se forma una estrategia de seguimiento de tendencias más completa.

Análisis de las ventajas

  1. Flexibilidad de configuración, combinación de parámetros personalizados para adaptarse a diferentes entornos de mercado
  2. La combinación de dos indicadores diferentes como filtros puede reducir las señales erróneas
  3. Los indicadores de tendencia evitan el cambio de tendencia en los mercados convulsionados
  4. La configuración de seguimiento de stop loss para maximizar las ganancias

Análisis de riesgos

  1. Ajuste adecuado de los parámetros para adaptarse a los diferentes períodos para evitar el exceso de comercio
  2. El seguimiento de las paradas puede ampliar las pérdidas en una caída rápida
  3. Asegurarse de tener suficiente capital para no correr el riesgo de pérdidas continuas

Dirección de optimización

  1. La adición de la cruz de oro y el halcón puede ser optimizada aún más
  2. Diferentes variedades de parámetros, los mejores parámetros para el entrenamiento de aprendizaje automático
  3. Indicadores de volatilidad y control de viento para determinar la oscilación de la tendencia

Resumir

En general, esta estrategia es una estrategia de seguimiento de tendencias muy práctica. Utiliza una intersección de indicadores para tomar decisiones, y agrega un módulo de juicio de tendencias que puede eliminar eficazmente las señales erróneas. Una vez configurado el stop loss, se puede seguir la tendencia de forma adecuada para operar y obtener mejores ganancias.

Código Fuente de la Estrategia
/*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 )