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.
Calcule el promedio móvil exponencial de 10 períodos de los precios de cierre de las velas Heikin-Ashi.
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.
Tomemos la media móvil exponencial de 20 períodos en el puntaje Z para obtener una curva llamada emaScore.
Establecer umbrales superiores e inferiores basados en la distribución de los datos de emaScore.
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.
Aplicar la idea de distribución gaussiana a través de la puntuación Z para juzgar la normalidad y filtrar las fallas.
La media móvil exponencial doble tiene un efecto de filtrado para determinar la tendencia a largo plazo.
El establecimiento de un umbral razonable reduce las probabilidades de que las operaciones sean incorrectas.
Incorporar los puntos más altos/más bajos de 100 períodos ayuda a captar las oportunidades de reversión.
La combinación de puntuación Z y MAs es sensible a la puesta a punto de parámetros.
Los niveles de umbral adecuados están directamente relacionados con la validez de la estrategia.
Los puntos más altos y más bajos de 100 períodos pueden generar fácilmente señales erróneas.
Heikin-Ashi tiene un poco de retraso.
Prueba diferentes períodos de promedios móviles, ventanas de retroceso de puntuación Z.
Utiliza el análisis de marcha hacia adelante para optimizar automáticamente los parámetros.
Pruebe diferentes métodos de fijación de umbrales, por ejemplo, múltiplos de ETS.
Mejorar la lógica de los puntos más altos y más bajos para evitar señales erróneas.
Prueba otros tipos de velas o precios típicos para reemplazar a Heikin-Ashi.
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")