📄 ta_ht_trendline.c
字号:
* hard to follow if you do not already know well the * original algorithm. * To understadn better, it is strongly suggested to look * first at the Excel implementation in "test_MAMA.xls" included * in this package. */ while( today <= endIdx ) { adjustedPrevPeriod = (0.075*period)+0.54; todayValue = inReal[today]; DO_PRICE_WMA(todayValue,smoothedValue); /* Remember the smoothedValue into the smoothPrice * circular buffer. */ smoothPrice[smoothPrice_Idx] = smoothedValue; if( (today%2) == 0 ) { /* Do the Hilbert Transforms for even price bar */ DO_HILBERT_EVEN(detrender,smoothedValue); DO_HILBERT_EVEN(Q1,detrender); DO_HILBERT_EVEN(jI,I1ForEvenPrev3); DO_HILBERT_EVEN(jQ,Q1); if( ++hilbertIdx == 3 ) hilbertIdx = 0; Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2); I2 = (0.2*(I1ForEvenPrev3 - jQ)) + (0.8*prevI2); /* The variable I1 is the detrender delayed for * 3 price bars. * * Save the current detrender value for being * used by the "odd" logic later. */ I1ForOddPrev3 = I1ForOddPrev2; I1ForOddPrev2 = detrender; } else { /* Do the Hilbert Transforms for odd price bar */ DO_HILBERT_ODD(detrender,smoothedValue); DO_HILBERT_ODD(Q1,detrender); DO_HILBERT_ODD(jI,I1ForOddPrev3); DO_HILBERT_ODD(jQ,Q1); Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2); I2 = (0.2*(I1ForOddPrev3 - jQ)) + (0.8*prevI2); /* The varaiable I1 is the detrender delayed for * 3 price bars. * * Save the current detrender value for being * used by the "even" logic later. */ I1ForEvenPrev3 = I1ForEvenPrev2; I1ForEvenPrev2 = detrender; } /* Adjust the period for next price bar */ Re = (0.2*((I2*prevI2)+(Q2*prevQ2)))+(0.8*Re); Im = (0.2*((I2*prevQ2)-(Q2*prevI2)))+(0.8*Im); prevQ2 = Q2; prevI2 = I2; tempReal = period; if( (Im != 0.0) && (Re != 0.0) ) period = 360.0 / (std_atan(Im/Re)*rad2Deg); tempReal2 = 1.5*tempReal; if( period > tempReal2) period = tempReal2; tempReal2 = 0.67*tempReal; if( period < tempReal2 ) period = tempReal2; if( period < 6 ) period = 6; else if( period > 50 ) period = 50; period = (0.2*period) + (0.8 * tempReal); smoothPeriod = (0.33*period)+(0.67*smoothPeriod); /* Compute Trendline */ DCPeriod = smoothPeriod+0.5; DCPeriodInt = (int)DCPeriod; /* idx is used to iterate for up to 50 of the last * value of smoothPrice. */ idx = today; tempReal = 0.0; for( i=0; i < DCPeriodInt; i++ ) tempReal += inReal[idx--]; if( DCPeriodInt > 0 ) tempReal = tempReal/(double)DCPeriodInt; tempReal2 = (4.0*tempReal + 3.0*iTrend1 + 2.0*iTrend2 + iTrend3) / 10.0; iTrend3 = iTrend2; iTrend2 = iTrend1; iTrend1 = tempReal; if( today >= startIdx ) { outReal[outIdx++] = tempReal2; } /* Ooof... let's do the next price bar now! */ CIRCBUF_NEXT(smoothPrice); today++; } VALUE_HANDLE_DEREF(outNBElement) = outIdx; return ENUM_VALUE(RetCode,TA_SUCCESS,Success);}/**** START GENCODE SECTION 5 - DO NOT DELETE THIS LINE ****//* Generated */ /* Generated */ #define USE_SINGLE_PRECISION_INPUT/* Generated */ #if !defined( _MANAGED ) && !defined( _JAVA )/* Generated */ #undef TA_PREFIX/* Generated */ #define TA_PREFIX(x) TA_S_##x/* Generated */ #endif/* Generated */ #undef INPUT_TYPE/* Generated */ #define INPUT_TYPE float/* Generated */ #if defined( _MANAGED )/* Generated */ enum class Core::RetCode Core::HtTrendline( int startIdx,/* Generated */ int endIdx,/* Generated */ cli::array<float>^ inReal,/* Generated */ [Out]int% outBegIdx,/* Generated */ [Out]int% outNBElement,/* Generated */ cli::array<double>^ outReal )/* Generated */ #elif defined( _JAVA )/* Generated */ public RetCode htTrendline( int startIdx,/* Generated */ int endIdx,/* Generated */ float inReal[],/* Generated */ MInteger outBegIdx,/* Generated */ MInteger outNBElement,/* Generated */ double outReal[] )/* Generated */ #else/* Generated */ TA_RetCode TA_S_HT_TRENDLINE( int startIdx,/* Generated */ int endIdx,/* Generated */ const float inReal[],/* Generated */ int *outBegIdx,/* Generated */ int *outNBElement,/* Generated */ double outReal[] )/* Generated */ #endif/* Generated */ {/* Generated */ int outIdx, i;/* Generated */ int lookbackTotal, today;/* Generated */ double tempReal, tempReal2;/* Generated */ double adjustedPrevPeriod, period;/* Generated */ int trailingWMAIdx;/* Generated */ double periodWMASum, periodWMASub, trailingWMAValue;/* Generated */ double smoothedValue;/* Generated */ double iTrend1, iTrend2, iTrend3;/* Generated */ CONSTANT_DOUBLE(a) = 0.0962;/* Generated */ CONSTANT_DOUBLE(b) = 0.5769;/* Generated */ double hilbertTempReal;/* Generated */ int hilbertIdx;/* Generated */ HILBERT_VARIABLES( detrender );/* Generated */ HILBERT_VARIABLES( Q1 );/* Generated */ HILBERT_VARIABLES( jI );/* Generated */ HILBERT_VARIABLES( jQ );/* Generated */ double Q2, I2, prevQ2, prevI2, Re, Im;/* Generated */ double I1ForOddPrev2, I1ForOddPrev3;/* Generated */ double I1ForEvenPrev2, I1ForEvenPrev3;/* Generated */ double rad2Deg;/* Generated */ double todayValue, smoothPeriod;/* Generated */ #define SMOOTH_PRICE_SIZE 50/* Generated */ CIRCBUF_PROLOG(smoothPrice,double,SMOOTH_PRICE_SIZE);/* Generated */ int idx;/* Generated */ int DCPeriodInt;/* Generated */ double DCPeriod;/* Generated */ #ifndef TA_FUNC_NO_RANGE_CHECK/* Generated */ if( startIdx < 0 )/* Generated */ return ENUM_VALUE(RetCode,TA_OUT_OF_RANGE_START_INDEX,OutOfRangeStartIndex);/* Generated */ if( (endIdx < 0) || (endIdx < startIdx))/* Generated */ return ENUM_VALUE(RetCode,TA_OUT_OF_RANGE_END_INDEX,OutOfRangeEndIndex);/* Generated */ #if !defined(_JAVA)/* Generated */ if( !inReal ) return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */ #endif /* Generated */ #if !defined(_JAVA)/* Generated */ if( !outReal )/* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */ #endif /* Generated */ #endif /* Generated */ CIRCBUF_INIT_LOCAL_ONLY(smoothPrice,double);/* Generated */ iTrend1 = iTrend2 = iTrend3 = 0.0;/* Generated */ tempReal = std_atan(1);/* Generated */ rad2Deg = 45.0/tempReal;/* Generated */ lookbackTotal = 63 + TA_GLOBALS_UNSTABLE_PERIOD(TA_FUNC_UNST_HT_TRENDLINE,HtTrendline);/* Generated */ if( startIdx < lookbackTotal )/* Generated */ startIdx = lookbackTotal;/* Generated */ if( startIdx > endIdx )/* Generated */ {/* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx);/* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outNBElement);/* Generated */ return ENUM_VALUE(RetCode,TA_SUCCESS,Success);/* Generated */ }/* Generated */ VALUE_HANDLE_DEREF(outBegIdx) = startIdx;/* Generated */ trailingWMAIdx = startIdx - lookbackTotal;/* Generated */ today = trailingWMAIdx;/* Generated */ tempReal = inReal[today++];/* Generated */ periodWMASub = tempReal;/* Generated */ periodWMASum = tempReal;/* Generated */ tempReal = inReal[today++];/* Generated */ periodWMASub += tempReal;/* Generated */ periodWMASum += tempReal*2.0;/* Generated */ tempReal = inReal[today++];/* Generated */ periodWMASub += tempReal;/* Generated */ periodWMASum += tempReal*3.0;/* Generated */ trailingWMAValue = 0.0;/* Generated */ #define DO_PRICE_WMA(varNewPrice,varToStoreSmoothedValue) { \/* Generated */ periodWMASub += varNewPrice; \/* Generated */ periodWMASub -= trailingWMAValue; \/* Generated */ periodWMASum += varNewPrice*4.0; \/* Generated */ trailingWMAValue = inReal[trailingWMAIdx++]; \/* Generated */ varToStoreSmoothedValue = periodWMASum*0.1; \/* Generated */ periodWMASum -= periodWMASub; \/* Generated */ }/* Generated */ i = 34;/* Generated */ do/* Generated */ {/* Generated */ tempReal = inReal[today++];/* Generated */ DO_PRICE_WMA(tempReal,smoothedValue);/* Generated */ } while( --i != 0);/* Generated */ hilbertIdx = 0;/* Generated */ INIT_HILBERT_VARIABLES(detrender);/* Generated */ INIT_HILBERT_VARIABLES(Q1);/* Generated */ INIT_HILBERT_VARIABLES(jI);/* Generated */ INIT_HILBERT_VARIABLES(jQ);/* Generated */ period = 0.0;/* Generated */ outIdx = 0;/* Generated */ prevI2 = prevQ2 = 0.0;/* Generated */ Re = Im = 0.0;/* Generated */ I1ForOddPrev3 = I1ForEvenPrev3 = 0.0;/* Generated */ I1ForOddPrev2 = I1ForEvenPrev2 = 0.0;/* Generated */ smoothPeriod = 0.0;/* Generated */ for( i=0; i < SMOOTH_PRICE_SIZE; i++ )/* Generated */ smoothPrice[i] = 0.0;/* Generated */ while( today <= endIdx )/* Generated */ {/* Generated */ adjustedPrevPeriod = (0.075*period)+0.54;/* Generated */ todayValue = inReal[today];/* Generated */ DO_PRICE_WMA(todayValue,smoothedValue);/* Generated */ smoothPrice[smoothPrice_Idx] = smoothedValue;/* Generated */ if( (today%2) == 0 )/* Generated */ {/* Generated */ DO_HILBERT_EVEN(detrender,smoothedValue);/* Generated */ DO_HILBERT_EVEN(Q1,detrender);/* Generated */ DO_HILBERT_EVEN(jI,I1ForEvenPrev3);/* Generated */ DO_HILBERT_EVEN(jQ,Q1);/* Generated */ if( ++hilbertIdx == 3 )/* Generated */ hilbertIdx = 0;/* Generated */ Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);/* Generated */ I2 = (0.2*(I1ForEvenPrev3 - jQ)) + (0.8*prevI2);/* Generated */ I1ForOddPrev3 = I1ForOddPrev2;/* Generated */ I1ForOddPrev2 = detrender; /* Generated */ }/* Generated */ else/* Generated */ {/* Generated */ DO_HILBERT_ODD(detrender,smoothedValue);/* Generated */ DO_HILBERT_ODD(Q1,detrender);/* Generated */ DO_HILBERT_ODD(jI,I1ForOddPrev3);/* Generated */ DO_HILBERT_ODD(jQ,Q1);/* Generated */ Q2 = (0.2*(Q1 + jI)) + (0.8*prevQ2);/* Generated */ I2 = (0.2*(I1ForOddPrev3 - jQ)) + (0.8*prevI2);/* Generated */ I1ForEvenPrev3 = I1ForEvenPrev2;/* Generated */ I1ForEvenPrev2 = detrender;/* Generated */ }/* Generated */ Re = (0.2*((I2*prevI2)+(Q2*prevQ2)))+(0.8*Re);/* Generated */ Im = (0.2*((I2*prevQ2)-(Q2*prevI2)))+(0.8*Im);/* Generated */ prevQ2 = Q2;/* Generated */ prevI2 = I2;/* Generated */ tempReal = period;/* Generated */ if( (Im != 0.0) && (Re != 0.0) )/* Generated */ period = 360.0 / (std_atan(Im/Re)*rad2Deg);/* Generated */ tempReal2 = 1.5*tempReal;/* Generated */ if( period > tempReal2)/* Generated */ period = tempReal2;/* Generated */ tempReal2 = 0.67*tempReal;/* Generated */ if( period < tempReal2 )/* Generated */ period = tempReal2;/* Generated */ if( period < 6 )/* Generated */ period = 6;/* Generated */ else if( period > 50 )/* Generated */ period = 50;/* Generated */ period = (0.2*period) + (0.8 * tempReal);/* Generated */ smoothPeriod = (0.33*period)+(0.67*smoothPeriod);/* Generated */ DCPeriod = smoothPeriod+0.5;/* Generated */ DCPeriodInt = (int)DCPeriod;/* Generated */ idx = today;/* Generated */ tempReal = 0.0;/* Generated */ for( i=0; i < DCPeriodInt; i++ )/* Generated */ tempReal += inReal[idx--];/* Generated */ if( DCPeriodInt > 0 )/* Generated */ tempReal = tempReal/(double)DCPeriodInt;/* Generated */ tempReal2 = (4.0*tempReal + 3.0*iTrend1 + 2.0*iTrend2 + iTrend3) / 10.0;/* Generated */ iTrend3 = iTrend2;/* Generated */ iTrend2 = iTrend1;/* Generated */ iTrend1 = tempReal;/* Generated */ if( today >= startIdx )/* Generated */ {/* Generated */ outReal[outIdx++] = tempReal2;/* Generated */ }/* Generated */ CIRCBUF_NEXT(smoothPrice);/* Generated */ today++;/* Generated */ }/* Generated */ VALUE_HANDLE_DEREF(outNBElement) = outIdx;/* Generated */ return ENUM_VALUE(RetCode,TA_SUCCESS,Success);/* Generated */ }/* Generated */ /* Generated */ #if defined( _MANAGED )/* Generated */ }}} // Close namespace TicTacTec.TA.Lib/* Generated */ #endif/**** END GENCODE SECTION 5 - DO NOT DELETE THIS LINE ****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -