
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.
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.
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.
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.
Strategi ini boleh dioptimumkan dalam beberapa aspek:
Uji nisbah garis hentian di bawah pelbagai tetapan parameter untuk mencari kombinasi parameter yang lebih baik;
Cuba untuk menetapkan garis hentian untuk perubahan dinamik, menyesuaikan dengan tahap turun naik pasaran;
Menambah penilaian indikator lain, memperkenalkan lebih banyak pembolehubah pada Stop Loss Basis, meningkatkan fleksibiliti strategi;
Mengoptimumkan parameter kitaran purata bergerak untuk mencari tetapan kitaran harga yang paling lancar.
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.
/*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))