From d4a5a3057c836ff45ade820300233890f3a536ea Mon Sep 17 00:00:00 2001 From: Tyler Goodlet Date: Tue, 21 Mar 2023 16:40:33 -0400 Subject: [PATCH] Add `MktPair.suffix: str` read from contract info To be compat with the `Symbol` (for now) and generally allow for reading the (derivative) contract specific part of the fqme. Adjust `contract_info: list[str]` and make `src: str = ''` by default. --- piker/accounting/_mktinfo.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/piker/accounting/_mktinfo.py b/piker/accounting/_mktinfo.py index fcb6c0f8..4c94962d 100644 --- a/piker/accounting/_mktinfo.py +++ b/piker/accounting/_mktinfo.py @@ -154,7 +154,7 @@ def maybe_cons_tokens( sequence of elements in ``tokens``. ''' - return '.'.join(filter(bool, tokens)).lower() + return delim_char.join(filter(bool, tokens)).lower() class MktPair(Struct, frozen=True): @@ -195,7 +195,7 @@ class MktPair(Struct, frozen=True): # required; the reason is for backward compat since more positioning # calculations were not originally stored with a src asset.. - src: str | Asset | None = None + src: str | Asset = '' # "source asset" (name) used to buy *from* # (or used to sell *to*). @@ -217,7 +217,7 @@ class MktPair(Struct, frozen=True): # for derivs, info describing contract, egs. # strike price, call or put, swap type, exercise model, etc. - contract_info: str | None = None + contract_info: list[str] | None = None _atype: str = '' @@ -287,7 +287,32 @@ class MktPair(Struct, frozen=True): "symbol". ''' - return maybe_cons_tokens([str(self.dst), self.src]) + return maybe_cons_tokens( + [str(self.dst), self.src], + delim_char='', + ) + + @property + def suffix(self) -> str: + ''' + The "contract suffix" for this market. + + Eg. mnq/usd.20230616.cme.ib + ^ ----- ^ + or tsla/usd.20230324.200c.cboe.ib + ^ ---------- ^ + + In most other tina platforms they only show you these details in + some kinda "meta data" format, we have FQMEs so we do this up + front and explicit. + + ''' + field_strs = [self.expiry] + con_info = self.contract_info + if con_info is not None: + field_strs.extend(con_info) + + return maybe_cons_tokens(field_strs) # NOTE: the main idea behind an fqme is to map a "market address" # to some endpoint from a transaction provider (eg. a broker) such @@ -387,6 +412,7 @@ class MktPair(Struct, frozen=True): def unpack_fqme( fqme: str, + ) -> tuple[str, str, str]: ''' Unpack a fully-qualified-symbol-name to ``tuple``.