Zero Lag Overlapping Moving Average dengan Strategi Dagangan Keluar Chandelier

Penulis:ChaoZhang, Tarikh: 2024-01-22 10:03:05
Tag:

img

Ringkasan

Idea utama strategi ini adalah untuk menggabungkan penunjuk Purata Bergerak Tumpang Tindih Zero (ZLSMA) untuk menilai arah trend, dan penunjuk Keluar Chandelier (CE) untuk mencari titik masuk dan keluar yang lebih tepat. ZLSMA adalah penunjuk trend yang dapat mengenal pasti perubahan trend lebih awal. CE secara dinamik menyesuaikan titik keluar dengan mengira ATR untuk mengawal dengan berkesan kehilangan berhenti. Strategi ini terutamanya sesuai untuk operasi jangka pendek dan sederhana.

Prinsip Strategi

  1. Bahagian ZLSMA:

    • Menggunakan kaedah regresi linear untuk mengira garis LMA 130 tempoh masing-masing.
    • Kemudian letakkan dua garis LMA untuk mendapatkan nilai perbezaan yang diberikan kepada eq.
    • Akhirnya, bina Zero Lag Overlapping Moving Average ZLSMA melalui garisan LMA asal ditambah perbezaan eq.
  2. Bahagian CE:

    • Mengira penunjuk ATR dan mengalikannya dengan faktor (default 2) untuk menentukan jarak dinamik dari titik tertinggi atau terendah terkini.
    • Apabila harga penutupan melebihi barisan stop loss panjang atau pendek yang paling baru, sesuaikan barisan stop loss.
    • Tentukan arah panjang atau pendek berdasarkan perubahan harga penutupan berbanding garis stop loss.
  3. Isyarat kemasukan:

    • ZLSMA menilai arah trend, masuk apabila CE mengeluarkan isyarat.
  4. Hentikan kerugian keluar:

    • Stop loss tetap dan mengambil keuntungan untuk kedudukan panjang.
    • Untuk kedudukan pendek, gunakan keluar dinamik CE untuk menggantikan stop loss tetap.

Analisis Kelebihan

  1. ZLSMA boleh mengenal pasti trend lebih awal untuk mengelakkan pecah palsu.
  2. CE boleh menyesuaikan titik keluar dengan fleksibel mengikut turun naik pasaran.
  3. Rasio risiko-balasan strategi yang boleh disesuaikan.
  4. Kaedah Stop Loss dan Take Profit yang berbeza digunakan untuk kedudukan panjang dan pendek untuk mengawal risiko.

Analisis Risiko

  1. Tetapan parameter yang tidak betul boleh meningkatkan kadar kehilangan atau memperluaskan julat stop loss.
  2. Masih ada risiko stop loss akan dilanggar sekiranya pasaran berbalik dengan pantas.

Arahan pengoptimuman

  1. Parameter boleh dioptimumkan untuk pasaran dan jangka masa yang berbeza.
  2. Pertimbangkan penyesuaian parameter keuntungan / berhenti berdasarkan turun naik atau kitaran tertentu.
  3. Cuba menggabungkan dengan penunjuk atau model lain untuk meningkatkan kadar keuntungan.

Ringkasan

Strategi ini terutamanya menggunakan purata bergerak yang bertindih Zero Lag untuk menentukan arah trend, digabungkan dengan penunjuk Chandelier Exit untuk mencari titik masuk dan keluar yang lebih tepat. Kelebihannya terletak pada nisbah berhenti / keuntungan yang boleh disesuaikan dan penyesuaian dinamik Chandelier Exit dapat mengawal risiko mengikut keadaan pasaran. Langkah seterusnya boleh menjadi pengoptimuman parameter dan kombinasi strategi untuk meningkatkan kestabilan dan keuntungan.


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




Lebih lanjut