#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);
}
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:
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);
}
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