commit
8cde68fedb
|
@ -282,7 +282,6 @@ class Client:
|
||||||
pattern: str,
|
pattern: str,
|
||||||
# how many contracts to search "up to"
|
# how many contracts to search "up to"
|
||||||
upto: int = 3,
|
upto: int = 3,
|
||||||
asdicts: bool = True,
|
|
||||||
) -> Dict[str, ContractDetails]:
|
) -> Dict[str, ContractDetails]:
|
||||||
"""Search for stocks matching provided ``str`` pattern.
|
"""Search for stocks matching provided ``str`` pattern.
|
||||||
|
|
||||||
|
@ -304,11 +303,17 @@ class Client:
|
||||||
# XXX: if there is more then one entry in the details list
|
# XXX: if there is more then one entry in the details list
|
||||||
details = {}
|
details = {}
|
||||||
for details_set in results:
|
for details_set in results:
|
||||||
|
|
||||||
# then the contract is so called "ambiguous".
|
# then the contract is so called "ambiguous".
|
||||||
for d in details_set:
|
for d in details_set:
|
||||||
con = d.contract
|
con = d.contract
|
||||||
unique_sym = f'{con.symbol}.{con.primaryExchange}'
|
unique_sym = f'{con.symbol}.{con.primaryExchange}'
|
||||||
details[unique_sym] = asdict(d) if asdicts else d
|
|
||||||
|
as_dict = asdict(d)
|
||||||
|
# nested dataclass we probably don't need and that won't IPC serialize
|
||||||
|
as_dict.pop('secIdList')
|
||||||
|
|
||||||
|
details[unique_sym] = as_dict
|
||||||
|
|
||||||
if len(details) == upto:
|
if len(details) == upto:
|
||||||
return details
|
return details
|
||||||
|
@ -1086,6 +1091,9 @@ async def stream_quotes(
|
||||||
syminfo = asdict(details)
|
syminfo = asdict(details)
|
||||||
syminfo.update(syminfo['contract'])
|
syminfo.update(syminfo['contract'])
|
||||||
|
|
||||||
|
# nested dataclass we probably don't need and that won't IPC serialize
|
||||||
|
syminfo.pop('secIdList')
|
||||||
|
|
||||||
# TODO: more consistent field translation
|
# TODO: more consistent field translation
|
||||||
atype = syminfo['asset_type'] = asset_type_map[syminfo['secType']]
|
atype = syminfo['asset_type'] = asset_type_map[syminfo['secType']]
|
||||||
|
|
||||||
|
|
|
@ -97,8 +97,7 @@ class _Token:
|
||||||
|
|
||||||
def __post_init__(self):
|
def __post_init__(self):
|
||||||
# np.array requires a list for dtype
|
# np.array requires a list for dtype
|
||||||
self.dtype_descr = np.dtype(
|
self.dtype_descr = np.dtype(list(map(tuple, self.dtype_descr))).descr
|
||||||
list(self.dtype_descr)).descr
|
|
||||||
|
|
||||||
def as_msg(self):
|
def as_msg(self):
|
||||||
return asdict(self)
|
return asdict(self)
|
||||||
|
|
|
@ -514,7 +514,10 @@ async def open_feed(
|
||||||
|
|
||||||
# cast shm dtype to list... can't member why we need this
|
# cast shm dtype to list... can't member why we need this
|
||||||
shm_token = data['shm_token']
|
shm_token = data['shm_token']
|
||||||
shm_token['dtype_descr'] = list(shm_token['dtype_descr'])
|
|
||||||
|
# XXX: msgspec won't relay through the tuples XD
|
||||||
|
shm_token['dtype_descr'] = list(map(tuple, shm_token['dtype_descr']))
|
||||||
|
|
||||||
assert shm_token == shm.token # sanity
|
assert shm_token == shm.token # sanity
|
||||||
|
|
||||||
feed._max_sample_rate = max(ohlc_sample_rates)
|
feed._max_sample_rate = max(ohlc_sample_rates)
|
||||||
|
|
Loading…
Reference in New Issue