class BarTracker(object): """ 跟踪器,可能是策略,策略用到的非主合约数据,独立指标。 :ivar events_pool: 事件池。 :ivar blotter: 订单本地处理器。 :ivar exchange: 模拟交易所。 :ivar _excution: 最小执行单元。 :ivar _series: 当前跟踪器负责维护的时间序列变量集合。 :ivar _main_pcontract: 主合约。即self.open等指向的合约。 :ivar open: 主合约当前Bar的开盘价。 :ivar close: 主合约当前Bar的收盘价。 :ivar high: 主合约当前Bar的最高价。 :ivar low: 主合约当前Bar的最低价。 :ivar volume: 主合约当前Bar的成交量。 :ivar datetime: 主合约当前Bar的开盘时间。 :ivar curbar: 当前Bar索引。 """ def __init__(self, exe_unit, pcontract=None): """ 初始化数据列表 Args: pcontract (PContract): 周期合约, 空表示仅是跟踪器,非策略。 """ self.events_pool = EventsPool() self.blotter = SimpleBlotter(None, self.events_pool) self.exchange = Exchange(self.events_pool, strict=False) self._excution = exe_unit # tracker中用到的时间序列 self._series = [] try: if pcontract: self._main_pcontract = pcontract exe_unit.add_tracker(self) else: self._main_pcontract = exe_unit.pcontracts[0] exe_unit.add_strategy(self) self._main_contract = self._main_pcontract.contract self._data = exe_unit.data[self._main_pcontract] self._container_day = np.zeros(shape=(self.length_day( self._main_pcontract), ), dtype=float) self._init_main_data() except KeyError: ## @todo 提醒用户用法。 raise KeyError def length_day(self, pcontract): """ 计算当天的数据量 """ ## @todo local_data return 4 @property def container_day(self): """ 为当天数据预留的空间 """ return self._container_day def _init_main_data(self): # 预留了历史和当天的数据空间。 self.open = NumberSeries(self, self._data.open, True) self.close = NumberSeries(self, self._data.close, True) self.high = NumberSeries(self, self._data.high, True) self.low = NumberSeries(self, self._data.low, True) self.volume = NumberSeries(self, self._data.volume, True) self.datetime = DateTimeSeries(self, self._data.index, True) self.curbar = 0 def on_tick(self): """ tick数据到达时候触发。 """ pass def on_bar(self): """ Bar数据到达时候触发。""" pass def execute_strategy(self): self.on_tick() self.on_bar() def add_series(self, series): """ 添加时间序列变量。 每个跟踪器都要维护策略使用的时间序列变量,当新的Bar数据 到达后,通过BarTracker.update_curbar函数更新时间序列变量的最 后一个值。 """ self._series.append(series) def update_curbar(self, index): """ 新的bar数据到达时,更新相关信息, 如其负责维护的时间序列对象变量的最新值。 :param int index: 当前bar索引。 :return: 最新的Bar对象。 :rtype: Bar """ self.curbar = index self.open.update_curbar(index) self.close.update_curbar(index) self.high.update_curbar(index) self.low.update_curbar(index) self.volume.update_curbar(index) self.datetime.update_curbar(index) for serie in self._series: serie.update_curbar(index) serie.duplicate_last_element() return Bar(self.datetime[0], self.open[0], self.close[0], self.high[0], self.low[0], self.volume[0])
class BarTracker(object): """ 跟踪器,可能是策略,策略用到的非主合约数据,独立指标。 :ivar events_pool: 事件池。 :ivar blotter: 订单本地处理器。 :ivar exchange: 模拟交易所。 :ivar _excution: 最小执行单元。 :ivar _series: 当前跟踪器负责维护的时间序列变量集合。 :ivar _main_pcontract: 主合约。即self.open等指向的合约。 :ivar open: 主合约当前Bar的开盘价。 :ivar close: 主合约当前Bar的收盘价。 :ivar high: 主合约当前Bar的最高价。 :ivar low: 主合约当前Bar的最低价。 :ivar volume: 主合约当前Bar的成交量。 :ivar datetime: 主合约当前Bar的开盘时间。 :ivar curbar: 当前Bar索引。 """ def __init__(self, exe_unit, pcontract=None): """ 初始化数据列表 Args: pcontract (PContract): 周期合约, 空表示仅是跟踪器,非策略。 """ self.events_pool = EventsPool() self.blotter = SimpleBlotter(None, self.events_pool) self.exchange = Exchange(self.events_pool, strict=False) self._excution = exe_unit # tracker中用到的时间序列 self._series = [] try: if pcontract: self._main_pcontract = pcontract exe_unit.add_tracker(self) else: self._main_pcontract = exe_unit.pcontracts[0] exe_unit.add_strategy(self) self._main_contract = self._main_pcontract.contract self._data = exe_unit.data[self._main_pcontract] self._container_day = np.zeros(shape=(self.length_day(self._main_pcontract), ), dtype = float) self._init_main_data() except KeyError: ## @todo 提醒用户用法。 raise KeyError def length_day(self, pcontract): """ 计算当天的数据量 """ ## @todo local_data return 4 @property def container_day(self): """ 为当天数据预留的空间 """ return self._container_day def _init_main_data(self): # 预留了历史和当天的数据空间。 self.open = NumberSeries(self, self._data.open, True) self.close = NumberSeries(self, self._data.close, True) self.high = NumberSeries(self, self._data.high, True) self.low = NumberSeries(self, self._data.low, True) self.volume = NumberSeries(self, self._data.volume, True) self.datetime = DateTimeSeries(self, self._data.index, True) self.curbar = 0 def on_tick(self): """ tick数据到达时候触发。 """ pass def on_bar(self): """ Bar数据到达时候触发。""" pass def execute_strategy(self): self.on_tick() self.on_bar() def add_series(self, series): """ 添加时间序列变量。 每个跟踪器都要维护策略使用的时间序列变量,当新的Bar数据 到达后,通过BarTracker.update_curbar函数更新时间序列变量的最 后一个值。 """ self._series.append(series) def update_curbar(self, index): """ 新的bar数据到达时,更新相关信息, 如其负责维护的时间序列对象变量的最新值。 :param int index: 当前bar索引。 :return: 最新的Bar对象。 :rtype: Bar """ self.curbar = index self.open.update_curbar(index) self.close.update_curbar(index) self.high.update_curbar(index) self.low.update_curbar(index) self.volume.update_curbar(index) self.datetime.update_curbar(index) for serie in self._series: serie.update_curbar(index) serie.duplicate_last_element() return Bar(self.datetime[0], self.open[0], self.close[0], self.high[0], self.low[0], self.volume[0])
class BarTracker(Simulator): """ 跟踪器,可能是策略,策略用到的非主合约数据,独立指标。 """ def __init__(self, exe_unit, pcontract=None): """ 初始化数据列表 Args: pcontract (PContract): 周期合约, 非空表示跟踪器,非策略。 """ super(BarTracker, self).__init__() self._excution = exe_unit # tracker中用到的时间序列 self._series = [] try: if pcontract: self._main_pcontract = pcontract exe_unit.add_tracker(self) else: self._main_pcontract = exe_unit.pcontracts[0] exe_unit.add_strategy(self) self._main_contract = self._main_pcontract.contract self._data = exe_unit.data[self._main_pcontract] self._container_day = np.zeros(shape=(self.length_day(self._main_pcontract), ), dtype = float) self._init_main_data() except KeyError: ## @todo 提醒用户用法。 raise KeyError def length_day(self, pcontract): """ 计算当天的数据量 """ ## @todo local_data return 4 @property def container_day(self): """ 为当天数据预留的空间 """ return self._container_day def _init_main_data(self): # 预留了历史和当天的数据空间。 self.open = NumberSeries(self, self._data.open, True) self.close = NumberSeries(self, self._data.close, True) self.high = NumberSeries(self, self._data.high, True) self.low = NumberSeries(self, self._data.low, True) self.volume = NumberSeries(self, self._data.volume, True) self.datetime = DateTimeSeries(self, self._data.index, True) self.curbar = 0 def on_tick(self): """""" pass def execute_strategy(self): self.on_tick() def add_series(self, series): self._series.append(series) def _open(self, pcon): """docstring for open""" #self.open = NumberSeries(self, _data.open, True) #self.close = NumberSeries(self, _data.close, True) #self.high = NumberSeries(self, _data.high, True) #self.low = NumberSeries(self, _data.low, True) #self.volume = NumberSeries(self, _data.volume, True) pass def update_curbar(self, index): """ 更新当前bar索引。 更新注册过的serie变量的索引, 计算系列指标中的最新值。 Args: index (int): 当前bar索引。 Raises: SeriesIndexError """ self.curbar = index self.open.update_curbar(index) self.close.update_curbar(index) self.high.update_curbar(index) self.low.update_curbar(index) self.volume.update_curbar(index) self.datetime.update_curbar(index) for serie in self._series: serie.update_curbar(index) serie.duplicate_last_element() return Bar(self.datetime[0], self.open[0], self.close[0], self.high[0], self.low[0], self.volume[0])