Zero Lag Overlapping Moving Average dengan Chandelier exit trading strategy

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

img

Gambaran umum

Ide utama dari strategi ini adalah menggabungkan indikator Zero Lag Overlapping Moving Average (ZLSMA) untuk menilai arah tren, dan indikator Chandelier Exit (CE) untuk menemukan titik masuk dan keluar yang lebih tepat. ZLSMA adalah indikator tren yang dapat mengidentifikasi perubahan tren lebih awal. CE secara dinamis menyesuaikan titik keluar dengan menghitung ATR untuk mengontrol stop loss secara efektif. Strategi ini terutama cocok untuk operasi jangka pendek dan menengah.

Prinsip Strategi

  1. Bagian ZLSMA:

    • Gunakan metode regresi linier untuk menghitung garis LMA 130 periode masing-masing.
    • Kemudian tumpang tindih dua garis LMA untuk mendapatkan nilai perbedaan yang diberikan untuk eq.
    • Akhirnya, bangun Zero Lag Overlapping Moving Average ZLSMA melalui garis LMA asli ditambah perbedaan eq.
  2. Bagian CE:

    • Menghitung indikator ATR dan mengalikannya dengan faktor (default 2) untuk menentukan jarak dinamis dari titik tertinggi atau terendah terbaru.
    • Ketika harga penutupan melebihi garis stop loss panjang atau pendek terbaru, sesuaikan garis stop loss.
    • Tentukan arah panjang atau pendek berdasarkan perubahan harga penutupan relatif terhadap garis stop loss.
  3. Sinyal masuk

    • ZLSMA menilai arah tren, masuk ketika CE mengeluarkan sinyal.
  4. Stop loss keluar:

    • Stop loss tetap dan mengambil keuntungan untuk posisi panjang.
    • Untuk posisi pendek, gunakan keluar dinamis CE untuk mengganti stop loss tetap.

Analisis Keuntungan

  1. ZLSMA dapat mengidentifikasi tren lebih awal untuk menghindari pecah palsu.
  2. CE dapat menyesuaikan titik keluar secara fleksibel sesuai dengan volatilitas pasar.
  3. Rasio risiko-manfaat yang dapat disesuaikan dari strategi.
  4. Metode stop loss dan take profit yang berbeda digunakan untuk posisi panjang dan pendek untuk mengendalikan risiko.

Analisis Risiko

  1. Pengaturan parameter yang tidak benar dapat meningkatkan tingkat kerugian atau memperluas rentang stop loss.
  2. Masih ada risiko stop loss yang rusak jika terjadi pembalikan pasar yang cepat.

Arahan Optimasi

  1. Parameter dapat dioptimalkan untuk pasar dan kerangka waktu yang berbeda.
  2. Pertimbangkan untuk menyesuaikan parameter profit/stop berdasarkan volatilitas atau siklus tertentu.
  3. Cobalah menggabungkan dengan indikator atau model lain untuk meningkatkan tingkat keuntungan.

Ringkasan

Strategi ini terutama menggunakan Zero Lag Overlapping Moving Average untuk menentukan arah tren, dikombinasikan dengan indikator Chandelier Exit untuk menemukan titik masuk dan keluar yang lebih tepat. Keuntungannya terletak pada rasio stop / profit yang dapat disesuaikan dan penyesuaian dinamis Chandelier Exit dapat mengendalikan risiko sesuai dengan kondisi pasar. Langkah selanjutnya adalah pengoptimalan parameter dan kombinasi strategi untuk meningkatkan stabilitas dan profitabilitas.


/*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 banyak