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)
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)
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)
def parse(self): orderbook = Orderbook(**self.data) return orderbook
def parse(self): """ 解析self._data数据 """ orderbook = Orderbook(**self.data) return orderbook
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)