def get_tick(self, code): """ Get tick buffer. """ tick = self.ticks.get(code, None) symbol, exchange = convert_symbol_futu2vt(code) if not tick: tick = TickData( symbol=symbol, exchange=exchange, datetime=datetime.now(), gateway_name=self.gateway_name, ) self.ticks[code] = tick contract = self.contracts.get(tick.vt_symbol, None) if contract: tick.name = contract.name return 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(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 OnRtnDepthMarketData(self, data: dict) -> None: """ Callback of tick data update. """ current_date = data["TradingDay"] current_time = data["UpdateTime"] dt = datetime.strptime(f'{current_date}-{current_time}', "%Y%m%d-%H:%M:%S") dt = CHINA_TZ.localize(dt) tick = TickData(symbol=data["SecurityID"], exchange=EXCHANGE_TORA2VT[bytes.decode( data["ExchangeID"])], datetime=dt, name=data["SecurityName"], volume=0, open_interest=data["OpenInterest"], last_price=data["LastPrice"], last_volume=data["Volume"], limit_up=data["UpperLimitPrice"], limit_down=data["LowerLimitPrice"], open_price=data["OpenPrice"], high_price=data["HighestPrice"], low_price=data["LowestPrice"], pre_close=data["PreClosePrice"], bid_price_1=data["BidPrice1"], ask_price_1=data["AskPrice1"], bid_volume_1=data["BidVolume1"], ask_volume_1=data["AskVolume1"], gateway_name=self.gateway_name) if data["BidVolume2"] or data["AskVolume2"]: 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_2 = data["AskPrice2"] tick.ask_price_3 = data["AskPrice3"] tick.ask_price_4 = data["AskPrice4"] tick.ask_price_5 = data["AskPrice5"] tick.bid_volume_2 = data["BidVolume2"] tick.bid_volume_3 = data["BidVolume3"] tick.bid_volume_4 = data["BidVolume4"] tick.bid_volume_5 = data["BidVolume5"] tick.ask_volume_2 = data["AskVolume2"] tick.ask_volume_3 = data["AskVolume3"] tick.ask_volume_4 = data["AskVolume4"] tick.ask_volume_5 = data["AskVolume5"] self.gateway.on_tick(tick)
def to_tick(self): """ Generate TickData object from DbTickData. """ tick = TickData( symbol=self.symbol, exchange=Exchange(self.exchange), datetime=self.datetime, name=self.name, volume=self.volume, open_interest=self.open_interest, last_price=self.last_price, last_volume=self.last_volume, limit_up=self.limit_up, limit_down=self.limit_down, open_price=self.open_price, high_price=self.high_price, low_price=self.low_price, pre_close=self.pre_close, bid_price_1=self.bid_price_1, ask_price_1=self.ask_price_1, bid_volume_1=self.bid_volume_1, ask_volume_1=self.ask_volume_1, gateway_name="DB", ) if self.bid_price_2: tick.bid_price_2 = self.bid_price_2 tick.bid_price_3 = self.bid_price_3 tick.bid_price_4 = self.bid_price_4 tick.bid_price_5 = self.bid_price_5 tick.ask_price_2 = self.ask_price_2 tick.ask_price_3 = self.ask_price_3 tick.ask_price_4 = self.ask_price_4 tick.ask_price_5 = self.ask_price_5 tick.bid_volume_2 = self.bid_volume_2 tick.bid_volume_3 = self.bid_volume_3 tick.bid_volume_4 = self.bid_volume_4 tick.bid_volume_5 = self.bid_volume_5 tick.ask_volume_2 = self.ask_volume_2 tick.ask_volume_3 = self.ask_volume_3 tick.ask_volume_4 = self.ask_volume_4 tick.ask_volume_5 = self.ask_volume_5 return 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 onRtnDepthMarketData(self, data: dict) -> None: """ Callback of tick data update. """ symbol = data["InstrumentID"] exchange = EXCHANGE_UFT2VT[data["ExchangeID"]] if not exchange: return timestamp = f"{data['TradingDay']} {data['UpdateTime']}000" tick = TickData(symbol=symbol, exchange=exchange, datetime=datetime.strptime(timestamp, "%Y%m%d %H%M%S%f"), name=symbol_name_map[symbol], volume=data["TradeVolume"], open_interest=data["OpenInterest"], last_price=data["LastPrice"], limit_up=data["UpperLimitPrice"], limit_down=data["LowerLimitPrice"], open_price=adjust_price(data["OpenPrice"]), high_price=adjust_price(data["HighestPrice"]), low_price=adjust_price(data["LowestPrice"]), pre_close=adjust_price(data["PreClosePrice"]), bid_price_1=adjust_price(data["BidPrice1"]), ask_price_1=adjust_price(data["AskPrice1"]), bid_volume_1=data["BidVolume1"], ask_volume_1=data["AskVolume1"], gateway_name=self.gateway_name) if data["BidVolume2"] or data["AskVolume2"]: tick.bid_price_2 = adjust_price(data["BidPrice2"]) tick.bid_price_3 = adjust_price(data["BidPrice3"]) tick.bid_price_4 = adjust_price(data["BidPrice4"]) tick.bid_price_5 = adjust_price(data["BidPrice5"]) tick.ask_price_2 = adjust_price(data["AskPrice2"]) tick.ask_price_3 = adjust_price(data["AskPrice3"]) tick.ask_price_4 = adjust_price(data["AskPrice4"]) tick.ask_price_5 = adjust_price(data["AskPrice5"]) tick.bid_volume_2 = adjust_price(data["BidVolume2"]) tick.bid_volume_3 = adjust_price(data["BidVolume3"]) tick.bid_volume_4 = adjust_price(data["BidVolume4"]) tick.bid_volume_5 = adjust_price(data["BidVolume5"]) tick.ask_volume_2 = adjust_price(data["AskVolume2"]) tick.ask_volume_3 = adjust_price(data["AskVolume3"]) tick.ask_volume_4 = adjust_price(data["AskVolume4"]) tick.ask_volume_5 = adjust_price(data["AskVolume5"]) self.gateway.on_tick(tick)
def onRtnDepthMarketData(self, data: dict): """ Callback of tick data update. """ symbol = data["InstrumentID"] exchange = symbol_exchange_map.get(symbol, "") if not exchange: return timestamp = f"{data['TradingDay']} {data['UpdateTime']}.{int(data['UpdateMillisec']/100)}" dt = datetime.strptime(timestamp, "%Y%m%d %H:%M:%S.%f") dt = CHINA_TZ.localize(dt) tick = TickData(symbol=symbol, exchange=exchange, datetime=dt, name=symbol_name_map[symbol], volume=data["Volume"], open_interest=data["OpenInterest"], last_price=data["LastPrice"], limit_up=data["UpperLimitPrice"], limit_down=data["LowerLimitPrice"], open_price=adjust_price(data["OpenPrice"]), high_price=adjust_price(data["HighestPrice"]), low_price=adjust_price(data["LowestPrice"]), pre_close=adjust_price(data["PreClosePrice"]), bid_price_1=adjust_price(data["BidPrice1"]), ask_price_1=adjust_price(data["AskPrice1"]), bid_volume_1=data["BidVolume1"], ask_volume_1=data["AskVolume1"], gateway_name=self.gateway_name) if data["BidVolume2"] or data["AskVolume2"]: tick.bid_price_2 = adjust_price(data["BidPrice2"]) tick.bid_price_3 = adjust_price(data["BidPrice3"]) tick.bid_price_4 = adjust_price(data["BidPrice4"]) tick.bid_price_5 = adjust_price(data["BidPrice5"]) tick.ask_price_2 = adjust_price(data["AskPrice2"]) tick.ask_price_3 = adjust_price(data["AskPrice3"]) tick.ask_price_4 = adjust_price(data["AskPrice4"]) tick.ask_price_5 = adjust_price(data["AskPrice5"]) tick.bid_volume_2 = adjust_price(data["BidVolume2"]) tick.bid_volume_3 = adjust_price(data["BidVolume3"]) tick.bid_volume_4 = adjust_price(data["BidVolume4"]) tick.bid_volume_5 = adjust_price(data["BidVolume5"]) tick.ask_volume_2 = adjust_price(data["AskVolume2"]) tick.ask_volume_3 = adjust_price(data["AskVolume3"]) tick.ask_volume_4 = adjust_price(data["AskVolume4"]) tick.ask_volume_5 = adjust_price(data["AskVolume5"]) self.gateway.on_tick(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 quote_stock_MKT(self, code, data): """ QUT/idcdmzpcr01/TSE/2330 {'AskPrice': [248.0, 248.5, 249.0, 249.5, 250.0], 'AskVolume': [355, 632, 630, 301, 429], 'BidPrice': [247.5, 247.0, 246.5, 246.0, 245.5], 'BidVolume': [397, 389, 509, 703, 434], 'Date': '2019/05/17', 'Time': '09:53:00.706928'} MKT/idcdmzpcr01/TSE/2330 {'Close': [248.0], 'Time': '09:53:00.706928', 'VolSum': [7023], 'Volume': [1]} """ 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, low_price=99999 ) self.ticks[code] = tick tick.datetime = datetime.combine(datetime.today(), datetime.strptime('{}'.format(data['Time']), "%H:%M:%S.%f").time()) tick.volume = data["VolSum"][0] tick.last_price = data["Close"][0] tick.limit_up = 0 tick.open_interest = 0 tick.limit_down = 0 tick.open_price = data["Close"][0] if tick.open_price == 0 else tick.open_price tick.high_price = data["Close"][0] if data["Close"][0] > tick.high_price else tick.high_price tick.low_price = data["Close"][0] if data["Close"][0] < tick.low_price else tick.low_price tick.pre_close = tick.open_price return 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 qutote_futures_L(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.get(code, None) tick = TickData( symbol=code, exchange=Exchange.TFE, name=f"{contract['name']}{contract['delivery_month']}", datetime=datetime.now(), gateway_name=self.gateway_name, ) self.ticks[code] = tick tick.datetime = datetime.strptime('{} {}'.format( data['Date'], data['Time']), "%Y/%m/%d %H:%M:%S.%f") tick.volume = data["VolSum"][0] tick.last_price = data["Close"][0] tick.limit_up = 0 tick.open_interest = 0 tick.limit_down = 0 tick.open_price = data["Open"] tick.high_price = data["High"][0] tick.low_price = data["Low"][0] tick.pre_close = data["Close"][0] - data["DiffPrice"][0] 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))
def update_strategy(self, dt, closed_pnl=0, hold_pnl=0): """ 更新资金曲线 :param dt: :param closed_pnl: 策略提供的平仓盈亏 :param hold_pnl: 策略提供的持仓盈亏 :return: """ # 获取当前bar的平仓权益 open_interest = 0 if len(self.kline.line_bar) > 0: open_interest = self.kline.line_bar[-1].open_interest if closed_pnl != 0: self.write_log(u'策略平仓收益:{}->{}'.format(open_interest, open_interest + closed_pnl)) open_interest += closed_pnl tick = TickData(gateway_name='Fund', symbol=self.symbol, exchange=Exchange.LOCAL, datetime=dt) tick.last_price = open_interest + hold_pnl tick.volume = 1 tick.ask_price1 = open_interest + hold_pnl tick.ask_volume1 = 1 tick.bid_price1 = open_interest + hold_pnl tick.bid_volume1 = 1 tick.datetime = dt tick.open_interest = open_interest tick.date = tick.datetime.strftime('%Y-%m-%d') tick.time = tick.datetime.strftime('%H:%M:%S') tick.trading_day = get_trading_date(dt) if self.inited: self.kline.on_tick(tick) self.closed_profit = open_interest self.holding_profit = hold_pnl
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