Ehler's "Even Better Sinewave"

Looks usable.



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 EvenBetterSinewave(vars Close, var Duration)
{
	var alpha1;
	var* HP = series(1,2);
	var a1;
	var b1;
	var c1;
	var c2;
	var c3;
	var* Filt = series(1,3);
	var count;
	var Wave;
	var Pwr;
	
	// HighPass filter cyclic components whose periods are shorter than Duration input
	alpha1 = (1 - rsin(360 / Duration)) / rcos(360 / Duration);
	HP[0] = .5*(1 + alpha1)*(Close[0] - Close[1]) + alpha1*HP[1];
	
	// Smooth with a Super Smoother Filter from equation 3-3
	a1 = exp(-1.414*3.14159 / Duration);
	b1 = 2*a1*rcos(1.414*180 / Duration);
	c2 = b1;
	c3 = -a1*a1;
	c1 = 1 - c2 - c3;
	Filt[0] = c1*(HP[0] + HP[1]) / 2 + c2*Filt[1] + c3*Filt[2];
	
	// 3 Bar average of Wave amplitude and power
	Wave = (Filt[0] + Filt[1] + Filt[2]) / 3;
	Pwr = (Filt[0]*Filt[0] + Filt[1]*Filt[1] + Filt[2]*Filt[2]) / 3;
	
	// Normalize the Average Wave to Square Root of the Average Power
	return Wave / sqrt(Pwr);
}

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

	vars close = series(priceClose());
		
	var evenBetterSinewave = EvenBetterSinewave(close, 10);
	
	plot("EBSW", evenBetterSinewave, NEW, BLACK);
}


[Linked Image]

Refucktored version:

Code
#include <profile.c>

var EvenBetterSinewave(vars Close, var Duration)
{
	var Wave;
	var Pwr;
		
	var* HP = series(HighPass1(Close, Duration), 2);
	if (HP[0] == 0) HP[0] = 1;
	
	var* Filt = series(Smooth(HP, Duration), 3);	
	Wave = SMA(Filt, 3);
	Pwr = (Filt[0]*Filt[0] + Filt[1]*Filt[1] + Filt[2]*Filt[2]) / 3;
	
	return Wave / sqrt(Pwr);
}

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

	vars close = series(priceClose());
		
	var evenBetterSinewave = EvenBetterSinewave(close, 10);
	
	plot("EBSW", evenBetterSinewave, NEW, BLACK);
}


Comparison with [CC] EBSW indicator on TradingView:

[Linked Image]


Interestingly - that one allows setting HighPass length separately from SuperSmoothFilter length.

Like this:

Code
var EvenBetterSinewave(vars Close, var HPLength, SSFLength)
{
	var Wave;
	var Pwr;
		
	var* HP = series(HighPass1(Close, HPLength), 2);
	if (HP[0] == 0) HP[0] = 1;
	
	var* Filt = series(Smooth(HP, SSFLength), 3);	
	Wave = SMA(Filt, 3);
	Pwr = (Filt[0]*Filt[0] + Filt[1]*Filt[1] + Filt[2]*Filt[2]) / 3;
	
	return Wave / sqrt(Pwr);
}


Lets smash in some trade signals!!!111eleven


Code
#include <profile.c>

var EvenBetterSinewave(vars Close, var Duration)
{
	var Wave;
	var Pwr;
		
	var* HP = series(HighPass1(Close, Duration), 2);
	if (HP[0] == 0) HP[0] = 1;
	
	var* Filt = series(Smooth(HP, Duration), 3);	
	Wave = SMA(Filt, 3);
	Pwr = (Filt[0]*Filt[0] + Filt[1]*Filt[1] + Filt[2]*Filt[2]) / 3;
	
	return Wave / sqrt(Pwr);
}

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

	vars close = series(priceClose());

	var* ebsw = series(EvenBetterSinewave(close, 225));
	
	if (crossOver(ebsw, -.99)) enterLong();	
	if (crossUnder(ebsw, .99)) enterShort();

	plot("EBSW", ebsw, NEW, BLACK);
}


[Linked Image]

Quote

Monte Carlo Analysis... Median AR 805%
Win 732$ MI 489$ DD 144$ Capital 448$
Trades 245 Win 38.8% Avg +29.9p Bars 181
AR 1311% PF 1.44 SR 0.00 UI 0% R2 1.00


Gotta fit that curve!

Last edited by Lapsa; 08/22/21 21:50.