📄 ta_trima.c
字号:
* the formula for a "triangular" serie is: * 1+2+3+2+1 = (n*(n+1))+n+1 * = (n+1)*(n+1) * = 3 * 3 = 9 * * Even period Formula: * period = 6 and with n=(int)(period/2) * the formula for a "triangular" serie is: * 1+2+3+3+2+1 = n*(n+1) * = 3 * 4 = 12 */ /* Note: entirely done with int and becomes double only * on assignement to the factor variable. */ i = (optInTimePeriod>>1); factor = (i+1)*(i+1); factor = 1.0/factor; /* Initialize all the variable before * starting to iterate for each output. */ trailingIdx = startIdx-lookbackTotal; middleIdx = trailingIdx + i; todayIdx = middleIdx + i; numerator = 0.0; numeratorSub = 0.0; for( i=middleIdx; i >= trailingIdx; i-- ) { tempReal = inReal[i]; numeratorSub += tempReal; numerator += numeratorSub; } numeratorAdd = 0.0; middleIdx++; for( i=middleIdx; i <= todayIdx; i++ ) { tempReal = inReal[i]; numeratorAdd += tempReal; numerator += numeratorAdd; } /* Write the first output */ outIdx = 0; tempReal = inReal[trailingIdx++]; outReal[outIdx++] = numerator * factor; todayIdx++; /* Note: The value at the trailingIdx was saved * in tempReal to account for the case where * outReal and inReal are ptr on the same * buffer. */ /* Iterate for remaining output */ while( todayIdx <= endIdx ) { /* Step (1) */ numerator -= numeratorSub; numeratorSub -= tempReal; tempReal = inReal[middleIdx++]; numeratorSub += tempReal; /* Step (2) */ numerator += numeratorAdd; numeratorAdd -= tempReal; tempReal = inReal[todayIdx++]; numeratorAdd += tempReal; /* Step (3) */ numerator += tempReal; /* Step (4) */ tempReal = inReal[trailingIdx++]; outReal[outIdx++] = numerator * factor; } } else { /* Even logic. * * Very similar to the odd logic, except: * - calculation of the factor is different. * - the coverage of the numeratorSub and numeratorAdd is * slightly different. * - Adjustment of numeratorAdd is different. See Step (2). */ i = (optInTimePeriod>>1); factor = i*(i+1); factor = 1.0/factor; /* Initialize all the variable before * starting to iterate for each output. */ trailingIdx = startIdx-lookbackTotal; middleIdx = trailingIdx + i - 1; todayIdx = middleIdx + i; numerator = 0.0; numeratorSub = 0.0; for( i=middleIdx; i >= trailingIdx; i-- ) { tempReal = inReal[i]; numeratorSub += tempReal; numerator += numeratorSub; } numeratorAdd = 0.0; middleIdx++; for( i=middleIdx; i <= todayIdx; i++ ) { tempReal = inReal[i]; numeratorAdd += tempReal; numerator += numeratorAdd; } /* Write the first output */ outIdx = 0; tempReal = inReal[trailingIdx++]; outReal[outIdx++] = numerator * factor; todayIdx++; /* Note: The value at the trailingIdx was saved * in tempReal to account for the case where * outReal and inReal are ptr on the same * buffer. */ /* Iterate for remaining output */ while( todayIdx <= endIdx ) { /* Step (1) */ numerator -= numeratorSub; numeratorSub -= tempReal; tempReal = inReal[middleIdx++]; numeratorSub += tempReal; /* Step (2) */ numeratorAdd -= tempReal; numerator += numeratorAdd; tempReal = inReal[todayIdx++]; numeratorAdd += tempReal; /* Step (3) */ numerator += tempReal; /* Step (4) */ tempReal = inReal[trailingIdx++]; outReal[outIdx++] = numerator * factor; } } VALUE_HANDLE_DEREF(outNBElement) = outIdx; VALUE_HANDLE_DEREF(outBegIdx) = startIdx; 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::Trima( int startIdx,/* Generated */ int endIdx,/* Generated */ cli::array<float>^ inReal,/* Generated */ int optInTimePeriod, /* From 2 to 100000 *//* Generated */ [Out]int% outBegIdx,/* Generated */ [Out]int% outNBElement,/* Generated */ cli::array<double>^ outReal )/* Generated */ #elif defined( _JAVA )/* Generated */ public RetCode trima( int startIdx,/* Generated */ int endIdx,/* Generated */ float inReal[],/* Generated */ int optInTimePeriod, /* From 2 to 100000 *//* Generated */ MInteger outBegIdx,/* Generated */ MInteger outNBElement,/* Generated */ double outReal[] )/* Generated */ #else/* Generated */ TA_RetCode TA_S_TRIMA( int startIdx,/* Generated */ int endIdx,/* Generated */ const float inReal[],/* Generated */ int optInTimePeriod, /* From 2 to 100000 *//* Generated */ int *outBegIdx,/* Generated */ int *outNBElement,/* Generated */ double outReal[] )/* Generated */ #endif/* Generated */ {/* Generated */ int lookbackTotal;/* Generated */ double numerator;/* Generated */ double numeratorSub;/* Generated */ double numeratorAdd;/* Generated */ int i, outIdx, todayIdx, trailingIdx, middleIdx;/* Generated */ double factor, tempReal;/* 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( (int)optInTimePeriod == TA_INTEGER_DEFAULT )/* Generated */ optInTimePeriod = 30;/* Generated */ else if( ((int)optInTimePeriod < 2) || ((int)optInTimePeriod > 100000) )/* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */ #if !defined(_JAVA)/* Generated */ if( !outReal )/* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */ #endif /* Generated */ #endif /* Generated */ lookbackTotal = (optInTimePeriod-1);/* 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 */ outIdx = 0;/* Generated */ if( (optInTimePeriod % 2) == 1 )/* Generated */ {/* Generated */ i = (optInTimePeriod>>1);/* Generated */ factor = (i+1)*(i+1); /* Generated */ factor = 1.0/factor;/* Generated */ trailingIdx = startIdx-lookbackTotal;/* Generated */ middleIdx = trailingIdx + i;/* Generated */ todayIdx = middleIdx + i;/* Generated */ numerator = 0.0;/* Generated */ numeratorSub = 0.0;/* Generated */ for( i=middleIdx; i >= trailingIdx; i-- )/* Generated */ {/* Generated */ tempReal = inReal[i];/* Generated */ numeratorSub += tempReal;/* Generated */ numerator += numeratorSub;/* Generated */ }/* Generated */ numeratorAdd = 0.0;/* Generated */ middleIdx++;/* Generated */ for( i=middleIdx; i <= todayIdx; i++ )/* Generated */ {/* Generated */ tempReal = inReal[i];/* Generated */ numeratorAdd += tempReal;/* Generated */ numerator += numeratorAdd;/* Generated */ }/* Generated */ outIdx = 0;/* Generated */ tempReal = inReal[trailingIdx++]; /* Generated */ outReal[outIdx++] = numerator * factor;/* Generated */ todayIdx++;/* Generated */ while( todayIdx <= endIdx )/* Generated */ {/* Generated */ numerator -= numeratorSub;/* Generated */ numeratorSub -= tempReal;/* Generated */ tempReal = inReal[middleIdx++];/* Generated */ numeratorSub += tempReal;/* Generated */ numerator += numeratorAdd;/* Generated */ numeratorAdd -= tempReal;/* Generated */ tempReal = inReal[todayIdx++];/* Generated */ numeratorAdd += tempReal;/* Generated */ numerator += tempReal;/* Generated */ tempReal = inReal[trailingIdx++]; /* Generated */ outReal[outIdx++] = numerator * factor;/* Generated */ }/* Generated */ }/* Generated */ else/* Generated */ {/* Generated */ i = (optInTimePeriod>>1);/* Generated */ factor = i*(i+1); /* Generated */ factor = 1.0/factor;/* Generated */ trailingIdx = startIdx-lookbackTotal;/* Generated */ middleIdx = trailingIdx + i - 1;/* Generated */ todayIdx = middleIdx + i;/* Generated */ numerator = 0.0;/* Generated */ numeratorSub = 0.0;/* Generated */ for( i=middleIdx; i >= trailingIdx; i-- )/* Generated */ {/* Generated */ tempReal = inReal[i];/* Generated */ numeratorSub += tempReal;/* Generated */ numerator += numeratorSub;/* Generated */ }/* Generated */ numeratorAdd = 0.0;/* Generated */ middleIdx++;/* Generated */ for( i=middleIdx; i <= todayIdx; i++ )/* Generated */ {/* Generated */ tempReal = inReal[i];/* Generated */ numeratorAdd += tempReal;/* Generated */ numerator += numeratorAdd;/* Generated */ }/* Generated */ outIdx = 0;/* Generated */ tempReal = inReal[trailingIdx++]; /* Generated */ outReal[outIdx++] = numerator * factor;/* Generated */ todayIdx++;/* Generated */ while( todayIdx <= endIdx )/* Generated */ {/* Generated */ numerator -= numeratorSub;/* Generated */ numeratorSub -= tempReal;/* Generated */ tempReal = inReal[middleIdx++];/* Generated */ numeratorSub += tempReal;/* Generated */ numeratorAdd -= tempReal;/* Generated */ numerator += numeratorAdd;/* Generated */ tempReal = inReal[todayIdx++];/* Generated */ numeratorAdd += tempReal;/* Generated */ numerator += tempReal;/* Generated */ tempReal = inReal[trailingIdx++]; /* Generated */ outReal[outIdx++] = numerator * factor;/* Generated */ }/* Generated */ }/* Generated */ VALUE_HANDLE_DEREF(outNBElement) = outIdx;/* Generated */ VALUE_HANDLE_DEREF(outBegIdx) = startIdx;/* 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 + -