Strategi Trend Riding Berdasarkan MOST dan KAMA

Penulis:ChaoZhang, Tanggal: 2024-02-29 11:04:38
Tag:

img

Strategi ini menggabungkan beberapa rata-rata bergerak seperti SMA dan EMA untuk mengidentifikasi arah tren harga, dan menetapkan garis stop loss berdasarkan terobosan harga untuk merancang strategi berikut tren. Ketika harga naik, itu mengikuti band atas sebagai stop loss; ketika harga turun, itu mengikuti batas bawah sebagai stop loss. Keuntungan dari strategi ini adalah bahwa kombinasi beberapa rata-rata bergerak dapat meluruskan data harga dan mengidentifikasi tren; Desain stop loss dinamis menghindari stop yang terlalu sensitif. Risiko dari strategi ini adalah bahwa Pengaturan garis stop loss mungkin terlalu longgar untuk menghentikan kerugian tepat waktu.

Prinsip Strategi

Strategi ini menggunakan KAMA sebagai dasar untuk menilai arah tren, karena KAMA merespons perubahan harga dengan lebih sensitif dan dapat mengidentifikasi pergeseran sebelumnya. Pada saat yang sama, strategi ini berisi kombinasi dari beberapa rata-rata bergerak lainnya seperti SMA dan EMA untuk menyaring harga dan mengidentifikasi arah tren utama.

Setelan garis stop loss strategi ini didasarkan pada harga itu sendiri dan moving average. Secara khusus, garis stop loss yang menjurus ke atas adalah moving average ditambah proporsi sebagai buffer; garis stop loss yang menjurus ke bawah adalah moving average dikurangi proporsi sebagai buffer. Ini memungkinkan stop loss segera ketika harga berbalik.

Kondisi masuk adalah panjang ketika harga menembus garis stop loss naik dari bawah ke atas; pendek ketika harga menembus garis stop loss turun dari atas ke bawah.

Analisis Keuntungan

Keuntungan terbesar dari strategi ini adalah bahwa dengan menggabungkan beberapa moving average, akurasi penilaian tren dapat ditingkatkan dan sinyal palsu dapat dikurangi. Pada saat yang sama, garis stop loss strategi berubah secara dinamis berdasarkan moving average, yang dapat disesuaikan secara real time dan merespons peristiwa mendadak.

Selain itu, dibandingkan dengan strategi indikator tunggal, strategi ini menggabungkan keuntungan dari pelacakan tren dan strategi terobosan.

Analisis Risiko

Risiko utama dari strategi ini adalah bahwa pengaturan garis stop loss mungkin terlalu longgar untuk menghentikan kerugian tepat waktu. Ini karena rasio retracement dari garis stop loss tetap, jika ada perubahan yang keras di pasar, garis stop loss tidak dapat diperbarui tepat waktu, yang dapat menyebabkan kerugian yang lebih besar.

Selain itu, Moving Average sendiri memiliki histeresis tinggi dan tidak dapat bereaksi segera terhadap perubahan harga. Ini juga dapat menyebabkan kegagalan untuk menghentikan kerugian pada waktunya ketika pasar berbalik dengan cepat.

Arahan Optimasi

Strategi dapat dioptimalkan dalam aspek berikut:

  1. Uji pengaturan parameter yang berbeda untuk rasio garis stop loss untuk menemukan kombinasi parameter yang lebih baik;

  2. Cobalah untuk membuat garis stop loss berubah secara dinamis sesuai dengan tingkat fluktuasi pasar;

  3. Meningkatkan indikator lain untuk menilai, memperkenalkan lebih banyak variabel dalam dasar stop loss untuk meningkatkan kemampuan adaptasi strategi;

  4. Mengoptimalkan parameter siklus rata-rata bergerak untuk menemukan pengaturan siklus terbaik untuk meringankan harga.

Ringkasan

Secara keseluruhan, strategi ini cukup kuat, menggabungkan beberapa moving average untuk menentukan arah tren, dan merancang mekanisme stop loss trailing dinamis yang bertujuan untuk mengikuti tren. Keuntungannya adalah dapat mengurangi sinyal palsu, mengendalikan risiko melalui stop loss; Kelemahannya adalah bahwa garis stop loss dapat diatur terlalu lebar untuk menghentikan kerugian dengan cepat. Langkah selanjutnya untuk mengoptimalkan strategi harus berfokus pada desain garis stop loss untuk membuatnya dapat disesuaikan secara dinamis sesuai dengan perubahan pasar.


/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Atlantean Trend Signal BUY SELL Strategy', overlay=true)

ma_length = input.int(title='Moving Average Length', minval=1, defval=3)
percent = input.float(3.3, 'STOP LOSS Percent', step=0.1, minval=0)
src = input(title='Source', defval=close)
mav = input.string(title="Moving Average Type", defval="KAMA", options=["SMA", "EMA", "WMA", "DEMA", "TMA", "VAR", "WWMA", "ZLEMA", "TSF", "HULL", "TILL", "KAMA"])
T3a1 = 0.7
_type = false //input(false, title='Activate Moving Average Screening Mode')
_type1 = false //input(false, title='Activate Moving Average Color Change Screening Mode')
activateScreener = input.bool(false, title="Activate Screener?")
showsignallabels = input(title='Show Signal Labels?', defval=true)

Var_Func(src, ma_length) =>
    valpha = 2 / (ma_length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

VAR = Var_Func(src, ma_length)
DEMA = 2 * ta.ema(src, ma_length) - ta.ema(ta.ema(src, ma_length), ma_length)

Wwma_Func(src, ma_length) =>
    wwalpha = 1 / ma_length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

WWMA = Wwma_Func(src, ma_length)

// KAMA Calculation
Kama_Func(src, ma_length) =>
    xvnoise = math.abs(src - src[1])
    nfastend = 0.666
    nslowend = 0.0645
    nsignal = math.abs(src - src[ma_length])
    nnoise = math.sum(xvnoise, ma_length)
    nefratio = nnoise != 0 ? nsignal / nnoise : 0
    nsmooth = math.pow(nefratio * (nfastend - nslowend) + nslowend, 2)
    nAMA = 0.0
    nAMA := nz(nAMA[1]) + nsmooth * (src - nz(nAMA[1]))
    nAMA

Zlema_Func(src, ma_length) =>
    zxLag = ma_length / 2 == math.round(ma_length / 2) ? ma_length / 2 : (ma_length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, ma_length)
    ZLEMA

ZLEMA = Zlema_Func(src, ma_length)

Tsf_Func(src, ma_length) =>
    lrc = ta.linreg(src, ma_length, 0)
    lrc1 = ta.linreg(src, ma_length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, ma_length, 0) + lrs
    TSF

TSF = Tsf_Func(src, ma_length)

HMA = ta.wma(2 * ta.wma(src, ma_length / 2) - ta.wma(src, ma_length), math.round(math.sqrt(ma_length)))

T3e1 = ta.ema(src, ma_length)
T3e2 = ta.ema(T3e1, ma_length)
T3e3 = ta.ema(T3e2, ma_length)
T3e4 = ta.ema(T3e3, ma_length)
T3e5 = ta.ema(T3e4, ma_length)
T3e6 = ta.ema(T3e5, ma_length)
T3c1 = -T3a1 * T3a1 * T3a1
T3c2 = 3 * T3a1 * T3a1 + 3 * T3a1 * T3a1 * T3a1
T3c3 = -6 * T3a1 * T3a1 - 3 * T3a1 - 3 * T3a1 * T3a1 * T3a1
T3c4 = 1 + 3 * T3a1 + T3a1 * T3a1 * T3a1 + 3 * T3a1 * T3a1
T3 = T3c1 * T3e6 + T3c2 * T3e5 + T3c3 * T3e4 + T3c4 * T3e3

getMA(src, ma_length) =>
    ma = 0.0
    ma := switch mav
        'SMA' => ta.sma(src, ma_length)
        'EMA' => ta.ema(src, ma_length)
        'WMA' => ta.wma(src, ma_length)
        'DEMA' => DEMA
        'TMA' => ta.sma(ta.sma(src, math.ceil(ma_length / 2)), math.floor(ma_length / 2) + 1)
        'VAR' => VAR
        'WWMA' => WWMA
        'ZLEMA' => ZLEMA
        'TSF' => TSF
        'HULL' => HMA
        'TILL' => T3
        'KAMA' => Kama_Func(src, ma_length)
    ma
ALL = getMA(src, ma_length)
exMov = ALL
fark = exMov * percent * 0.01
longStop = exMov - fark
longStopPrev = nz(longStop[1], longStop)
longStop := exMov > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = exMov + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := exMov < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and exMov > shortStopPrev ? 1 : dir == 1 and exMov < longStopPrev ? -1 : dir
MOST = dir == 1 ? longStop : shortStop
cro = _type and _type1 ? ta.crossover(exMov, exMov[1]) : _type ? ta.crossover(close, exMov) : ta.crossover(exMov, MOST)
cru = _type and _type1 ? ta.crossunder(exMov, exMov[1]) : _type ? ta.crossunder(close, exMov) : ta.crossunder(exMov, MOST)
direction = 0
direction := cro ? 1 : cru ? -1 : direction[1]
col1 = exMov > exMov[1]
col3 = exMov < exMov[1]
colorM = col1 and _type and _type1 ? color.rgb(14, 241, 52) : col3 and _type and _type1 ? color.red : color.new(#00bcd4, 0)
if (cro)
    strategy.entry('LONG', strategy.long)
if (cru)
    strategy.close('LONG')

plot(_type ? na : MOST, color=color.new(color.maroon, 0), linewidth=3, title='MOST')
plot(exMov, color=colorM, linewidth=2, title='exMov')
plotshape(cro and showsignallabels, title='BUY', text='BUY', location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.new(#00bcd4, 0), textcolor=color.new(color.white, 0))
plotshape(cru and showsignallabels, title='SELL', text='SELL', location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.new(#e91e63, 0), textcolor=color.new(color.white, 0))


Lebih banyak