def load_bar(self, vt_symbol: str, days: int, interval: Interval, callback: Callable[[BarData], None], use_database: bool): """""" symbol, exchange = extract_vt_symbol(vt_symbol) end = datetime.now(get_localzone()) start = end - timedelta(days) bars = [] # Pass gateway and database if use_database set to True if not use_database: # Query bars from gateway if available contract = self.main_engine.get_contract(vt_symbol) if contract and contract.history_data: req = HistoryRequest(symbol=symbol, exchange=exchange, interval=interval, start=start, end=end) bars = self.main_engine.query_history(req, contract.gateway_name) # try to load the data from database if we query no data from api. if not bars: bars = database_manager.load_bar_data( symbol=symbol, exchange=exchange, interval=interval, start=start, end=end, ) for bar in bars: callback(bar)
def load_bar(self, vt_symbol: str, days: int, interval: Interval) -> List[BarData]: """""" symbol, exchange = extract_vt_symbol(vt_symbol) end = datetime.now(get_localzone()) start = end - timedelta(days) contract: ContractData = self.main_engine.get_contract(vt_symbol) data = [] # Query bars from gateway if available if contract and contract.history_data: req = HistoryRequest( symbol=symbol, exchange=exchange, interval=interval, start=start, end=end ) data = self.main_engine.query_history(req, contract.gateway_name) if not data: data = database_manager.load_bar_data( symbol=symbol, exchange=exchange, interval=interval, start=start, end=end, ) return data
def load_bar_data(vt_symbol: str, interval: Interval, start: datetime, end: datetime): """""" symbol, exchange = extract_vt_symbol(vt_symbol) return database_manager.load_bar_data(symbol, exchange, interval, start, end)
def send_order(self, strategy: StrategyTemplate, vt_symbol: str, direction: Direction, offset: Offset, price: float, volume: float, lock: bool) -> List[str]: """""" price = round_to(price, self.priceticks[vt_symbol]) symbol, exchange = extract_vt_symbol(vt_symbol) self.limit_order_count += 1 order = OrderData( symbol=symbol, exchange=exchange, orderid=str(self.limit_order_count), direction=direction, offset=offset, price=price, volume=volume, status=Status.SUBMITTING, datetime=self.datetime, gateway_name=self.gateway_name, ) self.active_limit_orders[order.vt_orderid] = order self.limit_orders[order.vt_orderid] = order return [order.vt_orderid]
def __init__( self, strategy_engine: StrategyEngine, strategy_name: str, vt_symbols: List[str], setting: dict ): """""" super().__init__(strategy_engine, strategy_name, vt_symbols, setting) self.bgs: Dict[str, BarGenerator] = {} self.last_tick_time: datetime = None # Obtain contract info for vt_symbol in self.vt_symbols: symbol, exchange = extract_vt_symbol(vt_symbol) if "C" in symbol: self.call_symbol = vt_symbol _, strike_str = symbol.split("-C-") # For CFFEX/DCE options self.strike_price = int(strike_str) elif "P" in symbol: self.put_symbol = vt_symbol else: self.futures_symbol = vt_symbol def on_bar(bar: BarData): """""" pass self.bgs[vt_symbol] = BarGenerator(on_bar)
def load_bar_data(spread: SpreadData, interval: Interval, start: datetime, end: datetime, pricetick: float = 0): """""" # Load bar data of each spread leg leg_bars: Dict[str, Dict] = {} for vt_symbol in spread.legs.keys(): symbol, exchange = extract_vt_symbol(vt_symbol) bar_data: List[BarData] = database_manager.load_bar_data( symbol, exchange, interval, start, end) bars: Dict[datetime, BarData] = {bar.datetime: bar for bar in bar_data} leg_bars[vt_symbol] = bars # Calculate spread bar data spread_bars: List[BarData] = [] for dt in bars.keys(): spread_price = 0 spread_value = 0 spread_available = True for leg in spread.legs.values(): leg_bar = leg_bars[leg.vt_symbol].get(dt, None) if leg_bar: price_multiplier = spread.price_multipliers[leg.vt_symbol] spread_price += price_multiplier * leg_bar.close_price spread_value += abs(price_multiplier) * leg_bar.close_price else: spread_available = False if spread_available: if pricetick: spread_price = round_to(spread_price, pricetick) spread_bar = BarData( symbol=spread.name, exchange=exchange.LOCAL, datetime=dt, interval=interval, open_price=spread_price, high_price=spread_price, low_price=spread_price, close_price=spread_price, gateway_name="SPREAD", ) spread_bar.value = spread_value spread_bars.append(spread_bar) return spread_bars
def get_position(self, vt_symbol: str, direction: Direction): """""" key = (vt_symbol, direction) if key in self.positions: return self.positions[key] else: symbol, exchange = extract_vt_symbol(vt_symbol) position = PositionData(symbol=symbol, exchange=exchange, direction=direction, gateway_name=GATEWAY_NAME) self.positions[key] = position return position
def run_downloading( self, vt_symbol: str, interval: str, start: datetime, end: datetime ): """ Query bar data from RQData. """ self.write_log(f"{vt_symbol}-{interval}开始下载历史数据") try: symbol, exchange = extract_vt_symbol(vt_symbol) except ValueError: self.write_log(f"{vt_symbol}解析失败,请检查交易所后缀") self.thread = None return req = HistoryRequest( symbol=symbol, exchange=exchange, interval=Interval(interval), start=start, end=end ) contract = self.main_engine.get_contract(vt_symbol) try: # If history data provided in gateway, then query if contract and contract.history_data: data = self.main_engine.query_history( req, contract.gateway_name ) if data: database_manager.save_bar_data(data) self.write_log(f"{vt_symbol}-{interval}历史数据下载完成") else: self.write_log(f"数据下载失败,无法获取{vt_symbol}的历史数据") except Exception: msg = f"数据下载失败,触发异常:\n{traceback.format_exc()}" self.write_log(msg) # Clear thread object handler. self.thread = None
def load_tick(self, vt_symbol: str, days: int, callback: Callable[[TickData], None]): """""" symbol, exchange = extract_vt_symbol(vt_symbol) end = datetime.now() start = end - timedelta(days) ticks = database_manager.load_tick_data( symbol=symbol, exchange=exchange, start=start, end=end, ) for tick in ticks: callback(tick)