Rata-rata Gerak Langsung Eksponensial Tunggal dengan Tren Stop Loss Trailing Mengikuti Strategi

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

img

Gambaran umum

Strategi ini menggabungkan Single Exponential Smoothed Moving Average (SESMA) dan mekanisme stop loss trailing dengan Chandelier Exit untuk membentuk tren yang sangat stabil dan efisien mengikuti strategi. SESMA berfungsi sebagai garis utama untuk mengidentifikasi arah tren harga.

Logika Strategi

Strategi ini terdiri dari dua indikator inti:

  1. Single Exponential Smoothed Moving Average (SESMA): SESMA didasarkan pada gagasan EMA dan meningkatkan parameter untuk membuat kurva lebih halus dan mengurangi lag.

  2. Mekanisme stop loss trailing: Dikombinasikan dengan indikator harga tertinggi, harga terendah dan ATR untuk menghitung garis stop loss panjang dan pendek secara real time. Ini adalah mekanisme stop loss yang dapat disesuaikan secara dinamis yang dapat menyesuaikan rentang stop loss berdasarkan volatilitas dan tren pasar. Hubungan antara garis stop loss dan tingkat harga digunakan untuk menentukan waktu perintah keluar.

Sinyal masuk dari strategi ini dipicu ketika harga melintasi SESMA. Sinyal keluar dihasilkan oleh garis stop loss. Pilihan untuk menampilkan tanda masuk/keluar.

Keuntungan dari Strategi

  1. Metode perhitungan SESMA ditingkatkan dan dapat secara efektif mengurangi lag dan meningkatkan kemampuan mengikuti tren.
  2. Mekanisme stop loss trailing dapat menyesuaikan rentang stop loss sesuai dengan fluktuasi real-time untuk menghindari stop loss yang terlalu luas atau terlalu ketat.
  3. Hadir dengan bantuan visual untuk menandai masuk dan keluar sinyal.
  4. Parameter yang dapat disesuaikan yang cocok untuk produk yang berbeda dan optimasi parameter.

Risiko dan Arahan Optimalisasi

  1. Stop loss dapat dipicu terlalu dini selama pembalikan tren.
  2. Parameter SESMA dapat dioptimalkan untuk menemukan panjang terbaik.
  3. Parameter periode ATR juga dapat diuji.
  4. Uji efek dari menunjukkan tanda-tanda.

Kesimpulan

Strategi ini mengintegrasikan penilaian tren dan indikator pengendalian risiko untuk membentuk tren yang relatif kuat mengikuti strategi. Dibandingkan dengan strategi rata-rata bergerak sederhana, strategi ini dapat menangkap tren lebih fleksibel sambil mengurangi penarikan. Melalui optimasi parameter, strategi dapat mencapai hasil yang lebih baik di berbagai pasar.


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