Esta es una estrategia de seguimiento de tendencias adaptativa que combina los indicadores de volatilidad y Williams Percent Range. La estrategia ajusta la sensibilidad de determinación de tendencias mediante el cálculo de rango de precios y contadores personalizados, logrando una mejor adaptabilidad en diferentes condiciones de mercado. El mecanismo central consiste en ajustar dinámicamente los parámetros del indicador de Williams basados en la volatilidad de precios para capturar con mayor precisión los puntos de transición de tendencias del mercado.
La estrategia comienza calculando el rango de precios y su promedio móvil (AvgRange) dentro de un período. Al comparar los cambios de precios en tiempo real con el rango de volatilidad promedio, se establecen dos contadores (TrueCount y TrueCount2) para registrar la frecuencia de volatilidad significativa. Estos contadores se utilizan para ajustar dinámicamente los parámetros de cálculo del indicador de Williams, lo que permite a la estrategia adaptar automáticamente su sensibilidad en función de las condiciones de volatilidad del mercado.
Esta estrategia innovadora combina análisis de volatilidad y seguimiento de tendencias, mejorando la estabilidad y fiabilidad de la estrategia a través de mecanismos adaptativos.
/*backtest start: 2024-10-28 00:00:00 end: 2024-11-27 00:00:00 period: 1h basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("ASCTrend", shorttitle="ASCTrend", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100) eternalfg = input(false, title="eternal 確定") eternal = eternalfg ? 1 : 0 ASClength = input.int(title="ASC Length", minval=4, defval=10) RISK = input.int(title="RISK", minval=0, defval=3) // Custom sum function customSum(source, length) => sum = 0.0 for i = 0 to length - 1 sum := sum + source[i] sum x1 = 67 + RISK x2 = 33 - RISK Range = ta.highest(ASClength) - ta.lowest(ASClength) AvgRange = ta.sma(Range, ASClength) CountFg = math.abs(open - close) >= AvgRange * 2.0 ? 1 : 0 TrueCount = customSum(CountFg, ASClength) CountFg2 = math.abs(close[3] - close) >= AvgRange * 4.6 ? 1 : 0 TrueCount2 = customSum(CountFg2, ASClength - 3) wpr3RR = ta.wpr(3 + RISK + RISK) wpr3 = ta.wpr(3) wpr4 = ta.wpr(4) WprAbs = 100 + (TrueCount2 > 0 ? wpr4 : TrueCount > 0 ? wpr3 : wpr3RR) ASC_Trend = 0 ASC_Trend := WprAbs[eternal] < x2[eternal] ? -1 : WprAbs[eternal] > x1[eternal] ? 1 : ASC_Trend[1] if (ta.crossover(ASC_Trend, 0)) strategy.entry("Long", strategy.long) if (ta.crossunder(ASC_Trend, 0)) strategy.entry("Short", strategy.short) plotshape(ta.crossover(ASC_Trend, 0), location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small, text="B", textcolor=color.white) plotshape(ta.crossunder(ASC_Trend, 0), location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small, text="S", textcolor=color.white) alertcondition(ta.crossover(ASC_Trend, 0), title="ASC_Trend UP", message="ASC_Trend UP") alertcondition(ta.crossunder(ASC_Trend, 0), title="ASC_Trend Down", message="ASC_Trend Down")