Diese Strategie ist eine anpassungsfähige Preiskanalstrategie, die auf dem Indikator Average True Range (ATR) und dem Average Directional Index (ADX) basiert.
Berechnen Sie den höchsten Höchstwert (HH) und den niedrigsten Tieftrag (LL) über eine bestimmte Länge. Berechnen Sie auch den ATR über die gleiche Länge.
Berechnen Sie +DI und -DI basierend auf Kursbewegungen nach oben und unten.
Wenn ADX < 25, wird der Markt als seitlich betrachtet. Wenn schließen > oberen Kanal (HH - ATR Multiplikator * ATR), gehen lang. Wenn schließen < unteren Kanal (LL + ATR Multiplikator * ATR), gehen kurz.
Wenn ADX >= 25 und +DI > -DI ist der Markt bullisch.
Wenn ADX >= 25 und +DI < -DI ist der Markt bärisch.
Ausgangsposition nach exit_length-Streifen seit dem Eingang.
Die Strategie passt sich automatisch an die Marktbedingungen an, indem sie die Kanalstrategie im seitlichen Markt und den Trend im Trendmarkt verwendet.
Die Verwendung von ATR und ADX sorgt für Anpassungsfähigkeit. ATR passt die Kanalbreite an, ADX bestimmt den Trend.
Ein gewaltsamer Austritt bringt Stabilität.
ADX kann häufig falsche Signale erzeugen.
Schlechte ATR- und ADX-Parameter führen zu schlechten Leistungen.
Unfähig, sich effektiv vor Schwarzen Schwanen zu schützen.
Optimierung der Parameter für ATR und ADX zur Verbesserung der Anpassungsfähigkeit.
Hinzufügen von Stop Loss, um Verluste zu begrenzen.
Fügen Sie Filter hinzu, um falsche Signale zu vermeiden.
Die Strategie kombiniert Indikatoren und Mechanismen zur Anpassung an die Marktbedingungen, aber aufgrund von Indikatorenbeschränkungen können Fehleinschätzungen auftreten.
/*backtest start: 2023-11-03 00:00:00 end: 2023-12-03 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Adaptive Price Channel Strategy", overlay=true) length = input(20, title="Length") exit_length = input(10, title="Exit After X Periods") atr_multiplier = input(3.2, title="ATR Multiplier") startDate = input(defval = timestamp("2019-01-15T08:15:15+00:00"), title = "Start Date") endDate = input(defval = timestamp("2033-04-01T08:15:00+00:00"), title = "End Date") hh = ta.highest(high, length) ll = ta.lowest(low, length) atr = ta.atr(length) // calculate +DI and -DI upMove = high - high[1] downMove = low[1] - low plusDM = na(upMove[1]) ? na : (upMove > downMove and upMove > 0 ? upMove : 0) minusDM = na(downMove[1]) ? na : (downMove > upMove and downMove > 0 ? downMove : 0) plusDI = ta.rma(plusDM, length) / atr * 100 minusDI = ta.rma(minusDM, length) / atr * 100 // calculate ADX dx = math.abs(plusDI - minusDI) / (plusDI + minusDI) * 100 adx = ta.rma(dx, length) var int barSinceEntry = na if (not na(close[length]) ) if (adx < 25) // Sideways market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 else if (adx >= 25 and plusDI > minusDI) // Bullish market if (close > hh - atr_multiplier * atr) strategy.entry("PChLE", strategy.long, comment="PChLE") barSinceEntry := 0 else if (adx >= 25 and plusDI < minusDI) // Bearish market if (close < ll + atr_multiplier * atr) strategy.entry("PChSE", strategy.short, comment="PChSE") barSinceEntry := 0 if (na(barSinceEntry)) barSinceEntry := barSinceEntry[1] + 1 else if (barSinceEntry >= exit_length) strategy.close("PChLE") strategy.close("PChSE") barSinceEntry := na plot(hh, title="Highest High", color=color.green, linewidth=2) plot(ll, title="Lowest Low", color=color.red, linewidth=2)