code: def handleMarketDepth(self, msg):
          
  
          # make sure symbol exists
          if msg.tickerId not in self.marketDepthData.keys():
              self.marketDepthData[msg.tickerId] = self.marketDepthData[0].copy()
  
          # bid
          if msg.side == 1:
              self.marketDepthData[msg.tickerId].loc[msg.position, "bid"] = msg.price
              self.marketDepthData[msg.tickerId].loc[msg.position, "bidsize"] = msg.size
  
          # ask
          elif msg.side == 0:
              self.marketDepthData[msg.tickerId].loc[msg.position, "ask"] = msg.price
              self.marketDepthData[msg.tickerId].loc[msg.position, "asksize"] = msg.size
  
          """
          # bid/ask spread / vol diff
          self.marketDepthData[msg.tickerId].loc[msg.position, "spread"] = \
              self.marketDepthData[msg.tickerId].loc[msg.position, "ask"]-\
              self.marketDepthData[msg.tickerId].loc[msg.position, "bid"]
  
          self.marketDepthData[msg.tickerId].loc[msg.position, "spreadsize"] = \
              self.marketDepthData[msg.tickerId].loc[msg.position, "asksize"]-\
              self.marketDepthData[msg.tickerId].loc[msg.position, "bidsize"]
          """
  
          self.ibCallback(caller="handleMarketDepth", msg=msg)
docs: https://www.interactivebrokers.com/en/software/api/apiguide/java/updatemktdepth.htm
          https://www.interactivebrokers.com/en/software/api/apiguide/java/updatemktdepthl2.htm