Issue
The close price does not change each time a new bar is generated.
Cause
for bar in self.bars:
closes.append(bar.close)
In the for loop above "bar" should be changed to something else so that it's not overwritting "bar" from:
def on_bar_update(self, reqId, bar, realtime):