Trigonometric functions (Sine, Cosine etc) expect angles in degrees (0..360), while in C and in most other languages angles are in radians (0..2*PI). Log is the logarithm base e as in C.
Seemingly best use: - set long periods - 0 crossover for uptrend - 0 crossunder for downtrend
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 DecyclerOscillator(var* Close, var HPPeriod1, var HPPeriod2) // 30 60
{
var alpha1;
var alpha2;
var* hp1 = series(0,3);
var* hp2 = series(0,3);
alpha1 =
(rcos(.707*360/HPPeriod1)+
rsin(.707*360/HPPeriod1)-1)
/rcos(.707*360/HPPeriod1);
alpha2 =
(rcos(.707*360/HPPeriod2)+
rsin(.707*360/HPPeriod2)-1)/
rcos(.707*360/HPPeriod2);
hp1[0] = (1-alpha1/2)*(1-alpha1/2)*
(Close[0]-2*Close[1]+Close[2])+
2*(1-alpha1)*hp1[1]-(1-alpha1)*
(1-alpha1)*hp1[2];
hp2[0] = (1-alpha2/2)*(1-alpha2/2)*
(Close[0]-2*Close[1]+Close[2])+
2*(1-alpha2)*hp2[1]-(1-alpha2)*
(1-alpha2)*hp2[2];
return hp2[0] - hp1[0];
}
function run()
{
set(PLOTNOW);
BarPeriod = 1;
LookBack = 100;
StartDate = 20210702;
EndDate = 20210816;
vars closes = series(priceClose());
var osc = DecyclerOscillator(closes, 30, 60);
var zma = ZMA(closes, 30);
plot("ZMA", zma, MAIN, BLACK);
plot("Decycler OSC", osc, NEW, BLACK);
}
Refactored:
Code
var DecyclerOscillator(var* Close, var HPPeriod1, var HPPeriod2) // 30 60
{
return HighPass2(Close, HPPeriod2) - HighPass2(Close, HPPeriod1);
}