Es handelt sich um eine anpassungsfähige Trendfolgestrategie, die Volatilitäts- und Williams-Prozent-Range-Indikatoren kombiniert. Die Strategie passt die Tendenzbestimmungsempfindlichkeit an, indem Preisbereiche und benutzerdefinierte Zähler berechnet werden, um eine bessere Anpassungsfähigkeit unter verschiedenen Marktbedingungen zu erreichen. Der Kernmechanismus beinhaltet die dynamische Anpassung der Williams-Indikatorparameter basierend auf der Preisvolatilität, um Markttrend-Übergangspunkte genauer zu erfassen.
Die Strategie beginnt mit der Berechnung der Preisspanne und des gleitenden Durchschnitts (AvgRange) innerhalb eines Zeitraums. Durch den Vergleich von Echtzeitpreisänderungen mit dem durchschnittlichen Volatilitätsbereich werden zwei Zähler (TrueCount und TrueCount2) zur Erfassung der signifikanten Volatilitätsfrequenz eingesetzt. Diese Zähler werden verwendet, um die Berechnungsparameter des Williams-Indikators dynamisch anzupassen, so dass die Strategie ihre Empfindlichkeit automatisch an die Bedingungen der Marktvolatilität anpasst. Kauf- oder Verkaufssignale werden generiert, wenn die angepassten Williams-Indikatorwerte vorgegebene Schwellenwerte durchbrechen.
Diese innovative Strategie kombiniert Volatilitätsanalyse und Trendverfolgung und verbessert die Stabilität und Zuverlässigkeit der Strategie durch anpassungsfähige Mechanismen.
/*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")