CCI should use
Brought to you by:
fortier
There is a bug in CCI - for some data it returns wrong results. For ex.:
import talib
import numpy as np
timeperiod = 8
data = [1.1] *timeperiod
lows = np.asarray(data)
highs = lows.copy()
closes = lows.copy()
talib_ret = talib.CCI(highs, lows, closes, timeperiod=timeperiod)
print("talib", talib_ret[-1])
>>>> talib 66.66666666666667
while 0.0
is expected at talib_ret[-1]
.
That's because TA_CCI() contains:
if( (tempReal != 0.0) && (tempReal2 != 0.0) )
{
outReal[outIdx++] = tempReal/(0.015*(tempReal2/optInTimePeriod));
}
else
outReal[outIdx++] = 0.0;
while it should be:
if( (!TA_IS_ZERO(tempReal)) && (!TA_IS_ZERO(tempReal2)) )
{
outReal[outIdx++] = tempReal/(0.015*(tempReal2/optInTimePeriod));
}
else
outReal[outIdx++] = 0.0;
where TA_IS_ZERO()
compares absolute argument value with 1e-14 instead of 0.0.
Otherwise TA_CCI() will return:
>>> 2.220446049250313e-16 / (0.015*(1.5543122344752192e-15 / 7))
66.66666666666667
Related discussion is here