Die Ressourcen sind geladen. Beförderung...

Adaptive Preiskanalstrategie

Schriftsteller:ChaoZhang, Datum: 2023-12-04 16:33:45
Tags:

img

Übersicht

Diese Strategie ist eine anpassungsfähige Preiskanalstrategie, die auf dem Indikator Average True Range (ATR) und dem Average Directional Index (ADX) basiert.

Strategie Logik

  1. 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.

  2. Berechnen Sie +DI und -DI basierend auf Kursbewegungen nach oben und unten.

  3. 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.

  4. Wenn ADX >= 25 und +DI > -DI ist der Markt bullisch.

  5. Wenn ADX >= 25 und +DI < -DI ist der Markt bärisch.

  6. Ausgangsposition nach exit_length-Streifen seit dem Eingang.

Analyse der Vorteile

  1. Die Strategie passt sich automatisch an die Marktbedingungen an, indem sie die Kanalstrategie im seitlichen Markt und den Trend im Trendmarkt verwendet.

  2. Die Verwendung von ATR und ADX sorgt für Anpassungsfähigkeit. ATR passt die Kanalbreite an, ADX bestimmt den Trend.

  3. Ein gewaltsamer Austritt bringt Stabilität.

Risikoanalyse

  1. ADX kann häufig falsche Signale erzeugen.

  2. Schlechte ATR- und ADX-Parameter führen zu schlechten Leistungen.

  3. Unfähig, sich effektiv vor Schwarzen Schwanen zu schützen.

Optimierungsrichtlinien

  1. Optimierung der Parameter für ATR und ADX zur Verbesserung der Anpassungsfähigkeit.

  2. Hinzufügen von Stop Loss, um Verluste zu begrenzen.

  3. Fügen Sie Filter hinzu, um falsche Signale zu vermeiden.

Schlussfolgerung

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)



Mehr