def on_trade_session_open(self, msg): """ On start, trade session is opened. Now we can request data and set orders """ self._logger.debug(f"Trade session opened. Requesting feeds for subscribers: {self._feed_subscribers}") for asset in filter(lambda a: a != Asset.any_asset(), self._feed_subscribers): self._request_feed(asset)
def _on_level2(self, data: dict): """ Level 2 data handler. Quik sends us full level2 snapshot. """ # Sample of level2. {'msgid': 21014, 'quotes': {'QJSIM¦SBER': {'lines': {'22806': # {'b': 234, 's': 0, 'by': 0, 'sy': 0}, '22841': {'b': 437, 's': 0, 'by': 0, 'sy': 0}, # '22853': {'b': 60, 's': 0, 'by': 0, 'sy': 0}, '22878': {'b': 82, 's': 0, 'by': 0, 'sy': 0}, # '22886': {'b': 138, 's': 0, 'by': 0, 'sy': 0}, '22895': {'b': 1, 's': 0, 'by': 0, 'sy': 0},... # Go through all assets in level2 message # Todo: get rid of nested check for asset_str in data['quotes']: # asset_class, asset_code = self._connector.asset2tuple(asset_str) asset = WebQuikFeed._asset_of(asset_str) if asset not in self._feed_subscribers: continue # {'22806': {'b': 234, 's': 0, 'by': 0, 'sy': 0}, ..} level2_quik: dict = data['quotes'][asset_str]['lines'] # level2 = {} # Level2(datetime.now()) # Fill in level2 items items = [] for key in level2_quik.keys(): price = int(key) bid = level2_quik[key]['b'] if bid == 0: bid = None ask = level2_quik[key]['s'] if ask == 0: ask = None items.append(Level2Item(price, bid, ask)) level2 = Level2.of(datetime.now(),asset, items) # If somebody subscribed to level2 of this asset, send her this data. subscribers = self._feed_subscribers[asset] + self._feed_subscribers[Asset.any_asset()] for subscriber in filter(lambda s: s.on_level2, subscribers): subscriber.on_level2(level2)
def _on_quotes(self, data: dict): """ Bid/ask spreads callback Msg sample: {"msgid":21011,"dataResult":{"CETS\u00A6BYNRUBTODTOM":{"bid":0, "ask":10, last":0,"lastchange":... """ self._logger.debug('Got bid/ask quotes: %s', data) for quik_asset in data['dataResult'].keys(): asset = WebQuikFeed._asset_of(quik_asset) if asset in self._feed_subscribers.keys(): quote = WebQuikFeed._quote_of(quik_asset, data['dataResult'][quik_asset]) # Send to subscriber for subscriber in self._feed_subscribers[asset] + self._feed_subscribers[Asset.any_asset()]: subscriber.on_quote(quote)