Add prelim fqsn support into our `Symbol` type
							parent
							
								
									cf457112dd
								
							
						
					
					
						commit
						e9ed070cbf
					
				| 
						 | 
					@ -92,6 +92,28 @@ def ohlc_zeros(length: int) -> np.ndarray:
 | 
				
			||||||
    return np.zeros(length, dtype=base_ohlc_dtype)
 | 
					    return np.zeros(length, dtype=base_ohlc_dtype)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def uncons_fqsn(fqsn: str) -> tuple[str, str, str]:
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
 | 
					    Unpack a fully-qualified-symbol-name to ``tuple``.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
 | 
					    # TODO: probably reverse the order of all this XD
 | 
				
			||||||
 | 
					    tokens = fqsn.split('.')
 | 
				
			||||||
 | 
					    if len(tokens) > 3:
 | 
				
			||||||
 | 
					        symbol, venue, suffix, broker = tokens
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        symbol, venue, broker = tokens
 | 
				
			||||||
 | 
					        suffix = ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # head, _, broker = fqsn.rpartition('.')
 | 
				
			||||||
 | 
					    # symbol, _, suffix = head.rpartition('.')
 | 
				
			||||||
 | 
					    return (
 | 
				
			||||||
 | 
					        broker,
 | 
				
			||||||
 | 
					        '.'.join([symbol, venue]),
 | 
				
			||||||
 | 
					        suffix,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Symbol(BaseModel):
 | 
					class Symbol(BaseModel):
 | 
				
			||||||
    '''
 | 
					    '''
 | 
				
			||||||
    I guess this is some kinda container thing for dealing with
 | 
					    I guess this is some kinda container thing for dealing with
 | 
				
			||||||
| 
						 | 
					@ -103,6 +125,7 @@ class Symbol(BaseModel):
 | 
				
			||||||
    lot_tick_size: float = 0.0  # "volume" precision as min step value
 | 
					    lot_tick_size: float = 0.0  # "volume" precision as min step value
 | 
				
			||||||
    tick_size_digits: int = 2
 | 
					    tick_size_digits: int = 2
 | 
				
			||||||
    lot_size_digits: int = 0
 | 
					    lot_size_digits: int = 0
 | 
				
			||||||
 | 
					    suffix: str = ''
 | 
				
			||||||
    broker_info: dict[str, dict[str, Any]] = {}
 | 
					    broker_info: dict[str, dict[str, Any]] = {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # specifies a "class" of financial instrument
 | 
					    # specifies a "class" of financial instrument
 | 
				
			||||||
| 
						 | 
					@ -115,6 +138,7 @@ class Symbol(BaseModel):
 | 
				
			||||||
        broker: str,
 | 
					        broker: str,
 | 
				
			||||||
        symbol: str,
 | 
					        symbol: str,
 | 
				
			||||||
        info: dict[str, Any],
 | 
					        info: dict[str, Any],
 | 
				
			||||||
 | 
					        suffix: str = '',
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # XXX: like wtf..
 | 
					    # XXX: like wtf..
 | 
				
			||||||
    # ) -> 'Symbol':
 | 
					    # ) -> 'Symbol':
 | 
				
			||||||
| 
						 | 
					@ -129,9 +153,27 @@ class Symbol(BaseModel):
 | 
				
			||||||
            lot_tick_size=lot_tick_size,
 | 
					            lot_tick_size=lot_tick_size,
 | 
				
			||||||
            tick_size_digits=float_digits(tick_size),
 | 
					            tick_size_digits=float_digits(tick_size),
 | 
				
			||||||
            lot_size_digits=float_digits(lot_tick_size),
 | 
					            lot_size_digits=float_digits(lot_tick_size),
 | 
				
			||||||
 | 
					            suffix=suffix,
 | 
				
			||||||
            broker_info={broker: info},
 | 
					            broker_info={broker: info},
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @classmethod
 | 
				
			||||||
 | 
					    def from_fqsn(
 | 
				
			||||||
 | 
					        cls,
 | 
				
			||||||
 | 
					        fqsn: str,
 | 
				
			||||||
 | 
					        info: dict[str, Any],
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    # XXX: like wtf..
 | 
				
			||||||
 | 
					    # ) -> 'Symbol':
 | 
				
			||||||
 | 
					    ) -> None:
 | 
				
			||||||
 | 
					        broker, key, suffix = uncons_fqsn(fqsn)
 | 
				
			||||||
 | 
					        return cls.from_broker_info(
 | 
				
			||||||
 | 
					            broker,
 | 
				
			||||||
 | 
					            key,
 | 
				
			||||||
 | 
					            info=info,
 | 
				
			||||||
 | 
					            suffix=suffix,
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @property
 | 
					    @property
 | 
				
			||||||
    def type_key(self) -> str:
 | 
					    def type_key(self) -> str:
 | 
				
			||||||
        return list(self.broker_info.values())[0]['asset_type']
 | 
					        return list(self.broker_info.values())[0]['asset_type']
 | 
				
			||||||
| 
						 | 
					@ -141,9 +183,10 @@ class Symbol(BaseModel):
 | 
				
			||||||
        return list(self.broker_info.keys())
 | 
					        return list(self.broker_info.keys())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def nearest_tick(self, value: float) -> float:
 | 
					    def nearest_tick(self, value: float) -> float:
 | 
				
			||||||
        """Return the nearest tick value based on mininum increment.
 | 
					        '''
 | 
				
			||||||
 | 
					        Return the nearest tick value based on mininum increment.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        """
 | 
					        '''
 | 
				
			||||||
        mult = 1 / self.tick_size
 | 
					        mult = 1 / self.tick_size
 | 
				
			||||||
        return round(value * mult) / mult
 | 
					        return round(value * mult) / mult
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -159,11 +202,25 @@ class Symbol(BaseModel):
 | 
				
			||||||
            self.key,
 | 
					            self.key,
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def front_fqsn(self) -> str:
 | 
				
			||||||
 | 
					        broker, key = self.front_feed()
 | 
				
			||||||
 | 
					        if self.suffix:
 | 
				
			||||||
 | 
					            tokens = (key, self.suffix, broker)
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            tokens = (key, broker)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        fqsn = '.'.join(tokens)
 | 
				
			||||||
 | 
					        return fqsn
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def iterfqsns(self) -> list[str]:
 | 
					    def iterfqsns(self) -> list[str]:
 | 
				
			||||||
        return [
 | 
					        keys = []
 | 
				
			||||||
            mk_fqsn(self.key, broker)
 | 
					        for broker in self.broker_info.keys():
 | 
				
			||||||
            for broker in self.broker_info.keys()
 | 
					            fqsn = mk_fqsn(self.key, broker)
 | 
				
			||||||
        ]
 | 
					            if self.suffix:
 | 
				
			||||||
 | 
					                fqsn += f'.{self.suffix}'
 | 
				
			||||||
 | 
					            keys.append(fqsn)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return keys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def from_df(
 | 
					def from_df(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue