Estrategia de seguimiento de la inversión de la media móvil doble

El autor:¿ Qué pasa?, Fecha: 2024-02-20 17:08:43
Las etiquetas:

img

Resumen general

La estrategia de seguimiento de la reversión de la media móvil doble es una estrategia de negociación cuantitativa que utiliza cruces de media móvil como señales de negociación. La estrategia combina la diferencia de la media móvil rápida y lenta del indicador MACD y su línea de señal, así como la relación larga / corta de los volúmenes de negociación, para formar señales de negociación y capturar oportunidades de reversión del mercado.

Estrategia lógica

La estrategia juzga principalmente la relación entre la línea rápida y la línea lenta. Genera una señal de compra cuando la línea rápida cruza por encima de la línea lenta, y una señal de venta cuando la línea rápida cruza por debajo de la línea lenta. Además, también juzga de manera integral el estado largo / corto del mercado basado en el estado largo / corto del valor de la diferencia MACD, la relación entre la diferencia y la línea de señal, la situación larga / corta de los volúmenes de negociación, etc.

Específicamente, la estrategia juzga el tamaño y la dirección del valor de la diferencia MACD, el cruce entre la diferencia y la línea de señal, la dirección consistente o opuesta entre la diferencia y la línea de señal, etc. Estas situaciones reflejan las características de rebote del submercado después de una caída.

Cuando la diferencia y la línea de señal muestran señales de reversión del mercado y los volúmenes de negociación corresponden para confirmar la reversión del mercado, se generarán señales de negociación.

Ventajas

  • Utilizar dos cruces de medias móviles para determinar los puntos de inversión del mercado, base teórica sólida
  • Incorporar el juicio sobre el volumen de operaciones para evitar falsos breakouts
  • El indicador MACD evalúa el sentimiento de la subsección, identifica las características de rebote
  • Alta flexibilidad de los parámetros

Riesgos y soluciones

  • Problemas de la sierra causados por el cruce de la media móvil
    • Ajustar los parámetros de la media móvil, aumentar el umbral
  • Volúmenes de negociación no capaces de filtrar completamente las falsas rupturas
    • Incorporar indicadores secundarios como el OBV para juzgar las tendencias del volumen real de operaciones
  • Incapaz de juzgar la profundidad y la fuerza del ajuste de la subsección
    • Aumentar el stop loss, evaluar las áreas de apoyo importantes

Direcciones de optimización

  • Utilice modelos de aprendizaje automático en lugar de juicios basados en reglas
    • Mejorar la robustez de la estrategia, reducir el sobreajuste
  • Aumentar las técnicas de stop loss y take profit
    • Bloquear ganancias parciales, reducir riesgos
  • Incorporar indicadores de sentimiento, análisis de noticias
    • Mejorar la precisión de los juicios del modelo
  • Puerto a otros productos, mercados
    • Estendibilidad de la estrategia de ensayo

Resumen de las actividades

La estrategia de seguimiento de reversión de promedios móviles dobles considera de manera integral indicadores como promedios móviles, MACD y volúmenes de negociación. Al capturar sus señales de reversión, se seleccionan puntos de reversión apropiados para establecer posiciones. Todavía hay un gran espacio para optimizar esta estrategia, la robustez y la rentabilidad se pueden mejorar aún más con técnicas como el aprendizaje automático y la gestión de riesgos.


/*backtest
start: 2024-01-20 00:00:00
end: 2024-02-19 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("3 10 Oscillator Profile Flagging", shorttitle="3 10 Oscillator Profile Flagging", overlay=true)

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.8)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=10)

fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)

buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
//plot(macdSlope, color=color.red, title="Total Volume")
//plot(signalSlope, color=color.green, title="Total Volume")
intrabarRange = high - low

getLookBackSlope(lookBack) => signal - signal[lookBack]
getBuyerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if buyVolume[i] > sellVolume[i]
            j += 1
    j

getSellerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if sellVolume[i] > buyVolume[i]
            j += 1
    j

getVolBias(lookBack) =>
    float b = 0
    float s = 0
    for i = 1 to lookBack
        b += buyVolume[i]
        s += sellVolume[i]
    b > s

getSignalBuyerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] > signalBiasValue
            j += 1
    j

getSignalSellerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < ( 0 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 0 - signalBiasValue )
            j += 1
    j

getPriceRising(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] > close[i + 1]
            j += 1
    j


getPriceFalling(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] < close[i + 1] 
            j += 1
    j

getRangeNarrowing(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] < intrabarRange[i + 1] 
            j+= 1
    j

getRangeBroadening(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] > intrabarRange[i + 1] 
            j+= 1
    j

bool isNegativeSignalReversal = signalSlope < 0 and signalSlope[1] > 0
bool isNegativeMacdReversal = macdSlope < 0 and macdSlope[1] > 0

bool isPositiveSignalReversal = signalSlope > 0 and signalSlope[1] < 0
bool isPositiveMacdReversal = macdSlope > 0 and macdSlope[1] < 0

bool hasBearInversion = signalSlope > 0 and macdSlope < 0
bool hasBullInversion = signalSlope < 0 and macdSlope > 0

bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0 - signalBiasValue )

bool hasSignalBuyerBias = hasSignalBias and signal > 0
bool hasSignalSellerBias = hasSignalBias and signal < 0

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0 - macdBiasValue )

bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)

bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )

// 7.48 Profit 52.5% 
if ( hasSignificantBuyerVolBias and getPriceRising(shortLookBack) == shortLookBack  and getBuyerVolBias(shortLookBack) == shortLookBack and hasPositiveMACDBias and hasBullInversion)
    strategy.entry("Short1", strategy.short)
strategy.exit("TPS", "Short1", limit=strategy.position_avg_price - 0.75, stop=strategy.position_avg_price + 0.5)

// 32.53 Profit 47.91%
if ( getPriceFalling(shortLookBack) and (getVolBias(shortLookBack) == false) and signalSlope < 0 and hasSignalSellerBias)
    strategy.entry("Long1", strategy.long)
strategy.exit("TPS", "Long1", limit=strategy.position_avg_price + 0.75, stop=strategy.position_avg_price - 0.5)

Más.