summaryrefslogtreecommitdiffstats
path: root/test/adx.c
blob: aac452d6b4504a43528ba3bc37ef6663591c5844 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <math.h>
#include <stdlib.h>
#include "ts.h"

bool ts_test_adx( void )
{
	uint_t n = 14;
	uint_t k = 3;

	/* Monotonically rising data: +DM=1 each bar, -DM=0, TR=3 */
	fp_t *x[4];
	x[0] = malloc( n * sizeof( fp_t ) );
	x[1] = malloc( n * sizeof( fp_t ) );
	x[2] = malloc( n * sizeof( fp_t ) );
	x[3] = malloc( n * sizeof( fp_t ) );
	if ( !x[0 ] || !x[1] || !x[2] || !x[3] )
	{
		free( x[0] ); free( x[1] ); free( x[2] ); free( x[3] );
		return false;
	}

	for ( uint_t i = 0; i < n; ++i )
	{
		x[0][i] = 10 + i;
		x[1][i] = 12 + i;
		x[2][i] = 9 + i;
		x[3][i] = 11 + i;
	}

	/* Expected: +DI=100/3, -DI=0, DX=100, ADX=100 (converged EMAs) */
	fp_t edp[] = { 100.0 / 3, 100.0 / 3, 100.0 / 3, 100.0 / 3, 100.0 / 3, 100.0 / 3, 100.0 / 3, 100.0 / 3, 100.0 / 3, 100.0 / 3 };
	fp_t edm[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
	fp_t edx[] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };
	fp_t ead[] = { 100, 100, 100, 100, 100, 100, 100, 100, 100, 100 };
	fp_t *e[4] = { edp, edm, edx, ead };

	uint_t offset = k + 1;
	uint_t y_n = n - offset;

	/* Allocate full-size output since the function writes to absolute
	 * indices [offset..n-1], not compacted [0..y_n-1] */
	fp_t *y[4];
	for ( uint_t i = 0; i < 4; ++i )
	{
		y[i] = calloc( n, sizeof( fp_t ) );
		if ( !y[i] )
		{
			for ( uint_t j = 0; j < i; ++j )
				free( y[j] );
			free( x[0] ); free( x[1] ); free( x[2] ); free( x[3] );
			return false;
		}
	}

	uint8_t c[TS_CONSTANT_SIZE] = { 0 };
	*( uint_t * )c = k;

	ts_adx(y, ts_adx_p.n_outputs, (fp_t const * const *)x, ts_adx_p.n_inputs, n, (ts_constant_t const *)c);

	bool result = true;
	for ( uint_t i = 0; i < 4; ++i )
	{
		for ( uint_t j = 0; j < y_n; ++j )
		{
			if ( fabs( y[i][offset + j] - e[i][j] ) > TS_TEST_EPSILON )
				result = false;
		}
	}

	for ( uint_t i = 0; i < 4; ++i )
		free( y[i] );
	free( x[0] ); free( x[1] ); free( x[2] ); free( x[3] );

	return result;
}