class ArrayManager(object):
def init(self, size=100):
"""Constructor"""
self.count = 0
self.size = size
self.inited = False
self.open_array = np.zeros(size)
self.high_array = np.zeros(size)
self.low_array = np.zeros(size)
self.close_array = np.zeros(size)
self.volume_array = np.zeros(size)
在用户策略里经常用 下面的语句来生成一个ArrayManager:
1) self.am = ArrayManager() -----默认最多保存100个周期的bar数据
或者
2) self.am = ArrayManager(200) -----指定最多保存100个周期的bar数据
之后再用户策略的on_bar()或者self.on_xxx_bar()函数中会调用:
self.am.update_bar(bar) ---- 每次执行都会把最老的self.xxx_array一个的数据抛弃,同时添加bar的数据到self.xxx_array[-1]
sma300 = self,am.sma(300) ----- 本人故意用了300
那么问题来了:当一个am中保存的bar数据周期数不足300时,sma300的所有元素都将为NaN:
[NaN,NaN,NaN,.....,NaN]
建议:是否可以把ArrayManager多数据的存在管理做成自适应的?
方法:当用户的策略里对数据的引用数量超过ArrayManager的size时,把size调整为引用数量,重新创建各个数组xxx_array,并且把当前的数据迁移到新数组,这样当用户的bar数据个数达到引用数量时,talib的各个指标就可以计算出有实际意义的返回数组了,就可以适应策略的计算需求。