Estrategia cuantitativa: Seguimiento de tendencias de fortaleza y debilidad de medias móviles


Fecha de creación: 2024-01-19 16:50:13 Última modificación: 2024-01-19 16:50:13
Copiar: 3 Número de Visitas: 609
1
Seguir
1617
Seguidores

Estrategia cuantitativa: Seguimiento de tendencias de fortaleza y debilidad de medias móviles

Descripción general

La estrategia evalúa la fortaleza y la debilidad de la tendencia del mercado mediante el cálculo de las medias móviles (MA) de varios períodos de tiempo. La estrategia determina y sigue la tendencia. Cuando el indicador de la MA corta se eleva continuamente, se registra un alto puntaje y se forma un indicador de la curva de la fuerza de la MA. Cuando el indicador supera su propia MA de largo plazo, se genera una señal de compra.

Principio de estrategia

  1. Calcula el MA de 5 días, 10 días, 20 días, etc., para determinar si el precio ha roto cada MA hacia arriba, ha roto el punto de marca, y ha integrado la curva de la fuerza de la curva de la MA.
  2. Aplica una media móvil a la intensidad de la curva MA, forma un indicador de la línea media, determina que la línea media está vacía y genera una señal de negociación.
  3. Se pueden configurar los parámetros de seguimiento del ciclo: el número de grupos de MA a corto plazo, el ciclo de la línea media a largo plazo, las condiciones de apertura de la posición, etc.

La estrategia determina principalmente la amplitud de la mediana, y la intensidad media de la línea de reacción de la mediana. La línea de la mediana determina la dirección y la intensidad de la tendencia, y la mediana determina la continuidad.

Análisis de las ventajas

  1. Modelo multidimensional para evaluar la fuerza de la tendencia. Una sola línea MA no puede determinar la fuerza suficiente; la estrategia mide múltiples rupturas de MA y emite una señal de alta fiabilidad después de asegurar la fuerza suficiente.
  2. Se puede configurar el ciclo de seguimiento. Se pueden ajustar los parámetros de la MA a corto plazo para capturar diferentes niveles de tendencia. Se pueden ajustar los parámetros de la MA a largo plazo para controlar el ritmo de salida.
  3. Solo hacer más puede evitar errores y seguir una tendencia ascendente a largo plazo. La estrategia solo hacer más, solo seguir el ritmo y no seguir el ritmo, puede reducir la pérdida de inversión.

Análisis de riesgos

  1. Existe el riesgo de retroceso. Existe un mayor riesgo de retroceso cuando la línea corta atraviesa la línea media de la línea media de la línea larga. Se puede reducir la pérdida individual mediante el stop loss.
  2. Existen riesgos de reversión. La operación del mercado a largo plazo requiere ajustes, y la estrategia debe detener la salida a tiempo. Se recomienda combinar técnicas como bandas de onda y canales para determinar el final del ciclo y controlar el riesgo de reversión.
  3. Riesgo de los parámetros. La configuración incorrecta de los parámetros puede dar una señal errónea. Los parámetros deben ajustarse para adaptarse a las diferentes variedades y garantizar la estabilidad de los parámetros.

Dirección de optimización

  1. Combinando más indicadores de filtración de entrada, se puede considerar la combinación de volumen de tráfico, la emisión de señales bajo la verificación de la cantidad, para evitar falsas rupturas.
  2. La opción de incrementar el stop loss. El stop loss móvil, el stop loss de curva puede reducir la pérdida en el ajuste. También se puede considerar el stop loss, para bloquear las ganancias y evitar la reversión.
  3. Considere la configuración de las variedades de futuros y divisas. La línea de MA se rompe para las variedades de tendencia. Se puede evaluar la estabilidad de los parámetros de las diferentes variedades de futuros y elegir la mejor variedad.

Resumir

La estrategia determina la tendencia de los precios mediante el cálculo de la intensidad de la MA y el seguimiento de la tendencia con el cruce de la línea media como fuente de señal. La ventaja de la estrategia es la precisión en la determinación de la intensidad de la tendencia, la mayor fiabilidad. El principal riesgo reside en la inversión de la tendencia y el ajuste de los parámetros.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-19 00:00:00
end: 2024-01-18 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("MA Strength Strategy", overlay=false, initial_capital = 20000, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, commission_type = strategy.commission.percent, pyramiding = 1, commission_value = 0.01)
MAType = input(title="Moving Average Type", defval="ema", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
LookbackPeriod = input(10, step=10)

IndexMAType = input(title="Moving Average Type", defval="hma", options=["ema", "sma", "hma", "rma", "vwma", "wma"])
IndexMAPeriod = input(200, step=10)

considerTrendDirection = input(true)
considerTrendDirectionForExit = input(true)
offset = input(1, step=1)
tradeDirection = input(title="Trade Direction", defval=strategy.direction.long, options=[strategy.direction.all, strategy.direction.long, strategy.direction.short])
i_startTime = input(defval = timestamp("01 Jan 2010 00:00 +0000"), title = "Start Time", type = input.time)
i_endTime = input(defval = timestamp("01 Jan 2099 00:00 +0000"), title = "End Time", type = input.time)
inDateRange = 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_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.0
    upwardScore := close > ma5? upwardScore+1.10:upwardScore
    upwardScore := ma5 > ma10? upwardScore+1.10:upwardScore
    upwardScore := ma10 > ma20? upwardScore+1.10:upwardScore
    upwardScore := ma20 > ma30? upwardScore+1.10:upwardScore
    upwardScore := ma30 > ma50? upwardScore+1.15:upwardScore
    upwardScore := ma50 > ma100? upwardScore+1.20:upwardScore
    upwardScore := ma100 > ma200? upwardScore+1.25: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
    trendStrength = upwards?1:downwards?-1:includePartiallyAligned ? (upwardScore > 6? 0.5: upwardScore < 2?-0.5:upwardScore>4?0.25:-0.25) : 0
    [trendStrength, upwardScore]
    
includePartiallyAligned = true
[trendStrength, upwardScore] = f_getMaAlignment(MAType, includePartiallyAligned)

upwardSum = sum(upwardScore, LookbackPeriod)

indexSma = f_getMovingAverage(upwardSum,IndexMAType,IndexMAPeriod)

plot(upwardSum, title="Moving Average Strength", color=color.green, linewidth=2, style=plot.style_linebr)
plot(indexSma, title="Strength MA", color=color.red, linewidth=1, style=plot.style_linebr)
buyCondition = crossover(upwardSum,indexSma) and (upwardSum > upwardSum[offset] or not considerTrendDirection) 
sellCondition = crossunder(upwardSum,indexSma) and (upwardSum < upwardSum[offset]  or not considerTrendDirection)

exitBuyCondition = crossunder(upwardSum,indexSma)
exitSellCondition = crossover(upwardSum,indexSma) 
strategy.risk.allow_entry_in(tradeDirection)
strategy.entry("Buy", strategy.long, when= inDateRange and buyCondition, oca_name="oca_buy")
strategy.close("Buy", when = considerTrendDirectionForExit? sellCondition : exitBuyCondition)
strategy.entry("Sell", strategy.short, when= inDateRange and sellCondition, oca_name="oca_sell")
strategy.close( "Sell", when = considerTrendDirectionForExit? buyCondition : exitSellCondition)