Ehlers Instantaneous Trendline Strategie

Schriftsteller:ChaoZhang, Datum: 2023-12-20 16:51:05
Tags:

img

Übersicht

Die Ehlers Instantaneous Trendline Strategie wurde von John Ehlers in seinem Buch Cybernetic Analysis for Stocks and Futures vorgeschlagen.

Strategie Logik

Der Kern dieser Strategie ist die Berechnung der Instantaneous Trendline (IT).

it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]

wo src der Preis ist, a ein Glättungsfaktor, Standard 0.07 Diese Formel ist ein zweiter Filter, der den Preis glätten und Trends generieren kann.

Ein weiterer wichtiger Indikator ist die Verzögerungslinie, berechnet durch:

lag = 2.0 * it - nz(it[2])

Wenn der Preis über die Verzögerungslinie geht, signalisiert er einen Aufbruch, gehen Sie lang.

Darüber hinaus legt die Strategie Stop-Loss-Orders zur Risikokontrolle fest.

Analyse der Vorteile

Zu den Vorteilen dieser Strategie gehören:

  1. Die IT-Leitung filtert Geräusche effektiv und verbessert die Signalqualität
  2. Der Filter der zweiten Ordnung bietet mehr Flexibilität und Robustheit
  3. Die Verzögerungslinie vermeidet unnötige Whipsaws innerhalb der Trends
  4. Einbezogene Stop-Loss-Kontrollen für Risiken auf vordefinierten Ebenen
  5. Saubere Codestruktur, leicht zu verstehen und zu ändern

Risikoanalyse

Diese Strategie birgt auch einige Risiken:

  1. Eine unsachgemäße Parameter-Abstimmung der IT/Verzögerungslinie kann falsche Signale erzeugen.
  2. Eine schlechte Stop-Loss-Konfiguration könnte zu einem vorzeitigen Stop-Out oder zu einem übergroßen Verlust führen
  3. Hohe Handelsfrequenz führt zu kumulierten Provisionsgebühren
  4. Lange Haltezeiten erhöhen das Verlustvergrößerungsrisiko

Diese Risiken können durch folgende Maßnahmen verringert werden:

  1. Anwendung von maschinellem Lernen für die Optimierung von Parametern
  2. Anpassbare Stop-Loss-Niveaus festlegen
  3. Verringerung der Positionsgröße durch geringere Handelsfrequenzen
  4. Vermögenswerte, für die die Risikopositionen gemäß Artikel 429 Absatz 2 der CRR gelten

Optimierungsrichtlinien

Diese Strategie kann in folgenden Bereichen weiter optimiert werden:

  1. Prüfungseffekte verschiedener Filterparameter zur Bestimmung des optimalen
  2. Versuchen Sie, andere Indikatoren zu kombinieren, um Signale zu filtern.
  3. Verbesserung der Eintrittslogik, um während der Trendbeschleunigungsphasen die Größe zu erhöhen
  4. Anpassbare Stop-Loss-Einstellungen basierend auf der Marktvolatilität
  5. Durchführung von Zeitreihenanalysen zu Handelssitzungen und -häufigkeit

Schlussfolgerung

Insgesamt nutzt die Ehlers Instantaneous Trendline-Strategie technische Indikatoren, um Echtzeittrends in Aktien/Futures und offene Positionen zu identifizieren, wenn sich Trends umkehren. Sie hat die Vorteile einer effektiven Geräuschfilterung, hoher Parameter-Tuningfähigkeit, klarer Signalgenerationslogik und integrierter Risikokontrolle. Mit weiterer Optimierung der Parameterwahl, Signalfilterung, Positionsgröße und Stop-Loss-Tuning kann diese Strategie noch bessere Leistung erzielen. Die klare Codestruktur macht es auch einfach zu verstehen und zu ändern.


/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
    it := (src + 2 * src[1] + src[2]) / 4.0
else
    it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])

diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

strategy.cancel_all()
reverseTrade = false
if stopType == "market-order" 
    if  strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) 
        strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
        reverseTrade := true
    if  strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) 
        strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
        reverseTrade := true
    
if lag > it and not reverseTrade
    price = LongPrice(max(close - (high - low) * rngFrac, low))
    if strategy.position_size <= 0
        strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
    price = ShortPrice(min(close - (high - low) * rngFrac, high))
    if strategy.position_size >= 0
        strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))


itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red,  transp=70)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Mehr