
    Z-"iر                        S SK r S SKrS SKJrJrJrJr  S SKrS SKJ	r	  S SK
r
S SKJr  S SKJr  SSKJrJrJrJrJrJr  SSKJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$  SS	K%J&r&J'r'J(r(J)r)J*r*J+r+J,r,J-r-J.r.J/r/J0r0J1r1J2r2J3r3J4r4  \ Rj                  " \65      r7\\   r8\\   r9\\   r:\\   r;\\    r<\\#   r=\\\!\>4      r?\\\"\>4      r@\\\\>4      rA\\\1\>4      rBS
rCSrD " S S\E5      rF " S S\E5      rGS\R                  S\R                  4S jrI " S S\5      rJ " S S5      rK\K" S\JR                  5      \KlL        \K" S\JR                  5      \KlM        \K" S\JR                  5      \KlN        \K" S\JR                  5      \KlO        \K" S\JR                  5      \KlP         " S S\5      rQ " S S\R5      rSS\\T\\T   4   S\T4S jrUg)    N)IteratorListOptionalUnion)	HTTPError)Enum)__version__   )get_base_urlget_data_urlget_credentialsget_api_versionURLFLOAT)BarEntityAccountAccountConfigurationsAccountActivityAssetOrderPositionClockCalendarTradeQuote	WatchlistPortfolioHistory)BarV2BarsV2LatestBarsV2LatestQuotesV2LatestTradesV2
SnapshotV2SnapshotsV2TradesV2TradeV2QuotesV2QuoteV2NewsV2
NewsListV2OrderbookV2OrderbooksV2i'  2   c                       \ rS rSrSrg)RetryException*    N)__name__
__module____qualname____firstlineno____static_attributes__r2       O/home/james-whalen/.local/lib/python3.13/site-packages/alpaca_trade_api/rest.pyr0   r0   *   s    r8   r0   c                   p   ^  \ rS rSrSrS	U 4S jjr\S 5       r\S 5       r\S 5       r	\S 5       r
SrU =r$ )
APIError.   zL
Represent API related error.
error.status_code will have http status code.
c                 B   > [         TU ]  US   5        Xl        X l        g Nmessage)super__init___error_http_error)selferror
http_error	__class__s      r9   rA   APIError.__init__4   s     y)*%r8   c                 N    U R                   R                  SU R                  5      $ )Ncode)rB   getstatus_coderD   s    r9   rJ   APIError.code9   s    {{vt'7'788r8   c                 r    U R                   nUb(  [        US5      (       a  UR                  R                  $ g g )Nresponse)rC   hasattrrP   rL   )rD   rF   s     r9   rL   APIError.status_code=   s:    %%
!gj*&E&E&&222 'F!r8   c                 J    U R                   b  U R                   R                  $ g N)rC   requestrM   s    r9   rU   APIError.requestC   s%    '##+++ (r8   c                 J    U R                   b  U R                   R                  $ g rT   )rC   rP   rM   s    r9   rP   APIError.responseH   s%    '##,,, (r8   )rB   rC   rT   )r3   r4   r5   r6   __doc__rA   propertyrJ   rL   rU   rP   r7   __classcell__)rG   s   @r9   r;   r;   .   s]    
&
 9 9 3 3
 , , - -r8   r;   resprF   c                 ^     U R                  5       nSU;   a  [        X!5      S eUS e!   US e= fr>   )jsonr;   )r\   rF   rE   s      r9   raise_api_errorr_   M   s@    #		 Eu)t3
$	#d"s   ' ,c                   (    \ rS rSrSrSrSrSrSrSr	g)	TimeFrameUnitW   MinHourDayWeekMonthr2   N)
r3   r4   r5   r6   Minuterd   re   rf   rg   r7   r2   r8   r9   ra   ra   W   s    FD
CDEr8   ra   c                       \ rS rSrS\S\4S jr\S 5       r\R                  S\4S j5       r\S\4S	 j5       r
\
R                  S\4S
 j5       r
\S 5       rS r\S\S\4S j5       rSrg)	TimeFrame_   amountunitc                 >    U R                  X5        Xl        X l        g rT   validate_TimeFrame__amount_TimeFrame__unit)rD   rl   rm   s      r9   rA   TimeFrame.__init__`   s    f#r8   c                     U R                   $ rT   )rq   rM   s    r9   rl   TimeFrame.amounte   s    }}r8   valuec                 F    U R                  XR                  5        Xl        g rT   )rp   rr   rq   rD   rv   s     r9   rl   ru   i   s    e[[)r8   returnc                     U R                   $ rT   )rr   rM   s    r9   rm   TimeFrame.unitn   s    {{r8   c                 H    U R                  U R                  U5        Xl        g rT   ro   rx   s     r9   rm   r{   r   s    dmmU+r8   c                 J    U R                    U R                  R                   3$ rT   )rq   rr   rv   rM   s    r9   rv   TimeFrame.valuex   s     --!2!2 344r8   c                     U R                   $ rT   rv   rM   s    r9   __str__TimeFrame.__str__|       zzr8   c                 p   U S::  a  [        S5      eU[        R                  :X  a  U S:  a  [        S5      eU[        R                  :X  a  U S:  a  [        S5      eU[        R                  [        R
                  4;   a  U S:w  a  [        S5      eU[        R                  :X  a  U S	;  a  [        S
5      eg g )Nr   z(Amount must be a positive integer value.;   zBSecond or Minute units can only be used with amounts between 1-59.   z-Hour units can only be used with amounts 1-23r
   z1Day and Week units can only be used with amount 1)r
               z:Month units can only be used with amount 1, 2, 3, 6 and 12)
ValueErrorra   rh   rd   re   rf   rg   )rl   rm   s     r9   rp   TimeFrame.validate   s    Q;GHH='''FRK ? @ @ =%%%&2+LMMM%%}'9'9::v{CE E =&&&69I+ILN N ,J&r8   )__amount__unitN)r3   r4   r5   r6   intra   rA   rZ   rl   setterrm   rv   r   staticmethodrp   r7   r2   r8   r9   rj   rj   _   s    s - 
   ]]C   m   
[[-  
 5 5 N NM N Nr8   rj   c                   "    \ rS rSrSrSrS rSrg)Sort   ascdescc                     U R                   $ rT   r   rM   s    r9   r   Sort.__str__   r   r8   r2   N)r3   r4   r5   r6   AscDescr   r7   r2   r8   r9   r   r      s    
CDr8   r   c                      \ rS rSr      SS\S\S\S\S\4
S	 jjr   SS\S\4S
 jjrS\S\S\	S\
4S jrSS jrSS jrSS jrSS jrSS jr  SS\\   4S jjrS\4S jrS\4S jr    SS\S\S\S\S\4
S jjr         SS\S \
S!\S"\S#\S$\S%\\   S&\S\4S' jjr              SS(\S)\S&\S*\S+\S,\S-\S.\S/\S0\S1\	S2\	S3\S4\S5\4S6 jjrS.\S\4S7 jrSS8\S$\S\4S9 jjr      SS8\S)\S,\S-\S:\S+\S.\S\4S; jjr S8\SS4S< jr!SS= jr"S\#4S> jr$S(\S\%4S? jr&SS@.S(\S)\S\%4SA jjr'S\#4SB jr(SS\)4SC jjr*S(\S\+4SD jr,SESFS\-SSS4SG\SH\.\\\   4   S\SI\SJ\\   SK\
S\\   SL\\   SM\\   4SN jjr/       SS(\.\\\   4   SO\\   SP\\   S \
S\\   SL\\   SQ\\0   S\14SR jjr2      SS(\.\\\   4   SO\\   SP\\   S \
S\\   SL\\   SQ\\0   S\34SS jjr4       SS(\.\\\   4   SO\\   SP\\   S \
S\\   SL\\   SQ\\0   S\54ST jjr6      SS(\.\\\   4   SO\\   SP\\   S \
S\\   SL\\   SQ\\0   S\74SU jjr8        SS(\.\\\   4   SV\9SO\\   SP\\   SW\S \
S\\   SL\\   SQ\\0   S\:4SX jjr;       SS(\.\\\   4   SV\9SO\\   SP\\   SW\S \
S\\   SL\\   SQ\\0   S\<4SY jjr=SS(\S\\   S\>4SZ jjr? SS%\\   S\\   S\@4S[ jjrA SS(\S\\   S\B4S\ jjrC SS%\\   S\\   S\D4S] jjrE SS(\S\\   S\F4S^ jjrG SS%\\   S\\   S\H4S_ jjrI SS(\S\\   S\J4S` jjrK SS%\\   S\\   S\L4Sa jjrM      SS(\.\\\   4   SO\\   SP\\   S \
SQ\\0   SM\S\14Sb jjrN     SS(\.\\\   4   SO\\   SP\\   S \
SQ\\0   SM\S\34Sc jjrO      SS(\.\\\   4   SO\\   SP\\   S \
SQ\\0   SM\S\54Sd jjrP     SS(\.\\\   4   SO\\   SP\\   S \
SQ\\0   SM\S\74Se jjrQ      SS(\.\\\   4   SV\9SO\\   SP\\   S \
SQ\\0   SM\S\:4Sf jjrR     SS(\.\\\   4   SV\9SO\\   SP\\   S \
SQ\\0   SM\S\<4Sg jjrS SS%\\   SM\S\@4Sh jjrT SS%\\   SM\S\D4Si jjrU SS%\\   SM\S\H4Sj jjrV SS%\SM\S\L4Sk jjrW SS%\\   SM\S\L4Sl jjrX SS(\SM\S\Y4Sm jjrZ SS%\\   SM\S\Y4Sn jjr[SSSSo\0R                  SSS4S(\\.\\\   4      SO\\   SP\\   S \
SQ\0Sp\Sq\S\]4Sr jjr^SSSSo\0R                  SS4S(\\.\\\   4      SO\\   SP\\   S \
SQ\0Sp\Sq\S\_4Ss jjr`S\a4St jrb       SSu\S"\S!\S#\Sv\Sw\
Sx\S\c4Sy jjrdSSO\SP\S\e4Sz jjrfS\g4S{ jrhS|\S\i4S} jrjS~\S\i4S jrk SS~\S\i4S jjrlS|\S(\S\i4S jrm  SS|\S\S\i4S jjrnS|\SS4S jroS|\S(\SS4S jrp     SS\S\S\S/\S\q4
S jjrrS rsS rtS ruS\v4S jrwSrxg)REST   NFkey_id
secret_keybase_urlapi_versionraw_datac                 B   [        XU5      u  U l        U l        U l        [	        U=(       d
    [        5       5      U l        [        U5      U l        [        R                  " 5       U l        X`l        [        [        R                  R!                  SS5      5      U l        [        [        R                  R!                  SS5      5      U l        [        R                  R!                  SS5      R'                  S5       Vs/ s H  n[        U5      PM     snU l        gs  snf )ze
:param raw_data: should we return api response raw or wrap it with
                 Entity objects.
APCA_RETRY_MAXr   APCA_RETRY_WAITAPCA_RETRY_CODESz429,504,N)r   _key_id_secret_key_oauthr   r   	_base_urlr   _api_versionrequestsSession_session_use_raw_datar   osenvironrK   _retry_retry_waitsplit_retry_codes)rD   r   r   r   r   oauthr   os           r9   rA   REST.__init__   s     7F7'3d&!("<ln=+K8 ((*%"**..)91=>rzz~~.?CD-/ZZ^^	.++05:.6 7 .6SV .6 7 7s   >Dc                 x   U=(       d    U R                   nU(       a  UOU R                  n[        US-   U-   U-   5      n0 nU R                  (       a  SU R                  -   US'   OU R                  US'   U R
                  US'   S[        -   US'   USS	.n	UR                  5       S
;   a  X9S'   OX9S'   U R                  n
U
S:  a  Sn
U
S:  a   U R                  XX5      $ g ! [         aP    U R                  n[        R                  SR                  XU
5      5        [        R                   " U5        U
S-  n
 Ms  f = f)N/zBearer AuthorizationzAPCA-API-KEY-IDzAPCA-API-SECRET-KEYzAPCA-TRADE-SDK-PY/z
User-AgentF)headersallow_redirects)GETDELETEparamsr^   r   z3sleep {} seconds and retrying {} {} more time(s)...r
   )r   r   r   r   r   r   r	   upperr   _one_requestr0   r   loggerwarningformattimesleep)rD   methodpathdatar   r   versionurlr   optsretry
retry_waits               r9   _requestREST._request   sD    -t~~!,+$2C2Cx#~/$67;;'04;;'>GO$)-G%&-1-=-=G)* 4{ B&
  %
 <<>..!NL19Eqj
((dBB  " !--
))/"*01 

:&
s   C AD98D9r   r   r   r   c                 <   U R                   nU R                  R                  " X40 UD6n UR                  5         UR                  S:w  a  UR                  5       $ g! [         a5  nUR
                  U;   a  US:  a
  [        5       e[        Xg5         SnAN[SnAff = f)z
Perform one request, possibly raising RetryException in the case
the response is 429. Otherwise, if error text contain "code" string,
then it decodes to json object and returns APIError.
Returns the body json in the 200 status.
r   N )
r   r   rU   raise_for_statusr   rL   r0   r_   textr^   )rD   r   r   r   r   retry_codesr\   rF   s           r9   r   REST._one_request   s     ''}}$$V9D9	.!!# 99?99;  	.;.519$&&D--		.s   A 
B&+BBc                 &    U R                  SX5      $ )Nr   r   rD   r   r   s      r9   rK   REST.get       }}UD//r8   c                 &    U R                  SX5      $ )NPOSTr   r   s      r9   post	REST.post   s    }}VT00r8   c                 &    U R                  SX5      $ )NPUTr   r   s      r9   putREST.put  r   r8   c                 &    U R                  SX5      $ )NPATCHr   r   s      r9   patch
REST.patch  s    }}Wd11r8   c                 &    U R                  SX5      $ )Nr   r   r   s      r9   deleteREST.delete	  s    }}Xt22r8   feedc                 d    [        5       nU(       a  U=(       d    0 nX2S'   U R                  SXXTS9$ )Nr   r   )r   r   )r   r   )rD   r   r   r   r   r   s         r9   data_getREST.data_get  s9    $:2DL}}4  
 	
r8   ry   c                 P    U R                  S5      nU R                  U[        5      $ )zGet the accountz/account)rK   response_wrapperr   rD   r\   s     r9   get_accountREST.get_account  s#    xx
#$$T733r8   c                 P    U R                  S5      nU R                  U[        5      $ )zGet account configs/account/configurations)rK   r   r   r   s     r9   get_account_configurationsREST.get_account_configurations  s%    xx12$$T+@AAr8   no_shorting
dtbp_checktrade_confirm_emailsuspend_tradec                     0 nUb  XS'   Ub  X%S'   Ub  X5S'   Ub  XES'   U R                  SU5      nU R                  U[        5      $ )z
alpaca.markets/docs/api-documentation/api-v2/account-configuration/
Update account configs
:param dtbp_check: both, entry, or exit
:param trade_confirm_email: all or none
r   r   r   r   r   )r   r   r   )rD   r   r   r   r   r   r\   s          r9   update_account_configurations"REST.update_account_configurations   sg     "$/=!!#-< *,?()$&3?#zz3V<$$T+@AAr8   statuslimitafteruntil	directionnestedsymbolssidec
                 N   Uc
  [        5       nUb  X&S'   Ub  X6S'   Ub  XFS'   Ub  XVS'   Ub  XS'   Ub  XvS'   U	b  XS'   Ub  SR                  U5      US	'   S
n
U R                  X5      nU R                  (       a  U$ U Vs/ s H  oR	                  U[
        5      PM     sn$ s  snf )a  
Get a list of orders
https://docs.alpaca.markets/web-api/orders/#get-a-list-of-orders

:param status: open, closed or all. Defaults to open.
:param limit: Defaults to 50 and max is 500
:param after: timestamp
:param until: timestamp
:param direction: asc or desc.
:param params: refer to documentation
:param nested: should the data be nested like json
:param symbols: list of str (symbols)
:param side: Lets you filter to only 'buy' or 'sell' orders
r  r  r  r  r  r  r  r   r  /orders)dictjoinrK   r   r   r   )rD   r  r  r  r  r  r   r  r  r  r   r\   r   s                r9   list_ordersREST.list_orders8  s    2 >VF#7O#7O#7O "+;%8%8!6N # 1F9xx$K=ABT))!U3TBBBs    B"symbolqtytypetime_in_forcelimit_price
stop_priceclient_order_idextended_hoursorder_classtake_profit	stop_losstrail_pricetrail_percentnotionalc                     UUUUS.nUb  UUS'   Ub  UUS'   Ub  [        U5      US'   Ub  [        U5      US'   Ub  UUS'   U	b  U	US'   U
b  U
US'   Ub  SU;   a  [        US   5      US'   UUS	'   Ub3  SU;   a  [        US   5      US'   SU;   a  [        US   5      US'   UUS
'   Ub  UUS'   Ub  UUS'   U R                  SU5      nU R                  U[        5      $ )a&  
:param symbol: symbol or asset ID
:param qty: float. Mutually exclusive with "notional".
:param side: buy or sell
:param type: market, limit, stop, stop_limit or trailing_stop
:param time_in_force: day, gtc, opg, cls, ioc, fok
:param limit_price: str of float
:param stop_price: str of float
:param client_order_id:
:param extended_hours: bool. If true, order will be eligible to execute
       in premarket/afterhours.
:param order_class: simple, bracket, oco or oto
:param take_profit: dict with field "limit_price" e.g
       {"limit_price": "298.95"}
:param stop_loss: dict with fields "stop_price" and "limit_price" e.g
       {"stop_price": "297.95", "limit_price": "298.95"}
:param trail_price: str of float
:param trail_percent: str of float
:param notional: float. Mutually exclusive with "qty".
)r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  )r   r   r   r   )rD   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r\   s                     r9   submit_orderREST.submit_orderj  sN   H 	"#!!*	
 ?F5M!)F:"$)+$6F=!!#(#4F< &(7F$%%'5F#$"$/F=!"+-2;}3M-NM*$/F=! 	)+0=1I+J	-(y(*/	,0G*H	,'"+F;"$/F=!$&3F?#yyF+$$T511r8   c                 Z    SU0nU R                  SU5      nU R                  U[        5      $ )zGet an order by client order idr  z/orders:by_client_order_id)rK   r   r   )rD   r  r   r\   s       r9   get_order_by_client_order_id!REST.get_order_by_client_order_id  s6     
 xx4f=$$T511r8   order_idc                     0 nUb  X#S'   U R                  SR                  U5      U5      nU R                  U[        5      $ )zGet an orderr  
/orders/{})rK   r   r   r   )rD   r#  r  r   r\   s        r9   	get_orderREST.get_order  sC    %8xx++H5v>$$T511r8   trailc                    0 nUb  X(S'   Ub  [        U5      US'   Ub  [        U5      US'   Ub  [        U5      US'   Ub  XhS'   Ub  XxS'   U R                  SR                  U5      U5      n	U R                  U	[        5      $ )a|  
:param order_id:
:param qty: str of int
:param limit_price: str of float
:param stop_price: str of float
:param trail: str of float, represents trailing_price or
       trailing_percent. determined by the original order.
:param time_in_force: day, gtc, opg, cls, ioc, fok

note: you cannot replace type of order. so, it was trailing_stop(e.g)
      it will remain trailing_stop.
r  r  r  r(  r  r  r%  )r   r   r   r   r   )
rD   r#  r  r  r  r(  r  r  r   r\   s
             r9   replace_orderREST.replace_order  s    , ?5M"$)+$6F=!!#(#4F< #ElF7O$&3?#&(7$%zz,--h7@$$T511r8   c                 D    U R                  SR                  U5      5        g)zCancel an orderr%  Nr   r   )rD   r#  s     r9   cancel_orderREST.cancel_order  s    L''12r8   c                 &    U R                  S5        g)zCancel all open ordersr
  N)r   rM   s    r9   cancel_all_ordersREST.cancel_all_orders  s    Ir8   c                     U R                  S5      nU R                  (       a  U$ U Vs/ s H  o R                  U[        5      PM     sn$ s  snf )zGet a list of open positions
/positions)rK   r   r   r   )rD   r\   ps      r9   list_positionsREST.list_positions  sA    xx%K@DE1))!X6EEE   Ac                 n    U R                  SR                  U5      5      nU R                  U[        5      $ )zGet an open position/positions/{})rK   r   r   r   rD   r  r\   s      r9   get_positionREST.get_position  s.    xx..v67$$T844r8   )r  c                    U(       a  SU0nO0 nU R                  SR                  U5      US9nU R                  U[        5      $ )z<Liquidates the position for the given symbol at market pricer  r:  r   )r   r   r   r   )rD   r  r  r   r\   s        r9   close_positionREST.close_position  sE     3<DD{{?11&9{E$$T844r8   c                     U R                  S5      nU R                  (       a  U$ U Vs/ s H  o R                  U[        5      PM     sn$ s  snf )z-Liquidates all open positions at market pricer4  )r   r   r   r   rD   r\   r   s      r9   close_all_positionsREST.close_all_positions  sA    {{<(K@DE1))!X6EEEr8  c                     UUS.nU R                  SU5      nU R                  (       a  U$ U Vs/ s H  oPR                  U[        5      PM     sn$ s  snf )zGet a list of assets)r  asset_classz/assets)rK   r   r   r   )rD   r  rG  r   r\   r   s         r9   list_assetsREST.list_assets  sT     "&
 xx	6*K=ABT))!U3TBBBs   Ac                 n    U R                  SR                  U5      5      nU R                  U[        5      $ )zGet an assetz
/assets/{})rK   r   r   r   r;  s      r9   	get_assetREST.get_asset'  s.    xx++F34$$T511r8   v2stocksendpointsymbol_or_symbolsendpoint_baseresp_grouped_by_symbol
page_limitasoflocc
              +   &  #    S nSnU
R                  S5      nUS:H  =(       d    [        U[        5      (       + nUc  Un S nU(       a  [        [	        U5      U-
  U5      nUS:  a  g U
nUUS'   UUS'   SU 3nU	(       a  USU	 3-  nU(       a  [        U5      US'   OU(       a  USU 3-  nU(       a  UUS'   U(       a  USU 3-  nU R                  UUUUS	9nU(       d7  U=(       d    UnUR                  U/ 5      =(       d    /  H  nUv   US-  nM     O^UR                  U0 5      =(       d    0 n[        UR                  5       5       H&  u  nnU=(       d    /  H  nUUS
'   Uv   US-  nM     M(     UR                  S5      nU(       d  g GMR  7f)Nr   r  v1beta3r
   
page_tokenr   r  rT  )r   r   r   Snext_page_token)	rK   
isinstancestrminr   _join_with_commasr   sorteditems)rD   rO  rP  r   rQ  rR  rS  r   rT  rU  kwargsrX  total_itemsr  is_multi_symbolactual_limitr   r   r\   kitem	by_symbolsymr`  s                           r9   	_data_getREST._data_get,  s     


7#%2 3,c22 	!)%4"L"3u:#;ZH!#D(DM!+D}o&D!C5	!"34E"FY"!-.//#V!H:&==Dt-8 ! :D)- HHQO1r1DJ1$K 2 !HHXr28b	"():";JC %$'S	"
#q( !, #<
 "34JI s   FFstartendsortc	              #      #    U R                  SUUUUUUUS9n	U	 H(  n
U(       a  U
v   M  U R                  U
[        5      v   M*     g 7f)Ntradesrk  rl  r  r   rT  rm  ri  r   r   )rD   r  rk  rl  r  r   rT  rm  rawro  trades              r9   get_trades_iterREST.get_trades_iterd  W      &&+$'&+%)%)%)   " E++E599	    AAc                 V    [        U R                  UUUUUUUSS95      n[        U5      $ )NT)rk  rl  r  r   rT  rm  rr  )listrt  r&   )	rD   r  rk  rl  r  r   rT  rm  ro  s	            r9   
get_tradesREST.get_trades{  sD     d**616/216040404/3 + 5 6 r8   c	              #      #    U R                  SUUUUUUUS9n	U	 H(  n
U(       a  U
v   M  U R                  U
[        5      v   M*     g 7f)Nquotesrp  ri  r   r   )rD   r  rk  rl  r  r   rT  rm  rr  r}  quotes              r9   get_quotes_iterREST.get_quotes_iter  rv  rw  c                 V    [        U R                  UUUUUSUUS95      n[        U5      $ )NT)r  rk  rl  r  r   rr  rT  rm  )ry  r  r(   )	rD   r  rk  rl  r  r   rT  rm  r}  s	            r9   
get_quotesREST.get_quotes  sD     d**&16/21604/30404 + - . r8   	timeframe
adjustmentc              #      #    U R                  SUUUUUUUUU	S9
nU H(  nU
(       a  Uv   M  U R                  U[        5      v   M*     g 7f)Nbars)r  r  rk  rl  r  r   rT  rm  ri  r   r   )rD   r  r  rk  rl  r  r  r   rT  rm  rr  r  bars                r9   get_bars_iterREST.get_bars_iter  s]      ~~ff(1)3$)"%$)#'#'#'  	  C	++C55	 s   AA
c
                 Z    [        U R                  UUUUUUUUU	SS9
5      n
[        U
5      $ )NT)r   rT  rm  rr  )ry  r  r    )rD   r  r  rk  rl  r  r  r   rT  rm  r  s              r9   get_barsREST.get_bars  sI     D&&v'0','*'1',,0,0,0+/ ' 	1 	2 d|r8   c                 t    U R                  SR                  U5      USS9nU R                  US   [        5      $ )Nz/stocks/{}/bars/latestrM  r   r   r  )r   r   r   r   rD   r  r   r\   s       r9   get_latest_barREST.get_latest_bar  sB    }}$++F3   $$T%[%88r8   c                 n    U R                  S[        U5       3USS9nU R                  US   [        5      $ )Nz/stocks/bars/latest?symbols=rM  r  r  r   r^  r   r!   rD   r  r   r\   s       r9   get_latest_barsREST.get_latest_bars  sE    }}*+<W+E*FG   $$T&\<@@r8   c                 t    U R                  SR                  U5      USS9nU R                  US   [        5      $ )Nz/stocks/{}/trades/latestrM  r  rs  )r   r   r   r'   r  s       r9   get_latest_tradeREST.get_latest_trade  B    }}&--f5   $$T']G<<r8   c                 n    U R                  S[        U5       3USS9nU R                  US   [        5      $ )Nz/stocks/trades/latest?symbols=rM  r  ro  r   r^  r   r#   r  s       r9   get_latest_tradesREST.get_latest_trades  E    }},->w-G,HI   $$T(^^DDr8   c                 t    U R                  SR                  U5      USS9nU R                  US   [        5      $ )Nz/stocks/{}/quotes/latestrM  r  r  )r   r   r   r)   r  s       r9   get_latest_quoteREST.get_latest_quote
  r  r8   c                 n    U R                  S[        U5       3USS9nU R                  US   [        5      $ )Nz/stocks/quotes/latest?symbols=rM  r  r}  r   r^  r   r"   r  s       r9   get_latest_quotesREST.get_latest_quotes  r  r8   c                 n    U R                  SR                  U5      USS9nU R                  U[        5      $ )Nz/stocks/{}/snapshotrM  r  )r   r   r   r$   r  s       r9   get_snapshotREST.get_snapshot  s>    }}299&A"&)-  / $$T:66r8   c                     U R                  SR                  [        U5      5      USS9nU R                  U[        5      $ )Nz/stocks/snapshots?symbols={}rM  r  )r   r   r^  r   r%   r  s       r9   get_snapshotsREST.get_snapshots!  sD    }}*112CG2LM   $$T;77r8   c              #      #    U R                  SUSSX#XEUS9	nU H(  n	U(       a  U	v   M  U R                  U	[        5      v   M*     g 7f)Nro  rW  cryptor   rQ  rk  rl  r  rm  rU  rq  )
rD   r  rk  rl  r  rm  rU  rr  ro  rs  s
             r9   get_crypto_trades_iterREST.get_crypto_trades_iter)  R      &,5X&+E$'   ) E++E599	    AAc                 J    [        [        U R                  XX4XVSS95      5      $ NT)rr  )r&   ry  r  rD   r  rk  rl  r  rm  rU  s          r9   get_crypto_tradesREST.get_crypto_trades;  3     T883td 9 < = > 	>r8   c              #      #    U R                  SUSSX#XEUS9	nU H(  n	U(       a  U	v   M  U R                  U	[        5      v   M*     g 7f)Nr}  rW  r  r  r~  )
rD   r  rk  rl  r  rm  rU  rr  r}  r  s
             r9   get_crypto_quotes_iterREST.get_crypto_quotes_iterE  r  r  c                 J    [        [        U R                  XX4XVSS95      5      $ r  )r(   ry  r  r  s          r9   get_crypto_quotesREST.get_crypto_quotesW  r  r8   c	              #      #    U R                  SUSSUX4XVUS9
n	U	 H(  n
U(       a  U
v   M  U R                  U
[        5      v   M*     g 7f)Nr  rW  r  )r   rQ  r  rk  rl  r  rm  rU  r  )rD   r  r  rk  rl  r  rm  rU  rr  r  r  s              r9   get_crypto_bars_iterREST.get_crypto_bars_itera  sU      ~~ff*38(1$)%"%	  '
 C	++C55	 rw  c                 L    [        [        U R                  XX4XVUSS95      5      $ r  )r    ry  r  )rD   r  r  rk  rl  r  rm  rU  s           r9   get_crypto_barsREST.get_crypto_barsu  s9     d444u5 5 G H I 	Ir8   c                 t    U R                  SU S3S[        U5      0SS9nU R                  US   [        5      $ )N/crypto/z/latest/barsr  rW  r   r   r  r  rD   r  rU  r\   s       r9   get_latest_crypto_barsREST.get_latest_crypto_bars  sK    }}se<(.w78!  # $$T&\<@@r8   c                 t    U R                  SU S3S[        U5      0SS9nU R                  US   [        5      $ )Nr  z/latest/tradesr  rW  r  ro  r  r  s       r9   get_latest_crypto_tradesREST.get_latest_crypto_trades  K    }}se>*.w78!  # $$T(^^DDr8   c                 t    U R                  SU S3S[        U5      0SS9nU R                  US   [        5      $ )Nr  z/latest/quotesr  rW  r  r}  r  r  s       r9   get_latest_crypto_quotesREST.get_latest_crypto_quotes  r  r8   c                 b    U R                  SU S3SU0SS9nU R                  US   [        5      $ Nr  z
/snapshotsr  rW  r  	snapshots)r   r   r%   r  s       r9   get_crypto_snapshotREST.get_crypto_snapshot  sF    }}se:&W%!  # $$T+%6DDr8   c                 t    U R                  SU S3S[        U5      0SS9nU R                  US   [        5      $ r  )r   r^  r   r%   r  s       r9   get_crypto_snapshotsREST.get_crypto_snapshots  sL    }}se:&.w78!  # $$T+%6DDr8   c                 b    U R                  SU S3SU0SS9nU R                  US   [        5      $ Nr  z/latest/orderbooksr  rW  r  
orderbooks)r   r   r-   )rD   r  rU  r\   s       r9   get_latest_crypto_orderbook REST.get_latest_crypto_orderbook  sG    }}se-.V$!  # $$T,%7FFr8   c                 t    U R                  SU S3S[        U5      0SS9nU R                  US   [        5      $ r  )r   r^  r   r-   r  s       r9   get_latest_crypto_orderbooks!REST.get_latest_crypto_orderbooks  sM    }}se-..w78!  # $$T,%7FFr8   
   include_contentexclude_contentlessc	              #      #    U=(       d    / n[        U[        5      (       a  U/nU R                  SUSSX#XEUUS[        S9n	U	 H(  n
U(       a  U
v   M  U R	                  U
[
        5      v   M*     g 7f)Nr   v1beta1newsF)
r   rQ  rk  rl  r  rm  r  r  rR  rS  )r[  r\  ri  NEWS_MAX_LIMITr   r*   )rD   r  rk  rl  r  rm  r  r  rr  r  ns              r9   get_news_iterREST.get_news_iter  sx      2fc""XF~~b&*36$)%.=2E5:)7  9 A++Av66	 s   A/A1c                 R    [        U R                  UX#XEUUSS95      n[        U5      $ )NT)r  rk  rl  r  rm  r  r  rr  )ry  r  r+   )	rD   r  rk  rl  r  rm  r  r  r  s	            r9   get_newsREST.get_news  s>     D&&f-2-27F;N+/ ' 1 2 $r8   c                 P    U R                  S5      nU R                  U[        5      $ )Nz/clock)rK   r   r   r   s     r9   	get_clockREST.get_clock  s#    xx!$$T511r8   activity_typesdate	page_sizerX  c                 z   Sn0 n	[        U[        5      (       a  SR                  U5      U	S'   OUb  USR                  U5      -  nUb  X9S'   Ub  X)S'   Ub  XIS'   Ub  XYS'   Ub  XiS	'   Ub  XyS
'   U R	                  XS9n
U R
                  (       a  U
$ U
 Vs/ s H  oR                  U[        5      PM     sn$ s  snf )a\  
go to alpaca.markets/docs/api-documentation/api-v2/account-activities/
:param activity_types: go to documnetation to see available types
:param until: isoformat timestamp
:param after: isoformat timestamp
:param direction: asc or sesc. default is desc
:param date: str. can't be sued with until/after
:param page_size:
:param page_token:
:return:
z/account/activitiesr   r  z/{}r  r  r  r  r  rX  r?  )r[  ry  r  r   rK   r   r   r   )rD   r  r  r  r  r  r  rX  r   r   r\   r   s               r9   get_activitiesREST.get_activities  s    * $nd++'*xx'?F#$'5<<//C#7O#7O "+;!6N "+;!#-< xxx)KGKLt!))!_=tLLLs   B8c                     0 nUb  XS'   Ub  X#S'   U R                  SUS9nU R                  (       a  U$ U Vs/ s H  oPR                  U[        5      PM     sn$ s  snf )zx
:param start: isoformat date string eg '2006-01-02T15:04:05Z' or
       '2006-01-02'
:param end: isoformat date string
rk  rl  z	/calendarr?  )rK   r   r   r   )rD   rk  rl  r   r\   r   s         r9   get_calendarREST.get_calendar  se     #7O?5Mxx&x1K@DE1))!X6EEEs   Ac                     U R                  S5      nU R                  (       a  U$ U Vs/ s H  o R                  U[        5      PM     sn$ s  snf )z7Get the list of watchlists registered under the account/watchlists)rK   r   r   r   rC  s      r9   get_watchlistsREST.get_watchlists&  sA    xx&KAEFA))!Y7FFFr8  watchlist_idc                 n    U R                  SR                  U5      5      nU R                  U[        5      $ )z$Get a watchlist identified by the ID/watchlists/{})rK   r   r   r   )rD   r  r\   s      r9   get_watchlistREST.get_watchlist.  s/    xx(//?@$$T955r8   watchlist_namec                 V    SU0nU R                  SUS9nU R                  U[        5      $ )z&Get a watchlist identified by its namenamez/watchlists:by_namer?  )rK   r   r   )rD   r  r   r\   s       r9   get_watchlist_by_nameREST.get_watchlist_by_name3  s8     N
 xx-Fx;$$T955r8   c                 d    SU0nUb  X#S'   U R                  SUS9nU R                  U[        5      $ )z=Create a new watchlist with an optional initial set of assetsr
  r  r   r?  )r   r   r   )rD   r  r  r   r\   s        r9   create_watchlistREST.create_watchlist;  sE    
 N
  '9yyVy4$$T955r8   c                 z    U R                  SR                  U5      [        US9S9nU R                  U[        5      $ )zAdd an asset to the watchlistr  )r  r?  )r   r   r  r   r   )rD   r  r  r\   s       r9   add_to_watchlistREST.add_to_watchlistG  s?    yy##L1F8K  
 $$T955r8   r
  c                     0 nUb  X$S'   Ub  X4S'   U R                  SR                  U5      US9nU R                  U[        5      $ )z+Update a watchlist's name and/or asset listr
  r  r  r?  )r   r   r   r   )rD   r  r
  r  r   r\   s         r9   update_watchlistREST.update_watchlistN  sU    
 !6N '9xx(//=FxK$$T955r8   c                 D    U R                  SR                  U5      5        g)z3Delete a watchlist identified by the ID permanentlyr  Nr-  )rD   r  s     r9   delete_watchlistREST.delete_watchlist[  s    $++L9:r8   c                 D    U R                  SR                  X5      5        g)z/Remove an asset from the watchlist's asset listz/watchlists/{}/{}Nr-  )rD   r  r  s      r9   delete_from_watchlistREST.delete_from_watchlist_  s    '..|DEr8   
date_startdate_endperiodc                     0 nUb  XS'   Ub  X&S'   Ub  X6S'   Ub  XFS'   Ub  XVS'   U R                  SUS9nU R                  U[        5      $ )a  
alpaca.markets/docs/api-documentation/api-v2/portfolio-history/
:param date_start: YYYY-MM-DD
:param date_end: YYYY-MM-DD
:param period: The duration of the data in <number> + <unit>
       such as 1D, where <unit> can be D for day, W for week,
       M for month and A for year. Defaults to 1M.
:param timeframe: The resolution of time window. 1Min, 5Min, 15Min,
       1H, or 1D
:param extended_hours: bool. If true, include extended hours in the
       result.
r  r  r  r  r  z/account/portfolio/historyr?  )rK   r   r   )rD   r  r  r  r  r  r   r\   s           r9   get_portfolio_historyREST.get_portfolio_historyc  sw    $ !#-< !):%8 "+;%'5#$xx46xB$$T+;<<r8   c                     U $ rT   r2   rM   s    r9   	__enter__REST.__enter__  s    r8   c                 8    U R                   R                  5         g rT   )r   closerM   s    r9   r&  
REST.close  s    r8   c                 $    U R                  5         g rT   )r&  )rD   exc_typeexc_valexc_tbs       r9   __exit__REST.__exit__  s    

r8   entityc                 8    U R                   (       a  U$ U" U5      $ )a  
To allow the user to get raw response from the api, we wrap all
functions with this method, checking if the user has set raw_data
bool. if they didn't, we wrap the response with an Entity object.
:param obj: response from server
:param entity: derivative object of Entity
:return:
)r   )rD   objr.  s      r9   r   REST.response_wrapper  s     J#;r8   )
r   r   r   r   r   r   r   r   r   r   )NNNNNF)NNNrT   )NNv1)NNNN)	NNNNNNNNN)NbuymarketdayNNNNNNNNNN)NNNNNN)ry   N)NN)NNNNNNF)NNrr  NNNNF)NNrr  NNNN)NNNNusF)NNNNr6  )r6  )NNNNNNN)NNNNN)yr3   r4   r5   r6   r\  r   boolrA   r   r  r   r   rK   r   r   r   r   r   r   r   r   r   r   r   r   Ordersr  floatr  r   r!  r&  r*  r.  r1  	Positionsr6  r   r<  r@  rD  AssetsrH  r   rK  DATA_V2_MAX_LIMITr   ri  r   TradeIteratorrt  r&   rz  QuoteIteratorr  r(   r  rj   BarIteratorr  r    r  r   r  r!   r  r'   r  r#   r  r)   r  r"   r  r$   r  r%   r  r  r  r  r  r  r  r  r  r  r  r  r,   r  r  r   NewsIteratorr  r+   r  r   r  AccountActivitiesr  	Calendarsr  
Watchlistsr  r   r  r  r  r  r  r  r  r   r   r#  r&  r,  r   r   r7   r2   r8   r9   r   r      s{   ##'!%$("'77 7 7 "	7  74 !%$(+ 	+
 "+Z3 S  S (01023 #'9=
}
4W 4
B,A B !%"'+"&BB B "%	B
  B
 ,AB2 #'!%!%!%%)#')- $0C0C0C 0C 	0C
  #0C !0C "#Y0C 0C  0Ch #'!&!)*/(,'+,0,0(,)-'+(,*.'+H2 H2H2 H2 	H2
 %(H2 #&H2 "%H2 '*H2 &*H2 #&H2 #'H2 !%H2 #&H2 %(H2  %H2T2C 2E 22# 2t 2u 2 #"!%#'$2$2 $2 	$2
 $2 $2 $2 !$2 
$2L3S 3T 3F	 F53 58 5 %)5S 5!5 %5(FY F
CF 
C2 2 2 &*'/;?$5(,(,'+66%*3S	>%:6  #6 "%	6
 +34.6 "6 !6 !6  }6t 04-1%).2.2/3!: %c49n 5:'}: &c]:  #	:
 'sm: 'sm: 'tn: '4:2 +/(, $)-)-*.  d3i0 "3-  !  	 
 "#  "#  "$  ! * 04-1%).2.2/3!: %c49n 5:'}: &c]:  #	:
 'sm: 'sm: 'tn: '4:2 +/(, $)-)-*.  d3i0 "3-  !  	 
 "#  "#  "$  ! . .2+/(-#',0,0-16#CcN36!*6 &c]6 $C=	6
 #&6 !6 %SM6 %SM6 %TN6 %06< )-&*#("'+'+(,sDI~.% ! sm	
 !   }  }  ~ .9S 9 9 9 /3AtCy A&smA7CA 04=s ='}=8?= 15Ec E (E9GE 04=s ='}=8?= 15Ec E (E9GE ,073 7#C=74>7 -18T#Y 8$SM85@8 7;48,06:*.#(:',S$s)^'<:&.sm: %-SM: '*	:
 &.d^: %(: .;:( 26/3'+15%)>"'T#Y"7>!)#>  (}> "%	>
 !)>  #> /7> 7;48,06:*.#(:',S$s)^'<:&.sm: %-SM: '*	:
 &.d^: %(: .;:( 26/3'+15%)>"'T#Y"7>!)#>  (}> "%	>
 !)>  #> /7> 5926*.48(,!&6%*3S	>%:6(16 %-SM6 #+3-	6
 %(6 $,D>6 #&6 ,76. 04-1%)/3#'	I %c49n 5	I#,	I  (}	I &c]		I
  #	I 'tn	I !	I -3	I +/Ad3i A$'A3?A -1ES	 E&)E5CE -1ES	 E&)E5CE (,E3 E!$E0;E )-EDI E"%E1<E 04G# G),G8CG 15GDI G*-G9DG AE-1+/#%#'99.3277&uS$s)^'<=7%c]7 $C=7 !	7
 !7 (,7 ,07 %176 <@(,&* "ii).-2 !%T#Y"78    sm  	 
   #'  '+  ! $25 2 #'!!"+M+M +M 	+M
 +M +M +M +M 
+MZF# F3 F) F"G
 G6# 6) 6
6C 6I 6 "&
6),
6*3
66S 6# 6) 6 &*!%6'*6"6 +46;S ;T ;F# Fs Ft F
 15.2,0(,59=*-=(+= '*=
 /3=
 ?O=@F r8   r   xry   c                 R    [        U [        5      (       a  U $ SR                  U 5      $ )Nr   )r[  r\  r  )rD  s    r9   r^  r^    s"    !S88A;r8   )Vloggingr   typingr   r   r   r   r   requests.exceptionsr   r   enumr   alpaca_trade_apir	   commonr   r   r   r   r   r   r.  r   r   r   r   r   r   r   r   r   r   r   r   r   r   	entity_v2r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   	getLoggerr3   r   r:  r8  r;  rA  rB  rC  r  r=  r>  r?  r@  r<  r  	Exceptionr0   r;   Responser_   ra   rj   rh   rd   re   rf   rg   r   objectr   r\  r^  r2   r8   r9   <module>rQ     s    	 2 2  )   (    
     
		8	$N		e	e) N	)_
ud{+,ud{+,uS$Y'(fdl+, 	Y 	-y ->(++ 9K9K D 2N 2Nl Q 4 45	 1m001	!]../	1m001	A}223	4 t6 tnsDI~. 3 r8   