Strategi Mengikuti Tren Rata-rata Pergerakan Eksponensial Tunggal dengan Trailing Stop


Tanggal Pembuatan: 2024-01-08 11:37:44 Akhirnya memodifikasi: 2024-01-08 11:37:44
menyalin: 1 Jumlah klik: 649
1
fokus pada
1617
Pengikut

Strategi Mengikuti Tren Rata-rata Pergerakan Eksponensial Tunggal dengan Trailing Stop

Ringkasan

Strategi ini menggabungkan penggunaan rata-rata bergerak lurus indeks tunggal (SESMA) dan mekanisme sekitar tangga tangki yang disertai dengan trailing stop loss untuk membentuk strategi pelacakan tren yang sangat stabil dan efisien. Sesma berfungsi sebagai garis utama untuk mengidentifikasi arah tren harga.

Prinsip Strategi

Strategi ini terdiri dari dua indikator utama:

  1. Single-index Smooth Moving Average (SESMA): SESMA mengambil gagasan dari EMA, dan pada saat yang sama memperbaiki parameter, membuat kurva lebih halus, latensi lebih rendah. Untuk menilai tren harga melalui arah dan hubungan harga SESMA.

  2. Mekanisme Stop Loss Tautan: Menggabungkan harga tertinggi, harga terendah, dan indikator ATR, untuk menghitung garis stop loss multihead dan blank head secara real time. Ini adalah mekanisme stop loss yang disesuaikan secara dinamis, yang dapat menyesuaikan amplitudo stop loss sesuai dengan volatilitas pasar dan tren.

Strategi ini masuk berdasarkan harga yang menembus SESMA. Sedangkan sinyal keluar dipicu oleh garis stop loss. Anda dapat mengatur apakah tanda tersebut akan ditampilkan.

Keunggulan Strategis

  1. Metode perhitungan SESMA yang lebih baik dapat secara efektif mengurangi keterlambatan dan meningkatkan kemampuan untuk menangkap tren.
  2. Mekanisme tail stop dapat menyesuaikan amplitudo stop loss berdasarkan fluktuasi real-time, untuk menghindari stop loss terlalu longgar atau terlalu dekat.
  3. Penanda waktu Entry dan Exit dengan bantuan visual tambahan.
  4. Parameter yang dapat disesuaikan untuk berbagai varietas dan parameter optimasi.

Risiko dan arah optimasi

  1. Pada saat trend berbalik, mungkin terjadi stop loss yang dipicu yang menyebabkan keluar prematur.
  2. Parameter SESMA dapat dioptimalkan untuk menemukan panjang optimal.
  3. Parameter ATR juga dapat menguji panjang siklus yang berbeda.
  4. Apakah tes menunjukkan hasil yang ditandai.

Meringkaskan

Strategi ini mengintegrasikan penilaian tren dengan indikator pengendalian risiko untuk membentuk strategi pelacakan tren yang lebih kuat. Strategi ini menangkap tren dengan lebih banyak fleksibilitas dan mengurangi pengembalian dibandingkan dengan strategi rata-rata bergerak sederhana. Dengan pengoptimalan parameter, strategi ini dapat bekerja lebih baik di berbagai pasar.

Kode 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')