/* Generated */ TA_LIB_API TA_RetCode TA_APO_State( struct TA_APO_State* _state, /* Generated */ const double inReal, /* Generated */ double *outReal ) /* Generated */ #endif /**** END GENCODE SECTION 7 - DO NOT DELETE THIS LINE ****/ { /* insert local variable here */ #define TA_APO_SUPPRESS_EXIT_ON_NOT_ENOUGH_DATA double fastMA, slowMA; int res1, res2; /**** START GENCODE SECTION 8 - DO NOT DELETE THIS LINE ****/ /* Generated */ /* Generated */ #ifndef TA_FUNC_NO_RANGE_CHECK /* Generated */ /* Generated */ if (_state == NULL) /* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam); /* Generated */ #if !defined(_JAVA) /* Generated */ /* Generated */ #endif /* !defined(_JAVA)*/ /* Generated */ size_t _cur_idx = STATE.mem_index++; /* Generated */ if (MEM_SIZE > 0) _cur_idx %= MEM_SIZE; /* Generated */ UNUSED_VARIABLE(_cur_idx); // in case PUSH\POP methods won't be used /* Generated */ #ifndef TA_APO_SUPPRESS_EXIT_ON_NOT_ENOUGH_DATA /* Generated */ if (NEED_MORE_DATA) { /* Generated */ PUSH_TO_MEM(inReal,inReal); /* Generated */ return ENUM_VALUE(RetCode,TA_NEED_MORE_DATA,NeedMoreData); } /* Generated */ #endif /* Generated */ #if !defined(_JAVA) /* Generated */ if( !outReal ) /* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam); /* Generated */ /* Generated */ #endif /* !defined(_JAVA) */ /* Generated */ #endif /* TA_FUNC_NO_RANGE_CHECK */ /* Generated */ /**** END GENCODE SECTION 8 - DO NOT DELETE THIS LINE ****/ /* insert state based TA dunc code here. */ res1 = FUNCTION_CALL_STATE(MA)((struct TA_MA_State*) STATE.fastMAState, inReal, &fastMA); res2 = FUNCTION_CALL_STATE(MA)((struct TA_MA_State*) STATE.slowMAState, inReal, &slowMA); if (res1|res2) return (res1|res2); if (NEED_MORE_DATA) return ENUM_VALUE(RetCode,TA_NEED_MORE_DATA,NeedMoreData); if (STATE.doPercentageOutput != 0) { if( !TA_IS_ZERO(slowMA) ) VALUE_HANDLE_DEREF(outReal) = ((fastMA-slowMA)/slowMA)*100.0; else VALUE_HANDLE_DEREF(outReal) = 0.0; } else VALUE_HANDLE_DEREF(outReal) = fastMA - slowMA; return ENUM_VALUE(RetCode,TA_SUCCESS,Success); }
/* Generated */ TA_RetCode TA_PREFIX(INT_PO)( int startIdx, /* Generated */ int endIdx, /* Generated */ const INPUT_TYPE *inReal, /* Generated */ int optInFastPeriod, /* Generated */ int optInSlowPeriod, /* Generated */ TA_MAType optInMethod_2, /* Generated */ int *outBegIdx, /* Generated */ int *outNBElement, /* Generated */ double *outReal, /* Generated */ double *tempBuffer, /* Generated */ int doPercentageOutput ) /* Generated */ #endif /* Generated */ { /* Generated */ ENUM_DECLARATION(RetCode) retCode; /* Generated */ double tempReal; /* Generated */ int tempInteger; /* Generated */ VALUE_HANDLE_INT(outBegIdx1); /* Generated */ VALUE_HANDLE_INT(outNbElement1); /* Generated */ VALUE_HANDLE_INT(outBegIdx2); /* Generated */ VALUE_HANDLE_INT(outNbElement2); /* Generated */ int i, j; /* Generated */ if( optInSlowPeriod < optInFastPeriod ) /* Generated */ { /* Generated */ tempInteger = optInSlowPeriod; /* Generated */ optInSlowPeriod = optInFastPeriod; /* Generated */ optInFastPeriod = tempInteger; /* Generated */ } /* Generated */ retCode = FUNCTION_CALL(MA)( startIdx, endIdx, /* Generated */ inReal, /* Generated */ optInFastPeriod, /* Generated */ optInMethod_2, /* Generated */ VALUE_HANDLE_OUT(outBegIdx2), VALUE_HANDLE_OUT(outNbElement2), /* Generated */ tempBuffer ); /* Generated */ if( retCode == ENUM_VALUE(RetCode,TA_SUCCESS,Success) ) /* Generated */ { /* Generated */ retCode = FUNCTION_CALL(MA)( startIdx, endIdx, /* Generated */ inReal, /* Generated */ optInSlowPeriod, /* Generated */ optInMethod_2, /* Generated */ VALUE_HANDLE_OUT(outBegIdx1), VALUE_HANDLE_OUT(outNbElement1), /* Generated */ outReal ); /* Generated */ if( retCode == ENUM_VALUE(RetCode,TA_SUCCESS,Success) ) /* Generated */ { /* Generated */ tempInteger = VALUE_HANDLE_GET(outBegIdx1) - VALUE_HANDLE_GET(outBegIdx2); /* Generated */ if( doPercentageOutput != 0 ) /* Generated */ { /* Generated */ for( i=0,j=tempInteger; i < VALUE_HANDLE_GET(outNbElement1); i++, j++ ) /* Generated */ { /* Generated */ tempReal = outReal[i]; /* Generated */ if( !TA_IS_ZERO(tempReal) ) /* Generated */ outReal[i] = ((tempBuffer[j]-tempReal)/tempReal)*100.0; /* Generated */ else /* Generated */ outReal[i] = 0.0; /* Generated */ } /* Generated */ } /* Generated */ else /* Generated */ { /* Generated */ for( i=0,j=tempInteger; i < VALUE_HANDLE_GET(outNbElement1); i++, j++ ) /* Generated */ outReal[i] = tempBuffer[j]-outReal[i]; /* Generated */ } /* Generated */ VALUE_HANDLE_DEREF(outBegIdx) = VALUE_HANDLE_GET(outBegIdx1); /* Generated */ VALUE_HANDLE_DEREF(outNBElement) = VALUE_HANDLE_GET(outNbElement1); /* Generated */ } /* Generated */ } /* Generated */ if( retCode != ENUM_VALUE(RetCode,TA_SUCCESS,Success) ) /* Generated */ { /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx); /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outNBElement); /* Generated */ } /* Generated */ return retCode; /* Generated */ }
/* Generated */ TA_RetCode TA_S_ACCBANDS( int startIdx, /* Generated */ int endIdx, /* Generated */ const float inHigh[], /* Generated */ const float inLow[], /* Generated */ const float inClose[], /* Generated */ int optInTimePeriod, /* From 2 to 100000 */ /* Generated */ int *outBegIdx, /* Generated */ int *outNBElement, /* Generated */ double outRealUpperBand[], /* Generated */ double outRealMiddleBand[], /* Generated */ double outRealLowerBand[] ) /* Generated */ #endif /* Generated */ { /* Generated */ ENUM_DECLARATION(RetCode) retCode; /* Generated */ ARRAY_REF( tempBuffer1 ); /* Generated */ ARRAY_REF( tempBuffer2 ); /* Generated */ VALUE_HANDLE_INT(outBegIdxDummy); /* Generated */ VALUE_HANDLE_INT(outNbElementDummy); /* Generated */ int i, j, outputSize, bufferSize, lookbackTotal; /* Generated */ double 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(!inHigh||!inLow||!inClose) /* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam); /* Generated */ #endif /* Generated */ if( (int)optInTimePeriod == TA_INTEGER_DEFAULT ) /* Generated */ optInTimePeriod = 20; /* Generated */ else if( ((int)optInTimePeriod < 2) || ((int)optInTimePeriod > 100000) ) /* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam); /* Generated */ #if !defined(_JAVA) /* Generated */ if( !outRealUpperBand ) /* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam); /* Generated */ if( !outRealMiddleBand ) /* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam); /* Generated */ if( !outRealLowerBand ) /* Generated */ return ENUM_VALUE(RetCode,TA_BAD_PARAM,BadParam); /* Generated */ #endif /* Generated */ #endif /* Generated */ lookbackTotal = LOOKBACK_CALL(SMA)( optInTimePeriod ); /* 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 */ outputSize = endIdx-startIdx+1; /* Generated */ bufferSize = outputSize+lookbackTotal; /* Generated */ ARRAY_ALLOC(tempBuffer1, bufferSize ); /* Generated */ #if !defined(_JAVA) /* Generated */ if( !tempBuffer1 ) /* Generated */ { /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx); /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outNBElement); /* Generated */ return ENUM_VALUE(RetCode,TA_ALLOC_ERR,AllocErr); /* Generated */ } /* Generated */ #endif /* Generated */ ARRAY_ALLOC(tempBuffer2, bufferSize ); /* Generated */ #if !defined(_JAVA) /* Generated */ if( !tempBuffer2 ) /* Generated */ { /* Generated */ ARRAY_FREE(tempBuffer1); /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx); /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outNBElement); /* Generated */ return ENUM_VALUE(RetCode,TA_ALLOC_ERR,AllocErr); /* Generated */ } /* Generated */ #endif /* Generated */ for(j=0, i=startIdx-lookbackTotal; i<=endIdx; i++, j++) /* Generated */ { /* Generated */ tempReal = inHigh[i]+inLow[i]; /* Generated */ if( !TA_IS_ZERO(tempReal) ) /* Generated */ { /* Generated */ tempReal = 4*(inHigh[i]-inLow[i])/tempReal; /* Generated */ tempBuffer1[j] = inHigh[i]*(1+tempReal); /* Generated */ tempBuffer2[j] = inLow[i]*(1-tempReal); /* Generated */ } /* Generated */ else /* Generated */ { /* Generated */ tempBuffer1[j] = inHigh[i]; /* Generated */ tempBuffer2[j] = inLow[i]; /* Generated */ } /* Generated */ } /* Generated */ retCode = FUNCTION_CALL(SMA)( startIdx, endIdx, inClose, /* Generated */ optInTimePeriod, /* Generated */ VALUE_HANDLE_OUT(outBegIdxDummy), VALUE_HANDLE_OUT(outNbElementDummy), outRealMiddleBand ); /* Generated */ if( (retCode != ENUM_VALUE(RetCode,TA_SUCCESS,Success) ) || ((int)VALUE_HANDLE_GET(outNbElementDummy) != outputSize) ) /* Generated */ { /* Generated */ ARRAY_FREE( tempBuffer1 ); /* Generated */ ARRAY_FREE( tempBuffer2 ); /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx); /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outNBElement); /* Generated */ return retCode; /* Generated */ } /* Generated */ retCode = FUNCTION_CALL_DOUBLE(SMA)( 0, bufferSize-1, tempBuffer1, /* Generated */ optInTimePeriod, /* Generated */ VALUE_HANDLE_OUT(outBegIdxDummy), VALUE_HANDLE_OUT(outNbElementDummy), /* Generated */ outRealUpperBand ); /* Generated */ if( (retCode != ENUM_VALUE(RetCode,TA_SUCCESS,Success) ) || ((int)VALUE_HANDLE_GET(outNbElementDummy) != outputSize) ) /* Generated */ { /* Generated */ ARRAY_FREE( tempBuffer1 ); /* Generated */ ARRAY_FREE( tempBuffer2 ); /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx); /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outNBElement); /* Generated */ return retCode; /* Generated */ } /* Generated */ retCode = FUNCTION_CALL_DOUBLE(SMA)( 0, bufferSize-1, tempBuffer2, /* Generated */ optInTimePeriod, /* Generated */ VALUE_HANDLE_OUT(outBegIdxDummy), VALUE_HANDLE_OUT(outNbElementDummy), /* Generated */ outRealLowerBand ); /* Generated */ ARRAY_FREE( tempBuffer1 ); /* Generated */ ARRAY_FREE( tempBuffer2 ); /* Generated */ if( (retCode != ENUM_VALUE(RetCode,TA_SUCCESS,Success) ) || ((int)VALUE_HANDLE_GET(outNbElementDummy) != outputSize) ) /* Generated */ { /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outBegIdx); /* Generated */ VALUE_HANDLE_DEREF_TO_ZERO(outNBElement); /* Generated */ return retCode; /* Generated */ } /* Generated */ VALUE_HANDLE_DEREF(outBegIdx) = startIdx; /* Generated */ VALUE_HANDLE_DEREF(outNBElement) = outputSize; /* Generated */ return ENUM_VALUE(RetCode,TA_SUCCESS,Success); /* Generated */ }
/* Generated */ TA_RetCode TA_S_RSI( 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 outIdx; /* Generated */ int today, lookbackTotal, unstablePeriod, i; /* Generated */ double prevGain, prevLoss, prevValue, savePrevValue; /* Generated */ double tempValue1, tempValue2; /* Generated */ #ifndef TA_FUNC_NO_RANGE_CHECK /* Generated */ if( startIdx < 0 ) /* Generated */ return TA_OUT_OF_RANGE_START_INDEX; /* Generated */ if( (endIdx < 0) || (endIdx < startIdx)) /* Generated */ return TA_OUT_OF_RANGE_END_INDEX; /* Generated */ if( !inReal ) return TA_BAD_PARAM; /* Generated */ if( (int)optInTimePeriod == TA_INTEGER_DEFAULT ) /* Generated */ optInTimePeriod = 14; /* Generated */ else if( ((int)optInTimePeriod < 2) || ((int)optInTimePeriod > 100000) ) /* Generated */ return TA_BAD_PARAM; /* Generated */ if( outReal == NULL ) /* Generated */ return TA_BAD_PARAM; /* Generated */ #endif /* Generated */ *outBegIdx = 0; /* Generated */ *outNbElement = 0; /* Generated */ lookbackTotal = TA_RSI_Lookback( optInTimePeriod ); /* Generated */ if( startIdx < lookbackTotal ) /* Generated */ startIdx = lookbackTotal; /* Generated */ if( startIdx > endIdx ) /* Generated */ return TA_SUCCESS; /* Generated */ outIdx = 0; /* Generated */ if( optInTimePeriod == 1 ) /* Generated */ { /* Generated */ *outBegIdx = startIdx; /* Generated */ i = (endIdx-startIdx)+1; /* Generated */ *outNbElement = i; /* Generated */ ARRAY_MEMMOVE( outReal, 0, inReal, startIdx, i ); /* Generated */ return TA_SUCCESS; /* Generated */ } /* Generated */ today = startIdx-lookbackTotal; /* Generated */ prevValue = inReal[today]; /* Generated */ unstablePeriod = TA_Globals->unstablePeriod[TA_FUNC_UNST_RSI]; /* Generated */ if( (unstablePeriod == 0) && /* Generated */ (TA_Globals->compatibility == TA_COMPATIBILITY_METASTOCK)) /* Generated */ { /* Generated */ savePrevValue = prevValue; /* Generated */ prevGain = 0.0; /* Generated */ prevLoss = 0.0; /* Generated */ for( i=optInTimePeriod; i > 0; i-- ) /* Generated */ { /* Generated */ tempValue1 = inReal[today++]; /* Generated */ tempValue2 = tempValue1 - prevValue; /* Generated */ prevValue = tempValue1; /* Generated */ if( tempValue2 < 0 ) /* Generated */ prevLoss -= tempValue2; /* Generated */ else /* Generated */ prevGain += tempValue2; /* Generated */ } /* Generated */ tempValue1 = prevLoss/optInTimePeriod; /* Generated */ tempValue2 = prevGain/optInTimePeriod; /* Generated */ tempValue1 = tempValue2+tempValue1; /* Generated */ if( !TA_IS_ZERO(tempValue1) ) /* Generated */ outReal[outIdx++] = 100*(tempValue2/tempValue1); /* Generated */ else /* Generated */ outReal[outIdx++] = 0.0; /* Generated */ if( today > endIdx ) /* Generated */ { /* Generated */ *outBegIdx = startIdx; /* Generated */ *outNbElement = outIdx; /* Generated */ return TA_SUCCESS; /* Generated */ } /* Generated */ today -= optInTimePeriod; /* Generated */ prevValue = savePrevValue; /* Generated */ } /* Generated */ prevGain = 0.0; /* Generated */ prevLoss = 0.0; /* Generated */ today++; /* Generated */ for( i=optInTimePeriod; i > 0; i-- ) /* Generated */ { /* Generated */ tempValue1 = inReal[today++]; /* Generated */ tempValue2 = tempValue1 - prevValue; /* Generated */ prevValue = tempValue1; /* Generated */ if( tempValue2 < 0 ) /* Generated */ prevLoss -= tempValue2; /* Generated */ else /* Generated */ prevGain += tempValue2; /* Generated */ } /* Generated */ prevLoss /= optInTimePeriod; /* Generated */ prevGain /= optInTimePeriod; /* Generated */ if( today > startIdx ) /* Generated */ { /* Generated */ tempValue1 = prevGain+prevLoss; /* Generated */ if( !TA_IS_ZERO(tempValue1) ) /* Generated */ outReal[outIdx++] = 100.0*(prevGain/tempValue1); /* Generated */ else /* Generated */ outReal[outIdx++] = 0.0; /* Generated */ } /* Generated */ else /* Generated */ { /* Generated */ while( today < startIdx ) /* Generated */ { /* Generated */ tempValue1 = inReal[today]; /* Generated */ tempValue2 = tempValue1 - prevValue; /* Generated */ prevValue = tempValue1; /* Generated */ prevLoss *= (optInTimePeriod-1); /* Generated */ prevGain *= (optInTimePeriod-1); /* Generated */ if( tempValue2 < 0 ) /* Generated */ prevLoss -= tempValue2; /* Generated */ else /* Generated */ prevGain += tempValue2; /* Generated */ prevLoss /= optInTimePeriod; /* Generated */ prevGain /= optInTimePeriod; /* Generated */ today++; /* Generated */ } /* Generated */ } /* Generated */ while( today <= endIdx ) /* Generated */ { /* Generated */ tempValue1 = inReal[today++]; /* Generated */ tempValue2 = tempValue1 - prevValue; /* Generated */ prevValue = tempValue1; /* Generated */ prevLoss *= (optInTimePeriod-1); /* Generated */ prevGain *= (optInTimePeriod-1); /* Generated */ if( tempValue2 < 0 ) /* Generated */ prevLoss -= tempValue2; /* Generated */ else /* Generated */ prevGain += tempValue2; /* Generated */ prevLoss /= optInTimePeriod; /* Generated */ prevGain /= optInTimePeriod; /* Generated */ tempValue1 = prevGain+prevLoss; /* Generated */ if( !TA_IS_ZERO(tempValue1) ) /* Generated */ outReal[outIdx++] = 100.0*(prevGain/tempValue1); /* Generated */ else /* Generated */ outReal[outIdx++] = 0.0; /* Generated */ } /* Generated */ *outBegIdx = startIdx; /* Generated */ *outNbElement = outIdx; /* Generated */ return TA_SUCCESS; /* Generated */ }