Volatilitätsbereinigte Handelsstrategie für gleitenden Durchschnitt

Schriftsteller:ChaoZhang, Datum: 2023-11-07 17:18:05
Tags:

img

Übersicht

Diese Strategie verwendet eine Kombination aus dem gleitenden Durchschnitt T3, dem ATR-Indikator und Heikin Ashi, um Kauf- und Verkaufssignale zu identifizieren, und verwendet den ATR, um Stop-Loss- und Gewinnniveaus für den Trend nach dem Handel zu berechnen.

Grundsätzliche Analyse

Indikatorberechnungen

  • Gleitender Durchschnitt von T3: Berechnet einen glätteten gleitenden Durchschnitt von T3 (Standstillstandszeitraum 100), um die Trendrichtung zu bestimmen

  • ATR: Berechnet den durchschnittlichen tatsächlichen Bereich, der zur Bestimmung der Stop-Loss-/Take-Profit-Größe verwendet wird

  • ATR Trailing Stop: Berechnet einen auf ATR basierenden Stop-Loss, der anhand von Kursbewegung und Volatilität angepasst wird

Handelslogik

  • Kaufsignal: Wird ausgelöst, wenn der Schlusskurs über dem ATR-Trailing-Stop liegt und unter dem gleitenden Durchschnitt T3 liegt

  • Verkaufssignal: Wird ausgelöst, wenn der Schlusskreuz unter dem ATR-Trailing-Stop liegt und über dem gleitenden Durchschnitt T3 liegt

  • Stop-Loss/Take-Profit-Preise: Nach dem Eintritt werden die Stop-Loss- und Take-Profit-Preise auf der Grundlage der ATR und des vom Benutzer definierten Risiko-Rendite-Verhältnisses berechnet.

Einreise und Ausreise

  • Langer Einstieg: Stop-Loss ist der Einstiegspreis minus ATR, Take-Profit ist der Einstiegspreis plus ATR * Risiko/Rendite-Verhältnis

  • Short Entry: Stop-Loss ist der Einstiegspreis plus ATR, Take-Profit ist der Einstiegspreis minus ATR * Risiko-Rendite-Verhältnis

  • Ausgang, wenn der Preis den Stop-Loss- oder Take-Profit-Level erreicht

Analyse der Vorteile

Schnelle Reaktion

Der gleitende Durchschnittswert für die Zahlungsunfähigkeit von T3 beträgt 100, ist empfindlicher als typische gleitende Durchschnittswerte für eine schnellere Reaktion auf Preisänderungen

Risikokontrolle

ATR-Stoppbewegungen mit Marktvolatilität, um nicht ausgeschaltet zu werden.

Nachfolgender Trend

ATR Trailing Stop folgt dem Trend, vermeidet einen vorzeitigen Ausstieg auch bei kurzfristigen Rückschlägen

Optimierung der Parameter

Zeiträume für T3 und ATR können für verschiedene Märkte optimiert werden, um die Robustheit zu verbessern

Risikoanalyse

Stop-Loss-Gleichgewicht

Schwere Kursbewegungen können den Stop-Loss durchdringen und Verluste verursachen.

Trendumkehr

Verluste, die möglich sind, wenn sich der Trend umkehrt und der Kurs den Trailing Stop überschreitet.

Optimierung Überanpassung

Parameteroptimierung birgt Risiken, dass begrenzte historische Daten zu sehr angepasst werden.

Möglichkeiten zur Verbesserung

  • Versuche verschiedene gleitende Durchschnittsperioden von T3, um ein optimales Gleichgewicht zwischen Empfindlichkeit und Stabilität zu finden

  • Optimierung der ATR-Periode, um die beste Risikokontrolle und den Trend nach dem Gleichgewicht zu finden

  • Einbeziehung von RSI, MACD, um falsche Trades an Wendepunkten zu vermeiden

  • Maschinelles Lernen für optimale automatisierte Parameter, die manuelle Verzerrung reduzieren

  • Hinzufügen von Positionsgrößenregeln zur besseren Risikokontrolle

Zusammenfassung

Diese Strategie kombiniert die Vorteile von T3 und ATR, um eine schnelle Reaktion mit Risikokontrolle zu ermöglichen. Weitere Verbesserungen der Stabilität und Effizienz sind durch Parameteroptimierung und zusätzliche Filter möglich.


/*backtest
start: 2022-10-31 00:00:00
end: 2023-11-06 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title='UT Bot Alerts (QuantNomad) Strategy w/ NinjaView', 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 ,alert_message=OCOMarketLong)
strategy.entry("Short", strategy.short, when=sell , 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