Push only new key value pairs over quote streams
This is something I've been meaning to try for a while and will likely make writing tick data to a db more straight forward (filling in NaN values is more matter of fact) plus it should minimize bandwidth usage. Note, it'll require stream consumers to be considerate of non-full quotes arriving and thus using the first "full" quote message to fill out dynamically formatted systems or displays.its_happening
							parent
							
								
									2f2ff7cded
								
							
						
					
					
						commit
						3042d1eec6
					
				| 
						 | 
				
			
			@ -130,17 +130,33 @@ async def stream_requests(
 | 
			
		|||
            for quote in quotes:
 | 
			
		||||
                symbol = quote['symbol']
 | 
			
		||||
                last = _cache.setdefault(symbol, {})
 | 
			
		||||
 | 
			
		||||
                # find all keys that have match to a new value compared
 | 
			
		||||
                # to the last quote received
 | 
			
		||||
                new = set(quote.items()) - set(last.items())
 | 
			
		||||
                if new:
 | 
			
		||||
                    log.info(
 | 
			
		||||
                        f"New quote {quote['symbol']}:\n{new}")
 | 
			
		||||
                    _cache[symbol] = quote
 | 
			
		||||
 | 
			
		||||
                    # only ship diff updates and other required fields
 | 
			
		||||
                    payload['symbol'] = symbol
 | 
			
		||||
                    payload = {k: quote[k] for k, v in new}
 | 
			
		||||
 | 
			
		||||
                    # if there was volume likely the last size of
 | 
			
		||||
                    # shares traded is useful info and it's possible
 | 
			
		||||
                    # that the set difference from above will disregard
 | 
			
		||||
                    # a "size" value since the same # of shares were traded
 | 
			
		||||
                    size = quote.get('size')
 | 
			
		||||
                    if size and 'volume' in payload:
 | 
			
		||||
                        payload['size'] = size
 | 
			
		||||
 | 
			
		||||
                    # XXX: we append to a list for the options case where the
 | 
			
		||||
                    # subscription topic (key) is the same for all
 | 
			
		||||
                    # expiries even though this is uncessary for the
 | 
			
		||||
                    # stock case (different topic [i.e. symbol] for each
 | 
			
		||||
                    # quote).
 | 
			
		||||
                    new_quotes.setdefault(quote['key'], []).append(quote)
 | 
			
		||||
                    new_quotes.setdefault(quote['key'], []).append(payload)
 | 
			
		||||
        else:
 | 
			
		||||
            # log.debug(f"Delivering quotes:\n{quotes}")
 | 
			
		||||
            for quote in quotes:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue