8
8
9
9
#include <mysql.h>
10
10
#include <ctype.h>
11
+ #include <float.h>
11
12
#include "ta_libmysqludf_ta.h"
12
13
13
14
/*
18
19
typedef struct ta_tr_win_data_ {
19
20
double previous_close ;
20
21
double current_close ;
22
+ double group_high ;
23
+ double group_low ;
21
24
short int init ;
25
+ short int init_group ;
22
26
} ta_tr_win_data ;
23
27
24
28
DLLEXP my_bool ta_tr_win_init (UDF_INIT * initid , UDF_ARGS * args , char * message )
@@ -58,8 +62,12 @@ DLLEXP my_bool ta_tr_win_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
58
62
return 1 ;
59
63
}
60
64
65
+ data -> current_close = 0.0 ;
66
+ data -> group_high = DBL_MIN ;
67
+ data -> group_low = DBL_MAX ;
61
68
data -> previous_close = 0.0 ;
62
- data -> init = -1 ;
69
+ data -> init = 0 ;
70
+ data -> init_group = 0 ;
63
71
64
72
initid -> ptr = (char * )data ;
65
73
/*
@@ -76,21 +84,14 @@ DLLEXP void ta_tr_win_deinit(UDF_INIT *initid)
76
84
77
85
DLLEXP double ta_tr_win (UDF_INIT * initid , UDF_ARGS * args , char * is_null , char * error )
78
86
{
79
- ta_tr_win_data * data = (ta_tr_win_data * )initid -> ptr ;
80
- double * high = (double * )args -> args [0 ];
81
- double * low = (double * )args -> args [1 ];
82
- double * close = (double * )args -> args [2 ];
83
-
84
- if (close == NULL ) {
85
- * is_null = 1 ;
86
- return 0.0 ;
87
- }
87
+ ta_tr_win_data * data = (ta_tr_win_data * )initid -> ptr ;
88
88
89
- //fprintf(stderr, "tr\thigh=%f,low=%f,close=%f,previous_close=%f\n", *high, *low, *close, data->previous_close);
89
+
90
+ //fprintf(stderr, "tr\thigh=%f,low=%f,close=%f,previous_close=%f\n", data->group_high, data->group_low, data->current_close, data->previous_close);
90
91
//fflush(stderr);
91
92
92
- if (data -> init > 0 ) {
93
- return (* high > data -> previous_close ? * high : data -> previous_close ) - (* low < data -> previous_close ? * low : data -> previous_close );
93
+ if (data -> init_group > 0 ) {
94
+ return (data -> group_high > data -> previous_close ? data -> group_high : data -> previous_close ) - (data -> group_low < data -> previous_close ? data -> group_low : data -> previous_close );
94
95
} else {
95
96
* is_null = 1 ;
96
97
return 0.0 ;
@@ -101,41 +102,41 @@ void ta_tr_win_clear(UDF_INIT *initid, char *is_null, char *error) {
101
102
ta_tr_win_data * data = (ta_tr_win_data * )initid -> ptr ;
102
103
103
104
if (data -> init > 0 ) {
105
+ data -> init_group = 1 ;
104
106
data -> previous_close = data -> current_close ;
107
+ data -> group_high = DBL_MIN ;
108
+ data -> group_low = DBL_MAX ;
105
109
} else {
106
110
* is_null = 1 ;
107
- data -> init ++ ;
108
111
}
109
- //fprintf(stderr, "clear\tinit=%i\n", data->init);
112
+ //fprintf(stderr, "clear\tinit=%i\tinit_group=%i\ n", data->init, data->init_group );
110
113
//fflush(stderr);
111
114
}
112
115
113
116
void ta_tr_win_add (UDF_INIT * initid , UDF_ARGS * args , char * is_null , char * error ) {
114
117
ta_tr_win_data * data = (ta_tr_win_data * )initid -> ptr ;
115
- // double *high = (double *)args->args[0];
116
- // double *low = (double *)args->args[1];
117
- double * close = (double * )args -> args [2 ];
118
+ double * high = (double * )args -> args [0 ];
119
+ double * low = (double * )args -> args [1 ];
120
+ double * close = (double * )args -> args [2 ];
118
121
122
+ data -> init = 1 ;
119
123
data -> current_close = * close ;
120
- if (data -> init < 1 ) {
124
+ if (* high > data -> group_high ) {
125
+ data -> group_high = * high ;
126
+ }
127
+ if (* low < data -> group_low ) {
128
+ data -> group_low = * low ;
129
+ }
130
+ if (data -> init_group == 0 ) {
131
+ //fprintf(stderr, "init group is false\n");
121
132
* is_null = 1 ;
122
133
}
123
134
//fprintf(stderr, "add\thigh=%f,low=%f,close=%f,last_c=%f\n", *high, *low, *close, data->previous_close);
124
135
//fflush(stderr);
125
136
}
126
137
127
- void ta_tr_win_reset (UDF_INIT * initid , UDF_ARGS * args , char * is_null , char * error ) {
128
-
129
- //double *value = (double*)args->args[0];
130
-
131
- //fprintf(stderr, "reset %f\n", *value);
132
- //fflush(stderr);
133
-
134
- }
135
-
136
138
void ta_tr_win_remove (UDF_INIT * initid , UDF_ARGS * args , char * is_null , char * error ) {
137
-
138
- //fprintf(stderr, "remove\n");
139
- //fflush(stderr);
140
-
139
+ // do not remove this function, the udf will return incorrect results if you do.
140
+ //fprintf(stderr, "remove\n");
141
+ //fflush(stderr);
141
142
}
0 commit comments