Ehler's Decycler Oscillator (fixed)

Quote

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


[Linked Image]

Refactored:

Code
var DecyclerOscillator(var* Close, var HPPeriod1, var HPPeriod2) // 30 60
{
	return HighPass2(Close, HPPeriod2) - HighPass2(Close, HPPeriod1);
}


Last edited by Lapsa; 08/21/21 23:34.