""" Broker 经济人,负责处理处理撮合交易订单等功能. 微信:bitquant51 火币交易所推荐码:asd43 币安推荐码: 22795115 币安推荐链接:https://www.binance.co/?ref=22795115 Gateio交易所荐码:1100714 Bitmex交易所推荐码:SzZBil 或者 https://www.bitmex.com/register/SzZBil 代码地址: https://github.com/ramoslin02/51bitqunt 视频更新:首先在Youtube上更新,搜索51bitquant 关注我 B站视频: """ import numpy as np import talib from .data import BarData class ArrayManager(object): """ For: 1. time series container of bar data 2. calculating technical indicator value """ def __init__(self, size=500): """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) def update_bar(self, bar: BarData): """ Update new bar data into array manager. """ self.count += 1 if not self.inited and self.count >= self.size: self.inited = True # [1,2,3,4,5,6,7,8,9,10] # [1,2,3,4,5,6,7,8,9] = [2,3,4,5,6,7,8,9,10] # [2,3,4,5,6,7,8,9,10, 10] self.open_array[:-1] = self.open_array[1:] self.high_array[:-1] = self.high_array[1:] self.low_array[:-1] = self.low_array[1:] self.close_array[:-1] = self.close_array[1:] self.volume_array[:-1] = self.volume_array[1:] # [2,3,4,5,6,7,8,9,10, 10] 然后最后一个数字被替换了. self.open_array[-1] = bar.open_price self.high_array[-1] = bar.high_price self.low_array[-1] = bar.low_price self.close_array[-1] = bar.close_price self.volume_array[-1] = bar.volume @property def open(self): """ Get open price time series. """ return self.open_array @property def high(self): """ Get high price time series. """ return self.high_array @property def low(self): """ Get low price time series. """ return self.low_array @property def close(self): """ Get close price time series. """ return self.close_array @property def volume(self): """ Get trading volume time series. """ return self.volume_array def sma(self, n, array=False): """ Simple moving average. """ result = talib.SMA(self.close, n) if array: return result return result[-1] def std(self, n, array=False): """ Standard deviation """ result = talib.STDDEV(self.close, n) if array: return result return result[-1] def cci(self, n, array=False): """ Commodity Channel Index (CCI). """ result = talib.CCI(self.high, self.low, self.close, n) if array: return result return result[-1] def atr(self, n, array=False): """ Average True Range (ATR). """ result = talib.ATR(self.high, self.low, self.close, n) if array: return result return result[-1] def rsi(self, n, array=False): """ Relative Strenght Index (RSI). """ result = talib.RSI(self.close, n) if array: return result return result[-1] def macd(self, fast_period, slow_period, signal_period, array=False): """ MACD. """ macd, signal, hist = talib.MACD( self.close, fast_period, slow_period, signal_period ) if array: return macd, signal, hist return macd[-1], signal[-1], hist[-1] def adx(self, n, array=False): """ ADX. """ result = talib.ADX(self.high, self.low, self.close, n) if array: return result return result[-1] def boll(self, n, dev, array=False): """ Bollinger Channel. """ mid = self.sma(n, array) std = self.std(n, array) up = mid + std * dev down = mid - std * dev return up, down def keltner(self, n, dev, array=False): """ Keltner Channel. """ mid = self.sma(n, array) atr = self.atr(n, array) up = mid + atr * dev down = mid - atr * dev return up, down def donchian(self, n, array=False): """ Donchian Channel. """ up = talib.MAX(self.high, n) down = talib.MIN(self.low, n) if array: return up, down return up[-1], down[-1]