
    Z-"i                     j    S SK r S SKrS SKJrJrJrJrJrJr  S SK	r
S SKJrJrJr   " S S5      rS rg)    N)BarsV2QuotesV2TradesV2
EntityListTradeV2QuoteV2)URLget_credentialsget_data_urlc                       \ rS rSr     SS\S\S\S\S\4
S jjrS	 rS
 r	S\S\
S\R                  4S jr  SS jrSS jrSS jrS\S\4S jrS\S\4S jrSS jrS rSrg)	AsyncRest
   Nkey_id
secret_keydata_urlapi_versionraw_datac                 x    [        X5      u  U l        U l        n[        U=(       d
    [	        5       5      U l        g)ze
:param raw_data: should we return api response raw or wrap it with
                 Entity objects.
N)r
   _key_id_secret_keyr	   r   	_data_url)selfr   r   r   r   r   _s          U/home/james-whalen/.local/lib/python3.13/site-packages/alpaca_trade_api/rest_async.py__init__AsyncRest.__init__   s-     -<F,O)d&!("<ln=    c                 *    U R                    SU SU 3$ )N/v2/stocks//r   r   _typesymbols      r   _get_historic_urlAsyncRest._get_historic_url   s    ..!VHAeW==r   c                 ,    U R                    SU SU S3$ )Nr   r    z/latestr!   r"   s      r   _get_latest_urlAsyncRest._get_latest_url   s     ..!VHAeWGDDr   entity_typeentity_list_typereturnc                 B  #    [         R                  " 0 5      nU R                  XA5      nU R                  Xr5        Sh  vN nUR	                  U5      (       d  M!  U" X   5      R
                  n	[         R                  " Xi/SS9n[        U5      U:  d  M\    U$  NZ
 U$ 7f)z
iterates the api asynchronously until we get all requested data
:param symbol:
:param payload:
:param entity_type: bars/trades/quotes
:param entity_list_type:
:return:
Nr   )axis)pd	DataFramer%   _requestgetdfconcatlen)
r   r$   payloadlimitr*   r+   r3   urlpacketresponses
             r   _iterate_requestsAsyncRest._iterate_requests   s      \\"$$[9 MM#7 	&zz+&&+F,?@CCYY~A6r7e#		7 	s3   9BBB BB7BBBBc                 f   #    SnUUUUUS.nU R                  XXW[        5      I S h  vN n	X4$  N7f)Nbars)
adjustmentstartend	timeframer7   )r;   r   )
r   r$   r@   rA   rB   r7   r?   r#   r6   r3   s
             r   get_bars_asyncAsyncRest.get_bars_async8   sQ       %#
 ))&5*02 2 z2s   %1/1c                 b   #    SnUUUS.nU R                  XXE[        5      I S h  vN nX4$  N7f)Ntradesr@   rA   r7   )r;   r   r   r$   r@   rA   r7   r#   r6   r3   s           r   get_trades_asyncAsyncRest.get_trades_asyncM   I      

 ))&5*24 4 z4   #/-/c                 b   #    SnUUUS.nU R                  XXE[        5      I S h  vN nX4$  N7f)NquotesrG   )r;   r   rH   s           r   get_quotes_asyncAsyncRest.get_quotes_asyncZ   rK   rL   r$   c                 L  #    SnU R                  X!5      nU R                  5       n[        R                  " 5        ISh  vN nUR                  " U40 UD6 ISh  vN nUR                  5       I Sh  vN nUR	                  S5      (       a3  [        US   5      nX4sSSS5      ISh  vN   sSSS5      ISh  vN   $ SSS5      ISh  vN   SSS5      ISh  vN   g N N Nr N= N. N! , ISh  vN  (       d  f       N4= f N+! , ISh  vN  (       d  f       g= f7f)+
Get the latest trade for the given symbol
rF   Nquotetrade)r(   	_get_optsaiohttpClientSessionr2   jsonr   r   r$   r#   r8   optssessionr:   results           r   get_latest_trade_async AsyncRest.get_latest_trade_asyncg         ""51~~((**g{{3/$//8!)0<<(($Xg%67F!>	 0// +**// +**/0 0 +//// +***   =D$C" D$D
C$D
C.3C&4*C.D
*C(+D
/D$;C*<D$D
C,D
D$DD$$D
&C.(D
*D$,D
.D	4C75D	D
D$
D!DD!D$c                 L  #    SnU R                  X!5      nU R                  5       n[        R                  " 5        ISh  vN nUR                  " U40 UD6 ISh  vN nUR                  5       I Sh  vN nUR	                  S5      (       a3  [        US   5      nX4sSSS5      ISh  vN   sSSS5      ISh  vN   $ SSS5      ISh  vN   SSS5      ISh  vN   g N N Nr N= N. N! , ISh  vN  (       d  f       N4= f N+! , ISh  vN  (       d  f       g= f7f)rR   rN   NrS   )r(   rU   rV   rW   r2   rX   r   rY   s           r   get_latest_quote_async AsyncRest.get_latest_quote_asyncv   r_   r`   c                 X    0 nU R                   US'   U R                  US'   USS.nXS'   U$ )NzAPCA-API-KEY-IDzAPCA-API-SECRET-KEYF)headersallow_redirectsparams)r   r   )r   r6   re   rZ   s       r   rU   AsyncRest._get_opts   sD    %)\\!")-)9)9%&&
  %
 !Xr   c                  #    U R                  U5      n[        R                  " 5        IS h  vN n UR                  " U40 UD6 IS h  vN nUR	                  5       I S h  vN nUR                  S5      nXbS'   U7v   U(       d   S S S 5      IS h  vN   OS S S 5      IS h  vN   My  S S S 5      IS h  vN   g  N Nt N^ N. N! , IS h  vN  (       d  f       N4= f N)! , IS h  vN  (       d  f       g = f7f)Nnext_page_token
page_token)rU   rV   rW   r2   rX   )r   r8   r6   rZ   r[   r:   rk   s          r   r1   AsyncRest._request   s     ~~g&((**g";;s3d33x%-]]_4H!).?!@J,6L)"N% 43333  +**34 4333 +***s   +C=B=C=C#
B?C#C"C#&C	C#CC#%C&C#,C=7C!8C=?C#CC#C#C	CC	C#!C=#C:)C,*C:6C=)r   r   r   )NNNNF)  raw)rm   N)__name__
__module____qualname____firstlineno__strr	   boolr   r%   r(   r   r/   r0   r;   rC   rI   rO   r   r]   r   rb   rU   r1   __static_attributes__ r   r   r   r   
   s    ##'!%$("'>> > > "	>
  >>E .1	
 3=
 BD< $((-**3 *7 **3 *7 * r   r   c                    ^^#    [         R                  " U 5      mU4S jm[         R                  " U4S jU 5       SS06I Sh  vN $  N7f)z
when working with python function has limitations on the amount of tasks
it could handle. for that purpose we use this method that splits the tasks.
it's a bit slower, but gets the job done.
Follow the example code to learn how to use that
c                    >#    T IS h  vN   U I S h  vN sS S S 5      IS h  vN   $  N N N	! , IS h  vN  (       d  f       g = f7fro   rw   )task	semaphores    r   sem_task)gather_with_concurrency.<locals>.sem_task   s'     9: 99 999sE   A
*A
0,0A
.A
0A
A9AA
c              3   4   >#    U  H  nT" U5      v   M     g 7fro   rw   ).0rz   r|   s     r   	<genexpr>*gather_with_concurrency.<locals>.<genexpr>   s     !CUT(4..Us   return_exceptionsTN)asyncio	Semaphoregather)ntasksr|   r{   s     @@r   gather_with_concurrencyr      sJ      !!!$I !CU!C 8268 8 8 8s   A AA	A)rV   r   alpaca_trade_api.entity_v2r   r   r   r   r   r   pandasr/   alpaca_trade_api.commonr	   r
   r   r   r   rw   r   r   <module>r      s0     ! !  F FW Wt8r   