Strategi Mengikuti Trend Purata Pergerakan Eksponen Tunggal dengan Hentian Jejak


Tarikh penciptaan: 2024-01-08 11:37:44 Akhirnya diubah suai: 2024-01-08 11:37:44
Salin: 1 Bilangan klik: 649
1
fokus pada
1617
Pengikut

Strategi Mengikuti Trend Purata Pergerakan Eksponen Tunggal dengan Hentian Jejak

Gambaran keseluruhan

Strategi ini digabungkan dengan penggunaan purata bergerak rata-rata satu indeks ((SESMA) dan mekanisme sekitar tangga tangki yang disertakan dengan penghentian kerugian, membentuk strategi pengesanan trend yang sangat stabil dan cekap. Sesma berfungsi sebagai garis utama untuk mengenal pasti arah trend harga.

Prinsip Strategi

Strategi ini terdiri daripada dua petunjuk utama:

  1. SESMA: SESMA mengambil idea EMA, dan pada masa yang sama memperbaiki parameter, menjadikan kurva lebih licin dan kelewatan lebih rendah. Untuk menilai trend harga melalui arah dan hubungan harga SESMA.

  2. Mekanisme Hentikan Kerosakan: Menggabungkan harga tertinggi, harga terendah dan penunjuk ATR, dalam masa nyata mengira garis hentikan bertopeng dan kosong. Ini adalah mekanisme hentikan yang disesuaikan secara dinamik, yang dapat menyesuaikan amplitudo hentikan kerugian mengikut turun naik dan trend pasaran. Hubungan antara garis hentikan dengan harga digunakan untuk menentukan masa untuk keluar dari kedudukan kosong.

Dasar masuk untuk strategi ini adalah apabila harga menembusi SESMA. Isyarat keluar akan dicetuskan oleh garis stop loss. Anda boleh menetapkan sama ada tanda tersebut akan dipaparkan.

Kelebihan Strategik

  1. Peningkatan dalam kaedah pengiraan SESMA dapat mengurangkan kelewatan dan meningkatkan keupayaan untuk menangkap pergerakan.
  2. Mekanisme penangguhan kerugian yang mengikuti boleh menyesuaikan amplitudo penangguhan berdasarkan turun naik dalam masa nyata, untuk mengelakkan penangguhan yang terlalu longgar atau terlalu rapat.
  3. Penanda visual tambahan untuk menilai masa Entry dan Exit.
  4. Parameter yang boleh disesuaikan untuk pelbagai jenis dan pengoptimuman parameter.

Risiko dan arah pengoptimuman

  1. Apabila trend berbalik, mungkin terdapat stop loss yang dicetuskan yang menyebabkan penarikan diri awal.
  2. Parameter SESMA boleh dioptimumkan untuk mencari panjang optimum.
  3. Parameter ATR juga boleh menguji panjang kitaran yang berbeza.
  4. Adakah ujian menunjukkan kesan tanda tersebut?

ringkaskan

Strategi ini menggabungkan penghakiman trend dengan indikator kawalan risiko untuk membentuk strategi pengesanan trend yang lebih mantap. Strategi ini dapat menangkap trend dengan lebih fleksibel dan mengurangkan pengunduran berbanding dengan strategi purata bergerak yang mudah. Dengan pengoptimuman parameter, strategi ini dapat mencapai kesan yang lebih baik di pelbagai pasaran.

Kod sumber strategi
/*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')