Example #1
0
 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
Example #2
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])
Example #3
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])