//
// @author LazyBear
//
// List of my public indicators: http://bit.ly/1LQaPK8
// List of my app-store indicators: http://blog.tradingview.com/?p=970
//
// study("Ehlers MESA Adaptive Moving Average [LazyBear]", shorttitle="EMAMA_LB", overlay=true, precision=3)
// 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)
var nz(var x) {
return x;
}
var nz(var x, var y) {
if (x != 0) return x;
return y;
}
function run()
{
set(PLOTNOW);
StartDate = 20220114;
BarPeriod = 1;
LookBack = 100;
BarMode = BR_FLAT;
vars src = series(price());
vars dt = series(0, 3);
vars sp = series(0, 6);
vars q1 = series(0, 6);
vars i1 = series(0, 6);
vars jI = series(0, 6);
vars jq = series(0, 6);
vars i2 = series(0, 2);
vars q2 = series(0, 2);
vars re = series(0, 2);
vars im = series(0, 2);
vars p = series(0, 2);
vars spp = series(0, 2);
vars phase = series(0, 2);
vars mama = series(0, 2);
vars fama = series(0, 2);
vars p1 = series(0, 2);
vars p3 = series(0, 2);
var fl = .5;
var sl = .05;
sp[0] = (4*src[0] + 3*src[1] + 2*src[2] + src[3]) / 10.0;
dt[0] = (.0962*sp[0] + .5769*nz(sp[2]) - .5769*nz(sp[4])- .0962*nz(sp[6]))*(.075*nz(p[1]) + .54);
q1[0] = (.0962*dt[0] + .5769*nz(dt[2]) - .5769*nz(dt[4])- .0962*nz(dt[6]))*(.075*nz(p[1]) + .54);
i1[0] = nz(dt[3]);
jI[0] = (.0962*i1[0] + .5769*nz(i1[2]) - .5769*nz(i1[4])- .0962*nz(i1[6]))*(.075*nz(p[1]) + .54);
jq[0] = (.0962*q1[0] + .5769*nz(q1[2]) - .5769*nz(q1[4])- .0962*nz(q1[6]))*(.075*nz(p[1]) + .54);
var i2_ = i1[0] - jq[0];
var q2_ = q1[0] + jI[0];
i2[0] = .2*i2_ + .8*nz(i2[1]);
q2[0] = .2*q2_ + .8*nz(q2[1]);
var re_ = i2[0]*nz(i2[1]) + q2[0]*nz(q2[1]);
var im_ = i2[0]*nz(q2[1]) - q2[0]*nz(i2[1]);
re[0] = .2*re_ + .8*nz(re[1]);
im[0] = .2*im_ + .8*nz(im[1]);
if(im[0]!=0 && re[0]!=0) {
p1[0] = 360/atan(im[0]/re[0]);
} else {
p1[0] = nz(p[1]);
}
var p2;
if(p1[0] > 1.5*nz(p1[1])) {
p2 = 1.5*nz(p1[1]);
} else {
if (p1[0] < .67*nz(p1[1])) {
p2 = .67*nz(p1[1]);
} else {
p2 = p1[1];
}
}
if (p2<6) {
p3[0] = 6;
} else {
if (p2 > 50) {
p3[0] = 50;
} else {
p3[0] = p2;
}
}
p[0] = .2*p3[0]+.8*nz(p3[1]);
spp[0] = .33*p[0]+.67*nz(spp[1]);
phase[0] = atan(q1[0] / i1[0]);
var dphase_ = nz(phase[1]) - phase[0];
var dphase;
if (dphase_ < 1) {
dphase = 1;
} else {
dphase = dphase_;
}
var alpha_ = fl / dphase;
var alpha;
if (alpha_ < sl) {
alpha = sl;
} else {
if (alpha_ > fl) {
alpha = fl;
} else {
alpha = alpha_;
}
}
mama[0] = alpha * src[0] + (1 - alpha)*nz(mama[1]);
fama[0] = .5*alpha*mama[0]+(1-.5*alpha)*nz(fama[1]);
plot("mama", mama, NEW, RED);
plot("fama", fama, END, BLUE);
MAMA(src, fl, .5);
plot("z mama", rMAMA, NEW, RED);
plot("z fama", rFAMA, END, BLUE);
}