Strategi ini berdasarkan Ehlers MESA Adaptive Moving Average dan merancang strategi perdagangan trend yang mengesan persilangan antara dua purata bergerak. Ia pergi lama apabila garis pantas melintasi di atas garis perlahan, dan pergi pendek apabila garis pantas melintasi di bawah garis perlahan. Ini adalah strategi persilangan purata bergerak berganda yang tipikal.
Inti strategi ini adalah untuk mengira dua purata bergerak adaptif: garisan MAMA dan garisan FAMA.
alpha = fl / dphase
alpha = iff(alpha < sl, sl, iff(alpha > fl, fl, alpha))
mama = alpha*src + (1 - alpha)*nz(mama[1])
Di mana fl adalah had pantas, sl adalah had perlahan, dan dphase adalah perbezaan fasa.
Garis FAMA dikira sebagai:
fama = .5*alpha*mama + (1 - .5*alpha)*nz(fama[1])
Garis FAMA adalah penghalusan melalui rendah yang disaring dari garis MAMA.
Strategi ini membandingkan hubungan magnitud antara garis MAMA dan FAMA untuk menentukan sama ada pasaran kini berada dalam trend menaik atau menurun, dan menghasilkan isyarat perdagangan berdasarkan ini.
Strategi ini mempunyai kelebihan berikut:
Menggunakan purata bergerak adaptif di mana parameter menyesuaikan secara automatik berdasarkan perubahan pasaran, tanpa memerlukan parameter tetap yang ditetapkan secara manual.
Baris penapis FAMA yang rendah boleh menapis penyebaran palsu.
Menggunakan reka bentuk purata bergerak berganda boleh mengesan trend jangka sederhana hingga panjang.
Logik strategi yang mudah dan jelas yang mudah difahami dan diubah suai.
Penunjuk visual yang jelas menunjukkan isyarat perdagangan.
Strategi ini juga mempunyai beberapa risiko:
Strategi crossover dua baris boleh menghasilkan isyarat dagangan yang berlebihan, pengambilan dan kawalan selang yang betul disyorkan.
Pengiraan MAMA dan FAMA yang kompleks, tetapan parameter yang tidak betul boleh menyebabkan penyimpangan lengkung.
Parameter penyesuaian boleh menyebabkan pemasangan berlebihan, perlu disahkan dengan penunjuk teknikal lain.
Persalinan dua garis mempunyai kelewatan masa, mungkin terlepas titik perubahan trend.
Perlu berhati-hati dengan risiko stop loss daripada pelarian palsu.
Strategi ini boleh dioptimumkan dalam bidang berikut:
Mengoptimumkan tetapan parameter untuk mencari kombinasi had pantas dan had perlahan yang terbaik.
Tambah strategi stop loss untuk mengawal secara ketat setiap perdagangan stop loss.
Tambah penunjuk lain untuk menapis isyarat, seperti MACD, RSI dan lain-lain untuk mengelakkan pecah palsu.
Tambah indikator penilaian trend untuk mengelakkan perdagangan kontra-trend.
Mengoptimumkan kadar kemasukan dengan menyesuaikan keperluan silang untuk mengurangkan perdagangan yang terlalu kerap.
Mengoptimumkan strategi mengambil keuntungan mengikut kekuatan trend.
Uji perbezaan parameter antara pelbagai produk untuk mencari kombinasi parameter yang optimum.
Secara keseluruhan, ini adalah trend yang biasa mengikuti strategi, menggunakan purata bergerak adaptif Ehlers MESA untuk membina penunjuk yang dapat dilihat dan menghasilkan isyarat perdagangan melalui persimpangan garis berganda. Strategi ini mempunyai kelebihan seperti parameter adaptif, penapisan pecah palsu dan visualisasi, tetapi juga risiko seperti kelewatan masa dan perdagangan yang berlebihan. Penambahbaikan masa depan boleh dibuat melalui pengoptimuman parameter, strategi kehilangan berhenti, penapisan isyarat dan lain-lain untuk menjadikan strategi lebih mantap.
/*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)