def on_quote_change(self, tiger_symbol: str, data: list, trading: bool): """""" data = dict(data) symbol, exchange = convert_symbol_tiger2vt(tiger_symbol) tick = self.ticks.get(symbol, None) if not tick: tick = TickData( symbol=symbol, exchange=exchange, gateway_name=self.gateway_name, datetime=datetime.now(), name=self.symbol_names[symbol], ) self.ticks[symbol] = tick tick.datetime = datetime.fromtimestamp(data["latest_time"] / 1000) tick.pre_close = data.get("prev_close", 0) tick.last_price = data.get("latest_price", 0) tick.volume = data.get("volume", 0) tick.open_price = data.get("open", 0) tick.open_price = data.get("open", 0) tick.high_price = data.get("high", 0) tick.low_price = data.get("low", 0) tick.ask_price_1 = data.get("ask_price", 0) tick.bid_price_1 = data.get("bid_price", 0) tick.ask_volume_1 = data.get("ask_size", 0) tick.bid_volume_1 = data.get("bid_size", 0) self.on_tick(copy(tick))
def onDepthMarketData(self, data: dict) -> None: """""" timestamp = str(data["data_time"]) dt = datetime.strptime(timestamp, "%Y%m%d%H%M%S%f") tick = TickData(symbol=data["ticker"], exchange=EXCHANGE_XTP2VT[data["exchange_id"]], datetime=dt, volume=data["qty"], last_price=data["last_price"], limit_up=data["upper_limit_price"], limit_down=data["lower_limit_price"], open_price=data["open_price"], high_price=data["high_price"], low_price=data["low_price"], pre_close=data["pre_close_price"], gateway_name=self.gateway_name) tick.bid_price_1, tick.bid_price_2, tick.bid_price_3, tick.bid_price_4, tick.bid_price_5 = data[ "bid"][0:5] tick.ask_price_1, tick.ask_price_2, tick.ask_price_3, tick.ask_price_4, tick.ask_price_5 = data[ "ask"][0:5] tick.bid_volume_1, tick.bid_volume_2, tick.bid_volume_3, tick.bid_volume_4, tick.bid_volume_5 = data[ "bid_qty"][0:5] tick.ask_volume_1, tick.ask_volume_2, tick.ask_volume_3, tick.ask_volume_4, tick.ask_volume_5 = data[ "ask_qty"][0:5] tick.name = symbol_name_map.get(tick.vt_symbol, tick.symbol) self.gateway.on_tick(tick)
def on_quote_change(self, tiger_symbol: str, data: list, trading: bool): """""" data = dict(data) symbol, exchange = convert_symbol_tiger2vt(tiger_symbol) tick = self.ticks.get(symbol, None) if not tick: tick = TickData( symbol=symbol, exchange=exchange, gateway_name=self.gateway_name, datetime=datetime.now(), name=self.symbol_names[symbol], ) self.ticks[symbol] = tick tick.datetime = datetime.fromtimestamp(int(data["timestamp"]) / 1000) tick.pre_close = data.get("prev_close", tick.pre_close) tick.last_price = data.get("latest_price", tick.last_price) tick.volume = data.get("volume", tick.volume) tick.open_price = data.get("open", tick.open_price) tick.high_price = data.get("high", tick.high_price) tick.low_price = data.get("low", tick.low_price) tick.ask_price_1 = data.get("ask_price", tick.ask_price_1) tick.bid_price_1 = data.get("bid_price", tick.bid_price_1) tick.ask_volume_1 = data.get("ask_size", tick.ask_volume_1) tick.bid_volume_1 = data.get("bid_size", tick.bid_volume_1) self.on_tick(copy(tick))
def getContractSnapshot(self, contract): snapshot = self.api.quote.snapshots([contract])[0] code = snapshot.code exchange = Exchange.TSE if snapshot.exchange in ["TSE", "OTC"] else Exchange.TFE symbol = f"{code}.{exchange.value}" tick = self.ticks.get(symbol, None) if tick is None: self.code2contract[symbol] = contract if exchange == Exchange.TFE: name = f"{contract['name']}{contract['delivery_month']}" else: name = f"{contract['name']}" tick = TickData( symbol=code, exchange=exchange, name=name, datetime=datetime.fromtimestamp(snapshot.ts / 1000000000 - 8 * 60 * 60), gateway_name=self.gateway_name, ) tick.volume = snapshot.total_volume tick.last_price = snapshot.close tick.limit_up = contract.limit_up tick.open_interest = 0 tick.limit_down = contract.limit_down tick.open_price = snapshot.open tick.high_price = snapshot.high tick.low_price = snapshot.low tick.pre_close = contract.reference tick.bid_price_1 = snapshot.buy_price tick.bid_volume_1 = snapshot.buy_volume tick.ask_price_1 = snapshot.sell_price tick.ask_volume_1 = snapshot.sell_volume self.ticks[symbol] = tick self.on_tick(copy(tick))
def update_account(self, dt, balance): """ 更新资金曲线 :param dt: :param balance: 账号级别,直接使用账号得的balance; :return: """ tick = TickData(gateway_name='Fund', symbol=self.symbol, exchange=Exchange.LOCAL, datetime=dt) tick.last_price = balance tick.volume = 1 tick.ask_price_1 = balance tick.ask_volume_1 = 1 tick.bid_price_1 = balance tick.bid_volume_1 = 1 tick.date = tick.datetime.strftime('%Y-%m-%d') tick.time = tick.datetime.strftime('%H:%M:%S') tick.trading_day = get_trading_date(dt) tick.open_interest = balance if self.inited: self.kline.on_tick(tick) # 如果是从账号更新,无法更新持仓盈亏 self.closed_profit = balance self.holding_profit = 0
def onStockMarketData(self, data: dict) -> None: """""" timestamp = str(data["tradingDay"]) + str(data["updateTime"]) dt = datetime.strptime(timestamp, "%Y%m%d%H:%M:%S.%f") dt = CHINA_TZ.localize(dt) tick = TickData(symbol=data["securityID"], exchange=EXCHANGE_SEC2VT[data["exchangeID"]], datetime=dt, volume=data["tradeQty"], last_price=data["latestPrice"], limit_up=data["upperLimitPrice"], limit_down=data["lowerLimitPrice"], open_price=data["openPrice"], high_price=data["highestPrice"], low_price=data["lowestPrice"], pre_close=data["preClosePrice"], gateway_name=self.gateway_name) tick.bid_price_1 = data["bidPrice1"] tick.bid_price_2 = data["bidPrice2"] tick.bid_price_3 = data["bidPrice3"] tick.bid_price_4 = data["bidPrice4"] tick.bid_price_5 = data["bidPrice5"] tick.ask_price_1 = data["askPrice1"] tick.ask_price_2 = data["askPrice2"] tick.ask_price_3 = data["askPrice3"] tick.ask_price_4 = data["askPrice4"] tick.ask_price_5 = data["askPrice5"] tick.bid_volume_1 = data["bidQty1"] tick.bid_volume_2 = data["bidQty2"] tick.bid_volume_3 = data["bidQty3"] tick.bid_volume_4 = data["bidQty4"] tick.bid_volume_5 = data["bidQty5"] tick.ask_volume_1 = data["askQty1"] tick.ask_volume_2 = data["askQty2"] tick.ask_volume_3 = data["askQty3"] tick.ask_volume_4 = data["askQty4"] tick.ask_volume_5 = data["askQty5"] tick.name = symbol_name_map.get(tick.vt_symbol, tick.symbol) self.gateway.on_tick(tick)
def onMarketData(self, mk_type: int, symbol: str, data: dict) -> None: """""" timestamp = f"{self.date}{str(data['nTime'])}" dt = datetime.strptime(timestamp, "%Y%m%d%H%M%S%f") dt = CHINA_TZ.localize(dt) tick = TickData(symbol=symbol, exchange=MK_GTJA2VT[mk_type], datetime=dt, volume=data["iVolume"], last_price=data["uMatch"] / 10000, limit_up=data["uHighLimited"] / 10000, limit_down=data["uLowLimited"] / 10000, open_price=data["uOpen"] / 10000, high_price=data["uHigh"] / 10000, low_price=data["uLow"] / 10000, pre_close=data["uPreClose"] / 10000, gateway_name=self.gateway_name) tick.bid_price_1, tick.bid_price_2, tick.bid_price_3, tick.bid_price_4, tick.bid_price_5 = data[ "bid"][0:5] tick.ask_price_1, tick.ask_price_2, tick.ask_price_3, tick.ask_price_4, tick.ask_price_5 = data[ "ask"][0:5] tick.bid_volume_1, tick.bid_volume_2, tick.bid_volume_3, tick.bid_volume_4, tick.bid_volume_5 = data[ "bid_qty"][0:5] tick.ask_volume_1, tick.ask_volume_2, tick.ask_volume_3, tick.ask_volume_4, tick.ask_volume_5 = data[ "ask_qty"][0:5] pricetick = symbol_pricetick_map.get(tick.vt_symbol, 0) if pricetick: tick.bid_price_1 = round_to(tick.bid_price_1 / 10000, pricetick) tick.bid_price_2 = round_to(tick.bid_price_2 / 10000, pricetick) tick.bid_price_3 = round_to(tick.bid_price_3 / 10000, pricetick) tick.bid_price_4 = round_to(tick.bid_price_4 / 10000, pricetick) tick.bid_price_5 = round_to(tick.bid_price_5 / 10000, pricetick) tick.ask_price_1 = round_to(tick.ask_price_1 / 10000, pricetick) tick.ask_price_2 = round_to(tick.ask_price_2 / 10000, pricetick) tick.ask_price_3 = round_to(tick.ask_price_3 / 10000, pricetick) tick.ask_price_4 = round_to(tick.ask_price_4 / 10000, pricetick) tick.ask_price_5 = round_to(tick.ask_price_5 / 10000, pricetick) tick.name = symbol_name_map.get(tick.vt_symbol, tick.symbol) self.gateway.on_tick(tick)
def onRtnStockData(self, head: dict, data: dict) -> None: """""" #print(data) timestamp = f"{head['tradeDate']} {head['updateTime']}" tick = TickData(symbol=data["SecurityID"], exchange=EXCHANGE_OES2VT[head["exchId"]], datetime=datetime.strptime(timestamp, "%Y%m%d %H%M%S%f"), volume=data["TotalVolumeTraded"], pre_close=data["PrevClosePx"], last_price=data["TradePx"] / 10000, open_price=data["OpenPx"] / 10000, high_price=data["HighPx"] / 10000, low_price=data["LowPx"] / 10000, gateway_name=self.gateway_name) tick.bid_price_1, tick.bid_price_2, tick.bid_price_3, tick.bid_price_4, tick.bid_price_5 = data[ "bid"][0:5] tick.ask_price_1, tick.ask_price_2, tick.ask_price_3, tick.ask_price_4, tick.ask_price_5 = data[ "ask"][0:5] tick.bid_volume_1, tick.bid_volume_2, tick.bid_volume_3, tick.bid_volume_4, tick.bid_volume_5 = data[ "bid_qty"][0:5] tick.ask_volume_1, tick.ask_volume_2, tick.ask_volume_3, tick.ask_volume_4, tick.ask_volume_5 = data[ "ask_qty"][0:5] pricetick = SYMBOL_PRICETICK_MAP.get(tick.vt_symbol, 0) #宽睿priceTick最小报价单位 (单位精确到元后四位, 即1元 = 10000)已在OesTdApi登录获取证券信息时已转换成原始报价单位 #宽睿的价格22.22显示为222200,round_to函数为去除小数后两位,不适用,用round函数替换 ipricetick = get_digits(pricetick) if pricetick: tick.bid_price_1 = round(tick.bid_price_1 / 10000, ipricetick) tick.bid_price_2 = round(tick.bid_price_2 / 10000, ipricetick) tick.bid_price_3 = round(tick.bid_price_3 / 10000, ipricetick) tick.bid_price_4 = round(tick.bid_price_4 / 10000, ipricetick) tick.bid_price_5 = round(tick.bid_price_5 / 10000, ipricetick) tick.ask_price_1 = round(tick.ask_price_1 / 10000, ipricetick) tick.ask_price_2 = round(tick.ask_price_2 / 10000, ipricetick) tick.ask_price_3 = round(tick.ask_price_3 / 10000, ipricetick) tick.ask_price_4 = round(tick.ask_price_4 / 10000, ipricetick) tick.ask_price_5 = round(tick.ask_price_5 / 10000, ipricetick) tick.name = SYMBOL_NAME_MAP.get(tick.vt_symbol, "") self.gateway.on_tick(tick)
def onRtnOptionData(self, head: dict, data: dict) -> None: """""" timestamp = f"{head['tradeDate']} {head['updateTime']}" tick = TickData(symbol=data["SecurityID"], exchange=EXCHANGE_OES2VT[head["exchId"]], datetime=datetime.strptime(timestamp, "%Y%m%d %H%M%S%f"), volume=data["TotalVolumeTraded"], pre_close=data["PrevClosePx"], last_price=data["TradePx"] / 10000, open_price=data["OpenPx"] / 10000, high_price=data["HighPx"] / 10000, low_price=data["LowPx"] / 10000, gateway_name=self.gateway_name) tick.bid_price_1, tick.bid_price_2, tick.bid_price_3, tick.bid_price_4, tick.bid_price_5 = data[ "bid"][0:5] tick.ask_price_1, tick.ask_price_2, tick.ask_price_3, tick.ask_price_4, tick.ask_price_5 = data[ "ask"][0:5] tick.bid_volume_1, tick.bid_volume_2, tick.bid_volume_3, tick.bid_volume_4, tick.bid_volume_5 = data[ "bid_qty"][0:5] tick.ask_volume_1, tick.ask_volume_2, tick.ask_volume_3, tick.ask_volume_4, tick.ask_volume_5 = data[ "ask_qty"][0:5] pricetick = SYMBOL_PRICETICK_MAP.get(tick.vt_symbol, 0) if pricetick: tick.bid_price_1 = round_to(tick.bid_price_1 / 10000, pricetick) tick.bid_price_2 = round_to(tick.bid_price_2 / 10000, pricetick) tick.bid_price_3 = round_to(tick.bid_price_3 / 10000, pricetick) tick.bid_price_4 = round_to(tick.bid_price_4 / 10000, pricetick) tick.bid_price_5 = round_to(tick.bid_price_5 / 10000, pricetick) tick.ask_price_1 = round_to(tick.ask_price_1 / 10000, pricetick) tick.ask_price_2 = round_to(tick.ask_price_2 / 10000, pricetick) tick.ask_price_3 = round_to(tick.ask_price_3 / 10000, pricetick) tick.ask_price_4 = round_to(tick.ask_price_4 / 10000, pricetick) tick.ask_price_5 = round_to(tick.ask_price_5 / 10000, pricetick) tick.name = SYMBOL_NAME_MAP.get(tick.vt_symbol, "") self.gateway.on_tick(tick)
def on_quote_change(self, tiger_symbol: str, data: list, trading: bool): """""" data = dict(data) symbol, exchange = self.get_vt_symbol_exchange(tiger_symbol) # 如果只推送了时间戳,或只推送了timeline,不向策略中推送新的tick事件 if 'latest_price' not in data and 'bid_price' not in data: return tick = self.ticks.get(symbol, None) if not tick: tick = TickData( symbol=symbol, exchange=exchange, gateway_name=self.gateway_name, datetime=datetime.now(), name=symbol, ) self.ticks[symbol] = tick # 本地止损单的设计依赖于limit up 与limit down(张跌停价格)。目前API中没有提供。 # 所以这里用high low 来代替 limit up 与limit down tick.datetime = datetime.fromtimestamp(int(data["timestamp"]) / 1000) tick.volume = data.get("volume", tick.volume) tick.ask_volume_1 = data.get("ask_size", tick.ask_volume_1) tick.bid_volume_1 = data.get("bid_size", tick.bid_volume_1) tick.pre_close = data.get("prev_close", tick.pre_close) tick.last_price = data.get("latest_price", tick.last_price) tick.open_price = data.get("open", tick.open_price) tick.high_price = data.get("high", tick.high_price) tick.low_price = data.get("low", tick.low_price) tick.ask_price_1 = data.get("ask_price", tick.ask_price_1) tick.bid_price_1 = data.get("bid_price", tick.bid_price_1) tick.limit_down = tick.low_price tick.limit_up = tick.high_price self.on_tick(copy(tick))
def qute_stock_QUT(self, code, data): tick = self.ticks.get(code, None) if tick is None: contract = self.code2contract[code] tick = TickData( symbol=code, exchange=Exchange.TSE, name=f"{contract['name']}{contract['delivery_month']}", datetime=datetime.now(), gateway_name=self.gateway_name, ) self.ticks[code] = tick tick.bid_price_1 = data["BidPrice"][0] tick.bid_price_2 = data["BidPrice"][1] tick.bid_price_3 = data["BidPrice"][2] tick.bid_price_4 = data["BidPrice"][3] tick.bid_price_5 = data["BidPrice"][4] tick.ask_price_1 = data["AskPrice"][0] tick.ask_price_2 = data["AskPrice"][1] tick.ask_price_3 = data["AskPrice"][2] tick.ask_price_4 = data["AskPrice"][3] tick.ask_price_5 = data["AskPrice"][4] tick.bid_volume_1 = data["BidVolume"][0] tick.bid_volume_2 = data["BidVolume"][1] tick.bid_volume_3 = data["BidVolume"][2] tick.bid_volume_4 = data["BidVolume"][3] tick.bid_volume_5 = data["BidVolume"][4] tick.ask_volume_1 = data["AskVolume"][0] tick.ask_volume_2 = data["AskVolume"][1] tick.ask_volume_3 = data["AskVolume"][2] tick.ask_volume_4 = data["AskVolume"][3] tick.ask_volume_5 = data["AskVolume"][4] return tick
def quote_futures_Q(self, data): code = data.get('Code', None) if code is None: return tick = self.ticks.get(code, None) if tick is None: contract = self.code2contract[code] tick = TickData( symbol=data['Code'], exchange=Exchange.TFE, name=f"{contract['name']}{contract['delivery_month']}", datetime=datetime.now(), gateway_name=self.gateway_name, ) self.ticks[code] = tick tick.bid_price_1 = data["BidPrice"][0] tick.bid_price_2 = data["BidPrice"][1] tick.bid_price_3 = data["BidPrice"][2] tick.bid_price_4 = data["BidPrice"][3] tick.bid_price_5 = data["BidPrice"][4] tick.ask_price_1 = data["AskPrice"][0] tick.ask_price_2 = data["AskPrice"][1] tick.ask_price_3 = data["AskPrice"][2] tick.ask_price_4 = data["AskPrice"][3] tick.ask_price_5 = data["AskPrice"][4] tick.bid_volume_1 = data["BidVolume"][0] tick.bid_volume_2 = data["BidVolume"][1] tick.bid_volume_3 = data["BidVolume"][2] tick.bid_volume_4 = data["BidVolume"][3] tick.bid_volume_5 = data["BidVolume"][4] tick.ask_volume_1 = data["AskVolume"][0] tick.ask_volume_2 = data["AskVolume"][1] tick.ask_volume_3 = data["AskVolume"][2] tick.ask_volume_4 = data["AskVolume"][3] tick.ask_volume_5 = data["AskVolume"][4] return tick
def on_data_update(self, data): """""" channel_id = data[0] channel, symbol = self.channels[channel_id] symbol = str(symbol.replace("t", "")) # Get the Tick object if symbol in self.ticks: tick = self.ticks[symbol] else: tick = TickData( symbol=symbol, exchange=Exchange.BITFINEX, name=symbol, datetime=datetime.now(UTC_TZ), gateway_name=self.gateway_name, ) self.ticks[symbol] = tick l_data1 = data[1] # Update general quote if channel == "ticker": tick.volume = float(l_data1[-3]) tick.high_price = float(l_data1[-2]) tick.low_price = float(l_data1[-1]) tick.last_price = float(l_data1[-4]) tick.open_price = float(tick.last_price - l_data1[4]) # Update deep quote elif channel == "book": bid = self.bids.setdefault(symbol, {}) ask = self.asks.setdefault(symbol, {}) if len(l_data1) > 3: for price, count, amount in l_data1: price = float(price) count = int(count) amount = float(amount) if amount > 0: bid[price] = amount else: ask[price] = -amount else: price, count, amount = l_data1 price = float(price) count = int(count) amount = float(amount) if not count: if price in bid: del bid[price] elif price in ask: del ask[price] else: if amount > 0: bid[price] = amount else: ask[price] = -amount try: # BID bid_keys = bid.keys() bidPriceList = sorted(bid_keys, reverse=True) tick.bid_price_1 = bidPriceList[0] tick.bid_price_2 = bidPriceList[1] tick.bid_price_3 = bidPriceList[2] tick.bid_price_4 = bidPriceList[3] tick.bid_price_5 = bidPriceList[4] tick.bid_volume_1 = bid[tick.bid_price_1] tick.bid_volume_2 = bid[tick.bid_price_2] tick.bid_volume_3 = bid[tick.bid_price_3] tick.bid_volume_4 = bid[tick.bid_price_4] tick.bid_volume_5 = bid[tick.bid_price_5] # ASK ask_keys = ask.keys() askPriceList = sorted(ask_keys) tick.ask_price_1 = askPriceList[0] tick.ask_price_2 = askPriceList[1] tick.ask_price_3 = askPriceList[2] tick.ask_price_4 = askPriceList[3] tick.ask_price_5 = askPriceList[4] tick.ask_volume_1 = ask[tick.ask_price_1] tick.ask_volume_2 = ask[tick.ask_price_2] tick.ask_volume_3 = ask[tick.ask_price_3] tick.ask_volume_4 = ask[tick.ask_price_4] tick.ask_volume_5 = ask[tick.ask_price_5] except IndexError: return dt = datetime.now(UTC_TZ) tick.datetime = dt self.gateway.on_tick(copy(tick))