Strategi ini adalah berdasarkan pada Ehlers MESA Adaptive Moving Average dan telah direka bentuk sebagai strategi perdagangan trend yang mengikuti dua persilangan rata-rata. Berdagang lebih banyak ketika melintasi garis perlahan di atas garis cepat dan berdagang lebih sedikit ketika melintasi garis perlahan di bawah garis cepat adalah strategi persilangan rata-rata bergerak ganda yang tipikal.
Strategi ini berpusat pada pengiraan dua purata bergerak beradaptasi: garis MAMA dan garis FAMA. Di antaranya, formula pengiraan garis MAMA adalah seperti berikut:
alpha = fl / dphase
alpha = iff(alpha < sl, sl, iff(alpha > fl, fl, alpha))
mama = alpha*src + (1 - alpha)*nz(mama[1])
Di antaranya, fl adalah sekatan cepat, sl adalah sekatan perlahan, dan dphase adalah perbezaan fasa. alpha menyesuaikan secara dinamik mengikut perbezaan fasa, untuk mencapai parameter kelancaran yang sesuai.
Formula untuk mengira garis FAMA adalah seperti berikut:
fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])
Garis FAMA adalah garis kelancaran gelombang rendah MAMA.
Strategi ini menghasilkan isyarat perdagangan dengan membandingkan hubungan saiz antara garis MAMA dan garis FAMA untuk menentukan sama ada ia sedang dalam trend naik atau turun.
Strategi ini mempunyai beberapa kelebihan:
Menggunakan purata bergerak yang menyesuaikan diri, parameter akan disesuaikan secara automatik mengikut perubahan pasaran, tanpa perlu menetapkan parameter tetap secara manual.
Tambah saluran penapis rendah FAMA, yang boleh menapis penembusan palsu.
Dengan menggunakan reka bentuk purata bergerak berganda, ia dapat mengesan trend garis panjang di pasaran.
Logik strategi mudah difahami dan diubah suai.
Indikator visual intuitif, anda dapat melihat isyarat dagangan dengan jelas.
Strategi ini mempunyai beberapa risiko:
Strategi silang dua baris mudah menghasilkan banyak isyarat perdagangan, dan disarankan untuk mengawal jarak dan penarikan balik dengan sewajarnya.
Pengiraan garis MAMA dan FAMA adalah rumit dan parameter yang tidak betul boleh menyebabkan kurva berubah.
Parameter penyesuaian sendiri mungkin menyebabkan pengoptimuman berlebihan dan perlu disahkan bersama-sama dengan petunjuk teknikal lain.
Persaingan dua baris berada di belakang masa, mungkin terlepas titik peralihan trend.
Berhati-hatilah dengan risiko kerosakan akibat penembusan palsu.
Strategi ini boleh dioptimumkan dalam beberapa arah:
Mengoptimumkan parameter untuk mencari kombinasi parameter terhad cepat dan terhad perlahan yang terbaik.
Meningkatkan strategi penangguhan kerugian dan mengawal ketat penangguhan kerugian tunggal.
Gabungan dengan isyarat penapis indikator lain, seperti MACD, RSI, dan lain-lain, untuk mengelakkan penembusan palsu.
Meningkatkan indikator trend dan mengelakkan dagangan berlawanan arah.
Mengoptimumkan kelajuan masuk, menyesuaikan keperluan jarak antara dua laluan, mengurangkan terlalu banyak transaksi.
Mengoptimumkan strategi penangguhan, menggunakan penangguhan yang berbeza mengikut kekuatan trend.
Uji perbezaan parameter yang berbeza untuk mencari kombinasi parameter terbaik.
Strategi overall ini adalah strategi pengesanan trend tipikal, menggunakan Ehlers MESA adaptasi purata bergerak untuk membina petunjuk visual, dan menghasilkan isyarat perdagangan dengan cara silang dua baris. Strategi ini mempunyai kelebihan seperti parameter adaptasi, penembusan palsu gelombang, visualisasi, dan juga risiko seperti perdagangan berganda.
/*backtest
start: 2023-09-20 00:00:00
end: 2023-09-27 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=2
// @author LazyBear
//
// List of my public indicators: http://bit.ly/1LQaPK8
// List of my app-store indicators: http://blog.tradingview.com/?p=970
//
strategy("Ehlers MESA Adaptive Moving Average [LazyBear with ekoronin fix]", shorttitle="EMAMA_LB (ekoronin fix)", overlay=false, calc_on_every_tick=true, precision=0)
src=input(close, title="Source")
fl=input(.4, title="Fast Limit")
sl=input(.04, title="Slow Limit")
pi = 3.1415926
sp = (4*src + 3*src[1] + 2*src[2] + src[3]) / 10.0
dt = (.0962*sp + .5769*nz(sp[2]) - .5769*nz(sp[4])- .0962*nz(sp[6]))*(.075*nz(p[1]) + .54)
q1 = (.0962*dt + .5769*nz(dt[2]) - .5769*nz(dt[4])- .0962*nz(dt[6]))*(.075*nz(p[1]) + .54)
i1 = nz(dt[3])
jI = (.0962*i1 + .5769*nz(i1[2]) - .5769*nz(i1[4])- .0962*nz(i1[6]))*(.075*nz(p[1]) + .54)
jq = (.0962*q1 + .5769*nz(q1[2]) - .5769*nz(q1[4])- .0962*nz(q1[6]))*(.075*nz(p[1]) + .54)
i2_ = i1 - jq
q2_ = q1 + jI
i2 = .2*i2_ + .8*nz(i2[1])
q2 = .2*q2_ + .8*nz(q2[1])
re_ = i2*nz(i2[1]) + q2*nz(q2[1])
im_ = i2*nz(q2[1]) - q2*nz(i2[1])
re = .2*re_ + .8*nz(re[1])
im = .2*im_ + .8*nz(im[1])
//p1 = iff(im!=0 and re!=0, 360/atan(im/re), nz(p[1]))
p1 = iff(im!=0 and re!=0, 2*pi/atan(im/re), nz(p[1]))
p2 = iff(p1 > 1.5*nz(p1[1]), 1.5*nz(p1[1]), iff(p1 < 0.67*nz(p1[1]), 0.67*nz(p1[1]), p1))
p3 = iff(p2<6, 6, iff (p2 > 50, 50, p2))
p = .2*p3 + .8*nz(p3[1])
spp = .33*p + .67*nz(spp[1])
//phase = atan(q1 / i1)
phase = 180/pi * atan(q1 / i1)
dphase_ = nz(phase[1]) - phase
dphase = iff(dphase_< 1, 1, dphase_)
alpha_ = fl / dphase
alpha = iff(alpha_ < sl, sl, iff(alpha_ > fl, fl, alpha_))
mama = alpha*src + (1 - alpha)*nz(mama[1])
fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])
//pa=input(false, title="Mark crossover points")
//plotarrow(pa?(cross(mama, fama)?mama<fama?-1:1:na):na, title="Crossover Markers")
//fr=input(false, title="Fill MAMA/FAMA Region")
//duml=plot(fr?(mama>fama?mama:fama):na, style=circles, color=gray, linewidth=0, title="DummyL")
//mamal=plot(mama, title="MAMA", color=red, linewidth=2)
//famal=plot(fama, title="FAMA", color=green, linewidth=2)
//fill(duml, mamal, red, transp=70, title="NegativeFill")
//fill(duml, famal, green, transp=70, title="PositiveFill")
//ebc=input(false, title="Enable Bar colors")
//bc=mama>fama?lime:red
//barcolor(ebc?bc:na)
longSpike=mama>fama? 1:0
shortSpike=mama<fama? 1:0
plot(longSpike, title = "Mama Long", style=line, linewidth=1, color=yellow)
plot(shortSpike, title = "Mama Short", style=line, linewidth=1, color=red)
//possig = iff(reverse and pos == 1, -1,
// iff(reverse and pos == -1, 1, pos))
if (longSpike)
strategy.entry("Long", strategy.long)
if (shortSpike)
strategy.entry("Short", strategy.short)