📄 ta_ultosc.c
字号:
if( startIdx < lookbackTotal ) startIdx = lookbackTotal; /* Make sure there is still something to evaluate. */ if( startIdx > endIdx ) return ENUM_VALUE(RetCode,TA_SUCCESS,Success); /* Prime running totals used in moving averages */ #define CALC_TERMS(day) \ { \ tempLT = inLow[day]; \ tempHT = inHigh[day]; \ tempCY = inClose[day-1]; \ trueLow = min( tempLT, tempCY ); \ closeMinusTrueLow = inClose[day] - trueLow; \ trueRange = tempHT - tempLT; \ tempDouble = std_fabs( tempCY - tempHT ); \ if( tempDouble > trueRange ) \ trueRange = tempDouble; \ tempDouble = std_fabs( tempCY - tempLT ); \ if( tempDouble > trueRange ) \ trueRange = tempDouble; \ } #define PRIME_TOTALS(aTotal, bTotal, period) \ { \ aTotal = 0; \ bTotal = 0; \ for ( i = startIdx-period+1; i < startIdx; ++i ) \ { \ CALC_TERMS(i); \ aTotal += closeMinusTrueLow; \ bTotal += trueRange; \ } \ } PRIME_TOTALS(a1Total, b1Total, optInTimePeriod1); PRIME_TOTALS(a2Total, b2Total, optInTimePeriod2); PRIME_TOTALS(a3Total, b3Total, optInTimePeriod3); #undef PRIME_TOTALS /* Calculate oscillator */ today = startIdx; outIdx = 0; trailingIdx1 = today - optInTimePeriod1 + 1; trailingIdx2 = today - optInTimePeriod2 + 1; trailingIdx3 = today - optInTimePeriod3 + 1; while( today <= endIdx ) { /* Add on today's terms */ CALC_TERMS(today); a1Total += closeMinusTrueLow; a2Total += closeMinusTrueLow; a3Total += closeMinusTrueLow; b1Total += trueRange; b2Total += trueRange; b3Total += trueRange; /* Calculate the oscillator value for today */ output = 0.0; if( !TA_IS_ZERO(b1Total) ) output += 4.0*(a1Total/b1Total); if( !TA_IS_ZERO(b2Total) ) output += 2.0*(a2Total/b2Total); if( !TA_IS_ZERO(b3Total) ) output += a3Total/b3Total; /* Remove the trailing terms to prepare for next day */ CALC_TERMS(trailingIdx1); a1Total -= closeMinusTrueLow; b1Total -= trueRange; CALC_TERMS(trailingIdx2); a2Total -= closeMinusTrueLow; b2Total -= trueRange; CALC_TERMS(trailingIdx3); a3Total -= closeMinusTrueLow; b3Total -= trueRange; /* Last operation is to write the output. Must * be done after the trailing index have all been * taken care of because the caller is allowed * to have the input array to be also the output * array. */ outReal[outIdx] = 100.0 * (output / 7.0); /* Increment indexes */ outIdx++; today++; trailingIdx1++; trailingIdx2++; trailingIdx3++; } #undef CALC_TERMS /* All done. Indicate the output limits and return. */ 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::UltOsc( int startIdx,/* Generated */ int endIdx,/* Generated */ cli::array<float>^ inHigh,/* Generated */ cli::array<float>^ inLow,/* Generated */ cli::array<float>^ inClose,/* Generated */ int optInTimePeriod1, /* From 1 to 100000 *//* Generated */ int optInTimePeriod2, /* From 1 to 100000 *//* Generated */ int optInTimePeriod3, /* From 1 to 100000 *//* Generated */ [Out]int% outBegIdx,/* Generated */ [Out]int% outNBElement,/* Generated */ cli::array<double>^ outReal )/* Generated */ #elif defined( _JAVA )/* Generated */ public RetCode ultOsc( int startIdx,/* Generated */ int endIdx,/* Generated */ float inHigh[],/* Generated */ float inLow[],/* Generated */ float inClose[],/* Generated */ int optInTimePeriod1, /* From 1 to 100000 *//* Generated */ int optInTimePeriod2, /* From 1 to 100000 *//* Generated */ int optInTimePeriod3, /* From 1 to 100000 *//* Generated */ MInteger outBegIdx,/* Generated */ MInteger outNBElement,/* Generated */ double outReal[] )/* Generated */ #else/* Generated */ TA_RetCode TA_S_ULTOSC( int startIdx,/* Generated */ int endIdx,/* Generated */ const float inHigh[],/* Generated */ const float inLow[],/* Generated */ const float inClose[],/* Generated */ int optInTimePeriod1, /* From 1 to 100000 *//* Generated */ int optInTimePeriod2, /* From 1 to 100000 *//* Generated */ int optInTimePeriod3, /* From 1 to 100000 *//* Generated */ int *outBegIdx,/* Generated */ int *outNBElement,/* Generated */ double outReal[] )/* Generated */ #endif/* Generated */ {/* Generated */ double a1Total, a2Total, a3Total;/* Generated */ double b1Total, b2Total, b3Total;/* Generated */ double trueLow, trueRange, closeMinusTrueLow;/* Generated */ double tempDouble, output, tempHT, tempLT, tempCY;/* Generated */ int lookbackTotal;/* Generated */ int longestPeriod, longestIndex;/* Generated */ int i,j,today,outIdx;/* Generated */ int trailingIdx1, trailingIdx2, trailingIdx3;/* Generated */ ARRAY_INT_LOCAL(usedFlag,3);/* Generated */ ARRAY_INT_LOCAL(periods,3);/* Generated */ ARRAY_INT_LOCAL(sortedPeriods,3);/* 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(!inHigh||!inLow||!inClose)/* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */ #endif /* Generated */ if( (int)optInTimePeriod1 == TA_INTEGER_DEFAULT )/* Generated */ optInTimePeriod1 = 7;/* Generated */ else if( ((int)optInTimePeriod1 < 1) || ((int)optInTimePeriod1 > 100000) )/* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */ if( (int)optInTimePeriod2 == TA_INTEGER_DEFAULT )/* Generated */ optInTimePeriod2 = 14;/* Generated */ else if( ((int)optInTimePeriod2 < 1) || ((int)optInTimePeriod2 > 100000) )/* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam);/* Generated */ if( (int)optInTimePeriod3 == TA_INTEGER_DEFAULT )/* Generated */ optInTimePeriod3 = 28;/* Generated */ else if( ((int)optInTimePeriod3 < 1) || ((int)optInTimePeriod3 > 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 */ VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx);/* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outNBElement);/* Generated */ periods[0] = optInTimePeriod1;/* Generated */ periods[1] = optInTimePeriod2;/* Generated */ periods[2] = optInTimePeriod3;/* Generated */ usedFlag[0] = 0;/* Generated */ usedFlag[1] = 0;/* Generated */ usedFlag[2] = 0;/* Generated */ for ( i = 0; i < 3; ++i ) /* Generated */ {/* Generated */ longestPeriod = 0;/* Generated */ longestIndex = 0;/* Generated */ for ( j = 0; j < 3; ++j ) /* Generated */ {/* Generated */ if ( (usedFlag[j] == 0) && (periods[j] > longestPeriod) ) /* Generated */ {/* Generated */ longestPeriod = periods[j];/* Generated */ longestIndex = j;/* Generated */ }/* Generated */ }/* Generated */ usedFlag[longestIndex] = 1;/* Generated */ sortedPeriods[i] = longestPeriod;/* Generated */ }/* Generated */ optInTimePeriod1 = sortedPeriods[2];/* Generated */ optInTimePeriod2 = sortedPeriods[1];/* Generated */ optInTimePeriod3 = sortedPeriods[0];/* Generated */ lookbackTotal = LOOKBACK_CALL(ULTOSC)( optInTimePeriod1, optInTimePeriod2, optInTimePeriod3 );/* Generated */ if( startIdx < lookbackTotal ) startIdx = lookbackTotal;/* Generated */ if( startIdx > endIdx ) return ENUM_VALUE(RetCode,TA_SUCCESS,Success);/* Generated */ #define CALC_TERMS(day) \/* Generated */ { \/* Generated */ tempLT = inLow[day]; \/* Generated */ tempHT = inHigh[day]; \/* Generated */ tempCY = inClose[day-1]; \/* Generated */ trueLow = min( tempLT, tempCY ); \/* Generated */ closeMinusTrueLow = inClose[day] - trueLow; \/* Generated */ trueRange = tempHT - tempLT; \/* Generated */ tempDouble = std_fabs( tempCY - tempHT ); \/* Generated */ if( tempDouble > trueRange ) \/* Generated */ trueRange = tempDouble; \/* Generated */ tempDouble = std_fabs( tempCY - tempLT ); \/* Generated */ if( tempDouble > trueRange ) \/* Generated */ trueRange = tempDouble; \/* Generated */ }/* Generated */ #define PRIME_TOTALS(aTotal, bTotal, period) \/* Generated */ { \/* Generated */ aTotal = 0; \/* Generated */ bTotal = 0; \/* Generated */ for ( i = startIdx-period+1; i < startIdx; ++i ) \/* Generated */ { \/* Generated */ CALC_TERMS(i); \/* Generated */ aTotal += closeMinusTrueLow; \/* Generated */ bTotal += trueRange; \/* Generated */ } \/* Generated */ }/* Generated */ PRIME_TOTALS(a1Total, b1Total, optInTimePeriod1);/* Generated */ PRIME_TOTALS(a2Total, b2Total, optInTimePeriod2);/* Generated */ PRIME_TOTALS(a3Total, b3Total, optInTimePeriod3);/* Generated */ #undef PRIME_TOTALS/* Generated */ today = startIdx;/* Generated */ outIdx = 0;/* Generated */ trailingIdx1 = today - optInTimePeriod1 + 1;/* Generated */ trailingIdx2 = today - optInTimePeriod2 + 1;/* Generated */ trailingIdx3 = today - optInTimePeriod3 + 1;/* Generated */ while( today <= endIdx )/* Generated */ { /* Generated */ CALC_TERMS(today);/* Generated */ a1Total += closeMinusTrueLow;/* Generated */ a2Total += closeMinusTrueLow;/* Generated */ a3Total += closeMinusTrueLow;/* Generated */ b1Total += trueRange;/* Generated */ b2Total += trueRange;/* Generated */ b3Total += trueRange;/* Generated */ output = 0.0; /* Generated */ if( !TA_IS_ZERO(b1Total) ) output += 4.0*(a1Total/b1Total);/* Generated */ if( !TA_IS_ZERO(b2Total) ) output += 2.0*(a2Total/b2Total);/* Generated */ if( !TA_IS_ZERO(b3Total) ) output += a3Total/b3Total; /* Generated */ CALC_TERMS(trailingIdx1);/* Generated */ a1Total -= closeMinusTrueLow;/* Generated */ b1Total -= trueRange;/* Generated */ CALC_TERMS(trailingIdx2);/* Generated */ a2Total -= closeMinusTrueLow;/* Generated */ b2Total -= trueRange;/* Generated */ CALC_TERMS(trailingIdx3);/* Generated */ a3Total -= closeMinusTrueLow;/* Generated */ b3Total -= trueRange;/* Generated */ outReal[outIdx] = 100.0 * (output / 7.0);/* Generated */ outIdx++;/* Generated */ today++; /* Generated */ trailingIdx1++; /* Generated */ trailingIdx2++; /* Generated */ trailingIdx3++;/* Generated */ }/* Generated */ #undef CALC_TERMS/* 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 + -