IndicatorsΒΆ

Indicators are aggregate measurements of financial data which intend is to reveal patterns and provide insights for decision making. In PyBotTrader, indicators are the most basic building block to implement trading algorithms.

There exist many libraries to compute indicators, like ta-lib, however PyBotTrader provides its own implementations because they are designed for streaming data. Instead of making calculations from scratch at every moment, indicators in PyBotTrader keep memory of the previous result and just get updated when new data is captured. This is a more efficient approach for timed data, and the same time makes easier to use them.

All the available indicators in PyBotTrader share the same interface. Once they have been initialized, you can call the update method to include more data. For example, one of the more basic indicators is the simple moving average, designated as MA in PyBotTrader. This represents the average of the n most recent data points.

from pybottrader.indicators import MA

ma = MA(period=3)
ma.update(1)
ma.update(2)
ma.update(3)

print(ma[0])  # Output is 2

ma.update(4)

print(ma[0])  # Output is 3

In the previous code section, a moving average object is created to represent the average of the last three data points. To access the value of the moving average an array notation is used. A zero index correspond to the current moment: ma[0].

By default, indicators in PyBotTrader only keep memory of the most recent value. In the previous example, when a new data point is captured, the indicator value is recomputed and the previous value is forgoten. However, you are able to modify this behavior defining how many values to be remembered including the argmument mem_size when an indicator is created.

from pybottrader.indicators import MA

ma = MA(period=3, mem_size=2)
ma.update(1)
ma.update(2)
ma.update(3)
ma.update(4)
ma.update(5)

print(ma[0])   # Output is 4
print(ma[-1])  # Output is 3
print(ma[-2])  # Output is NaN

In the previous example, a moving average object its configurated to remind two values, the current one is ma[0] and the previous one is ma[-1]. Observe that to access previous values negative indexes are used. Because the memory size is only for two values, trying to access ma[-2] returns a NaN value. Using negative indeces can seem strange for sotware developers, but it is a natural way to represent past events when the current moment is designed with the 0 index. Under this logic, positive indices can be used for future events.