def error(self, reqId: int, errorCode: int, errorString: str): # https://interactivebrokers.github.io/tws-api/message_codes.html warningCodes = {165, 202, 399, 434, 492, 10167} isWarning = errorCode in warningCodes or 2100 <= errorCode < 2200 msg = (f'{"Warning" if isWarning else "Error"} ' f'{errorCode}, reqId {reqId}: {errorString}') contract = self._reqId2Contract.get(reqId) if contract: msg += f', contract: {contract}' if isWarning: self._logger.info(msg) else: self._logger.error(msg) if reqId in self._futures: # the request failed if self._quash_errors: self._endReq(reqId) else: self._endReq(reqId, RequestError(reqId, errorCode, errorString), success=False) elif (self.clientId, reqId) in self.trades: # something is wrong with the order, cancel it trade = self.trades[(self.clientId, reqId)] if not trade.isDone(): status = trade.orderStatus.status = OrderStatus.Cancelled logEntry = TradeLogEntry(self.lastTime, status, msg) trade.log.append(logEntry) self._logger.warning(f'Canceled order: {trade}') self.ib.orderStatusEvent.emit(trade) trade.statusEvent.emit(trade) trade.cancelledEvent.emit(trade) if errorCode == 165: # for scan data subscription there are no longer matching results dataList = self.reqId2Subscriber.get(reqId) if dataList: dataList.clear() dataList.updateEvent.emit(dataList) elif errorCode == 317: # Market depth data has been RESET ticker = self.reqId2Ticker.get(reqId) if ticker: # clear all DOM levels ticker.domTicks += [ MktDepthData(self.lastTime, 0, '', 2, 0, level.price, 0) for level in ticker.domAsks ] ticker.domTicks += [ MktDepthData(self.lastTime, 0, '', 2, 1, level.price, 0) for level in ticker.domBids ] ticker.domAsks.clear() ticker.domBids.clear() self.pendingTickers.add(ticker) self.ib.errorEvent.emit(reqId, errorCode, errorString, contract)
def updateMktDepthL2(self, reqId: int, position: int, marketMaker: str, operation: int, side: int, price: float, size: int, isSmartDepth: bool = False): # operation: 0 = insert, 1 = update, 2 = delete # side: 0 = ask, 1 = bid ticker = self.reqId2Ticker[reqId] dom = ticker.domBids if side else ticker.domAsks if operation == 0: dom.insert(position, DOMLevel(price, size, marketMaker)) elif operation == 1: dom[position] = DOMLevel(price, size, marketMaker) elif operation == 2: if position < len(dom): level = dom.pop(position) price = level.price size = 0 tick = MktDepthData(self.lastTime, position, marketMaker, operation, side, price, size) ticker.domTicks.append(tick) self.pendingTickers.add(ticker)
def error(self, reqId, errorCode, errorString): # https://interactivebrokers.github.io/tws-api/message_codes.html warningCodes = {165, 202, 399, 434, 10167} isWarning = errorCode in warningCodes or 2100 <= errorCode < 2200 msg = ( f'{"Warning" if isWarning else "Error"} ' f'{errorCode}, reqId {reqId}: {errorString}') contract = self._reqId2Contract.get(reqId) if contract: msg += f', contract: {contract}' if isWarning: self._logger.info(msg) else: self._logger.error(msg) if reqId in self._futures: # the request failed self._endReq(reqId) elif (self.clientId, reqId) in self.trades: # something is wrong with the order, cancel it trade = self.trades[(self.clientId, reqId)] if not trade.isDone(): status = trade.orderStatus.status = OrderStatus.Cancelled logEntry = TradeLogEntry(self.lastTime, status, msg) trade.log.append(logEntry) self._logger.warning(f'Canceled order: {trade}') self.ib.orderStatusEvent.emit(trade) trade.cancelledEvent.emit(trade) elif errorCode == 317: # Market depth data has been RESET ticker = self.reqId2Ticker.get(reqId) if ticker: for side, l in ((0, ticker.domAsks), (1, ticker.domBids)): for position in reversed(l): level = l.pop(position) tick = MktDepthData( self.lastTime, position, '', 2, side, level.price, 0) ticker.domTicks.append(tick) self.ib.errorEvent.emit(reqId, errorCode, errorString, contract)
def error(self, reqId: int, errorCode: int, errorString: str): # https://interactivebrokers.github.io/tws-api/message_codes.html warningCodes = {165, 202, 399, 404, 434, 492, 10167} isWarning = errorCode in warningCodes or 2100 <= errorCode < 2200 msg = ( f'{"Warning" if isWarning else "Error"} ' f'{errorCode}, reqId {reqId}: {errorString}') contract = self._reqId2Contract.get(reqId) if contract: msg += f', contract: {contract}' if isWarning: self._logger.info(msg) else: self._logger.error(msg) if reqId in self._futures: # the request failed if self.ib.RaiseRequestErrors: error = RequestError(reqId, errorCode, errorString) self._endReq(reqId, error, success=False) else: self._endReq(reqId) elif (self.clientId, reqId) in self.trades: # something is wrong with the order, cancel it trade = self.trades[(self.clientId, reqId)] if not trade.isDone(): status = trade.orderStatus.status = OrderStatus.Cancelled logEntry = TradeLogEntry(self.lastTime, status, msg) trade.log.append(logEntry) self._logger.warning(f'Canceled order: {trade}') self.ib.orderStatusEvent.emit(trade) trade.statusEvent.emit(trade) trade.cancelledEvent.emit(trade) if errorCode == 165: # for scan data subscription there are no longer matching results dataList = self.reqId2Subscriber.get(reqId) if dataList: dataList.clear() dataList.updateEvent.emit(dataList) elif errorCode == 317: # Market depth data has been RESET ticker = self.reqId2Ticker.get(reqId) if ticker: # clear all DOM levels ticker.domTicks += [MktDepthData( self.lastTime, 0, '', 2, 0, level.price, 0) for level in ticker.domAsks] ticker.domTicks += [MktDepthData( self.lastTime, 0, '', 2, 1, level.price, 0) for level in ticker.domBids] ticker.domAsks.clear() ticker.domBids.clear() self.pendingTickers.add(ticker) elif errorCode == 10225: # Bust event occurred, current subscription is deactivated. # Please resubscribe real-time bars immediately bars = self.reqId2Subscriber.get(reqId) if isinstance(bars, RealTimeBarList): self.ib.client.cancelRealTimeBars(reqId) self.ib.client.reqRealTimeBars( reqId, bars.contract, bars.barSize, bars.whatToShow, bars.useRTH, bars.realTimeBarsOptions) elif isinstance(bars, BarDataList): self.ib.client.cancelHistoricalData(reqId) self.ib.client.reqHistoricalData( reqId, bars.contract, bars.endDateTime, bars.durationStr, bars.barSizeSetting, bars.whatToShow, bars.useRTH, bars.formatDate, bars.keepUpToDate, bars.chartOptions) self.ib.errorEvent.emit(reqId, errorCode, errorString, contract)