Automatische Trendverfolgungsstrategie auf Basis von T3 und ATR

Schriftsteller:ChaoZhang, Datum: 2024-01-03 11:58:25
Tags:

img

Übersicht

Der Kern dieser Strategie besteht darin, den Indikator T3 Smoothed Moving Average und den Indikator ATR Dynamic Stop Loss zu verwenden, um die Trendrichtung zu identifizieren und Trends zu verfolgen.

Strategie Logik

Die Strategie verwendet den T3-Indikator, um den glatten gleitenden Durchschnitt der Preise zu berechnen, und verwendet den ATR-Indikator, um den durchschnittlichen wahren Bereich des aktuellen Zyklus zu berechnen. Handelssignale werden generiert, wenn die Preise den ATR-dynamischen Stop-Loss durchbrechen. Insbesondere wird ein Kaufsignal generiert, wenn die Preise über die ATR-Stop-Loss-Linie brechen, und ein Verkaufssignal generiert, wenn die Preise unter die ATR-Stop-Loss-Linie brechen.

Um falsche Signale zu filtern, erfordert die Strategie zusätzlich, dass die Preise vor der Bestätigung des Signals auch den gleitenden Durchschnitt T3 durchbrechen müssen.

Analyse der Vorteile

Im Vergleich zu herkömmlichen gleitenden Durchschnitten hat der T3-Indikator eine höhere Empfindlichkeit und weniger Verzögerung, wodurch Änderungen der Kursentwicklung schneller erfasst werden können.

Der ATR-Wert spiegelt die aktuelle Volatilität und das Risikoniveau des Marktes wider. ATR-dynamische Tracking-Stopps und -Gewinne können die Positionsgrößen dynamisch anpassen, um größere Gewinne in Trendmärkten zu erzielen und Verluste in volatilen Märkten zu reduzieren.

Risikoanalyse

Die Strategie beruht auf Indikatorberechnungen und Risiken, die von einem Arbitrage abhängen. Darüber hinaus haben T3-glättete gleitende Durchschnitte und ATR-dynamische Stopps Verzögerungsprobleme, die Möglichkeiten für schnelle Preisumkehrungen verpassen können. Parameter können entsprechend angepasst oder mit anderen Indikatoren zur Optimierung kombiniert werden.

Wenn der Trend schwankt und umkehrt, können Stop-Losses gebrochen werden, was zu größeren Verlusten führt.

Optimierungsrichtlinien

  • T3-Indikatorparameter anpassen, um die Empfindlichkeit zu optimieren.

  • Versuche verschiedene ATR-Zyklusparameter, um optimale Werte zu finden.

  • Versuchen Sie verschiedene Risiko-Lohn-Verhältnisse, um die besten Parameter zu bestimmen.

  • Hinzufügen anderer Indikatoren zu Filtersignalen, wie z. B. Geldflussindex.

  • Verwenden Sie maschinelle Lernmethoden, um Parameterkombinationen automatisch zu optimieren.

Zusammenfassung

Diese Strategie integriert die Trend-Tracking-Fähigkeit des T3 Gleitenden gleitenden Durchschnitts und die dynamische Stop-Loss-Anpassungsfähigkeit des ATR. Mit der richtigen Parameteroptimierung und Risikokontrolle verspricht sie gute Renditen. Die Strategie berücksichtigt sowohl Trend-Tracking als auch Umkehrmöglichkeiten und ist damit eine vielseitige quantitative Handelsstrategie.


/*backtest
start: 2023-12-26 00:00:00
end: 2024-01-02 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='NinjaView Example 1 (UTBA "QuantNomad" Strategy)', overlay=true)
T3 = input(100)//600
// Input for Long Settings
// Input for Long Settings


xPrice3 = close
xe1 = ta.ema(xPrice3, T3)
xe2 = ta.ema(xe1, T3)
xe3 = ta.ema(xe2, T3)
xe4 = ta.ema(xe3, T3)
xe5 = ta.ema(xe4, T3)
xe6 = ta.ema(xe5, T3)

b3 = 0.7
c1 = -b3*b3*b3
c2 = 3*b3*b3+3*b3*b3*b3
c3 = -6*b3*b3-3*b3-3*b3*b3*b3
c4 = 1+3*b3+b3*b3*b3+3*b3*b3
nT3Average = c1 * xe6 + c2 * xe5 + c3 * xe4 + c4 * xe3

//plot(nT3Average, color=color.white, title="T3")

// Buy Signal - Price is below T3 Average
buySignal3 = xPrice3 < nT3Average
sellSignal3 = xPrice3 > nT3Average
// Inputs
a = input(1, title='Key Value. "This changes the sensitivity"')
c = input(50, title='ATR Period')
h = input(true, title='Signals from Heikin Ashi Candles')
riskRewardRatio = input(1, title='Risk Reward Ratio')

xATR = ta.atr(c)
nLoss = a * xATR

src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, close, lookahead=barmerge.lookahead_off) : close

xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3

xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue

ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossunder(ema, xATRTrailingStop)

buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below

barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop

plotshape(buy, title='Buy', text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.new(color.white, 0), size=size.tiny)
plotshape(sell, title='Sell', text='Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.new(color.white, 0), size=size.tiny)

barcolor(barbuy ? color.new(color.green, 90) : na)
barcolor(barsell ? color.new(color.red, 90) : na)

var float entryPrice = na
var float takeProfitLong = na
var float stopLossLong = na
var float takeProfitShort = na
var float stopLossShort = na

if buy and buySignal3
    entryPrice := src
    takeProfitLong := entryPrice + nLoss * riskRewardRatio
    stopLossLong := entryPrice - nLoss
    takeProfitShort := na
    stopLossShort := na

if sell and sellSignal3
    entryPrice := src
    takeProfitShort := entryPrice - nLoss * riskRewardRatio
    stopLossShort := entryPrice + nLoss
    takeProfitLong := na
    stopLossLong := na

// Strategy order conditions
acct = "Sim101"
ticker = "ES 12-23"
qty = 1

OCOMarketLong = '{ "alert": "OCO Market Long", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '", "qty": "' + str.tostring(qty) + '", "take_profit_price": "' + str.tostring(takeProfitLong) + '", "stop_price": "' + str.tostring(stopLossLong) + '", "tif": "DAY" }'
OCOMarketShort = '{ "alert": "OCO Market Short", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '", "qty": "' + str.tostring(qty) + '", "take_profit_price": "' + str.tostring(takeProfitShort) + '", "stop_price": "' + str.tostring(stopLossShort) + '", "tif": "DAY" }'
CloseAll = '{ "alert": "Close All", "account": "' + str.tostring(acct) + '", "ticker": "' + str.tostring(ticker) + '" }'

strategy.entry("Long", strategy.long, when=buy and buySignal3, alert_message=OCOMarketLong)
strategy.entry("Short", strategy.short, when=sell and sellSignal3, alert_message=OCOMarketShort)

// Setting the take profit and stop loss for long trades
strategy.exit("Take Profit/Stop Loss", "Long", stop=stopLossLong, limit=takeProfitLong,alert_message=CloseAll)

// Setting the take profit and stop loss for short trades
strategy.exit("Take Profit/Stop Loss", "Short", stop=stopLossShort, limit=takeProfitShort,alert_message=CloseAll)

// Plot trade setup boxes
bgcolor(buy ? color.new(color.green, 90) : na, transp=0, offset=-1)
bgcolor(sell ? color.new(color.red, 90) : na, transp=0, offset=-1)

// longCondition = buy and not na(entryPrice)
// shortCondition = sell and not na(entryPrice)

// var line longTakeProfitLine = na
// var line longStopLossLine = na
// var line shortTakeProfitLine = na
// var line shortStopLossLine = na

// if longCondition
//     longTakeProfitLine := line.new(bar_index, takeProfitLong, bar_index + 1, takeProfitLong, color=color.green, width=2)
//     longStopLossLine := line.new(bar_index, stopLossLong, bar_index + 1, stopLossLong, color=color.red, width=2)
//     label.new(bar_index + 1, takeProfitLong, str.tostring(takeProfitLong, "#.#####"), color=color.green, style=label.style_none, textcolor=color.green, size=size.tiny)
//     label.new(bar_index + 1, stopLossLong, str.tostring(stopLossLong, "#.#####"), color=color.red, style=label.style_none, textcolor=color.red, size=size.tiny)

// if shortCondition
//     shortTakeProfitLine := line.new(bar_index, takeProfitShort, bar_index + 1, takeProfitShort, color=color.green, width=2)
//     shortStopLossLine := line.new(bar_index, stopLossShort, bar_index + 1, stopLossShort, color=color.red, width=2)
//     label.new(bar_index + 1, takeProfitShort, str.tostring(takeProfitShort, "#.#####"), color=color.green, style=label.style_none, textcolor=color.green, size=size.tiny)
//     label.new(bar_index + 1, stopLossShort, str.tostring(stopLossShort, "#.#####"), color=color.red, style=label.style_none, textcolor=color.red, size=size.tiny)

alertcondition(buy, 'UT Long', 'UT Long')
alertcondition(sell, 'UT Short', 'UT Short')


Mehr