Ehler's "Dominant Cycle Measured by Zero Crossings of the Band-Pass Filter"

Not 100% sure I got it right. Might be, might be not.

Looks believable.


Code

var rad(var degrees) { return degrees*PI/180; }
var rcos(var degrees) {	return cos(rad(degrees)); }
var rsin(var degrees) {	return sin(rad(degrees)); }

var DCBandPass(var* Close, var Period, var Bandwidth)
{
	var alpha2;
	var* HP = series(0, 3);
	var gamma1;
	var alpha1;
	var beta1;
	var* BP = series(0, 3);
	var* Peak = series(0, 2);
	var* Real = series(0, 3);
	var* counter = series(0, 2);
	var* DC = series(0, 2);
	
	alpha2 = (
			rcos(.25*Bandwidth*360 / Period) + 
			rsin(.25*Bandwidth*360 / Period) - 1
		) / rcos(.25*Bandwidth*360 / Period);

	HP[0] = (1 + alpha2 / 2)*(Close[0] - Close[1]) + 
		(1- alpha2)*HP[1];
		
	beta1 = rcos(360 / Period);
	
	gamma1 = 1 / rcos(360*Bandwidth / Period);
	alpha1 = gamma1 - sqrt(gamma1*gamma1 - 1);
	
	BP[0] = .5*(1 - alpha1)*(HP[0] - HP[2]) + 
		beta1*(1 + alpha1)*BP[1] - alpha1*BP[2];

	Peak[0] = .991*Peak[1];
	
	if (abs(BP[0]) > Peak[0]) Peak[0] = abs(BP[0]);
	
	if (Peak[0] != 0) Real[0] = BP[0] / Peak[0];
	
	DC[0] = DC[1];
	if (DC[0] < 6) DC[0] = 6;
	counter[0] = counter[1] + 1;
	
	if (crossOver(Real, 0) || crossUnder(Real, 0)) {
		DC[0] = 2*counter[0];					
		if (2*counter[0] > 1.25*DC[1]) {

			DC[0] = 1.25*DC[1];
		}
		if (2*counter[0] < .8*DC[1]) {
			DC[0] = .8*DC[1];
		}
		counter[0] = 0;
	}
	
	return DC[0];
}


function run()
{
	set(PLOTNOW);
	BarPeriod = 1;
	LookBack = 300;
	StartDate = 20210810;
	EndDate = 20210816;

	vars closes = series(priceClose());

	var dc = DCBandPass(closes, 20, .7);
	var ht_dc = HTDcPeriod(closes);
	
	var sma = SMA(closes, dc);
	var ht_sma = SMA(closes, ht_dc);
	
	plot("BPDC SMA", sma, MAIN, RED);
	plot("HTDC SMA", ht_sma, MAIN, BLACK);
	
	plot("BP DC", dc, NEW, RED);
	plot("HT DC", ht_dc, END, BLACK);
}

[Linked Image]

Last edited by Lapsa; 08/21/21 15:03.