Moyenne mobile avec décalage zéro et stratégie de négociation de sortie Chandelier

Auteur:ChaoZhang est là., Date: 2024-01-22 10h03:05
Les étiquettes:

img

Résumé

L'idée principale de cette stratégie est de combiner l'indicateur ZLSMA (Zero Lag Overlapping Moving Average) pour juger de la direction de la tendance, et l'indicateur de sortie du lustre (CE) pour trouver des points d'entrée et de sortie plus précis.

Principe de stratégie

  1. Partie ZLSMA:

    • Utiliser la méthode de régression linéaire pour calculer respectivement les lignes LMA de 130 périodes.
    • Puis superposer les deux lignes LMA pour obtenir la valeur de différence attribuée à l'équation.
    • Enfin, construisez la moyenne mobile ZLSMA à décalage zéro par l'intermédiaire de la ligne LMA d'origine plus la différence eq.
  2. Partie CE:

    • Calculer l'indicateur ATR et le multiplier par un facteur (défaut 2) pour déterminer la distance dynamique à partir du point le plus élevé ou le plus bas.
    • Lorsque le prix de clôture dépasse la ligne de stop loss longue ou courte la plus récente, ajuster la ligne de stop loss en conséquence.
    • Déterminer la direction longue ou courte en fonction de la variation du prix de clôture par rapport à la ligne stop loss.
  3. Signal d'entrée:

    • ZLSMA juge la direction de la tendance, entrez lorsque CE émet un signal.
  4. Perte de sortie:

    • Stop-loss fixe et prise de profit pour la position longue.
    • Pour les positions courtes, utilisez la sortie dynamique de CE pour remplacer le stop loss fixe.

Analyse des avantages

  1. ZLSMA peut identifier la tendance plus tôt pour éviter une fausse rupture.
  2. CE peut ajuster de manière flexible les points de sortie en fonction de la volatilité du marché.
  3. Ratio risque-rendement personnalisable de la stratégie.
  4. Différentes méthodes d'arrêt des pertes et de prise de profit utilisées pour les positions longues et courtes afin de contrôler le risque.

Analyse des risques

  1. Les paramètres mal réglés peuvent augmenter le taux de perte ou élargir la plage de stop loss.
  2. Il existe toujours un risque de rupture du stop loss en cas d'inversion rapide du marché.

Directions d'optimisation

  1. Les paramètres peuvent être optimisés pour différents marchés et délais.
  2. Envisager d'ajuster les paramètres de profit/arrêt en fonction de la volatilité ou de cycles spécifiques.
  3. Essayez de les combiner avec d'autres indicateurs ou modèles pour améliorer le taux de profit.

Résumé

La stratégie utilise principalement la moyenne mobile de chevauchement de décalage zéro pour déterminer la direction de la tendance, combinée à l'indicateur de sortie de l'échandelier pour trouver des points d'entrée et de sortie plus précis.


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




Plus de