예제 #1
0
파일: tiger_gateway.py 프로젝트: Alyle/vnpy
    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))
예제 #2
0
    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)
예제 #3
0
    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))
예제 #4
0
 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))
예제 #5
0
    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
예제 #6
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)
예제 #7
0
    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)
예제 #8
0
    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)
예제 #9
0
    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)
예제 #10
0
    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))
예제 #11
0
    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
예제 #12
0
 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
예제 #13
0
    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))