
    iP                        d Z ddlmZ ddlZddlmZmZ ddlmZ erddl	m
Z
 ddlZddlmZ dd	lmZ dd
lmZ e G d d             Zy)zCSymbol-Exchange-Interval Set (Seis) for tracking live data streams.    )annotationsN)	dataclassfield)TYPE_CHECKING)Callable   TvDatafeedLive)Consumer)Intervalc                  l   e Zd ZU dZded<   ded<   ded<    eddd	      Zd
ed<    eedd      Zded<    eddd	      Z	ded<   ddZ
ddZed d       Zej                  d!d       Zej                  d"d       Z	 d#	 	 	 	 	 d$dZ	 d#	 	 	 	 	 d%dZd&dZd&dZd'dZ	 	 d(	 	 	 	 	 d)dZd#d*dZd+dZy),Seisa  Symbol, exchange, and interval data set for live streaming.

    Holds a unique combination of symbol, exchange, and interval values,
    along with associated consumers for this data stream.

    Args:
        symbol: Ticker symbol string
        exchange: Exchange where symbol is listed
        interval: Chart time interval

    Example:
        >>> seis = Seis('ETHUSDT', 'BINANCE', Interval.in_1_hour)
        >>> seis.new_consumer(my_callback)
    strsymbolexchanger   intervalNF)defaultreprinitTvDatafeedLive | None_tvdatafeed)default_factoryr   r   list[Consumer]
_consumerszdatetime.datetime | None_updatedc                    t        |t              st        S | j                  |j                  k(  xr4 | j                  |j                  k(  xr | j
                  |j
                  k(  S )zCompare two Seis instances for equality.

        Instances are equal if symbol, exchange, and interval match.

        Args:
            other: Object to compare with

        Returns:
            True if equal, False otherwise
        )
isinstancer   NotImplementedr   r   r   )selfothers     H/home/work/apex_v16/venv/lib/python3.12/site-packages/tvDatafeed/seis.py__eq__zSeis.__eq__+   sU     %&!! KK5<<' ,MMU^^+,MMU^^+	
    c                j    d| j                    d| j                   d| j                  j                   dS )zReturn string representation.zsymbol='z', exchange='z', interval='')r   r   r   namer   s    r!   __str__zSeis.__str__?   s4    $++mDMM?-PTP]P]PbPbOccdeer#   c                    | j                   S )z'Get associated TvDatafeedLive instance.r   r'   s    r!   
tvdatafeedzSeis.tvdatafeedC   s     r#   c                z    ddl m} | j                  t        d      t	        ||      st        d      || _        y)zSet TvDatafeedLive instance.

        Args:
            value: TvDatafeedLive instance

        Raises:
            AttributeError: If already set (cannot overwrite)
            TypeError: If value is not TvDatafeedLive instance
        r   r	   Nz-Cannot overwrite tvdatafeed - delete it firstz%Value must be TvDatafeedLive instance)datafeedr
   r   AttributeErrorr   	TypeError)r   valueTvDatafeedLiveClasss      r!   r+   zSeis.tvdatafeedH   s?     	D' !PQQ%!45CDD r#   c                    d| _         y)z Delete TvDatafeedLive reference.Nr*   r'   s    r!   r+   zSeis.tvdatafeed^   s      r#   c                j    | j                   t        d      | j                   j                  | ||      S )a  Create new consumer and add to this Seis.

        Args:
            callback: Function(seis, data) to call with new data
            timeout: Maximum wait time in seconds (-1 for blocking)

        Returns:
            Consumer instance, or False if timeout

        Raises:
            RuntimeError: If no TvDatafeedLive reference set

        Example:
            >>> def my_callback(seis, data):
            ...     print(f"New data: {data}")
            >>> consumer = seis.new_consumer(my_callback)
        4No TvDatafeedLive instance associated with this Seis)r   RuntimeErrornew_consumer)r   callbacktimeouts      r!   r6   zSeis.new_consumerc   s7    , #UVV,,T8WEEr#   c                h    | j                   t        d      | j                   j                  ||      S )a>  Remove consumer from this Seis.

        Args:
            consumer: Consumer instance to remove
            timeout: Maximum wait time in seconds (-1 for blocking)

        Returns:
            True if successful, False if timeout

        Raises:
            RuntimeError: If no TvDatafeedLive reference set
        r4   )r   r5   del_consumer)r   consumerr8   s      r!   r:   zSeis.del_consumer~   s5    " #UVV,,Xw??r#   c                :    | j                   j                  |       y)zAdd consumer to internal list.

        Internal method used by TvDatafeedLive. Not for direct use.

        Args:
            consumer: Consumer instance to add
        N)r   appendr   r;   s     r!   add_consumerzSeis.add_consumer   s     	x(r#   c                l    || j                   vrt        d      | j                   j                  |       y)zRemove consumer from internal list.

        Internal method used by TvDatafeedLive. Not for direct use.

        Args:
            consumer: Consumer instance to remove

        Raises:
            ValueError: If consumer not in list
        z&Consumer not registered with this SeisN)r   
ValueErrorremover>   s     r!   pop_consumerzSeis.pop_consumer   s.     4??*EFFx(r#   c                l    |j                   j                         d   }| j                  |k7  r|| _        yy)zCheck if data contains a new bar (different datetime).

        Args:
            data: DataFrame with datetime index

        Returns:
            True if new data, False if duplicate
        r   TF)indexto_pydatetimer   )r   data
current_dts      r!   is_new_datazSeis.is_new_data   s4     ZZ--/2
==J&&DMr#   c                    | j                   t        d      | j                   j                  | j                  | j                  | j
                  ||      S )a  Get historical data for this Seis.

        Args:
            n_bars: Number of bars to retrieve
            timeout: Maximum wait time in seconds (-1 for blocking)

        Returns:
            DataFrame with OHLCV data, or False if timeout

        Raises:
            RuntimeError: If no TvDatafeedLive reference set

        Example:
            >>> data = seis.get_hist(n_bars=100)
        r4   )r   r   r   n_barsr8   )r   r5   get_histr   r   r   )r   rK   r8   s      r!   rL   zSeis.get_hist   sU    ( #UVV((;;]]]] ) 
 	
r#   c                h    | j                   t        d      | j                   j                  | |      S )a  Remove this Seis from TvDatafeedLive.

        Args:
            timeout: Maximum wait time in seconds (-1 for blocking)

        Returns:
            True if successful, False if timeout

        Raises:
            RuntimeError: If no TvDatafeedLive reference set
        r4   )r   r5   del_seis)r   r8   s     r!   rN   zSeis.del_seis   s5     #UVV((w77r#   c                    | j                   S )zjGet list of all consumers for this Seis.

        Returns:
            List of Consumer instances
        )r   r'   s    r!   get_consumerszSeis.get_consumers   s     r#   )r    objectreturnbool)rR   r   )rR   r   )r0   r
   rR   None)rR   rT   ))r7   z$Callable[[Seis, pd.DataFrame], None]r8   intrR   zConsumer | bool)r;   r   r8   rV   rR   rS   )r;   r   rR   rT   )rG   zpd.DataFramerR   rS   )
   rU   )rK   rV   r8   rV   rR   zpd.DataFrame | bool)r8   rV   rR   rS   )rR   r   )__name__
__module____qualname____doc____annotations__r   r   listr   r   r"   r(   propertyr+   setterdeleterr6   r:   r?   rC   rI   rL   rN   rP    r#   r!   r   r      s?    KM */t%e)TK&T!&t%e!TJT).t%e)TH&T
(f     ! !*     F6F F 
	F< @@ @ 
	@,))& 

 
 
	
>8"r#   r   )r[   
__future__r   datetimedataclassesr   r   typingr   collections.abcr   pandaspdr-   r
   r;   r   mainr   r   ra   r#   r!   <module>rj      sB    I "  (  ((" b b br#   