Here is the snippet of Python code from Crusher that calcs RSI. I believe it does so correctly. I coded this because it thought it was useful and indeed I do use it and find it to be of value. A xy plot of returns versus indicator values reveals nothing. If simple answers were sufficient... Have a nice weekend. --jab def rsi(self): """RSI""" # checked 2004-10-15, OK self.rsi = [] length = config['indconsts.rsi'] up = dn = 0.0 # find the first value for line in range(0, length): if self.close[length - line] > self.close[length - line - 1]: up += self.close[length - line] - self.close[length - line - 1] if self.close[length - line] < self.close[length - line - 1]: dn += self.close[length - line - 1] - self.close[length - line] # pad the runup with 0 if line < (length - 1): self.rsi.append(0.0) up = up / length dn = dn / length try: self.rsi.append(100 - 100 / (1 + up / dn)) except ZeroDivisionError: self.rsi.append(0.0) # use Wilder's average technique to find the remaining values for line in range(length, len(self.date)): if self.close[line] > self.close[line - 1]: up = ((self.close[line] - self.close[line - 1]) + up * (length - 1)) / length else: up = up / length * (length - 1) if self.close[line] < self.close[line - 1]: dn = ((self.close[line - 1] - self.close[line]) + dn * (length - 1)) / length else: dn = dn / length * (length - 1) try: self.rsi.append(100 - 100 / (1 + up / dn)) except ZeroDivisionError: self.rsi.append(0.0) if config['general.debug'] == 1: for line in range(len(self.date)): print '%4d %10s %8.2f %8.2f' % (line, self.date[line], self.close[line], self.rsi[line])