Example #1
0
 async def on_orderbook_update_callback(self, orderbook: Orderbook):
     """ 订单薄更新
     """
     if self.native_to_system:
         orderbook.symbol = self.native_to_system[
             orderbook.symbol]  #'交易所原始符号'转换成'量化平台通用符号'
     await self._original_on_orderbook_update_callback(orderbook)
Example #2
0
    async def publish_orderbook(self, symbol):
        ob = self._orderbooks[symbol]
        if not ob["asks"] or not ob["bids"]:
            logger.warn("symbol:",
                        symbol,
                        "asks:",
                        ob["asks"],
                        "bids:",
                        ob["bids"],
                        caller=self)
            return

        ask_keys = sorted(list(ob["asks"].keys()))
        bid_keys = sorted(list(ob["bids"].keys()), reverse=True)
        if ask_keys[0] <= bid_keys[0]:
            logger.warn("symbol:",
                        symbol,
                        "ask1:",
                        ask_keys[0],
                        "bid1:",
                        bid_keys[0],
                        caller=self)
            return

        asks = []
        for k in ask_keys[:self._orderbook_length]:
            price = k
            quantity = ob["asks"].get(k)
            asks.append([price, quantity])

        bids = []
        for k in bid_keys[:self._orderbook_length]:
            price = k
            quantity = ob["bids"].get(k)
            bids.append([price, quantity])

        info = {
            "platform": self._platform,
            "symbol": symbol,
            "asks": asks,
            "bids": bids,
            "timestamp": ob["timestamp"]
        }
        ob = Orderbook(**info)
        SingleTask.run(self.cb.on_orderbook_update_callback, ob)
Example #3
0
 async def feed(self, row):
     """ 通过历史数据驱动策略进行回测
     """
     drive_type = row["drive_type"]  #数据驱动方式
     if drive_type == "kline" and self.cb.on_kline_update_callback:
         kw = row.to_dict()
         del kw["drive_type"]
         del kw["gw"]
         del kw["dt"]
         kw["platform"] = self._platform
         kw["timestamp"] = int(kw["begin_dt"])
         kw["kline_type"] = MARKET_TYPE_KLINE
         kline = Kline(**kw)
         await self.cb.on_kline_update_callback(kline)
     elif drive_type == "trade" and self.cb.on_trade_update_callback:
         kw = {
             "platform": self._platform,
             "symbol": row["symbol"],
             "action": row["direction"],
             "price": row["tradeprice"],
             "quantity": row["volume"],
             "timestamp": int(row["tradedt"])
         }
         trade = Trade(**kw)
         await self.cb.on_trade_update_callback(trade)
     elif drive_type == "orderbook" and self.cb.on_orderbook_update_callback:
         asks = []
         bids = []
         for i in range(1, 20 + 1):
             asks.append([row[f'askprice{i}'], row[f'asksize{i}']])
             bids.append([row[f'bidprice{i}'], row[f'bidsize{i}']])
         kw = {
             "platform": self._platform,
             "symbol": row["symbol"],
             "asks": asks,
             "bids": bids,
             "timestamp": int(row["pubdt"])
         }
         ob = Orderbook(**kw)
         await self.cb.on_orderbook_update_callback(ob)
Example #4
0
 def parse(self):
     orderbook = Orderbook(**self.data)
     return orderbook
Example #5
0
 def parse(self):
     """ 解析self._data数据
     """
     orderbook = Orderbook(**self.data)
     return orderbook
Example #6
0
    def _update_orderbook(self, orderbook_info):
        """ orderbook update.

        Args:
            orderbook_info: orderbook information.

        Returns:
        """
        market = orderbook_info['market']
        data = orderbook_info['data']
        if data['action'] == 'partial':
            self._reset_orderbook(market)
        for side in {'bids', 'asks'}:
            book = self._orderbooks[market][side]
            for price, size in data[side]:
                if size:
                    book[price] = size
                else:
                    del book[price]
        #end for
        checksum = data['checksum']
        orderbook = self._get_orderbook(market)
        checksum_data = [
            ':'.join([
                f'{float(order[0])}:{float(order[1])}'
                for order in (bid, offer) if order
            ]) for (bid, offer) in zip_longest(orderbook['bids'][:100],
                                               orderbook['asks'][:100])
        ]
        computed_result = int(zlib.crc32(':'.join(checksum_data).encode()))
        if computed_result != checksum:
            #校验和不对就需要重新订阅深度信息
            if self.cb.on_orderbook_update_callback != None:

                @async_method_locker("FTXTrader._re_subscribe.locker")
                async def _re_subscribe(self):
                    await self.ws.send_json({
                        'op': 'unsubscribe',
                        'channel': 'orderbook',
                        'market': market
                    })
                    await self.ws.send_json({
                        'op': 'subscribe',
                        'channel': 'orderbook',
                        'market': market
                    })

                SingleTask.run(self._re_subscribe)
            #校验和不对就退出
            return

        logger.debug("orderbook:", json.dumps(orderbook), caller=self)

        ts = int(float(data['time']) * 1000)  #转变为毫秒
        p = {
            "platform": self._platform,
            "symbol": market,
            "asks": orderbook['asks'],
            "bids": orderbook['bids'],
            "timestamp": ts
        }
        ob = Orderbook(**p)
        SingleTask.run(self.cb.on_orderbook_update_callback, ob)