Strategi mengikut aliran berdasarkan MOST dan KAMA


Tarikh penciptaan: 2024-02-29 11:04:38 Akhirnya diubah suai: 2024-02-29 11:04:38
Salin: 3 Bilangan klik: 697
1
fokus pada
1617
Pengikut

Strategi mengikut aliran berdasarkan MOST dan KAMA

Gambaran keseluruhan

Strategi ini menggunakan pelbagai purata bergerak seperti SMA, EMA, KAMA untuk mengenal pasti arah trend harga, dan merancang strategi untuk mengikuti trend yang dijalankan berdasarkan penembusan harga untuk menetapkan garis hentian. Apabila harga naik, trails the upper band sebagai hentian; apabila harga turun, trails the bawah sebagai hentian.

Prinsip Strategi

Strategi ini menggunakan KAMA sebagai petunjuk asas untuk menentukan arah trend, kerana KAMA bertindak balas terhadap perubahan harga yang lebih sensitif, dan boleh mengenal pasti perubahan lebih awal. Pada masa yang sama, strategi ini merangkumi kombinasi pelbagai purata bergerak lain seperti SMA, EMA, dan lain-lain, yang dapat memfilter harga dan mengenal pasti arah trend utama.

Setting stop loss line strategi berdasarkan harga itu sendiri dan bergerak rata-rata. Khususnya, stop loss line yang dijejaki ke atas untuk bergerak rata-rata ditambah satu peratusan sebagai penampan; stop loss line yang dijejaki ke bawah untuk bergerak rata-rata tolak satu peratusan sebagai penampan.

Syarat untuk masuk ialah, buat lebih apabila harga dari bawah ke atas memecahkan garis henti rugi atas; buat kosong apabila harga dari atas ke bawah memecahkan garis henti rugi bawah.

Analisis kelebihan

Kelebihan utama strategi ini adalah bahawa ia meningkatkan ketepatan penilaian trend dan mengurangkan isyarat palsu melalui kombinasi pelbagai purata bergerak. Pada masa yang sama, garis hentian strategi ini adalah berdasarkan perubahan dinamik purata bergerak dan dapat disesuaikan dengan harga masa nyata untuk bertindak balas terhadap peristiwa yang tidak dijangka.

Di samping itu, berbanding dengan strategi satu petunjuk, strategi ini menggabungkan kelebihan strategi trend dan strategi pemecahan. Dalam keadaan yang sedang maju, keuntungan maksimum dapat diperoleh; dan dalam keadaan yang bergolak, kerugian dapat dikurangkan dengan menetapkan stop loss.

Analisis risiko

Risiko utama strategi ini adalah bahawa tetapan garis berhenti mungkin terlalu longgar dan tidak dapat berhenti tepat pada masanya. Ini kerana kadar penarikan garis berhenti ditetapkan secara tetap, dan jika keadaan berubah secara drastik, tidak dapat memperbaharui garis berhenti tepat pada masanya dapat menyebabkan kerugian yang lebih besar.

Selain itu, Moving Average sendiri sangat lambat dan tidak dapat bertindak balas dengan segera terhadap perubahan harga. Ini juga boleh menyebabkan kerugian tidak dapat dihentikan dengan cepat apabila pasaran berbalik dengan cepat.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa aspek:

  1. Uji nisbah garis hentian di bawah pelbagai tetapan parameter untuk mencari kombinasi parameter yang lebih baik;

  2. Cuba untuk menetapkan garis hentian untuk perubahan dinamik, menyesuaikan dengan tahap turun naik pasaran;

  3. Menambah penilaian indikator lain, memperkenalkan lebih banyak pembolehubah pada Stop Loss Basis, meningkatkan fleksibiliti strategi;

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

ringkaskan

Strategi ini agak kuat secara keseluruhan, menilai arah trend melalui pelbagai kombinasi rata-rata bergerak, dan merancang mekanisme pelacakan berhenti yang dinamik, yang bertujuan untuk mengikuti trend. Kelebihan adalah dapat mengurangkan isyarat palsu, dengan mengawal risiko dengan menghentikan kerugian; Kelemahannya adalah bahawa garis berhenti mungkin terlalu lebar dan tidak dapat menghentikan kerugian dengan cepat.

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