Пример #1
0
 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}')
Пример #3
0
 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)
Пример #4
0
 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)
Пример #5
0
 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}')
Пример #6
0
 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}')
Пример #7
0
 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)