INDICATOR(RSI)(const std::vector<Candlestick>* candlesticks, int* startIndex) { std::vector<double> indicatorData = std::vector<double>(); int outBeginIdx; int outNbElement; int optInTimePeriod = 14; unsigned int lookback = TA_RSI_Lookback(optInTimePeriod); if (candlesticks->size() <= lookback) { return indicatorData; } //Initialize all required parameters this->PrepareParameters(candlesticks); //Perform the RSI calculation TA_RSI( this->startIdx, this->endIdx, this->inClose, optInTimePeriod, &outBeginIdx, &outNbElement, this->outReal); //Put the result into indicator data vector in RsiModel for (int i = 0; i < outNbElement; i++) { indicatorData.push_back(outReal[i]); } *startIndex = outBeginIdx; //Cleanup all required parameters this->Clean(); return indicatorData; }
/* 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 */ outReal[outIdx++] = 100*(tempValue2/(tempValue2+tempValue1)); /* 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 */ outReal[outIdx++] = 100.0*(prevGain/(prevGain+prevLoss)); /* 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 */ outReal[outIdx++] = 100.0*(prevGain/(prevGain+prevLoss)); /* Generated */ } /* Generated */ *outBegIdx = startIdx; /* Generated */ *outNbElement = outIdx; /* Generated */ return TA_SUCCESS; /* Generated */ }