Ehler's "Band-Pass Filter"


Code
#include <profile.c>

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 BPSignal;
var BPTrigger;

var BandPassFilter(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* Signal = series(0, 2);
	var* Trigger = 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) Signal[0] = BP[0] / Peak[0];
	
	alpha2 = (rcos(1.5*Bandwidth*360 / Period) + 
		rsin(1.5*Bandwidth*360 / Period) - 1) / 
		rcos(1.5*Bandwidth*360 / Period);

	Trigger[0] = 
		(1 + alpha2 / 2)*(Signal[0] - Signal[1]) +
		(1- alpha2)*Trigger[1];
		
	BPSignal = Signal[0];
	BPTrigger = Trigger[0];
}

function run()
{
	set(PLOTNOW);
	BarPeriod = 1;
	LookBack = 100;
	StartDate = 20210702;
	EndDate = 20210816;

	vars closes = series(priceClose());
	BandPassFilter(closes, 20, .3);
	
	plot("Signal", BPSignal, NEW, BLACK);
	plot("Trigger", BPTrigger, END, RED);
}


[Linked Image]

Lets smash in some trade signals!!!111eleven

Code
#include <profile.c>

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 BPSignal;
var BPTrigger;

var BandPassFilter(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* Signal = series(0, 2);
	var* Trigger = 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) Signal[0] = BP[0] / Peak[0];
	
	alpha2 = (rcos(1.5*Bandwidth*360 / Period) + 
		rsin(1.5*Bandwidth*360 / Period) - 1) / 
		rcos(1.5*Bandwidth*360 / Period);

	Trigger[0] = 
		(1 + alpha2 / 2)*(Signal[0] - Signal[1]) +
		(1- alpha2)*Trigger[1];
		
	BPSignal = Signal[0];
	BPTrigger = Trigger[0];
}

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

	vars closes = series(priceClose());
	BandPassFilter(closes, 23, .05821);
	
	var* signalSeries = series(BPSignal);
	var* triggerSeries = series(BPTrigger);	

	MaxLong = 1;
	MaxShort = 1;
	
	if (
		BPTrigger < BPSignal
		//&& BPSignal > -0.3
	) {
		if (ProfitOpen >= 0) enterLong();
		else exitShort();
	}
	if (
		BPTrigger > BPSignal
		//&& BPSignal < 0.3
	) {
		if (ProfitOpen >= 0)	enterShort();
		else exitLong();
	}
	
	plot("Signal", BPSignal, NEW, BLACK);
	plot("Trigger", BPTrigger, END, RED);
}


[Linked Image]

Quote

Monte Carlo Analysis... Median AR 4054%
Win 318$ MI 1481$ DD 134$ Capital 409$
Trades 424 Win 50.9% Avg +7.5p Bars 13
AR 4350% PF 1.22 SR 0.00 UI 0% R2 1.00


High signal count.

Only Period of 23 works seemingly well in combination with that weird bandwidth of .05821.

Fails to perform month before.


Last edited by Lapsa; 08/21/21 14:32.