def tickGeneric(self, reqId: int, tickType: int, value: float): ticker = self.reqId2Ticker.get(reqId) if not ticker: return try: value = float(value) except ValueError: self._logger.error(f'genericTick: malformed value: {value!r}') return if tickType == 23: ticker.histVolatility = value elif tickType == 24: ticker.impliedVolatility = value elif tickType == 31: ticker.indexFuturePremium = value elif tickType == 49: ticker.halted = value elif tickType == 54: ticker.tradeCount = value elif tickType == 55: ticker.tradeRate = value elif tickType == 56: ticker.volumeRate = value elif tickType == 58: ticker.rtHistVolatility = value tick = TickData(self.lastTime, tickType, value, 0) ticker.ticks.append(tick) self.pendingTickers.add(ticker)
def tickString(self, reqId: int, tickType: int, value: str): ticker = self.reqId2Ticker.get(reqId) if not ticker: return try: if tickType == 47: # https://interactivebrokers.github.io/tws-api/fundamental_ratios_tags.html d = dict( t.split('=') # type: ignore for t in value.split(';') if t) # type: ignore for k, v in d.items(): with suppress(ValueError): if v == '-99999.99': v = 'nan' d[k] = float(v) d[k] = int(v) ticker.fundamentalRatios = FundamentalRatios(**d) elif tickType in (48, 77): # RT Volume or RT Trade Volume string format: # price;size;ms since epoch;total volume;VWAP;single trade # example: # 701.28;1;1348075471534;67854;701.46918464;true priceStr, sizeStr, rtTime, volume, vwap, _ = value.split(';') if volume: if tickType == 48: ticker.rtVolume = int(volume) elif tickType == 77: ticker.rtTradeVolume = int(volume) if vwap: ticker.vwap = float(vwap) if rtTime: ticker.rtTime = datetime.fromtimestamp( int(rtTime) / 1000, timezone.utc) if priceStr == '': return price = float(priceStr) size = int(sizeStr) if price and size: if ticker.prevLast != ticker.last: ticker.prevLast = ticker.last ticker.last = price if ticker.prevLastSize != ticker.lastSize: ticker.prevLastSize = ticker.lastSize ticker.lastSize = size tick = TickData(self.lastTime, tickType, price, size) ticker.ticks.append(tick) elif tickType == 59: # Dividend tick: # https://interactivebrokers.github.io/tws-api/tick_types.html#ib_dividends # example value: '0.83,0.92,20130219,0.23' past12, next12, nextDate, nextAmount = value.split(',') ticker.dividends = Dividends( float(past12) if past12 else None, float(next12) if next12 else None, parseIBDatetime(nextDate) if nextDate else None, float(nextAmount) if nextAmount else None) self.pendingTickers.add(ticker) except ValueError: self._logger.error(f'tickString with tickType {tickType}: ' f'malformed value: {value!r}')
def priceSizeTick(self, reqId, tickType, price, size): ticker = self.reqId2Ticker.get(reqId) if not ticker: self._logger.error(f'priceSizeTick: Unknown reqId: {reqId}') return ticker.time = self.lastTime # https://interactivebrokers.github.io/tws-api/tick_types.html if tickType in (1, 66): if price != ticker.bid: ticker.prevBid = ticker.bid ticker.bid = price if size != ticker.bidSize: ticker.prevBidSize = ticker.bidSize ticker.bidSize = size elif tickType in (2, 67): if price != ticker.ask: ticker.prevAsk = ticker.ask ticker.ask = price if size != ticker.askSize: ticker.prevAskSize = ticker.askSize ticker.askSize = size elif tickType in (4, 68): if price != ticker.last: ticker.prevLast = ticker.last ticker.last = price if size != ticker.lastSize: ticker.prevLastSize = ticker.lastSize ticker.lastSize = size elif tickType in (6, 72): ticker.high = price elif tickType in (7, 73): ticker.low = price elif tickType == 9: ticker.close = price elif tickType == 14: ticker.open = price elif tickType == 15: ticker.low13week = price elif tickType == 16: ticker.high13week = price elif tickType == 17: ticker.low26week = price elif tickType == 18: ticker.high26week = price elif tickType == 19: ticker.low52week = price elif tickType == 20: ticker.high52week = price elif tickType == 50: ticker.bidYield = price elif tickType == 51: ticker.askYield = price elif tickType == 52: ticker.lastYield = price if price or size: tick = TickData(self.lastTime, tickType, price, size) ticker.ticks.append(tick) self.pendingTickers.add(ticker)
def tickSize(self, reqId: int, tickType: int, size: float): ticker = self.reqId2Ticker.get(reqId) if not ticker: self._logger.error(f'tickSize: Unknown reqId: {reqId}') return price = -1.0 # https://interactivebrokers.github.io/tws-api/tick_types.html if tickType in (0, 69): if size == ticker.bidSize: return price = ticker.bid ticker.prevBidSize = ticker.bidSize ticker.bidSize = size elif tickType in (3, 70): if size == ticker.askSize: return price = ticker.ask ticker.prevAskSize = ticker.askSize ticker.askSize = size elif tickType in (5, 71): price = ticker.last if isNan(price): return if size != ticker.lastSize: ticker.prevLastSize = ticker.lastSize ticker.lastSize = size elif tickType in (8, 74): ticker.volume = size elif tickType == 21: ticker.avVolume = size elif tickType == 27: ticker.callOpenInterest = size elif tickType == 28: ticker.putOpenInterest = size elif tickType == 29: ticker.callVolume = size elif tickType == 30: ticker.putVolume = size elif tickType == 34: ticker.auctionVolume = size elif tickType == 36: ticker.auctionImbalance = size elif tickType == 61: ticker.regulatoryImbalance = size elif tickType == 86: ticker.futuresOpenInterest = size elif tickType == 87: ticker.avOptionVolume = size elif tickType == 89: ticker.shortableShares = size if price or size: tick = TickData(self.lastTime, tickType, price, size) ticker.ticks.append(tick) ticker.marketDataType = self.reqId2MarketDataType.get(reqId, 0) self.pendingTickers.add(ticker)
def tickGeneric(self, reqId, tickType, value): ticker = self.reqId2Ticker.get(reqId) if not ticker: return try: value = float(value) tick = TickData(self.lastTime, tickType, value, 0) ticker.ticks.append(tick) self.pendingTickers.add(ticker) except ValueError: self._logger.error(f'genericTick: malformed value: {value!r}')
def tickString(self, reqId, tickType, value): ticker = self.reqId2Ticker.get(reqId) if not ticker: return try: if tickType == 47: # https://interactivebrokers.github.io/tws-api/fundamental_ratios_tags.html ticker.fundamentalRatios = value elif tickType == 48: # RTVolume string format: # price;size;ms since epoch;total volume;VWAP;single trade # example: # 701.28;1;1348075471534;67854;701.46918464;true price, size, _, rtVolume, vwap, _ = value.split(';') if rtVolume: ticker.rtVolume = int(rtVolume) if vwap: ticker.vwap = float(vwap) if price == '': return price = float(price) size = float(size) if price and size: if ticker.prevLast != ticker.last: ticker.prevLast = ticker.last ticker.last = price if ticker.prevLastSize != ticker.lastSize: ticker.prevLastSize = ticker.lastSize ticker.lastSize = size tick = TickData(self.lastTime, tickType, price, size) ticker.ticks.append(tick) self.pendingTickers.add(ticker) elif tickType == 59: # Dividend tick: # https://interactivebrokers.github.io/tws-api/tick_types.html#ib_dividends # example value: '0.83,0.92,20130219,0.23' past12, next12, nextDate, nextAmount = value.split(',') ticker.dividends = Dividends( float(past12) if past12 else None, float(next12) if next12 else None, util.parseIBDatetime(nextDate) if nextDate else None, float(nextAmount) if nextAmount else None) except ValueError: self._logger.error( f'tickString with tickType {tickType}: ' f'malformed value: {value!r}')
def tickSize(self, reqId, tickType, size): ticker = self.reqId2Ticker.get(reqId) if not ticker: self._logger.error(f'tickSize: Unknown reqId: {reqId}') return ticker.time = self.lastTime price = -1.0 # https://interactivebrokers.github.io/tws-api/tick_types.html if tickType in (0, 69): price = ticker.bid if size != ticker.bidSize: ticker.prevBidSize = ticker.bidSize ticker.bidSize = size elif tickType in (3, 70): price = ticker.ask if size != ticker.askSize: ticker.prevAskSize = ticker.askSize ticker.askSize = size elif tickType in (5, 71): price = ticker.last if util.isNan(price): return if size != ticker.lastSize: ticker.prevLastSize = ticker.lastSize ticker.lastSize = size elif tickType in (8, 74): ticker.volume = size elif tickType == 21: ticker.avVolume = size elif tickType == 27: ticker.callOpenInterest = size elif tickType == 28: ticker.putOpenInterest = size elif tickType == 29: ticker.callVolume = size elif tickType == 30: ticker.putVolume = size elif tickType == 86: ticker.futuresOpenInterest = size if price or size: tick = TickData(self.lastTime, tickType, price, size) ticker.ticks.append(tick) self.pendingTickers.add(ticker)