1 /* TA-LIB Copyright (c) 1999-2007, Mario Fortier
2 * All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or
5 * without modification, are permitted provided that the following
6 * conditions are met:
7 *
8 * - Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 *
16 * - Neither name of author nor the names of its contributors
17 * may be used to endorse or promote products derived from this
18 * software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 * REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
29 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
30 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
31 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34 /* List of contributors:
35 *
36 * Initial Name/description
37 * -------------------------------------------------------------------
38 * MF Mario Fortier
39 *
40 *
41 * Change history:
42 *
43 * MMDDYY BY Description
44 * -------------------------------------------------------------------
45 * 120802 MF Template creation.
46 * 052603 MF Adapt code to compile with .NET Managed C++
47 *
48 */
49
50 /**** START GENCODE SECTION 1 - DO NOT DELETE THIS LINE ****/
51 /* All code within this section is automatically
52 * generated by gen_code. Any modification will be lost
53 * next time gen_code is run.
54 */
55 /* Generated */
56 /* Generated */ #if defined( _MANAGED )
57 /* Generated */ #include "TA-Lib-Core.h"
58 /* Generated */ #define TA_INTERNAL_ERROR(Id) (RetCode::InternalError)
59 /* Generated */ namespace TicTacTec { namespace TA { namespace Library {
60 /* Generated */ #elif defined( _JAVA )
61 /* Generated */ #include "ta_defs.h"
62 /* Generated */ #include "ta_java_defs.h"
63 /* Generated */ #define TA_INTERNAL_ERROR(Id) (RetCode.InternalError)
64 /* Generated */ #else
65 /* Generated */ #include <string.h>
66 /* Generated */ #include <math.h>
67 /* Generated */ #include "ta_func.h"
68 /* Generated */ #endif
69 /* Generated */
70 /* Generated */ #ifndef TA_UTILITY_H
71 /* Generated */ #include "ta_utility.h"
72 /* Generated */ #endif
73 /* Generated */
74 /* Generated */ #ifndef TA_MEMORY_H
75 /* Generated */ #include "ta_memory.h"
76 /* Generated */ #endif
77 /* Generated */
78 /* Generated */ #define TA_PREFIX(x) TA_##x
79 /* Generated */ #define INPUT_TYPE double
80 /* Generated */
81 /* Generated */ #if defined( _MANAGED )
HtTrendlineLookback(void)82 /* Generated */ int Core::HtTrendlineLookback( void )
83 /* Generated */
84 /* Generated */ #elif defined( _JAVA )
85 /* Generated */ public int htTrendlineLookback( )
86 /* Generated */
87 /* Generated */ #else
88 /* Generated */ int TA_HT_TRENDLINE_Lookback( void )
89 /* Generated */
90 /* Generated */ #endif
91 /**** END GENCODE SECTION 1 - DO NOT DELETE THIS LINE ****/
92 {
93 /* insert local variable here */
94
95 /**** START GENCODE SECTION 2 - DO NOT DELETE THIS LINE ****/
96 /* Generated */ /* No parameters to validate. */
97 /**** END GENCODE SECTION 2 - DO NOT DELETE THIS LINE ****/
98
99 /* insert lookback code here. */
100
101 /* 31 input are skip
102 * +32 output are skip to account for misc lookback
103 * ---
104 * 63 Total Lookback
105 *
106 * 31 is for being compatible with Tradestation.
107 * See TA_MAMA_Lookback for an explanation of the "32".
108 */
109 return 63 + TA_GLOBALS_UNSTABLE_PERIOD(TA_FUNC_UNST_HT_TRENDLINE,HtTrendline);
110 }
111
112 /**** START GENCODE SECTION 3 - DO NOT DELETE THIS LINE ****/
113 /*
114 * TA_HT_TRENDLINE - Hilbert Transform - Instantaneous Trendline
115 *
116 * Input = double
117 * Output = double
118 *
119 */
120 /* Generated */
121 /* Generated */ #if defined( _MANAGED ) && defined( USE_SUBARRAY )
122 /* Generated */ enum class Core::RetCode Core::HtTrendline( int startIdx,
123 /* Generated */ int endIdx,
124 /* Generated */ SubArray^ inReal,
125 /* Generated */ [Out]int% outBegIdx,
126 /* Generated */ [Out]int% outNBElement,
127 /* Generated */ cli::array<double>^ outReal )
128 /* Generated */ #elif defined( _MANAGED )
129 /* Generated */ enum class Core::RetCode Core::HtTrendline( int startIdx,
130 /* Generated */ int endIdx,
131 /* Generated */ cli::array<double>^ inReal,
132 /* Generated */ [Out]int% outBegIdx,
133 /* Generated */ [Out]int% outNBElement,
134 /* Generated */ cli::array<double>^ outReal )
135 /* Generated */ #elif defined( _JAVA )
136 /* Generated */ public RetCode htTrendline( int startIdx,
137 /* Generated */ int endIdx,
138 /* Generated */ double inReal[],
139 /* Generated */ MInteger outBegIdx,
140 /* Generated */ MInteger outNBElement,
141 /* Generated */ double outReal[] )
142 /* Generated */ #else
143 /* Generated */ TA_RetCode TA_HT_TRENDLINE( int startIdx,
144 /* Generated */ int endIdx,
145 /* Generated */ const double inReal[],
146 /* Generated */ int *outBegIdx,
147 /* Generated */ int *outNBElement,
148 /* Generated */ double outReal[] )
149 /* Generated */ #endif
150 /**** END GENCODE SECTION 3 - DO NOT DELETE THIS LINE ****/
151 {
152 /* insert local variable here */
153 int outIdx, i;
154 int lookbackTotal, today;
155 double tempReal, tempReal2;
156
157 double adjustedPrevPeriod, period;
158
159 /* Variable used for the price smoother (a weighted moving average). */
160 int trailingWMAIdx;
161 double periodWMASum, periodWMASub, trailingWMAValue;
162 double smoothedValue;
163
164 /* Variable to keep track of the last 3 ITrend */
165 double iTrend1, iTrend2, iTrend3;
166
167 /* Variables used for the Hilbert Transormation */
168 CONSTANT_DOUBLE(a) = 0.0962;
169 CONSTANT_DOUBLE(b) = 0.5769;
170 double hilbertTempReal;
171 int hilbertIdx;
172
173 HILBERT_VARIABLES( detrender );
174 HILBERT_VARIABLES( Q1 );
175 HILBERT_VARIABLES( jI );
176 HILBERT_VARIABLES( jQ );
177
178 double Q2, I2, prevQ2, prevI2, Re, Im;
179
180 double I1ForOddPrev2, I1ForOddPrev3;
181 double I1ForEvenPrev2, I1ForEvenPrev3;
182
183 double rad2Deg;
184
185 double todayValue, smoothPeriod;
186
187 /* Variable used to keep track of the previous
188 * smooth price. In the case of this algorithm,
189 * we will never need more than 50 values.
190 */
191 #define SMOOTH_PRICE_SIZE 50
192 CIRCBUF_PROLOG(smoothPrice,double,SMOOTH_PRICE_SIZE);
193 int idx;
194
195 /* Variable used to calculate the dominant cycle phase */
196 int DCPeriodInt;
197 double DCPeriod;
198
199 /**** START GENCODE SECTION 4 - DO NOT DELETE THIS LINE ****/
200 /* Generated */
201 /* Generated */ #ifndef TA_FUNC_NO_RANGE_CHECK
202 /* Generated */
203 /* Generated */ /* Validate the requested output range. */
204 /* Generated */ if( startIdx < 0 )
205 /* Generated */ return ENUM_VALUE(RetCode,TA_OUT_OF_RANGE_START_INDEX,OutOfRangeStartIndex);
206 /* Generated */ if( (endIdx < 0) || (endIdx < startIdx))
207 /* Generated */ return ENUM_VALUE(RetCode,TA_OUT_OF_RANGE_END_INDEX,OutOfRangeEndIndex);
208 /* Generated */
209 /* Generated */ #if !defined(_JAVA)
210 /* Generated */ if( !inReal ) return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);
211 /* Generated */ #endif /* !defined(_JAVA)*/
212 /* Generated */ #if !defined(_JAVA)
213 /* Generated */ if( !outReal )
214 /* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);
215 /* Generated */
216 /* Generated */ #endif /* !defined(_JAVA) */
217 /* Generated */ #endif /* TA_FUNC_NO_RANGE_CHECK */
218 /* Generated */
219 /**** END GENCODE SECTION 4 - DO NOT DELETE THIS LINE ****/
220
221 /* Insert TA function code here. */
222
223 CIRCBUF_INIT_LOCAL_ONLY(smoothPrice,double);
224
225 iTrend1 = iTrend2 = iTrend3 = 0.0;
226
227 /* Constant */
228 tempReal = std_atan(1);
229 rad2Deg = 45.0/tempReal;
230
231 /* Identify the minimum number of price bar needed
232 * to calculate at least one output.
233 */
234 lookbackTotal = 63 + TA_GLOBALS_UNSTABLE_PERIOD(TA_FUNC_UNST_HT_TRENDLINE,HtTrendline);
235
236 /* Move up the start index if there is not
237 * enough initial data.
238 */
239 if( startIdx < lookbackTotal )
240 startIdx = lookbackTotal;
241
242 /* Make sure there is still something to evaluate. */
243 if( startIdx > endIdx )
244 {
245 VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx);
246 VALUE_HANDLE_DEREF_TO_ZERO(outNBElement);
247 return ENUM_VALUE(RetCode,TA_SUCCESS,Success);
248 }
249
250 VALUE_HANDLE_DEREF(outBegIdx) = startIdx;
251
252 /* Initialize the price smoother, which is simply a weighted
253 * moving average of the price.
254 * To understand this algorithm, I strongly suggest to understand
255 * first how TA_WMA is done.
256 */
257 trailingWMAIdx = startIdx - lookbackTotal;
258 today = trailingWMAIdx;
259
260 /* Initialization is same as WMA, except loop is unrolled
261 * for speed optimization.
262 */
263 tempReal = inReal[today++];
264 periodWMASub = tempReal;
265 periodWMASum = tempReal;
266 tempReal = inReal[today++];
267 periodWMASub += tempReal;
268 periodWMASum += tempReal*2.0;
269 tempReal = inReal[today++];
270 periodWMASub += tempReal;
271 periodWMASum += tempReal*3.0;
272
273 trailingWMAValue = 0.0;
274
275 /* Subsequent WMA value are evaluated by using
276 * the DO_PRICE_WMA macro.
277 */
278 #define DO_PRICE_WMA(varNewPrice,varToStoreSmoothedValue) { \
279 periodWMASub += varNewPrice; \
280 periodWMASub -= trailingWMAValue; \
281 periodWMASum += varNewPrice*4.0; \
282 trailingWMAValue = inReal[trailingWMAIdx++]; \
283 varToStoreSmoothedValue = periodWMASum*0.1; \
284 periodWMASum -= periodWMASub; \
285 }
286
287 i = 34;
288 do
289 {
290 tempReal = inReal[today++];
291 DO_PRICE_WMA(tempReal,smoothedValue);
292 } while( --i != 0);
293
294 /* Initialize the circular buffers used by the hilbert
295 * transform logic.
296 * A buffer is used for odd day and another for even days.
297 * This minimize the number of memory access and floating point
298 * operations needed (note also that by using static circular buffer,
299 * no large dynamic memory allocation is needed for storing
300 * intermediate calculation!).
301 */
302 hilbertIdx = 0;
303
304 INIT_HILBERT_VARIABLES(detrender);
305 INIT_HILBERT_VARIABLES(Q1);
306 INIT_HILBERT_VARIABLES(jI);
307 INIT_HILBERT_VARIABLES(jQ);
308
309 period = 0.0;
310 outIdx = 0;
311
312 prevI2 = prevQ2 = 0.0;
313 Re = Im = 0.0;
314 I1ForOddPrev3 = I1ForEvenPrev3 = 0.0;
315 I1ForOddPrev2 = I1ForEvenPrev2 = 0.0;
316 smoothPeriod = 0.0;
317
318 for( i=0; i < SMOOTH_PRICE_SIZE; i++ )
319 smoothPrice[i] = 0.0;
320
321 /* The code is speed optimized and is most likely very
322 * hard to follow if you do not already know well the
323 * original algorithm.
324 * To understadn better, it is strongly suggested to look
325 * first at the Excel implementation in "test_MAMA.xls" included
326 * in this package.
327 */
328 while( today <= endIdx )
329 {
330 adjustedPrevPeriod = (0.075*period)+0.54;
331
332 todayValue = inReal[today];
333 DO_PRICE_WMA(todayValue,smoothedValue);
334
335 /* Remember the smoothedValue into the smoothPrice
336 * circular buffer.
337 */
338 smoothPrice[smoothPrice_Idx] = smoothedValue;
339
340 if( (today%2) == 0 )
341 {
342 /* Do the Hilbert Transforms for even price bar */
343 DO_HILBERT_EVEN(detrender,smoothedValue);
344 DO_HILBERT_EVEN(Q1,detrender);
345 DO_HILBERT_EVEN(jI,I1ForEvenPrev3);
346 DO_HILBERT_EVEN(jQ,Q1);
347 if( ++hilbertIdx == 3 )
348 hilbertIdx = 0;
349
350 Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);
351 I2 = (0.2*(I1ForEvenPrev3 - jQ)) + (0.8*prevI2);
352
353 /* The variable I1 is the detrender delayed for
354 * 3 price bars.
355 *
356 * Save the current detrender value for being
357 * used by the "odd" logic later.
358 */
359 I1ForOddPrev3 = I1ForOddPrev2;
360 I1ForOddPrev2 = detrender;
361 }
362 else
363 {
364 /* Do the Hilbert Transforms for odd price bar */
365 DO_HILBERT_ODD(detrender,smoothedValue);
366 DO_HILBERT_ODD(Q1,detrender);
367 DO_HILBERT_ODD(jI,I1ForOddPrev3);
368 DO_HILBERT_ODD(jQ,Q1);
369
370 Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);
371 I2 = (0.2*(I1ForOddPrev3 - jQ)) + (0.8*prevI2);
372
373 /* The varaiable I1 is the detrender delayed for
374 * 3 price bars.
375 *
376 * Save the current detrender value for being
377 * used by the "even" logic later.
378 */
379 I1ForEvenPrev3 = I1ForEvenPrev2;
380 I1ForEvenPrev2 = detrender;
381 }
382
383 /* Adjust the period for next price bar */
384 Re = (0.2*((I2*prevI2)+(Q2*prevQ2)))+(0.8*Re);
385 Im = (0.2*((I2*prevQ2)-(Q2*prevI2)))+(0.8*Im);
386 prevQ2 = Q2;
387 prevI2 = I2;
388 tempReal = period;
389 if( (Im != 0.0) && (Re != 0.0) )
390 period = 360.0 / (std_atan(Im/Re)*rad2Deg);
391 tempReal2 = 1.5*tempReal;
392 if( period > tempReal2)
393 period = tempReal2;
394 tempReal2 = 0.67*tempReal;
395 if( period < tempReal2 )
396 period = tempReal2;
397 if( period < 6 )
398 period = 6;
399 else if( period > 50 )
400 period = 50;
401 period = (0.2*period) + (0.8 * tempReal);
402
403 smoothPeriod = (0.33*period)+(0.67*smoothPeriod);
404
405 /* Compute Trendline */
406 DCPeriod = smoothPeriod+0.5;
407 DCPeriodInt = (int)DCPeriod;
408
409 /* idx is used to iterate for up to 50 of the last
410 * value of smoothPrice.
411 */
412 idx = today;
413 tempReal = 0.0;
414 for( i=0; i < DCPeriodInt; i++ )
415 tempReal += inReal[idx--];
416
417 if( DCPeriodInt > 0 )
418 tempReal = tempReal/(double)DCPeriodInt;
419
420 tempReal2 = (4.0*tempReal + 3.0*iTrend1 + 2.0*iTrend2 + iTrend3) / 10.0;
421 iTrend3 = iTrend2;
422 iTrend2 = iTrend1;
423 iTrend1 = tempReal;
424
425 if( today >= startIdx )
426 {
427 outReal[outIdx++] = tempReal2;
428 }
429
430 /* Ooof... let's do the next price bar now! */
431 CIRCBUF_NEXT(smoothPrice);
432 today++;
433 }
434
435 VALUE_HANDLE_DEREF(outNBElement) = outIdx;
436
437 return ENUM_VALUE(RetCode,TA_SUCCESS,Success);
438 }
439
440 /**** START GENCODE SECTION 5 - DO NOT DELETE THIS LINE ****/
441 /* Generated */
442 /* Generated */ #define USE_SINGLE_PRECISION_INPUT
443 /* Generated */ #if !defined( _MANAGED ) && !defined( _JAVA )
444 /* Generated */ #undef TA_PREFIX
445 /* Generated */ #define TA_PREFIX(x) TA_S_##x
446 /* Generated */ #endif
447 /* Generated */ #undef INPUT_TYPE
448 /* Generated */ #define INPUT_TYPE float
449 /* Generated */ #if defined( _MANAGED )
450 /* Generated */ enum class Core::RetCode Core::HtTrendline( int startIdx,
451 /* Generated */ int endIdx,
452 /* Generated */ cli::array<float>^ inReal,
453 /* Generated */ [Out]int% outBegIdx,
454 /* Generated */ [Out]int% outNBElement,
455 /* Generated */ cli::array<double>^ outReal )
456 /* Generated */ #elif defined( _JAVA )
457 /* Generated */ public RetCode htTrendline( int startIdx,
458 /* Generated */ int endIdx,
459 /* Generated */ float inReal[],
460 /* Generated */ MInteger outBegIdx,
461 /* Generated */ MInteger outNBElement,
462 /* Generated */ double outReal[] )
463 /* Generated */ #else
464 /* Generated */ TA_RetCode TA_S_HT_TRENDLINE( int startIdx,
465 /* Generated */ int endIdx,
466 /* Generated */ const float inReal[],
467 /* Generated */ int *outBegIdx,
468 /* Generated */ int *outNBElement,
469 /* Generated */ double outReal[] )
470 /* Generated */ #endif
471 /* Generated */ {
472 /* Generated */ int outIdx, i;
473 /* Generated */ int lookbackTotal, today;
474 /* Generated */ double tempReal, tempReal2;
475 /* Generated */ double adjustedPrevPeriod, period;
476 /* Generated */ int trailingWMAIdx;
477 /* Generated */ double periodWMASum, periodWMASub, trailingWMAValue;
478 /* Generated */ double smoothedValue;
479 /* Generated */ double iTrend1, iTrend2, iTrend3;
480 /* Generated */ CONSTANT_DOUBLE(a) = 0.0962;
481 /* Generated */ CONSTANT_DOUBLE(b) = 0.5769;
482 /* Generated */ double hilbertTempReal;
483 /* Generated */ int hilbertIdx;
484 /* Generated */ HILBERT_VARIABLES( detrender );
485 /* Generated */ HILBERT_VARIABLES( Q1 );
486 /* Generated */ HILBERT_VARIABLES( jI );
487 /* Generated */ HILBERT_VARIABLES( jQ );
488 /* Generated */ double Q2, I2, prevQ2, prevI2, Re, Im;
489 /* Generated */ double I1ForOddPrev2, I1ForOddPrev3;
490 /* Generated */ double I1ForEvenPrev2, I1ForEvenPrev3;
491 /* Generated */ double rad2Deg;
492 /* Generated */ double todayValue, smoothPeriod;
493 /* Generated */ #define SMOOTH_PRICE_SIZE 50
494 /* Generated */ CIRCBUF_PROLOG(smoothPrice,double,SMOOTH_PRICE_SIZE);
495 /* Generated */ int idx;
496 /* Generated */ int DCPeriodInt;
497 /* Generated */ double DCPeriod;
498 /* Generated */ #ifndef TA_FUNC_NO_RANGE_CHECK
499 /* Generated */ if( startIdx < 0 )
500 /* Generated */ return ENUM_VALUE(RetCode,TA_OUT_OF_RANGE_START_INDEX,OutOfRangeStartIndex);
501 /* Generated */ if( (endIdx < 0) || (endIdx < startIdx))
502 /* Generated */ return ENUM_VALUE(RetCode,TA_OUT_OF_RANGE_END_INDEX,OutOfRangeEndIndex);
503 /* Generated */ #if !defined(_JAVA)
504 /* Generated */ if( !inReal ) return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);
505 /* Generated */ #endif
506 /* Generated */ #if !defined(_JAVA)
507 /* Generated */ if( !outReal )
508 /* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);
509 /* Generated */ #endif
510 /* Generated */ #endif
511 /* Generated */ CIRCBUF_INIT_LOCAL_ONLY(smoothPrice,double);
512 /* Generated */ iTrend1 = iTrend2 = iTrend3 = 0.0;
513 /* Generated */ tempReal = std_atan(1);
514 /* Generated */ rad2Deg = 45.0/tempReal;
515 /* Generated */ lookbackTotal = 63 + TA_GLOBALS_UNSTABLE_PERIOD(TA_FUNC_UNST_HT_TRENDLINE,HtTrendline);
516 /* Generated */ if( startIdx < lookbackTotal )
517 /* Generated */ startIdx = lookbackTotal;
518 /* Generated */ if( startIdx > endIdx )
519 /* Generated */ {
520 /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx);
521 /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outNBElement);
522 /* Generated */ return ENUM_VALUE(RetCode,TA_SUCCESS,Success);
523 /* Generated */ }
524 /* Generated */ VALUE_HANDLE_DEREF(outBegIdx) = startIdx;
525 /* Generated */ trailingWMAIdx = startIdx - lookbackTotal;
526 /* Generated */ today = trailingWMAIdx;
527 /* Generated */ tempReal = inReal[today++];
528 /* Generated */ periodWMASub = tempReal;
529 /* Generated */ periodWMASum = tempReal;
530 /* Generated */ tempReal = inReal[today++];
531 /* Generated */ periodWMASub += tempReal;
532 /* Generated */ periodWMASum += tempReal*2.0;
533 /* Generated */ tempReal = inReal[today++];
534 /* Generated */ periodWMASub += tempReal;
535 /* Generated */ periodWMASum += tempReal*3.0;
536 /* Generated */ trailingWMAValue = 0.0;
537 /* Generated */ #define DO_PRICE_WMA(varNewPrice,varToStoreSmoothedValue) { \
538 /* Generated */ periodWMASub += varNewPrice; \
539 /* Generated */ periodWMASub -= trailingWMAValue; \
540 /* Generated */ periodWMASum += varNewPrice*4.0; \
541 /* Generated */ trailingWMAValue = inReal[trailingWMAIdx++]; \
542 /* Generated */ varToStoreSmoothedValue = periodWMASum*0.1; \
543 /* Generated */ periodWMASum -= periodWMASub; \
544 /* Generated */ }
545 /* Generated */ i = 34;
546 /* Generated */ do
547 /* Generated */ {
548 /* Generated */ tempReal = inReal[today++];
549 /* Generated */ DO_PRICE_WMA(tempReal,smoothedValue);
550 /* Generated */ } while( --i != 0);
551 /* Generated */ hilbertIdx = 0;
552 /* Generated */ INIT_HILBERT_VARIABLES(detrender);
553 /* Generated */ INIT_HILBERT_VARIABLES(Q1);
554 /* Generated */ INIT_HILBERT_VARIABLES(jI);
555 /* Generated */ INIT_HILBERT_VARIABLES(jQ);
556 /* Generated */ period = 0.0;
557 /* Generated */ outIdx = 0;
558 /* Generated */ prevI2 = prevQ2 = 0.0;
559 /* Generated */ Re = Im = 0.0;
560 /* Generated */ I1ForOddPrev3 = I1ForEvenPrev3 = 0.0;
561 /* Generated */ I1ForOddPrev2 = I1ForEvenPrev2 = 0.0;
562 /* Generated */ smoothPeriod = 0.0;
563 /* Generated */ for( i=0; i < SMOOTH_PRICE_SIZE; i++ )
564 /* Generated */ smoothPrice[i] = 0.0;
565 /* Generated */ while( today <= endIdx )
566 /* Generated */ {
567 /* Generated */ adjustedPrevPeriod = (0.075*period)+0.54;
568 /* Generated */ todayValue = inReal[today];
569 /* Generated */ DO_PRICE_WMA(todayValue,smoothedValue);
570 /* Generated */ smoothPrice[smoothPrice_Idx] = smoothedValue;
571 /* Generated */ if( (today%2) == 0 )
572 /* Generated */ {
573 /* Generated */ DO_HILBERT_EVEN(detrender,smoothedValue);
574 /* Generated */ DO_HILBERT_EVEN(Q1,detrender);
575 /* Generated */ DO_HILBERT_EVEN(jI,I1ForEvenPrev3);
576 /* Generated */ DO_HILBERT_EVEN(jQ,Q1);
577 /* Generated */ if( ++hilbertIdx == 3 )
578 /* Generated */ hilbertIdx = 0;
579 /* Generated */ Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);
580 /* Generated */ I2 = (0.2*(I1ForEvenPrev3 - jQ)) + (0.8*prevI2);
581 /* Generated */ I1ForOddPrev3 = I1ForOddPrev2;
582 /* Generated */ I1ForOddPrev2 = detrender;
583 /* Generated */ }
584 /* Generated */ else
585 /* Generated */ {
586 /* Generated */ DO_HILBERT_ODD(detrender,smoothedValue);
587 /* Generated */ DO_HILBERT_ODD(Q1,detrender);
588 /* Generated */ DO_HILBERT_ODD(jI,I1ForOddPrev3);
589 /* Generated */ DO_HILBERT_ODD(jQ,Q1);
590 /* Generated */ Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);
591 /* Generated */ I2 = (0.2*(I1ForOddPrev3 - jQ)) + (0.8*prevI2);
592 /* Generated */ I1ForEvenPrev3 = I1ForEvenPrev2;
593 /* Generated */ I1ForEvenPrev2 = detrender;
594 /* Generated */ }
595 /* Generated */ Re = (0.2*((I2*prevI2)+(Q2*prevQ2)))+(0.8*Re);
596 /* Generated */ Im = (0.2*((I2*prevQ2)-(Q2*prevI2)))+(0.8*Im);
597 /* Generated */ prevQ2 = Q2;
598 /* Generated */ prevI2 = I2;
599 /* Generated */ tempReal = period;
600 /* Generated */ if( (Im != 0.0) && (Re != 0.0) )
601 /* Generated */ period = 360.0 / (std_atan(Im/Re)*rad2Deg);
602 /* Generated */ tempReal2 = 1.5*tempReal;
603 /* Generated */ if( period > tempReal2)
604 /* Generated */ period = tempReal2;
605 /* Generated */ tempReal2 = 0.67*tempReal;
606 /* Generated */ if( period < tempReal2 )
607 /* Generated */ period = tempReal2;
608 /* Generated */ if( period < 6 )
609 /* Generated */ period = 6;
610 /* Generated */ else if( period > 50 )
611 /* Generated */ period = 50;
612 /* Generated */ period = (0.2*period) + (0.8 * tempReal);
613 /* Generated */ smoothPeriod = (0.33*period)+(0.67*smoothPeriod);
614 /* Generated */ DCPeriod = smoothPeriod+0.5;
615 /* Generated */ DCPeriodInt = (int)DCPeriod;
616 /* Generated */ idx = today;
617 /* Generated */ tempReal = 0.0;
618 /* Generated */ for( i=0; i < DCPeriodInt; i++ )
619 /* Generated */ tempReal += inReal[idx--];
620 /* Generated */ if( DCPeriodInt > 0 )
621 /* Generated */ tempReal = tempReal/(double)DCPeriodInt;
622 /* Generated */ tempReal2 = (4.0*tempReal + 3.0*iTrend1 + 2.0*iTrend2 + iTrend3) / 10.0;
623 /* Generated */ iTrend3 = iTrend2;
624 /* Generated */ iTrend2 = iTrend1;
625 /* Generated */ iTrend1 = tempReal;
626 /* Generated */ if( today >= startIdx )
627 /* Generated */ {
628 /* Generated */ outReal[outIdx++] = tempReal2;
629 /* Generated */ }
630 /* Generated */ CIRCBUF_NEXT(smoothPrice);
631 /* Generated */ today++;
632 /* Generated */ }
633 /* Generated */ VALUE_HANDLE_DEREF(outNBElement) = outIdx;
634 /* Generated */ return ENUM_VALUE(RetCode,TA_SUCCESS,Success);
635 /* Generated */ }
636 /* Generated */
637 /* Generated */ #if defined( _MANAGED )
638 /* Generated */ }}} // Close namespace TicTacTec.TA.Lib
639 /* Generated */ #endif
640 /**** END GENCODE SECTION 5 - DO NOT DELETE THIS LINE ****/
641
642