Estrategia de combinación de promedio móvil alineado y índice alto bajo acumulado

El autor:¿ Qué pasa?, Fecha: 2023-11-21 15:19:35
Las etiquetas:

img

Resumen general

Esta estrategia combina principalmente el índice de baja alta, el índice de media móvil y el índice de súper tendencia para determinar la tendencia del mercado y las posiciones abiertas.

Estrategia lógica

  1. El High Low Index juzga si el último precio durante un determinado período ha hecho un nuevo máximo o un nuevo mínimo, y acumula la puntuación.

  2. El índice de promedio móvil juzga si el precio se encuentra en una tendencia alcista en forma de escalera o una tendencia bajista en forma de escalera.

  3. Combine los juicios del índice de baja alta y el índice de promedio móvil para determinar la tendencia del mercado, y luego encuentre oportunidades comerciales combinadas con la dirección del índice de súper tendencia.

Ventajas

  1. El índice alto bajo puede juzgar eficazmente el movimiento de precios y los cambios en el impulso. El índice promedio móvil puede determinar eficazmente la tendencia de precios. La combinación de ambos puede determinar con mayor precisión la dirección del mercado.

  2. La apertura de posiciones combinada con el Super Trend Index puede evitar la apertura prematura o tardía de posiciones.

  3. Varios indicadores se verifican entre sí y reducen las señales falsas.

Los riesgos

  1. Las señales incorrectas del índice High Low y del índice de la media móvil pueden dar lugar a posiciones con pérdidas.

  2. La participación insuficiente y la configuración inadecuada de los parámetros del índice Super Trend pueden generar señales incorrectas.

  3. Las inversiones rápidas de tendencia y la configuración inadecuada del stop loss pueden provocar grandes pérdidas.

  4. Los riesgos pueden reducirse optimizando los parámetros del indicador, ajustando los niveles de precios de stop loss, etc.

Optimización

  1. Prueba diferentes tipos de indicadores de media móvil para encontrar la combinación óptima de parámetros.

  2. Optimizar los parámetros del índice de alto bajo y el índice de promedio móvil para hacer que las señales sean más estables y confiables.

  3. Incorporar otros indicadores de verificación, como el MACD, el KD, etc., para reducir las señales falsas.

  4. Incorporar algoritmos de aprendizaje automático para optimizar automáticamente los parámetros y los pesos de la señal.

  5. Incorpore análisis de sentimiento para evitar el comercio de productos menos populares.

Conclusión

Esta estrategia determina las tendencias y el impulso del mercado a través del índice de alta baja y el índice de promedio móvil, y luego filtra las señales utilizando el índice de súper tendencia, abriendo posiciones cuando las fuerzas alcistas y bajistas se enfrentan entre sí y el índice de súper tendencia se invierte. Sus ventajas se encuentran en la verificación de múltiples señales y la apertura oportuna de posiciones, lo que puede controlar eficazmente los riesgos. Los problemas existentes incluyen señales falsas y el mal juicio de la tendencia. Se pueden hacer varias mejoras a través de la optimización de parámetros, configuración de pérdidas de parada, filtro de señales, etc. para hacer que la estrategia sea más robusta y confiable.


/*backtest
start: 2023-10-21 00:00:00
end: 2023-11-20 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("AlignedMA and Cumulative HighLow Strategy", overlay=true, initial_capital = 1000, 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"])
includePartiallyAligned = input(true)
HighLowPeriod = input(50, minval=1,step=1)
LookbackPeriod = input(10, minval=1,step=1)

supertrendMult = input(2, minval=1, maxval=10, step=0.5)
supertrendLength = input(10, minval=1)

tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
backtestYears = input(10, minval=1, step=1)

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_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

f_getHighLowValue(HighLowPeriod)=>
    currentHigh = highest(high,HighLowPeriod) == high
    currentLow = lowest(low,HighLowPeriod) == low
    currentHigh?1:currentLow?-1:0

inDateRange = time >= timestamp(syminfo.timezone, year(timenow) - backtestYears, 01, 01, 0, 0)

maAlignment = f_getMaAlignment(MAType,includePartiallyAligned)
alignedMaIndex = sum(maAlignment,LookbackPeriod)

maAlignmentDirection = alignedMaIndex > alignedMaIndex[1] ? 1 : alignedMaIndex < alignedMaIndex[1] ? -1 : 0
maAlignmentDirection := maAlignmentDirection == 0? nz(maAlignmentDirection[1],0):maAlignmentDirection

highLowIndex = f_getHighLowValue(HighLowPeriod)
cumulativeHighLowIndex = sum(highLowIndex,LookbackPeriod)

hlDirection = cumulativeHighLowIndex > cumulativeHighLowIndex[1] ? 1 : cumulativeHighLowIndex < cumulativeHighLowIndex[1] ? -1 : 0
hlDirection := hlDirection == 0? nz(hlDirection[1],0):hlDirection

[superTrend, dir] = supertrend(supertrendMult, supertrendLength)

buyEntry = (dir == -1 and maAlignmentDirection == 1 and hlDirection == 1)
sellEntry = (dir == 1 and maAlignmentDirection == -1 and hlDirection == -1)

barColor = buyEntry?color.lime:sellEntry?color.orange:color.gray
barcolor(barColor)

// strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Buy", strategy.long, when=barColor == color.lime and inDateRange, oca_name="oca_buy")
strategy.close("Buy", when=dir == 1)

strategy.entry("Sell", strategy.short, when=barColor == color.orange and inDateRange, oca_name="oca_sell")
strategy.close("Sell", when=dir == -1)


Más.