Strategi ini berdasarkan kepada penunjuk EMA (Exponential Moving Average) dan MAMA (MESA Adaptive Moving Average) untuk menentukan arah trend dan menjana isyarat perdagangan mengikut persilangan mereka. EMA sering digunakan untuk menilai arah trend pasaran, sementara MAMA dapat menangkap titik perubahan pasaran dengan lebih tepat. Menggunakan kedua-duanya dapat meningkatkan prestasi strategi.
Mengira EMA pantas dan EMA perlahan, yang mencerminkan trend jangka pendek dan jangka panjang pasaran masing-masing.
Hitung garis MAMA dan FAMA, yang merupakan purata bergerak adaptif.
Apabila EMA cepat melintasi di atas EMA perlahan, isyarat beli dihasilkan.
Apabila EMA cepat melintasi di bawah EMA perlahan, isyarat jual dihasilkan.
Apabila MAMA melintasi di atas FAMA, isyarat beli dihasilkan.
Apabila MAMA melintasi di bawah FAMA, isyarat jual dihasilkan.
Crossover MAMA dan FAMA boleh digunakan untuk mengesahkan isyarat EMA atau menyediakan pengesanan awal perubahan trend.
Secara khusus, strategi ini mula-mula mengira EMA cepat (fl) dan EMA perlahan (sl), yang mencerminkan trend jangka pendek dan jangka panjang masing-masing.
Kemudian ia mengira MAMA dan FAMA berdasarkan formula John Ehlers:
Mengira Transformasi Hilbert harga dan maklumat fasa ekstrak isyarat.
Mengira frekuensi sesaat p berdasarkan maklumat fasa.
Mengira faktor berat α berdasarkan nilai p.
Mengira MAMA dan FAMA berdasarkan α.
Akhirnya, isyarat dagangan dihasilkan berdasarkan persilangan EMA dan MAMA/FAMA:
Strategi ini menggabungkan kelebihan penunjuk EMA dan MAMA untuk meningkatkan ketepatan isyarat perdagangan.
Kelebihan EMA:
Kelebihan MAMA:
Kelebihan menggabungkan mereka:
Risiko utama strategi ini:
Penyelesaian:
Strategi ini boleh dioptimumkan dalam aspek berikut:
Strategi ini mengintegrasikan kekuatan penunjuk EMA dan MAMA untuk mengikuti trend dan menangkap giliran tepat pada masanya. Dengan pengoptimuman parameter dan kawalan risiko, ia dapat mencapai peningkatan kadar kemenangan dan keuntungan. Tetapi pengguna masih harus berhati-hati berdasarkan keutamaan risiko peribadi.
/*backtest start: 2023-09-30 00:00:00 end: 2023-10-30 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=2 strategy("EMAMA strategy", overlay=true) //This entire strategy is courtesy of LazyBear for programming the original EMAMA system, I simply added a strategy element to everything to round things out. src=input(hl2, title="Source") fl=input(.5, title="Fast Limit") sl=input(.05, title="Slow Limit") 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])) 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) 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) longCondition = crossover(mama, fama) if (longCondition) strategy.entry("My Long Entry Id", strategy.long) shortCondition = crossunder(mama, fama) if (shortCondition) strategy.entry("My Short Entry Id", strategy.short)