Null-Lag-Überlappung gleitender Durchschnitt mit Chandelier-Ausgangshandelsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-01-22 10:03:05
Tags:

img

Übersicht

Die Hauptidee dieser Strategie besteht darin, den ZLSMA-Indikator (Zero Lag Overlapping Moving Average) zu kombinieren, um die Trendrichtung zu beurteilen, und den Chandelier Exit (CE) Indikator, um genauere Ein- und Ausstiegspunkte zu finden.

Strategieprinzip

  1. ZLSMA-Teil

    • Für die Berechnung der LMA-Linien mit jeweils 130 Perioden wird die lineare Regressionsmethode verwendet.
    • Dann überlagern Sie die beiden LMA-Linien, um den Differenzwert zu erhalten, der eq zugewiesen wird.
    • Schließlich konstruieren Sie den ZLSMA mit Null-Lag-Überlappung durch die ursprüngliche LMA-Linie plus die eq-Differenz.
  2. CE-Teil

    • Der ATR-Indikator wird berechnet und mit einem Faktor (Standard 2) multipliziert, um den dynamischen Abstand zum letzten Höchst- oder Tiefpunkt zu bestimmen.
    • Wenn der Schlusskurs die letzte lange oder kurze Stop-Loss-Linie übersteigt, wird die Stop-Loss-Linie entsprechend angepasst.
    • Es wird eine lange oder kurze Richtung anhand der Veränderung des Schlusskurses im Verhältnis zur Stop-Loss-Linie ermittelt.
  3. Eintrittssignal:

    • ZLSMA beurteilt die Trendrichtung, geben Sie ein, wenn CE ein Signal ausgibt.
  4. Ausgangsstoppverlust:

    • Festgelegte Stop Loss- und Take Profit-Positionen.
    • Bei einer Shortposition wird der dynamische Ausstieg von CE als Ersatz für den festen Stop-Loss verwendet.

Analyse der Vorteile

  1. ZLSMA kann einen Trend früher erkennen, um einen falschen Ausbruch zu vermeiden.
  2. CE kann die Ausgangspunkte flexibel an die Marktvolatilität anpassen.
  3. Anpassungsfähige Risiko-Rendite-Ratio der Strategie.
  4. Unterschiedliche Methoden des Stop-Loss und des Take-Profits für Long- und Short-Positionen zur Risikokontrolle.

Risikoanalyse

  1. Die falsche Einstellung der Parameter kann die Verlustrate erhöhen oder den Stoppverlustbereich erweitern.
  2. Es besteht immer noch die Gefahr, dass der Stop-Loss bei einer schnellen Umkehr des Marktes gebrochen wird.

Optimierungsrichtlinien

  1. Die Parameter können für verschiedene Märkte und Zeitrahmen optimiert werden.
  2. Es sollte in Betracht gezogen werden, die Gewinn-/Stoppparameter anhand von Volatilität oder spezifischen Zyklen anzupassen.
  3. Versuchen Sie, sie mit anderen Indikatoren oder Modellen zu kombinieren, um die Gewinnrate zu verbessern.

Zusammenfassung

Die Strategie verwendet hauptsächlich den Null-Lag-Überschneidungs-Bewegungsdurchschnitt, um die Trendrichtung zu bestimmen, kombiniert mit dem Chandelier Exit-Indikator, um präzisere Ein- und Ausstiegspunkte zu finden. Die Vorteile liegen in der anpassbaren Stop/Profit-Ratio und der dynamischen Anpassung von Chandelier Exit kann Risiken entsprechend den Marktbedingungen kontrollieren. Die nächsten Schritte könnten Parameteroptimierung und Strategiekombination sein, um die Stabilität und Rentabilität weiter zu verbessern.


/*backtest
start: 2024-01-14 00:00:00
end: 2024-01-21 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © GGkurg

//@version=5

strategy(title = "ZLSMA + Chandelier Exit", shorttitle="ZLSMA + CE", overlay=true)


var GRP1 = "take profit / stop loss"
TP = input(title='long TP%', defval=2.0,   inline = "1", group = GRP1) 
SL = input(title='long SL%', defval=2.0,    inline = "1", group = GRP1) 
TP2 = input(title='short TP', defval=2.0,    inline = "2", group = GRP1) 
SL2 = input(title='short SL', defval=2.0,    inline = "2", group = GRP1) 
//-------------------------------------------------calculations
takeProfitPrice = strategy.position_avg_price * (1+(TP/100))
stopLossPrice = strategy.position_avg_price * (1-(SL/100))
takeProfitPrice2 = strategy.position_avg_price * (1-(TP2/100))
stopLossPrice2 = strategy.position_avg_price * (1+(SL2/100))


//---------------------------------------ZLSMA - Zero Lag LSMA
var GRP2 = "ZLSMA settings"
length1 = input(title='Length', defval=130, inline = "1", group = GRP2) 
offset1 = input(title='Offset', defval=0, inline = "2", group = GRP2) 
src = input(close, title='Source', inline = "3", group = GRP2) 
lsma = ta.linreg(src, length1, offset1)
lsma2 = ta.linreg(lsma, length1, offset1)
eq = lsma - lsma2
zlsma = lsma + eq

plot(zlsma, color=color.new(color.yellow, 0), linewidth=3)


//---------------------------------------ZLSMA conditisions 
//---------long
longc1 = close > zlsma
longclose1 = close < zlsma
//---------short
shortc1 = close < zlsma
shortclose1 = close > zlsma


//---------------------------------------Chandelier Exit
var string calcGroup = 'Chandelier exit settings'
length = input.int(title='ATR Period', defval=1, group=calcGroup)
mult = input.float(title='ATR Multiplier', step=0.1, defval=2.0, group=calcGroup)
useClose = input.bool(title='Use Close Price for Extremums', defval=true, group=calcGroup)

var string visualGroup = 'Visuals'
showLabels = input.bool(title='Show Buy/Sell Labels', defval=true, group=visualGroup)
highlightState = input.bool(title='Highlight State', defval=true, group=visualGroup)

var string alertGroup = 'Alerts'
awaitBarConfirmation = input.bool(title="Await Bar Confirmation", defval=true, group=alertGroup)

atr = mult * ta.atr(length)

longStop = (useClose ? ta.highest(close, length) : ta.highest(length)) - atr
longStopPrev = nz(longStop[1], longStop)
longStop := close[1] > longStopPrev ? math.max(longStop, longStopPrev) : longStop

shortStop = (useClose ? ta.lowest(close, length) : ta.lowest(length)) + atr
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := close[1] < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop

var int dir = 1
dir := close > shortStopPrev ? 1 : close < longStopPrev ? -1 : dir

var color longColor = color.green
var color shortColor = color.red
var color longFillColor = color.new(color.green, 90)
var color shortFillColor = color.new(color.red, 90)
var color textColor = color.new(color.white, 0)

longStopPlot = plot(dir == 1 ? longStop : na, title='Long Stop', style=plot.style_linebr, linewidth=2, color=color.new(longColor, 0))
buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal ? longStop : na, title='Long Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(longColor, 0))
plotshape(buySignal and showLabels ? longStop : na, title='Buy Label', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(longColor, 0), textcolor=textColor)

shortStopPlot = plot(dir == 1 ? na : shortStop, title='Short Stop', style=plot.style_linebr, linewidth=2, color=color.new(shortColor, 0))
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal ? shortStop : na, title='Short Stop Start', location=location.absolute, style=shape.circle, size=size.tiny, color=color.new(shortColor, 0))
plotshape(sellSignal and showLabels ? shortStop : na, title='Sell Label', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(shortColor, 0), textcolor=textColor)

midPricePlot = plot(ohlc4, title='', style=plot.style_circles, linewidth=0, display=display.none, editable=false)

longStateFillColor = highlightState ? dir == 1 ? longFillColor : na : na
shortStateFillColor = highlightState ? dir == -1 ? shortFillColor : na : na
fill(midPricePlot, longStopPlot, title='Long State Filling', color=longStateFillColor)
fill(midPricePlot, shortStopPlot, title='Short State Filling', color=shortStateFillColor)

await = awaitBarConfirmation ? barstate.isconfirmed : true
alertcondition(dir != dir[1] and await, title='Alert: CE Direction Change', message='Chandelier Exit has changed direction!')
alertcondition(buySignal and await, title='Alert: CE Buy', message='Chandelier Exit Buy!')
alertcondition(sellSignal and await, title='Alert: CE Sell', message='Chandelier Exit Sell!')




//---------------------------------------Chandelier Exit conditisions 
//---------long
longc2 = buySignal
longclose2 = sellSignal
//---------short
shortc2 = sellSignal
shortclose2 = buySignal



//---------------------------------------Long entry and exit
if longc1 and longc2 
    strategy.entry("long", strategy.long)

if strategy.position_avg_price > 0
    strategy.exit("close long", "long", limit = takeProfitPrice, stop = stopLossPrice, alert_message = "close all orders")

if longclose1 and longclose2 and strategy.opentrades == 1
    strategy.close("long","ema long cross", alert_message = "close all orders")


//---------------------------------------Short entry and exit
if shortc1 and shortc2 
    strategy.entry("short", strategy.short)

if strategy.position_avg_price > 0
    strategy.exit("close short", "short", limit = takeProfitPrice2, stop = stopLossPrice2, alert_message = "close all orders")

if shortclose1 and shortclose2 and strategy.opentrades == 1
    strategy.close("close short","short", alert_message = "close all orders")




Mehr