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