Purata Bergerak Lesu Eksponensial Tunggal dengan Trend Stop Loss Berikutan Strategi

Penulis:ChaoZhang, Tarikh: 2024-01-08 11:37:44
Tag:

img

Ringkasan

Strategi ini menggabungkan Purata Bergerak Lencir Eksponensial Tunggal (SESMA) dan mekanisme hentian kerugian dengan Penarikan Chandelier untuk membentuk trend yang sangat stabil dan cekap mengikuti strategi. SESMA berfungsi sebagai garis utama untuk mengenal pasti arah trend harga. Mekanisme hentian kerugian hentian dapat mengurangkan risiko strategi dengan berkesan sambil melindungi keuntungan.

Logika Strategi

Strategi ini terdiri daripada dua penunjuk teras:

  1. Purata Bergerak Lencir Eksponensial Tunggal (SESMA): SESMA mengambil kira idea EMA dan meningkatkan parameter untuk menjadikan kurva lebih lancar dan mengurangkan lag. Ia menggunakan arah dan tahap SESMA untuk menilai trend harga.

  2. Mekanisme Stop Loss Trailing: Digabungkan dengan harga tertinggi, harga terendah dan penunjuk ATR untuk mengira garis stop loss panjang dan pendek dalam masa nyata. Ia adalah mekanisme stop loss yang boleh disesuaikan yang boleh menyesuaikan julat stop loss berdasarkan turun naik pasaran dan trend. Hubungan antara garis stop loss dan tahap harga digunakan untuk menentukan masa pesanan keluar.

Isyarat masuk strategi ini dicetuskan apabila harga melintasi SESMA Isyarat keluar dihasilkan oleh garis stop loss Pilihan untuk menunjukkan tanda masuk / keluar

Kelebihan Strategi

  1. Kaedah pengiraan SESMA dipertingkatkan dan dapat mengurangkan kelewatan secara berkesan dan meningkatkan keupayaan mengikuti trend.
  2. Mekanisme stop loss trailing boleh menyesuaikan julat stop loss mengikut turun naik masa nyata untuk mengelakkan stop loss yang terlalu luas atau terlalu ketat.
  3. Hadir dengan bantuan visual untuk menandakan isyarat masuk dan keluar.
  4. Parameter yang boleh disesuaikan yang sesuai untuk produk yang berbeza dan pengoptimuman parameter.

Risiko dan Arahan Pengoptimuman

  1. Stop loss boleh dicetuskan lebih awal semasa pembalikan trend. Boleh melonggarkan julat stop loss dengan tepat.
  2. Parameter SESMA boleh dioptimumkan untuk mencari panjang yang terbaik.
  3. Parameter tempoh ATR juga boleh diuji.
  4. Uji kesan menunjukkan tanda.

Kesimpulan

Strategi ini mengintegrasikan penghakiman trend dan penunjuk kawalan risiko untuk membentuk trend yang agak kukuh mengikut strategi. Berbanding dengan strategi purata bergerak yang mudah, strategi ini dapat menangkap trend dengan lebih fleksibel sambil mengurangkan pengeluaran. Melalui pengoptimuman parameter, strategi dapat mencapai hasil yang lebih baik di pasaran yang berbeza.


/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-07 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © simwai
strategy('Chandelier Exit ZLSMA Strategy', shorttitle='CE_ZLSMA', overlay = true, initial_capital = 1000, default_qty_value = 10, default_qty_type = strategy.percent_of_equity, calc_on_every_tick = false, process_orders_on_close = true, commission_value = 0.075)

// -- Colors --
color maximumYellowRed = color.rgb(255, 203, 98) // yellow
color rajah = color.rgb(242, 166, 84) // orange
color magicMint = color.rgb(171, 237, 198)
color languidLavender = color.rgb(232, 215, 255)
color maximumBluePurple = color.rgb(181, 161, 226)
color skyBlue = color.rgb(144, 226, 244)
color lightGray = color.rgb(214, 214, 214)
color quickSilver = color.rgb(163, 163, 163)
color mediumAquamarine = color.rgb(104, 223, 153)
color carrotOrange = color.rgb(239, 146, 46)

// -- Inputs --
length = input(title='ATR Period', defval=1)
mult = input.float(title='ATR Multiplier', step=0.1, defval=2)
showLabels = input(title='Show Buy/Sell Labels ?', tooltip='Created by Chandelier Exit (CE)', defval=false)
isSignalLabelEnabled = input(title='Show Signal Labels ?', defval=true)
useClose = input(title='Use Close Price for Extrema ?', defval=true)
zcolorchange = input(title='Enable Rising/Decreasing Highlightning', defval=false)
zlsmaLength = input(title='ZLSMA Length', defval=50)
offset = input(title='Offset', defval=0)

// -- CE - Credits to @everget --
float haClose = float(1) / 4 * (open[1] + high[1] + low[1] + close[1])
atr = mult * ta.atr(length)[1]

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

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

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

buySignal = dir == 1 and dir[1] == -1
plotshape(buySignal and showLabels ? longStop : na, title='Buy Label', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=mediumAquamarine, textcolor=color.white)
sellSignal = dir == -1 and dir[1] == 1
plotshape(sellSignal and showLabels ? shortStop : na, title='Sell Label', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=carrotOrange, textcolor=color.white)

changeCond = dir != dir[1]

// -- ZLSMA - Credits to @netweaver2011 --
lsma = ta.linreg(haClose, zlsmaLength, offset)
lsma2 = ta.linreg(lsma, zlsmaLength, offset)
eq = lsma - lsma2
zlsma = lsma + eq

zColor = zcolorchange ? zlsma > zlsma[1] ? magicMint : rajah : languidLavender
plot(zlsma, title='ZLSMA', linewidth=2, color=zColor)

// -- Signals --
var string isTradeOpen = ''
var string signalCache = ''

bool enterLong = buySignal and ta.crossover(haClose, zlsma) 
bool exitLong = ta.crossunder(haClose, zlsma) 
bool enterShort = sellSignal and ta.crossunder(haClose, zlsma)
bool exitShort = ta.crossover(haClose, zlsma)

if (signalCache == 'long entry')
    signalCache := ''
    enterLong := true
else if (signalCache == 'short entry')
    signalCache := ''
    enterShort := true

if (isTradeOpen == '')
    if (exitShort and (not enterLong))
        exitShort := false
    if (exitLong and (not enterShort))
        exitLong := false   
    if (enterLong and exitShort)
        isTradeOpen := 'long'
        exitShort := false
    else if (enterShort and exitLong)
        isTradeOpen := 'short'
        exitLong := false
    else if (enterLong)
        isTradeOpen := 'long'
    else if (enterShort)
        isTradeOpen := 'short'
else if (isTradeOpen == 'long')
    if (exitShort)
        exitShort := false
    if (enterLong)
        enterLong := false
    if (enterShort and exitLong)
        enterShort := false
        signalCache := 'short entry'
    if (exitLong)
        isTradeOpen := ''
else if (isTradeOpen == 'short')
    if (exitLong)
        exitLong := false
    if (enterShort)
        enterShort := false
    if (enterLong and exitShort)
        enterLong := false
        signalCache := 'long entry'
    if (exitShort)
        isTradeOpen := ''

plotshape((isSignalLabelEnabled and enterLong) ? zlsma : na, title='LONG', text='L', style=shape.labelup, color=mediumAquamarine, textcolor=color.white, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and enterShort) ? zlsma : na, title='SHORT', text='S', style=shape.labeldown, color=carrotOrange, textcolor=color.white, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and exitLong) ? zlsma : na, title='LONG EXIT', style=shape.circle, color=magicMint, size=size.tiny, location=location.absolute)
plotshape((isSignalLabelEnabled and exitShort) ? zlsma : na, title='SHORT EXIT', style=shape.circle, color=rajah, size=size.tiny, location=location.absolute)

barcolor(color=isTradeOpen == 'long' ? mediumAquamarine : isTradeOpen == 'short' ? carrotOrange : na)

// -- Long Exits --
if (exitLong and strategy.position_size > 0)
    strategy.close('long', comment='EXIT_LONG')

// -- Short Exits --
if (exitShort and strategy.position_size < 0)
    strategy.close('short', comment='EXIT_SHORT')

// -- Long Entries --
if (enterLong)
    strategy.entry('long', strategy.long, comment='ENTER_LONG')

// -- Short Entries --
if (enterShort)
    strategy.entry('short', strategy.short, comment='ENTER_SHORT')

Lebih lanjut