Strategi Trend Riding Berdasarkan MOST dan KAMA

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

img

Strategi ini menggabungkan pelbagai purata bergerak seperti SMA dan EMA untuk mengenal pasti arah trend harga, dan menetapkan garis stop loss berdasarkan terobosan harga untuk merancang strategi berikut trend. Apabila harga naik, ia mengikuti jalur atas sebagai stop loss; apabila harga jatuh, ia mengikuti batas bawah sebagai stop loss. Kelebihan strategi adalah bahawa gabungan pelbagai purata bergerak dapat meluruskan data harga dan mengenal pasti trend; Reka bentuk stop loss dinamik mengelakkan berhenti yang terlalu sensitif. Risiko strategi adalah bahawa Penetapan garis stop loss mungkin terlalu longgar untuk menghentikan kerugian pada waktunya.

Prinsip Strategi

Strategi ini menggunakan KAMA sebagai asas untuk menilai arah trend, kerana KAMA bertindak balas terhadap perubahan harga dengan lebih sensitif dan dapat mengenal pasti giliran terlebih dahulu. Pada masa yang sama, strategi ini mengandungi kombinasi pelbagai purata bergerak lain seperti SMA dan EMA untuk menapis harga dan mengenal pasti arah trend utama.

Tetapan garis stop-loss strategi ini berdasarkan pada harga itu sendiri dan purata bergerak. Khususnya, garis stop loss yang menjurus ke atas adalah purata bergerak ditambah perkadaran sebagai penyangga; Garis stop loss yang menjurus ke bawah adalah purata bergerak dikurangkan perkadaran sebagai penyangga. Ini membolehkan stop loss segera apabila harga berbalik.

Keadaan kemasukan adalah panjang apabila harga menembusi garis stop loss menaik dari bawah ke atas; pendek apabila harga menembusi garis stop loss menaik dari atas ke bawah.

Analisis Kelebihan

Kelebihan terbesar strategi ini ialah dengan menggabungkan pelbagai purata bergerak, ketepatan penilaian trend dapat ditingkatkan dan isyarat palsu dapat dikurangkan. Pada masa yang sama, garis stop loss strategi berubah secara dinamik berdasarkan purata bergerak, yang dapat menyesuaikan diri dalam masa nyata dan bertindak balas terhadap peristiwa tiba-tiba.

Di samping itu, berbanding dengan strategi penunjuk tunggal, strategi ini menggabungkan kelebihan pengesanan trend dan strategi terobosan.

Analisis Risiko

Risiko utama strategi ini adalah bahawa tetapan garis stop loss mungkin terlalu longgar untuk menghentikan kerugian tepat pada masanya. Ini kerana nisbah retracement garis stop loss tetap, jika terdapat perubahan ganas di pasaran, garis stop loss tidak dapat dikemas kini tepat pada masanya, yang boleh membawa kepada kerugian yang lebih besar.

Di samping itu, Moving Average sendiri mempunyai histeresis yang tinggi dan tidak dapat bertindak balas dengan segera terhadap perubahan harga. Ini juga boleh menyebabkan kegagalan untuk menghentikan kerugian tepat pada masanya apabila pasaran berbalik dengan cepat.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Uji tetapan parameter yang berbeza untuk nisbah garisan stop loss untuk mencari kombinasi parameter yang lebih baik;

  2. Cuba untuk membuat garis stop loss berubah secara dinamik mengikut tahap turun naik pasaran;

  3. Meningkatkan penunjuk lain untuk menilai, memperkenalkan lebih banyak pembolehubah dalam asas stop loss untuk meningkatkan kebolehsesuaian strategi;

  4. Mengoptimumkan parameter kitaran purata bergerak untuk mencari tetapan kitaran terbaik untuk harga yang lancar.

Ringkasan

Secara keseluruhan, strategi ini agak kukuh, menggabungkan pelbagai purata bergerak untuk menentukan arah trend, dan merancang mekanisme stop loss yang dinamik yang bertujuan untuk mengikuti trend. Kelebihannya ialah ia dapat mengurangkan isyarat palsu, mengawal risiko melalui stop loss; Kelemahannya adalah bahawa garis stop loss mungkin ditetapkan terlalu lebar untuk menghentikan kerugian dengan cepat. Langkah seterusnya untuk mengoptimumkan strategi harus memberi tumpuan kepada reka bentuk garis stop loss untuk menjadikannya disesuaikan secara dinamik mengikut perubahan pasaran.


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