Sistema de votación cruzada multi-MA configurable

El autor:¿ Qué pasa?, Fecha: 2023-09-23 15:52:06
Las etiquetas:

Resumen general

Esta estrategia permite la configuración flexible de múltiples pares de medias móviles rápidas / lentas. Se hace largo cuando todos los MA rápidos cruzan por encima de los MA lentos, y sale cuando cualquier MA rápido cruza por debajo de los MA lentos.

Estrategia lógica

Los componentes y reglas clave son:

  1. MAs rápidas/lentas múltiples: mediante SMA, WMA, VWMA, etc.

  2. Señal larga: todos los MAs rápidos cruzan por encima de los MAs lentos.

  3. Señales de salida: cualquier cruce de velocidad MA por debajo de la velocidad MA lenta.

  4. Puntos de ganancia/pérdida: Puntos fijos basados en ATR.

  5. Configurable: Configuración flexible de varios pares de MA.

La entrada basada en votación con múltiples MAs mejora la fiabilidad de la señal.

Ventajas

En comparación con las estrategias individuales de MA, las ventajas son las siguientes:

  1. Las MAs múltiples proporcionan una evaluación de tendencias más completa.

  2. El voto evita señales falsas del ruido.

  3. Gran espacio de afinación de configuraciones MA personalizadas.

  4. El apoyo a los diferentes tipos de AUE mejora la adaptabilidad.

  5. Control de puntos de ganancia/pérdida definidos por riesgo/recompensa de la operación.

  6. Funciona mejor en marcos de tiempo más largos, menos curvas.

  7. Lógica simple e intuitiva, fácil de implementar y operar.

  8. En general, más estable con mayor longevidad en comparación con un solo MA.

Los riesgos

Sin embargo, existen algunos riesgos:

  1. Aumento de la complejidad con MAs múltiples.

  2. Los riesgos de la sobre-optimización.

  3. Desfase fundamental en la identificación de los cambios de tendencia.

  4. No se tiene en cuenta el volumen, se corre el riesgo de quedar atrapados.

  5. Los puntos de ganancia/pérdida pueden causar salidas innecesarias.

  6. Rendimiento sujeto a cambios en los regímenes de mercado.

  7. Necesidad de monitorear las relaciones de recompensa/riesgo y la suavidad de la curva.

  8. La robustez entre instrumentos requiere validación.

Mejoras

Basándose en el análisis, las mejoras pueden incluir:

  1. Prueba de la robustez de los parámetros en diferentes instrumentos.

  2. Añadir confirmación de volumen o volatilidad.

  3. Optimizar los puntos de ganancia/pérdida.

  4. Establecimiento del límite máximo tolerable de extracción.

  5. Construcción de modelos dinámicos de dimensionamiento de la posición.

  6. Evaluación del efecto de la introducción del aprendizaje automático.

  7. Supervisión de la absorción máxima y la suavidad de la curva.

  8. Iteraciones continuas para evitar el sobreajuste.

Conclusión

El enfoque multi-MA configurable constituye un mecanismo robusto de mantenimiento de posiciones, pero la prevención del sobreajuste y las adaptaciones dinámicas a los mercados cambiantes son fundamentales para la longevidad de cualquier estrategia.


/*backtest
start: 2022-09-16 00:00:00
end: 2023-09-22 00:00:00
period: 1d
basePeriod: 1h
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/
// © levieux

//@version=5
strategy(title='Configurable Multi MA Crossover Voting System', shorttitle='Configurable Multi MA Crossover Voting System', initial_capital=1000, overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)
crossoverConfig= input.string(defval="2x4,3x5,4x6", title="Crossover Config")
source= input.source(high)
maType= input.string("WMA", title="Moving Average Type", options=["WMA","SMA","VWMA"])
atrPeriod= input(14, title="ATR Period")
profitAtr = input(10, title="Profit ATR x")
lossAtr = input(5, title="Loss ATR x")


ma(src,length,type) => 
    float ma = switch type
	    "SMA" => ta.sma(src, length)
	    "WMA" => ta.wma(src, length)
	    "VWMA" => ta.vwma(src, length)

crossoverGroups= str.split(crossoverConfig, ",")
crossoverCount= array.size(crossoverGroups)
crossovers= array.new_string(crossoverCount)
positions= array.new_int(crossoverCount, 0)
longVotes= 0
for i= 0 to crossoverCount-1
    crossover= str.tostring(array.get(crossoverGroups, i))
    crossoverBoundaries= str.split(crossover, "x")
    int fastLength= math.round(str.tonumber(array.get(crossoverBoundaries, 0)))
    int slowLength= math.round(str.tonumber(array.get(crossoverBoundaries, 1)))
    wmaFast= ma(source,fastLength,maType)
    wmaSlow= ma(source,slowLength,maType)
    if wmaFast>wmaSlow
        longVotes:= longVotes + 1
        array.set(positions, i, 1)

longCondition= longVotes==crossoverCount and strategy.position_size==0


//profitTicks = profitAtr*ta.atr(atrPeriod)/syminfo.mintick
//lossTicks = lossAtr*ta.atr(atrPeriod)/syminfo.mintick
profitPrice= close+profitAtr*ta.atr(atrPeriod)
lossPrice= close-lossAtr*ta.atr(atrPeriod)

if strategy.position_size>0
    profitPrice:= profitPrice[1]
    lossPrice:= lossPrice[1]

plot(profitPrice, color=color.green)
plot(lossPrice, color=color.red)

if longCondition and profitPrice>0
    strategy.entry("Long", strategy.long)

if longVotes<crossoverCount and strategy.position_size>0 and (high>profitPrice or low<lossPrice)
    strategy.close("Long")
    
longVotes:= 0

Más.