Überlagerter gleitender Durchschnitt ohne Verzögerung kombiniert mit einer Cantilever-Line-Exit-Trading-Strategie


Erstellungsdatum: 2024-01-22 10:03:05 zuletzt geändert: 2024-01-22 10:03:05
Kopie: 0 Klicks: 1897
1
konzentrieren Sie sich auf
1617
Anhänger

Überlagerter gleitender Durchschnitt ohne Verzögerung kombiniert mit einer Cantilever-Line-Exit-Trading-Strategie

Überblick

Die Hauptidee der Strategie besteht darin, die Richtung des Trends in Kombination mit den nullverzögerten überlagerten Moving Averages (ZLSMA) und den Ausgängen der Hängelinie (CE) zu bestimmen. ZLSMA ist ein Trendindikator, der Trendänderungen früher bestimmen kann. Die CE kann die Ausgangsposition dynamisch anpassen, indem sie die ATR berechnet, um die Stop-Loss-Effekte zu kontrollieren.

Strategieprinzip

  1. ZLSMA-Teil:

    • Die LMA-Linien mit einer Länge von 130 Zyklen werden mit der linearen Regression berechnet.
    • Die beiden LMA-Linien werden dann überlagert, um die Differenz zu erhalten, die dem eq zugewiesen wird.
    • Schließlich wird der Eq-Differenz über die ursprüngliche LMA-Linie hinzugefügt, um einen nullverzögerten überlagerten Moving Average ZLSMA zu bilden.
  2. Teil CE:

    • Berechnen Sie den ATR-Wert und multiplizieren Sie ihn mit dem Faktor ((Standard 2)), um die dynamische Entfernung zum nächsten Hoch- oder Tiefpunkt zu ermitteln.
    • Wenn der Schlusskurs die jüngste Multi-Stop-Linie oder die Leer-Stop-Linie überschreitet, wird diese Stop-Linie entsprechend angepasst.
    • Die Kurse werden nach der Änderung der Position des Schlusskurses in Bezug auf die Stop-Line berechnet.
  3. Eintrittszeit:

    • ZLSMA entscheidet über die Richtung des Trends, CE kommt, wenn es ein Signal gibt.
  4. Ausgangsschaden:

    • Die Langleiter sind mit einem festen Stop-Loss- und Stop-Stop-System ausgestattet.
    • Kurzleiter ersetzen die dynamische Ausgabe des CE durch einen festen Stopp.

Analyse der Stärken

  1. ZLSMA kann Trends frühzeitig erkennen, um falsche Durchbrüche zu vermeiden.
  2. Die CE kann den Ausgangsplatz flexibel an die Marktschwankungen anpassen.
  3. Das Risiko-Gewinn-Verhältnis der Strategie ist anpassbar.
  4. Der Einsatz von Stop-Loss-Stopp-Methoden unterscheidet sich von der Verwendung von Long-Short-Line und kann gleichzeitig Risiken kontrollieren.

Risikoanalyse

  1. Die falsche Einstellung der Parameter kann die Durchsatzrate erhöhen oder den Stop-Loss-Bereich erweitern.
  2. Wenn sich die Situation rasch umkehrt, besteht die Gefahr, dass die Stop-Loss-Regelung durchbrochen wird.

Optimierungsrichtung

  1. Die Optimierung von Parametern für verschiedene Märkte und Zeitspannen kann getestet werden.
  2. Es kann in Betracht gezogen werden, die Stop-Loss-Parameter an die Fluktuationsrate oder an bestimmte Perioden anzupassen.
  3. Es kann versucht werden, diese mit anderen Indikatoren oder Modellen zu kombinieren, um die Gewinnquote zu erhöhen.

Zusammenfassen

Die Strategie nutzt vor allem die Überlagerung von Moving Averages mit Nullverzögerung, um die Trendrichtung zu bestimmen, in Kombination mit den Ausgangsmesswerten der Hangarlinie, um einen präziseren Zeitpunkt für die Ein- und Ausfahrt zu finden. Der Vorteil der Strategie besteht darin, dass die Stop-Loss-Ratio angepasst werden kann, und die Dynamik des Ausgangs der Hangarlinie kann dem Risiko entsprechend der Marktlage angepasst werden. Im nächsten Schritt kann die Optimierung der Parameter und die Kombination der Strategien versucht werden, um die Stabilität und die Profitabilität weiter zu verbessern.

Strategiequellcode
/*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")