La estrategia de negociación de la media móvil gaussiana

El autor:¿ Qué pasa?, Fecha: 2024-01-03 16:06:45
Las etiquetas:

img

Resumen general

Esta estrategia aplica la idea de la distribución gaussiana y calcula la puntuación Z basada en la media móvil exponencial de 10 períodos de los precios de cierre de las velas de Heikin-Ashi.

Estrategia lógica

  1. Calcule el promedio móvil exponencial de 10 períodos de los precios de cierre de las velas Heikin-Ashi.

  2. Basándose en los datos de la media móvil anterior, calcule la puntuación Z durante una ventana de retroceso de 25 períodos.

  3. Tomemos la media móvil exponencial de 20 períodos en el puntaje Z para obtener una curva llamada emaScore.

  4. Establecer umbrales superiores e inferiores basados en la distribución de los datos de emaScore.

  5. Largo cuando emaScore cruza la línea media o el umbral inferior hacia arriba. Corto cuando emaScore cruza el umbral superior, el umbral inferior o el máximo de 100 períodos hacia abajo.

Análisis de ventajas

  1. Aplicar la idea de distribución gaussiana a través de la puntuación Z para juzgar la normalidad y filtrar las fallas.

  2. La media móvil exponencial doble tiene un efecto de filtrado para determinar la tendencia a largo plazo.

  3. El establecimiento de un umbral razonable reduce las probabilidades de que las operaciones sean incorrectas.

  4. Incorporar los puntos más altos/más bajos de 100 períodos ayuda a captar las oportunidades de reversión.

Análisis de riesgos

  1. La combinación de puntuación Z y MAs es sensible a la puesta a punto de parámetros.

  2. Los niveles de umbral adecuados están directamente relacionados con la validez de la estrategia.

  3. Los puntos más altos y más bajos de 100 períodos pueden generar fácilmente señales erróneas.

  4. Heikin-Ashi tiene un poco de retraso.

Direcciones de optimización

  1. Prueba diferentes períodos de promedios móviles, ventanas de retroceso de puntuación Z.

  2. Utiliza el análisis de marcha hacia adelante para optimizar automáticamente los parámetros.

  3. Pruebe diferentes métodos de fijación de umbrales, por ejemplo, múltiplos de ETS.

  4. Mejorar la lógica de los puntos más altos y más bajos para evitar señales erróneas.

  5. Prueba otros tipos de velas o precios típicos para reemplazar a Heikin-Ashi.

Resumen de las actividades

Esta estrategia juzga la anormalidad de los precios y genera señales comerciales basadas en la idea de la distribución gaussiana, las medias móviles exponenciales dobles y el establecimiento de umbrales dinámicos. Las principales ventajas son filtrar las rupturas falsas y detectar reversiones. Sin embargo, existe un gran impacto con respecto a la selección y combinación de parámetros. Se necesitan más pruebas y optimización para encontrar los mejores parámetros y combinaciones.


/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 5m
basePeriod: 1m
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/
// © jensenvilhelm

// Here is an attempt to create a robust strategy for BTCUSD on a 5 minute chart
// I can't seem to get this code to work the way i want.... if you want to give it a try, please let me know -
// how it goes in comment section. 

//@version=5
// Define the strategy settings
strategy("The Z-score", shorttitle="TZS", overlay=true)

// User can set the start date for the strategy
startDate = timestamp("2023 06 01")

// Heikin-Ashi Open, Close, High and Low calculation
haClose = ohlc4
var float haOpen = na
haOpen := na(haOpen[1]) ? (open + close) / 2 : (haOpen[1] + haClose[1]) / 2
haHigh = math.max(nz(haOpen, high), nz(haClose, high), high)
haLow = math.min(nz(haOpen, low), nz(haClose, low), low)

// Function to calculate the Z-Score
z_score(_series, _length) =>
    _mean = ta.sma(_series, _length)
    _stddev = ta.stdev(_series, _length)
    (_series - _mean) / _stddev

// Compute the score and its EMA
score = z_score(ta.ema(haClose, 10), 25)
emaScore = ta.ema(score, 20)

// Calculate lower and upper thresholds using percentiles of EMA
lowerBlue = ta.percentile_linear_interpolation(emaScore, 50, 10)
upperBlue = ta.percentile_linear_interpolation(emaScore, 50, 90)

// Calculate the middle line as 50th percentile
middleLine = ta.percentile_linear_interpolation(emaScore, 50, 50) 

// Plot the EMA of the score and the thresholds
plot(emaScore,"The White Line", color=color.white, linewidth=2)
plot(lowerBlue,"Lower Blue Line", linewidth=2)
plot(upperBlue, "Upper Blue Line", linewidth=2)
plot(middleLine, "Middle Yellow Line", linewidth=2, color=color.yellow)
plot(score,"The Z-Score Mixed With EMA 10", color=color.green)

// Calculate highest and lowest EMA score over 100 bars period
highest = ta.highest(emaScore, 100)
lowest = ta.lowest(emaScore, 100)

// Plot highest and lowest EMA score lines 
plot(highest, "Highest of emaScore", color=color.red, linewidth=2)
plot(lowest, "Lowest of emaScore", color=color.red, linewidth=2)

// Define entry and exit conditions for long and short positions
longCon = ta.crossover(score, lowerBlue) or ta.crossover(emaScore, middleLine)
addOn = ta.crossover(score, highest)
shortCon = ta.crossunder(emaScore, upperBlue) or ta.crossunder(emaScore, lowerBlue) or ta.crossunder(emaScore, highest)

// Execute trading logic based on conditions and after the start date
if (time >= startDate)
    if longCon
        strategy.entry("Long", strategy.long)
        if shortCon
            strategy.close("Long")
    if addOn
        strategy.entry("LongNR2", strategy.long)
        if shortCon
            strategy.close("LongNR2")
    
    if shortCon
        strategy.entry("Short", strategy.short)
        if longCon
            strategy.close("Short")


Más.