Sub each new symbol to shm incrementing
							parent
							
								
									e3e219aa4b
								
							
						
					
					
						commit
						8832804bab
					
				|  | @ -8,7 +8,7 @@ built on it) and thus actor aware API calls must be spawned with | |||
| from contextlib import asynccontextmanager | ||||
| from dataclasses import asdict | ||||
| from functools import partial | ||||
| from typing import List, Dict, Any, Tuple, Optional, AsyncGenerator, Callable | ||||
| from typing import List, Dict, Any, Tuple, Optional, AsyncIterator, Callable | ||||
| import asyncio | ||||
| import logging | ||||
| import inspect | ||||
|  | @ -29,7 +29,8 @@ from ..data import ( | |||
|     maybe_spawn_brokerd, | ||||
|     iterticks, | ||||
|     attach_shm_array, | ||||
|     get_shm_token | ||||
|     get_shm_token, | ||||
|     subscribe_ohlc_for_increment, | ||||
| ) | ||||
| from ..ui._source import from_df | ||||
| 
 | ||||
|  | @ -147,7 +148,7 @@ class Client: | |||
|             # durationStr='1 D', | ||||
| 
 | ||||
|             # time length calcs | ||||
|             durationStr='{count} S'.format(count=1000 * 5), | ||||
|             durationStr='{count} S'.format(count=100 * 5), | ||||
|             barSizeSetting='5 secs', | ||||
| 
 | ||||
|             # always use extended hours | ||||
|  | @ -494,14 +495,16 @@ def normalize( | |||
| # TODO: figure out how to share quote feeds sanely despite | ||||
| # the wacky ``ib_insync`` api. | ||||
| # @tractor.msg.pub | ||||
| @tractor.stream | ||||
| async def stream_quotes( | ||||
|     ctx: tractor.Context, | ||||
|     symbols: List[str], | ||||
|     shm_token: Tuple[str, str, List[tuple]], | ||||
|     loglevel: str = None, | ||||
|     # compat for @tractor.msg.pub | ||||
|     topics: Any = None, | ||||
|     get_topics: Callable = None, | ||||
| ) -> AsyncGenerator[str, Dict[str, Any]]: | ||||
| ) -> AsyncIterator[Dict[str, Any]]: | ||||
|     """Stream symbol quotes. | ||||
| 
 | ||||
|     This is a ``trio`` callable routine meant to be invoked | ||||
|  | @ -539,8 +542,12 @@ async def stream_quotes( | |||
|             shm.push(bars) | ||||
|             shm_token = shm.token | ||||
| 
 | ||||
|             times = shm.array['time'] | ||||
|             delay_s = times[-1] - times[times != times[-1]][-1] | ||||
|             subscribe_ohlc_for_increment(shm, delay_s) | ||||
| 
 | ||||
|         # pass back token, and bool, signalling if we're the writer | ||||
|         yield shm_token, not writer_exists | ||||
|         await ctx.send_yield((shm_token, not writer_exists)) | ||||
| 
 | ||||
|         # first quote can be ignored as a 2nd with newer data is sent? | ||||
|         first_ticker = await stream.__anext__() | ||||
|  | @ -581,9 +588,11 @@ async def stream_quotes( | |||
|         topic = '.'.join((con['symbol'], con[suffix])).lower() | ||||
|         first_quote = {topic: quote} | ||||
|         ticker.ticks = [] | ||||
|         # yield first quote asap | ||||
|         yield first_quote | ||||
| 
 | ||||
|         # yield first quote asap | ||||
|         await ctx.send_yield(first_quote) | ||||
| 
 | ||||
|         # real-time stream | ||||
|         async for ticker in stream: | ||||
|             quote = normalize( | ||||
|                 ticker, | ||||
|  | @ -614,7 +623,8 @@ async def stream_quotes( | |||
| 
 | ||||
|             con = quote['contract'] | ||||
|             topic = '.'.join((con['symbol'], con[suffix])).lower() | ||||
|             yield {topic: quote} | ||||
| 
 | ||||
|             await ctx.send_yield({topic: quote}) | ||||
| 
 | ||||
|             # ugh, clear ticks since we've consumed them | ||||
|             ticker.ticks = [] | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue