Example #1
0
 def start(self, instmt):
     """
     Start the exchange gateway
     :param instmt: Instrument
     :return List of threads
     """
     instmt.set_l2_depth(L2Depth(5))
     instmt.set_prev_l2_depth(L2Depth(5))
     instmt.set_instmt_snapshot_table_name(self.get_instmt_snapshot_table_name(instmt.get_exchange_name(),
                                                                               instmt.get_instmt_name()))
     self.init_instmt_snapshot_table(instmt)
     return [self.api_socket.connect(self.api_socket.get_link(),
                                     on_message_handler=partial(self.on_message_handler, instmt),
                                     on_open_handler=partial(self.on_open_handler, instmt),
                                     on_close_handler=partial(self.on_close_handler, instmt))]
Example #2
0
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        l2_depth = L2Depth()
        raw = raw["result"]
        keys = list(raw.keys())
        if cls.get_bids_field_name() in keys and \
           cls.get_asks_field_name() in keys:

            # Date time
            l2_depth.date_time = datetime.utcnow().strftime(
                "%Y%m%d %H:%M:%S.%f")

            # Bids
            bids = raw[cls.get_bids_field_name()]
            for i in range(0, 5):
                l2_depth.bids[i].price = bids[i][cls.get_price_field_name()]
                l2_depth.bids[i].volume = bids[i][cls.get_volume_field_name()]

            # Asks
            asks = raw[cls.get_asks_field_name()]
            for i in range(0, 5):
                l2_depth.asks[i].price = asks[i][cls.get_price_field_name()]
                l2_depth.asks[i].volume = asks[i][cls.get_volume_field_name()]
        else:
            raise Exception('Does not contain order book keys in instmt %s-%s.\nOriginal:\n%s' % \
                (instmt.get_exchange_name(), instmt.get_instmt_name(), \
                 raw))

        return l2_depth
Example #3
0
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        l2_depth = L2Depth()
        keys = list(raw.keys())
        if cls.get_bids_field_name() in keys and \
           cls.get_asks_field_name() in keys:
            # Bids
            bids = raw[cls.get_bids_field_name()]
            bids = sorted(bids, key=lambda x: x[0], reverse=True)
            for i in range(0, len(bids)):
                l2_depth.bids[i].price = float(
                    bids[i][0]) if type(bids[i][0]) != float else bids[i][0]
                l2_depth.bids[i].volume = float(
                    bids[i][1]) if type(bids[i][1]) != float else bids[i][1]

            # Asks
            asks = raw[cls.get_asks_field_name()]
            asks = sorted(asks, key=lambda x: x[0])
            for i in range(0, len(asks)):
                l2_depth.asks[i].price = float(
                    asks[i][0]) if type(asks[i][0]) != float else asks[i][0]
                l2_depth.asks[i].volume = float(
                    asks[i][1]) if type(asks[i][1]) != float else asks[i][1]

        return l2_depth
Example #4
0
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        l2_depth = L2Depth()
        keys = list(raw.keys())
        if cls.get_bids_field_name() in keys and \
           cls.get_asks_field_name() in keys:
            
            # No Date time information, has update id only
            l2_depth.date_time = datetime.utcnow().strftime("%Y%m%d %H:%M:%S.%f")

            # Bids
            bids = raw[cls.get_bids_field_name()]
            bids = sorted(bids, key=lambda x: x['price'], reverse=True)
            max_bid_len = min(len(bids), 5)
            for i in range(0, max_bid_len):
                l2_depth.bids[i].price = float(bids[i]['price']) if type(bids[i]['price']) != float else bids[i]['price']
                l2_depth.bids[i].volume = float(bids[i]['volume']) if type(bids[i]['volume']) != float else bids[i]['volume']  
                
            # Asks
            asks = raw[cls.get_asks_field_name()]
            asks = sorted(asks, key=lambda x: x['price'])
            max_ask_len =  min(len(asks), 5)
            for i in range(0, max_ask_len):
                l2_depth.asks[i].price = float(asks[i]['price']) if type(asks[i]['price']) != float else asks[i]['price']
                l2_depth.asks[i].volume = float(asks[i]['volume']) if type(asks[i]['volume']) != float else asks[i]['volume']           
        else:
            raise Exception('Does not contain order book keys in instmt %s-%s.\nOriginal:\n%s' % \
                (instmt.get_exchange_name(), instmt.get_instmt_name(), \
                 raw))
        
        return l2_depth
Example #5
0
 def start(self, instmt):
     """
     Start the exchange gateway
     :param instmt: Instrument
     :return List of threads
     """
     instmt.set_prev_l2_depth(L2Depth(5))
     instmt.set_l2_depth(L2Depth(5))
     instmt.set_instmt_snapshot_table_name(self.get_instmt_snapshot_table_name(instmt.get_exchange_name(),
                                                                               instmt.get_instmt_name()))
     self.init_instmt_snapshot_table(instmt)
     t1 = threading.Thread(target=partial(self.get_order_book_worker, instmt))
     t1.start()
     t2 = threading.Thread(target=partial(self.get_trades_worker, instmt))
     t2.start()
     return [t1, t2]
 def parse_l2_depth(cls, instmt, raw):
     """
     Parse raw data to L2 depth
     :param instmt: Instrument
     :param raw: Raw data in JSON
     """
     l2_depth = L2Depth()
     keys = list(raw.keys())
     if (cls.get_bids_field_name() in keys and 
         cls.get_asks_field_name() in keys):
         
         # Date time
         date_time = float(raw[cls.get_order_book_timestamp_field_name()])
         date_time = date_time / cls.get_timestamp_offset()
         l2_depth.date_time = datetime.utcfromtimestamp(date_time).strftime("%Y%m%d %H:%M:%S.%f")
         
         # Bids
         bids = raw[cls.get_bids_field_name()]
         bids = sorted(bids, key=lambda x: x[0], reverse=True)
         for i in range(0, 5):
             l2_depth.bids[i].price = float(bids[i][0]) if type(bids[i][0]) != float else bids[i][0]
             l2_depth.bids[i].volume = float(bids[i][1]) if type(bids[i][1]) != float else bids[i][1]   
             
         # Asks
         asks = raw[cls.get_asks_field_name()]
         asks = sorted(asks, key=lambda x: x[0])
         for i in range(0, 5):
             l2_depth.asks[i].price = float(asks[i][0]) if type(asks[i][0]) != float else asks[i][0]
             l2_depth.asks[i].volume = float(asks[i][1]) if type(asks[i][1]) != float else asks[i][1]  
     else:
         raise Exception('Does not contain order book keys in instmt %s-%s.\nOriginal:\n%s' % \
             (instmt.get_exchange_name(), instmt.get_instmt_name(), \
              raw))
     
     return l2_depth
Example #7
0
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        l2_depth = L2Depth()
        keys = list(raw.keys())
        if (cls.get_bids_field_name() in keys and 
            cls.get_asks_field_name() in keys):
            # Date time
            l2_depth.date_time = datetime.utcnow().strftime("%Y%m%d %H:%M:%S.%f")
            
            # Bids
            bids = raw[cls.get_bids_field_name()]
            max_bid_len = min(len(bids), 5)
            for i in range(0, max_bid_len):
                l2_depth.bids[i].price = float(bids[i][0]) if type(bids[i][0]) != float else bids[i][0]
                l2_depth.bids[i].volume = float(bids[i][1]) if type(bids[i][1]) != float else bids[i][1]   
                
            # Asks
            asks = raw[cls.get_asks_field_name()]
            max_ask_len = min(len(asks), 5)
            for i in range(0, max_ask_len):
                l2_depth.asks[i].price = float(asks[i][0]) if type(asks[i][0]) != float else asks[i][0]
                l2_depth.asks[i].volume = float(asks[i][1]) if type(asks[i][1]) != float else asks[i][1]            
        else:
            raise Exception('Does not contain order book keys in instmt %s-%s.\nOriginal:\n%s' % \
                (instmt.get_exchange_name(), instmt.get_instmt_name(), \
                 raw))

        return l2_depth
Example #8
0
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        """
         {'bids': [[13700.8, 1.2389], [13700.5, 2.1162], [13700.2, 0.0352], [13700.0, 0.1149], [13686.1, 0.1], [13686.0, 0.005], [13680.0, 0.1524], [13675.3, 0.1], [13665.2, 0.8], [13664.7, 0.132], [13664.6, 0.0329], [13651.4, 0.297], [13651.3, 0.0383], [13650.0, 0.0011], [13645.2, 1.3241], [13639.5, 0.1198], [13622.0, 0.003], [13616.0, 0.01], [13603.0, 1.6498], [13600.0, 0.4871]], 'asks': [[13730.0, 0.005], [13732.3, 0.0228], [13736.9, 0.8], [13740.0, 2.6722], [13740.4, 0.2431], [13740.6, 0.4722], [13740.9, 0.0998], [13743.2, 0.063], [13745.0, 0.0276], [13756.9, 1.3241], [13766.0, 1.6502], [13767.9, 0.188], [13768.0, 0.2877], [13787.6, 0.439], [13790.0, 0.7925], [13798.0, 0.0187], [13800.0, 6.2271], [13800.2, 0.1055], [13829.0, 0.03189167691083954], [13833.0, 0.2172]], 'ts': 1515743657029, 'version': 1184504329}
        """

        l2_depth = L2Depth()

        # raw = raw["result"]

        keys = list(raw.keys())

        # Logger.info(cls.__name__, "keys:%s" %keys)

        if cls.get_bids_field_name() in keys and \
                cls.get_asks_field_name() in keys:

            # Date time
            timestamp = float(
                raw[cls.get_order_book_timestamp_field_name()]) / 1000.0
            l2_depth.date_time = datetime.utcfromtimestamp(timestamp).strftime(
                "%Y%m%d %H:%M:%S.%f")
            # Logger.info(cls.__name__,"date_time:%s.........."%l2_depth.date_time)
            # Bids
            bids = raw[cls.get_bids_field_name()]
            bids = sorted(bids, key=lambda x: x[0], reverse=True)
            # Logger.info(cls.__name__,"len(bids):%d"%len(bids))
            # Logger.info(cls.__name__,"bids:%s"%bids)

            for i in range(0, 5):  # len(bids)):
                # Logger.info(cls.__name__,"bids:%d.........."%i)
                l2_depth.bids[i].price = float(
                    bids[i][0]) if type(bids[i][0]) != float else bids[i][0]
                l2_depth.bids[i].volume = float(
                    bids[i][1]) if type(bids[i][1]) != float else bids[i][1]

                # Asks
            asks = raw[cls.get_asks_field_name()]
            asks = sorted(asks, key=lambda x: x[0])
            # Logger.info(cls.__name__,"asks:%s"%asks)
            for i in range(0, 5):  # len(asks)):
                # Logger.info(cls.__name__,"asks:%d.........."%i)
                l2_depth.asks[i].price = float(
                    asks[i][0]) if type(asks[i][0]) != float else asks[i][0]
                l2_depth.asks[i].volume = float(
                    asks[i][1]) if type(asks[i][1]) != float else asks[i][1]
                # Logger.info(cls.__name__,"if cls.get_bids_field_name() in keys")
        else:
            raise Exception('Does not contain order book keys in instmt %s-%s.\nOriginal:\n%s' % \
                            (instmt.get_exchange_name(), instmt.get_instmt_name(), \
                             raw))

        return l2_depth
Example #9
0
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        """
        {"asks":[[0.00198857,197],[0.00198856,12.9406],[0.00198009,30],[0.00198,80],[0.00197421,127.959]],"bids":[[0.0019683,2.299],[0.00196729,41.122],[0.00196718,24.1949],[0.00196716,600],[0.0019649,112.0409]]}
        """

        l2_depth = L2Depth()
        keys = list(raw.keys())
        #Logger.info(cls.__name__, "keys:%s" %keys)

        if cls.get_bids_field_name() in keys and \
                cls.get_asks_field_name() in keys:

            # Date time
            #timestamp = float(raw[cls.get_order_book_timestamp_field_name()]) / 1000.0
            #l2_depth.date_time = datetime.utcfromtimestamp(timestamp).strftime("%Y%m%d %H:%M:%S.%f")
            # Logger.info(cls.__name__,"date_time:%s.........."%l2_depth.date_time)
            # Bids
            bids = raw[cls.get_bids_field_name()]
            bids = sorted(bids, key=lambda x: x[0], reverse=True)
            # Logger.info(cls.__name__,"len(bids):%d"%len(bids))
            # Logger.info(cls.__name__,"bids:%s"%bids)

            for i in range(0, 5):  # len(bids)):
                # Logger.info(cls.__name__,"bids:%d.........."%i)
                l2_depth.bids[i].price = float(
                    bids[i][0]) if type(bids[i][0]) != float else bids[i][0]
                l2_depth.bids[i].volume = float(
                    bids[i][1]) if type(bids[i][1]) != float else bids[i][1]

                # Asks
            asks = raw[cls.get_asks_field_name()]
            asks = sorted(asks, key=lambda x: x[0])
            # Logger.info(cls.__name__,"asks:%s"%asks)
            for i in range(0, 5):  # len(asks)):
                # Logger.info(cls.__name__,"asks:%d.........."%i)
                l2_depth.asks[i].price = float(
                    asks[i][0]) if type(asks[i][0]) != float else asks[i][0]
                l2_depth.asks[i].volume = float(
                    asks[i][1]) if type(asks[i][1]) != float else asks[i][1]
                # Logger.info(cls.__name__,"if cls.get_bids_field_name() in keys")
        else:
            raise Exception('Does not contain order book keys in instmt %s-%s.\nOriginal:\n%s' % \
                            (instmt.get_exchange_name(), instmt.get_instmt_name(), \
                             raw))

        return l2_depth
Example #10
0
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        keys = list(raw.keys())
        if cls.get_bids_field_name() in keys and \
          cls.get_asks_field_name() in keys:

            l2_depth = L2Depth()
            # Bids
            bids = raw[cls.get_bids_field_name()]
            bid_level = -1
            for bid in bids:
                price = bid[cls.get_order_book_price_field_name()]
                volume = bid[cls.get_order_book_volume_field_name()]

                if bid_level == -1 or l2_depth.bids[bid_level].price != price:
                    bid_level += 1

                    if bid_level < 5:
                        l2_depth.bids[bid_level].price = float(price)
                    else:
                        break

                l2_depth.bids[bid_level].volume += float(volume)

            # Asks
            asks = raw[cls.get_asks_field_name()]
            ask_level = -1
            for ask in asks:
                price = ask[cls.get_order_book_price_field_name()]
                volume = ask[cls.get_order_book_volume_field_name()]

                if ask_level == -1 or l2_depth.asks[ask_level].price != price:
                    ask_level += 1

                    if ask_level < 5:
                        l2_depth.asks[ask_level].price = float(price)
                    else:
                        break

                l2_depth.asks[ask_level].volume += float(volume)

            return l2_depth

        else:
            raise Exception('Does not contain order book keys in instmt %s-%s.\nOriginal:\n%s' % \
                (instmt.get_exchange_name(), instmt.get_instmt_name(), \
                 raw))
Example #11
0
    def start(self, instmt):
        """
        Start the exchange gateway
        :param instmt: Instrument
        :return List of threads
        """
        instmt.set_l2_depth(L2Depth(50))
        instmt.set_prev_l2_depth(L2Depth(50))
        instmt.set_instmt_snapshot_table_name(
            self.get_instmt_snapshot_table_name(instmt.get_exchange_name(),
                                                instmt.get_instmt_name()))
        self.init_instmt_snapshot_table(instmt)
        t_trades = self.api_socket.connect(
            url=self.api_socket.get_link(),
            on_message_handler=partial(self.on_message_handler, instmt),
            on_open_handler=partial(self.on_open_handler, instmt),
            on_close_handler=partial(self.on_close_handler, instmt))

        t_order_book = threading.Thread(
            target=partial(self.get_order_book_worker, instmt))
        t_order_book.start()

        return [t_order_book, t_trades]
        :return List of threads
        """
        instmt.set_l2_depth(L2Depth(5))
        instmt.set_prev_l2_depth(L2Depth(5))
        instmt.set_instmt_snapshot_table_name(
            self.get_instmt_snapshot_table_name(instmt.get_exchange_name(),
                                                instmt.get_instmt_name()))
        self.init_instmt_snapshot_table(instmt)
        instmt.set_recovered(False)
        t1 = threading.Thread(
            target=partial(self.get_order_book_worker, instmt))
        t2 = threading.Thread(target=partial(self.get_trades_worker, instmt))
        t1.start()
        t2.start()
        return [t1, t2]


if __name__ == '__main__':
    Logger.init_log()
    exchange_name = 'Poloniex'
    instmt_name = 'BTCETH'
    instmt_code = 'BTC_ETH'
    instmt = Instrument(exchange_name, instmt_name, instmt_code)
    db_client = SqlClientTemplate()
    exch = ExchGwPoloniex([db_client])
    instmt.set_l2_depth(L2Depth(5))
    instmt.set_prev_l2_depth(L2Depth(5))
    instmt.set_recovered(False)
    # exch.get_order_book_worker(instmt)
    exch.get_trades_worker(instmt)
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        def get_order_info(data):
            return (data['price'] if 'price' in data.keys() else None,
                    (0 if data['side'] == "Buy" else 1), data['id'],
                    data['size'] if 'size' in data.keys() else None)

        if raw['action'] in ('partial', 'insert'):
            # Order book initialization or insertion
            for data in raw['data']:
                if data['symbol'] != instmt.get_instmt_code():
                    continue

                price, side, id, volume = get_order_info(data)
                instmt.realtime_order_book_ids[side][id] = price
                if price not in instmt.realtime_order_book_prices[side].keys():
                    instmt.realtime_order_book_prices[side][price] = {
                        id: volume
                    }
                else:
                    instmt.realtime_order_book_prices[side][price][id] = volume

        elif raw['action'] == 'update':
            # Order book update
            for data in raw['data']:
                if data['symbol'] != instmt.get_instmt_code():
                    continue

                _, side, id, volume = get_order_info(data)
                price = instmt.realtime_order_book_ids[side][id]
                instmt.realtime_order_book_ids[side][id] = price
                instmt.realtime_order_book_prices[side][price][id] = volume

        elif raw['action'] == 'delete':
            # Order book delete
            for data in raw['data']:
                if data['symbol'] != instmt.get_instmt_code():
                    continue

                _, side, id, _ = get_order_info(data)
                price = instmt.realtime_order_book_ids[side][id]
                del instmt.realtime_order_book_prices[side][price][id]
                if len(instmt.realtime_order_book_prices[side][price]) == 0:
                    del instmt.realtime_order_book_prices[side][price]

        # return l2_depth
        l2_depth = L2Depth()
        l2_depth.date_time = datetime.utcnow().strftime("%Y%m%d %H:%M:%S.%f")

        bids_px = sorted(list(instmt.realtime_order_book_prices[0].keys()),
                         reverse=True)[:5]
        asks_px = sorted(list(instmt.realtime_order_book_prices[1].keys()))[:5]
        bids_qty = [
            sum(instmt.realtime_order_book_prices[0][px].values())
            for px in bids_px
        ]
        asks_qty = [
            sum(instmt.realtime_order_book_prices[1][px].values())
            for px in asks_px
        ]
        for i in range(0, 5):
            l2_depth.bids[i].price = bids_px[i]
            l2_depth.bids[i].volume = bids_qty[i]
            l2_depth.asks[i].price = asks_px[i]
            l2_depth.asks[i].volume = asks_qty[i]

        return l2_depth
Example #14
0
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        # No order book mapping from config. Need to decode here.
        l2_depth = instmt.get_l2_depth()
        l2_depth.date_time = datetime.utcnow().strftime("%Y%m%d %H:%M:%S.%f")
        if isinstance(raw[0], list):
            # Start subscription
            for i in range(0, 25):
                bid = raw[i]
                ask = raw[25 + i]

                l2_depth.bids[i] = L2Depth.Depth(price=bid[0],
                                                 count=bid[1],
                                                 volume=bid[2])
                l2_depth.asks[i] = L2Depth.Depth(price=ask[0],
                                                 count=ask[1],
                                                 volume=-ask[2])

        else:
            price = raw[1]
            count = raw[2]
            volume = raw[3]
            found = False

            if count == 0:
                # Deletion
                if volume > 0:
                    for i in range(0, len(l2_depth.bids)):
                        if price == l2_depth.bids[i].price:
                            found = True
                            del l2_depth.bids[i]
                            break
                else:
                    for i in range(0, len(l2_depth.asks)):
                        if price == l2_depth.asks[i].price:
                            found = True
                            del l2_depth.asks[i]
                            break

                if not found:
                    depth_text = ""
                    for i in range(0, l2_depth.depth):
                        if i < len(l2_depth.bids):
                            depth_text += "%.4f,%d,%.4f" % \
                              (l2_depth.bids[i].volume, \
                               l2_depth.bids[i].count, \
                               l2_depth.bids[i].price)
                        else:
                            depth_text += "                   "
                        depth_text += "<--->"
                        if i < len(l2_depth.asks):
                            depth_text += "%.4f,%d,%.4f" % \
                                          (l2_depth.asks[i].volume, \
                                           l2_depth.asks[i].count, \
                                           l2_depth.asks[i].price)
                        else:
                            depth_text += "                   "
                        depth_text += "\n"
                    Logger.info(cls.__name__, "Cannot find the deletion of the message: %s\nDepth:\n%s\n" % \
                              (raw, depth_text))
                    exit(-1)
            else:
                # Insertion/Update
                if volume > 0:
                    # Update
                    for i in range(0, len(l2_depth.bids)):
                        if price == l2_depth.bids[i].price:
                            l2_depth.bids[i].count = count
                            l2_depth.bids[i].volume = volume
                            found = True
                            break

                    if not found:
                        # Insertion
                        l2_depth.bids.append(
                            L2Depth.Depth(price=price,
                                          count=count,
                                          volume=volume))
                        l2_depth.sort_bids()

                        # if len(l2_depth.bids) > l2_depth.depth * 2:
                        #     del l2_depth.bids[l2_depth.depth:]
                else:
                    for i in range(0, len(l2_depth.asks)):
                        # Update
                        if price == l2_depth.asks[i].price:
                            l2_depth.asks[i].count = count
                            l2_depth.asks[i].volume = -volume
                            found = True
                            break

                    if not found:
                        # Insertion
                        l2_depth.asks.append(
                            L2Depth.Depth(price=price,
                                          count=count,
                                          volume=-volume))
                        l2_depth.sort_asks()

                        # if len(l2_depth.asks) > l2_depth.depth * 2:
                        #     del l2_depth.asks[l2_depth.depth:]
        if len(l2_depth.asks) < 5:
            print('..asks<5..')
            print(l2_depth.values())
            # exit(-1)

        if len(l2_depth.bids) < 5:
            print('...asks<5..')
            print(l2_depth.values())
            # exit(-1)

        return l2_depth
Example #15
0
    def parse_l2_depth(cls, instmt, raw):
        """
        Parse raw data to L2 depth
        :param instmt: Instrument
        :param raw: Raw data in JSON
        """
        l2_depth = instmt.get_l2_depth()
        keys = list(raw.keys())

        bids_field = cls.get_bids_field_name()
        asks_field = cls.get_asks_field_name()

        if bids_field in keys and asks_field in keys:
            # Date time
            l2_depth.date_time = datetime.utcnow().strftime(
                "%Y%m%d %H:%M:%S.%f")

            # Bids
            bids = raw[bids_field]
            bids_len = min(l2_depth.depth, len(bids))
            for i in range(0, bids_len):
                l2_depth.bids[i].price = float(bids[i]['price']) \
                    if not isinstance(bids[i]['price'], float) else bids[i][0]
                l2_depth.bids[i].volume = float(bids[i]['volume']) \
                    if not isinstance(bids[i]['volume'], float) else bids[i][1]
                l2_depth.bids[i].id = bids[i]['id']

            # Asks
            asks = raw[asks_field]
            asks_len = min(l2_depth.depth, len(asks))
            for i in range(0, asks_len):
                l2_depth.asks[i].price = float(asks[i]['price']) \
                    if not isinstance(asks[i]['price'], float) else asks[i][0]
                l2_depth.asks[i].volume = float(asks[i]['volume']) \
                    if not isinstance(asks[i]['volume'], float) else asks[i][1]
                l2_depth.asks[i].id = asks[i]['id']

        elif "order_id" in keys:
            if 'type' in keys:
                # Insertion
                order_id = raw['order_id']
                price = float(raw['price'])
                volume = float(raw['volume'])
                update_type = raw['type']

                if update_type == "BID":
                    l2_depth.bids.append(
                        L2Depth.Depth(price=price, volume=volume))

                    l2_depth.bids[-1].id = order_id

                    l2_depth.sort_bids()

                    if len(l2_depth.bids) > l2_depth.depth * 2:
                        del l2_depth.bids[l2_depth.depth:]

                elif update_type == "ASK":
                    l2_depth.asks.append(
                        L2Depth.Depth(price=price, volume=volume))

                    l2_depth.asks[-1].id = order_id

                    l2_depth.sort_asks()

                    if len(l2_depth.asks) > l2_depth.depth * 2:
                        del l2_depth.asks[l2_depth.depth:]

            elif 'base' in keys:
                # Update
                order_id = raw['order_id']
                volume = float(raw['base'])
                price = float(raw['counter']) / float(raw['base'])

                for i in range(0, len(l2_depth.bids)):
                    if l2_depth.bids[i].id == order_id:
                        if l2_depth.bids[i].price == price:
                            l2_depth.bids[i].volume -= volume
                            break

            else:
                # Deletion
                order_id = raw['order_id']
                found = False

                for i in range(0, len(l2_depth.bids)):
                    if l2_depth.bids[i].id == order_id:
                        found = True
                        del l2_depth.bids[i]
                        break

                if not found:
                    for i in range(0, len(l2_depth.asks)):
                        if l2_depth.asks[i].id == order_id:
                            del l2_depth.asks[i]
                            break

        else:
            raise Exception(
                'Does not contain order book keys in instmt %s-%s.\nOriginal:\n%s'
                % (instmt.get_exchange_name(), instmt.get_instmt_name(), raw))

        return l2_depth