def __init__(self, start_time: datetime.datetime, end_time: datetime.datetime, frequency: str): assert is_aware_datetime(start_time) assert is_aware_datetime(end_time) if start_time >= end_time: raise SettingError(_("START TIME can not bigger than END TIME")) self.start_time = start_time self.end_time = end_time self.frequency = FREQ_DICT.get(frequency) self.current = start_time
def active_instruments( self, date_time: datetime.datetime) -> Dict[str, Instrument]: assert is_aware_datetime(date_time) active = {} for instrument in self.instruments.values(): if instrument.expiry_date is None: active[instrument.symbol] = instrument continue if instrument.listing_date is None: continue if instrument.listing_date < date_time and instrument.expiry_date > date_time: active[instrument.symbol] = instrument return active
def get_last_price(self, symbol: str, date_time: datetime.datetime) -> float: assert is_aware_datetime(date_time) kline = self._kline_store.get(symbol) time_target = make_datetime_exactly(date_time, "T", forward=False) try: bar = kline.loc[time_target] return bar['close'] except KeyError: logger.warning( _("Instrument {} on {} has no bar data., Use 0 as last price". format(symbol, date_time))) return 0.0
def get_kline(self, symbol: str, date_time: datetime.datetime, count: int) -> pandas.DataFrame: assert is_aware_datetime(date_time) kline_frame = self._kline_store.get(symbol) target_klines = kline_count_window(kline_frame, date_time, count) return target_klines
def test_aware_datetime() -> None: d1 = datetime.datetime(2018, 1, 1, 12, 0, 0) assert not is_aware_datetime(d1) d2 = datetime.datetime(2018, 1, 1, 12, tzinfo=pytz.utc) assert is_aware_datetime(d2)