Ehlers MESA Adaptive Moving Average [LazyBear]

(code)

Code
//
// @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);
}



(img)

[Linked Image]