
    E#io                         S SK rS SK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  S SKJr  S SKJr  S SKJr  S SKJr   " S S	\R,                  R.                  5      rg)
    N)
ArrayCacheArrayCacheBySymbolByIdArrayCacheByTimestamp)AnyBoolIntOrder	OrderBookStrTickerTrade)Client)List)ExchangeError)AuthenticationErrorc                     ^  \ rS rSrS\4U 4S jjr0 4S\S\4S jjrS\	4S jr
S%S\4S	 jjrS
SS0 4S\S\S\S\S\\   4
S jjrS\	4S jrS0 4S\S\S\4S jjrS\	4S jrS rS rSS0 4S\S\S\S\\   4S jjrS\	4S jrSSS0 4S\S\S\S\\   4S jjrSSS0 4S\S\S\S\\   4S jjrS\	4S jrS\	4S jrS\	4S jrS%S jr 0 4S jr!S\	S\"4S jr#S\	4S jr$S\	4S jr%S\	4S  jr&S\	4S! jr'S\	4S" jr(S\	4S# jr)S$r*U =r+$ )&alpaca   returnc                    > U R                  [        [        U ]  5       0 SS_SS_SS_SS_SS_SS_S	S_S
S_SS_SS_SS_SS_SS_SS_SS_SS_SS_SSSSSSSSSS.	ESSSS.0SSSS.0S.0 0 SS0 00S.5      $ )NwsT&createOrderWithTakeProfitAndStopLossWsFcreateReduceOnlyOrderWscreateStopLossOrderWscreateTakeProfitOrderWsfetchPositionForSymbolWsfetchPositionsForSymbolWsfetchPositionsWsfetchPositionWsunWatchPositionswatchBalancewatchLiquidationswatchLiquidationsForSymbolswatchMarkPricewatchMarkPriceswatchMyLiquidationswatchMyLiquidationsForSymbols)	watchMyTrades
watchOHLCVwatchOrderBookwatchOrderswatchPositionwatchPositionswatchTickerwatchTickerswatchTradesz/wss://stream.data.alpaca.markets/v1beta2/cryptozwss://api.alpaca.markets/stream)cryptotradingz%wss://paper-api.alpaca.markets/stream)apitestexact)hasurlsoptions	streaming
exceptions)deep_extendsuperr   describe)self	__class__s    I/home/james-whalen/.local/lib/python3.13/site-packages/ccxt/pro/alpaca.pyr=   alpaca.describe   sd   fd < >d8% *5 (	
 *5 +E ,U #E "5 #E  $U .u !% "5  &u!" 0#$ "&""&#!&"'# %#5< "S#D "S#J ]4A
 4 4	    symbolc                 :  #    U R                   S   S   S   nU R                  U5      I Sh  vN   U R                  5       I Sh  vN   U R                  U5      nSUS   -   nSUS   /S	.nU R	                  X5U R                  Xb5      U5      I Sh  vN $  Nh NR N7f)
a  
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market

https://docs.alpaca.markets/docs/real-time-crypto-pricing-data#quotes

:param str symbol: unified symbol of the market to fetch the ticker for
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
r3   r   r1   Nticker:rC   	subscribeid)actionquotes)r7   authenticateload_marketsmarketwatchextend)r>   rC   paramsurlrL   messageHashrequests          r@   watch_tickeralpaca.watch_tickerH   s      iit$X.$$$!!!V$&"22!d|n
 ZZ$++g2NP[\\\ 	%! ]s4   *BBBBABBBBBclientc                     U R                  U5      nUS   nSU-   nX0R                  U'   UR                  U R                  U   U5        g )NrC   rE   )parse_tickertickersresolve)r>   rU   messagetickerrC   rQ   s         r@   handle_tickeralpaca.handle_ticker]   sK     ""7+!&(%Vt||F+[9rB   Nc                    U R                  US5      nU R                  US5      nU R                  0 SU R                  X25      _SU R                  U5      _SU_SS _SS _SU R                  US	5      _S
U R                  US5      _SU R                  US5      _SU R                  US5      _SS _SS _SS _SS _SS _SS _SS _SS _S S US.EU5      $ )NStrC   	timestampdatetimehighlowbidbp	bidVolumebsaskap	askVolumeasvwapopencloselastpreviousClosechange
percentageaverage)
baseVolumequoteVolumeinfo)safe_stringsafe_tickersafe_symbol	parse8601)r>   r[   rL   marketIdrb   s        r@   rW   alpaca.parse_tickero   se    ##FC0##FC0 !
d&&x8!
1!
 !
 D	!

 4!
 4##FD1!
 ))&$7!
 4##FD1!
 ))&$7!
 D!
 D!
 T!
 D!
 T!
 d!
  $!!
" t#!
$ )!
* + 	rB   1m	timeframesincelimitc                   #    U R                   S   S   S   nU R                  U5      I Sh  vN   U R                  5       I Sh  vN   U R                  U5      nUS   nSUS   /S.nS	U-   n	U R	                  XiU R                  X5      U	5      I Sh  vN n
U R                  (       a  U
R                  X5      nU R                  XUS
S5      $  N N N>7f)aW  
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market

https://docs.alpaca.markets/docs/real-time-crypto-pricing-data#bars

:param str symbol: unified symbol of the market to fetch OHLCV data for
:param str timeframe: the length of time each candle represents
:param int [since]: timestamp in ms of the earliest candle to fetch
:param int [limit]: the maximum amount of candles to fetch
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns int[][]: A list of candles ordered, open, high, low, close, volume
r3   r   r1   NrC   rF   rG   )rH   barsohlcv:r   T	r7   rJ   rK   rL   rM   rN   
newUpdatesgetLimitfilter_by_since_limit)r>   rC   r   r   r   rO   rP   rL   rR   rQ   ohlcvs              r@   watch_ohlcvalpaca.watch_ohlcv   s      iit$X.$$$!!!V$!!D\N
 'jj4;;w3OQ\]]??NN61E))%q$GG 	%! ^4   *CCCCACC;CCCc                 d   U R                  US5      nU R                  U5      nU R                  U R                  U5      nUc6  U R	                  U R
                  SS5      n[        U5      nXPR                  U'   U R                  U5      nUR                  U5        SU-   nUR                  XX5        g )Nr_   
OHLCVLimit  r   )
rx   rz   
safe_valueohlcvssafe_integerr8   r   parse_ohlcvappendrY   	r>   rU   rZ   r|   rC   storedr   parsedrQ   s	            r@   handle_ohlcvalpaca.handle_ohlcv   s     ##GS1!!(+f5>%%dllL$GE*51F"(KK!!'*f'v+rB   c                 ^  #    U R                   S   S   S   nU R                  U5      I Sh  vN   U R                  5       I Sh  vN   U R                  U5      nUS   nSU-   nSUS   /S	.nU R	                  XFU R                  Xs5      U5      I Sh  vN nUR                  5       $  Nz Nd N7f)
a  
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data

https://docs.alpaca.markets/docs/real-time-crypto-pricing-data#orderbooks

:param str symbol: unified symbol of the market to fetch the order book for
:param int [limit]: the maximum amount of order book entries to return.
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict: A dictionary of `order book structures <https://docs.ccxt.com/#/?id=order-book-structure>` indexed by market symbols
r3   r   r1   NrC   
orderbook:rF   rG   )rH   
orderbooks)r7   rJ   rK   rL   rM   rN   r   )	r>   rC   r   rO   rP   rL   rQ   rR   	orderbooks	            r@   watch_order_bookalpaca.watch_order_book   s      iit$X.$$$!!!V$!'&0!!$<.
 **St{{77SU`aa	   	%! bs4   *B-B'B-B)AB-B+B-)B-+B-c           	         U R                  US5      nU R                  U5      nU R                  US5      nU R                  U5      nU R                  USS5      nX@R                  ;  a  U R                  5       U R                  U'   U R                  U   nU(       a(  U R                  X$USSSS5      n	UR                  U	5        OXU R                  US/ 5      n
U R                  US/ 5      nU R                  US	   U
5        U R                  US
   U5        XhS'   XXS'   SU-   nXR                  U'   UR                  X5        g )Nr_   r`   rFbapsasksbidsra   rb   r   )rx   rz   r{   	safe_boolr   
order_bookparse_order_bookreset	safe_listhandle_deltasrY   )r>   rU   rZ   r|   rC   rb   ra   
isSnapshotr   snapshotr   r   rQ   s                r@   handle_order_bookalpaca.handle_order_book   s0   , ##GS1!!(+##GS1NN8,	^^GS%8
//)&*oo&7DOOF#OOF+	,,WicSVX[\HOOH%>>'33D>>'33Dy0$7y0$7%.k"$,j!'&0"+y.rB   c                 L    U R                  USS5      nUR                  U5        g )Nr   r   )parse_bid_ask
storeArray)r>   booksidedeltabidAsks       r@   handle_deltaalpaca.handle_delta  s$    ##E34F#rB   c                 d    [        S[        U5      5       H  nU R                  XU   5        M     g )Nr   )rangelenr   )r>   r   deltasis       r@   r   alpaca.handle_deltas  s)    q#f+&Ahq	2 'rB   c                   #    U R                   S   S   S   nU R                  U5      I Sh  vN   U R                  5       I Sh  vN   U R                  U5      nUS   nSU-   nSUS   /S	.nU R	                  XWU R                  X5      U5      I Sh  vN n	U R                  (       a  U	R                  X5      nU R                  XUS
S5      $  N N N>7f)a  
watches information on multiple trades made in a market

https://docs.alpaca.markets/docs/real-time-crypto-pricing-data#trades

:param str symbol: unified market symbol of the market trades were made in
:param int [since]: the earliest time in ms to fetch orders for
:param int [limit]: the maximum number of trade structures to retrieve
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
r3   r   r1   NrC   trade:rF   rG   )rH   tradesra   Tr   )
r>   rC   r   r   rO   rP   rL   rQ   rR   r   s
             r@   watch_tradesalpaca.watch_trades  s      iit$X.$$$!!!V$!'!d|n
 zz#DKK4PR]^^??OOF2E))&TRR 	%! _r   c                 d   U R                  US5      nU R                  U5      nU R                  U R                  U5      nUc6  U R	                  U R
                  SS5      n[        U5      nXPR                  U'   U R                  U5      nUR                  U5        SU-   nUR                  XX5        g )Nr_   tradesLimitr   r   )
rx   rz   r   r   r   r8   r   parse_trader   rY   r   s	            r@   handle_tradesalpaca.handle_trades2  s     ##GS1!!(+f5>%%dllM4HE&F"(KK!!'*f#f,v+rB   c                   #    U R                   S   S   S   nU R                  U5      I Sh  vN   SnU R                  5       I Sh  vN   Ub  U R                  U5      nUSU-   -  nSSS	/0S
.nU R	                  XVU R                  Xt5      U5      I Sh  vN nU R                  (       a  UR                  X5      nU R                  XUSS5      $  N N N>7f)a;  
watches information on multiple trades made by the user

https://docs.alpaca.markets/docs/websocket-streaming#trade-updates

:param str symbol: unified market symbol of the market trades were made in
:param int [since]: the earliest time in ms to fetch trades for
:param int [limit]: the maximum number of trade structures to retrieve
:param dict [params]: extra parameters specific to the exchange API endpoint
:param boolean [params.unifiedMargin]: use unified margin account
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
r3   r   r2   NmyTrades:listenstreamstrade_updatesrH   datara   T)	r7   rJ   rK   rC   rM   rN   r   r   r   )	r>   rC   r   r   rO   rP   rQ   rR   r   s	            r@   watch_my_tradesalpaca.watch_my_tradesJ  s      iit$Y/$$$ !!![[(F3<'KO,
 zz#DKK4PR]^^??OOF2E))&TRR 	%! _s4   *CCCCACC;CCCc                   #    U R                   S   S   S   nU R                  U5      I Sh  vN   U R                  5       I Sh  vN   SnUb  U R                  U5      nUS   nSU-   nSS	S
/0S.nU R	                  XVU R                  X5      U5      I Sh  vN n	U R                  (       a  U	R                  X5      nU R                  XX#S5      $  N N N=7f)a  
watches information on multiple orders made by the user
:param str symbol: unified market symbol of the market orders were made in
:param int [since]: the earliest time in ms to fetch orders for
:param int [limit]: the maximum number of order structures to retrieve
:param dict [params]: extra parameters specific to the exchange API endpoint
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
r3   r   r2   NordersrC   orders:r   r   r   r   T)	r7   rJ   rK   rL   rM   rN   r   r   filter_by_symbol_since_limit)
r>   rC   r   r   rO   rP   rQ   rL   rR   r   s
             r@   watch_ordersalpaca.watch_ordersi  s      iit$Y/$$$!!![[(FH%F#f,KO,
 zz#DKK4PR]^^??OOF2E00tTT! 	%! _s4   *CCCCACC:CCCc                 H    U R                  X5        U R                  X5        g N)handle_orderhandle_my_trader>   rU   rZ   s      r@   handle_trade_updatealpaca.handle_trade_update  s    &*V-rB   c                 x   U R                  US0 5      nU R                  US0 5      nU R                  c-  U R                  U R                  SS5      n[	        U5      U l        U R                  nU R                  U5      nUR                  U5        SnUR                  Xh5        SUS   -   nUR                  Xh5        g )Nr   orderordersLimitr   r   r   rC   )r   r   r   r8   r   parse_orderr   rY   )	r>   rU   rZ   r   rawOrderr   r   r   rQ   s	            r@   r   alpaca.handle_order  s    \ w3??4"5;;%%dllM4HE07DK  *ev+%/1v+rB   c                    U R                  US0 5      nU R                  US5      nUS:w  a  US:w  a  g U R                  US0 5      nU R                  nUc(  U R                  U R                  SS5      n[        U5      nU R                  U5      nUR                  U5        SUS	   -   n	UR                  Xi5        S
n	UR                  Xi5        g )Nr   eventfillpartial_fillr   r   r   z	myTrades:rC   r   )	r   rx   r   r   r8   r   parse_my_trader   rY   )
r>   rU   rZ   r   r   r   r   r   traderQ   s
             r@   r   alpaca.handle_my_trade  s    \ w3  w/F?u6??4"5==%%dllM4HE-e4H##H-!E(O3x- x-rB   c                    U R                  US5      nU R                  US5      nU R                  US5      nUR                  S5      S:  a  SnU R                  U R                  US5      UU R                  U5      UU R	                  US S5      U R                  US5      UU R                  US	5      US
:X  a  SOSU R                  US5      U R                  US5      S S S.U5      $ )NrC   	filled_attyper   r   r   /rG   siderL   takermakerfilled_avg_price
filled_qty)rG   rw   ra   rb   rC   r   r   r   takerOrMakerpriceamountcostfee)rx   find
safe_trader{   rz   )r>   r   rL   r|   rb   r   s         r@   r   alpaca.parse_my_trade  s    L ##E84##E;7v.99W"D""5#.1 &&xs;%%eT2$$UF3(,(8Gw%%e-?@&&ul; 
  	rB   c                   #    U R                  5         SnU R                  U5      nUR                  U5      nU R                  UR                  U5      nUca  SU R
                  U R                  S.nXR                  S   S   S   :X  a  SU R
                  U R                  S.S	.nU R                  XXsU5        UI S h  vN $  N7f)
Nauthenticatedauth)rH   keysecretr3   r   r2   rJ   )key_id
secret_keyr   )	check_required_credentialsrU   reusableFuturer   subscriptionsapiKeyr  r7   rM   )r>   rP   rO   rQ   rU   futurer   rR   s           r@   rJ   alpaca.authenticate>  s     '')%S!&&{3(<(<kJ  {{++G
 ii&t,Y77 -"&++&*kk JJsvF||s   B:C<C=Cc                     U R                  US5      nU R                  US0 5      n[        U R                  S-   U-   S-   U-   5      e)Ncodemsgz code: z
 message: )rx   r   r   rG   )r>   rU   rZ   r  r  s        r@   handle_error_messagealpaca.handle_error_messageV  sK     0oogub1DGGi/$6EKLLrB   c                     U$ r    r   s      r@   handle_connectedalpaca.handle_connectedb  s	     rB   c                    [        S[        U5      5       H  nX#   nU R                  US5      nU R                  US5      nUS:X  a  U R                  X5          g US:X  a  US:X  a  U R	                  X5          g US:X  a  US:X  a  U R                  X5          g U R                  U R                  U R                  U R                  U R                  S.nU R                  Xu5      nUc  M  U" X5        M     g )	Nr   Tr  subscriptionsuccess	connectedr   )errorr   qr`   o)r   r   rx   handle_subscriptionr  handle_authenticater  r   r\   r   r   r   )	r>   rU   rZ   r   r   r  r  methodsmethods	            r@   handle_crypto_messagealpaca.handle_crypto_messagek  s    q#g,'A:D  s+A""4/CN"((6I~#"4%%f3I~#"8((622&&''''++G __W0F!v$- (rB   c                     U R                  US5      nU R                  U R                  U R                  S.nU R	                  XC5      nUb	  U" X5        g g )Nstream)authorization	listeningr   )rx   r  r  r   r   )r>   rU   rZ   r$  r  r   s         r@   handle_trading_messagealpaca.handle_trading_message  sY    !!'84!5511!55

 16# rB   c                 t    [        U[        5      (       a  U R                  X5        g U R                  X5        g r   )
isinstancelistr!  r'  r   s      r@   handle_messagealpaca.handle_message  s.    gt$$&&v7##F4rB   c                     U R                  US5      nU R                  US0 5      nU R                  US5      nUS:X  d  US:X  a!  UR                  S   nUR                  U5        g [	        U R
                  S-   5      e)Nr  r   statusr  
authorizedr   z failed to authenticate.)rx   r   futuresrY   r   rG   )r>   rU   rZ   r  r   r/  promises          r@   r  alpaca.handle_authenticate  sz    4 Wc*w3!!$1	>V|3nn_5GOOG$!$'',F"FGGrB   c                     U$ r   r  r   s      r@   r  alpaca.handle_subscription  s	    ( rB   )r   r   ),__name__
__module____qualname____firstlineno__r   r=   strr   rS   r   r\   rW   r   r   r+  r   r   r
   r   r   r   r   r   r   r   r   r   r	   r   r   r   r   r   rJ   r   r  r  r!  r'  r,  r  r  __static_attributes____classcell__)r?   s   @r@   r   r      s-   5# 5n 68 ] ]F ]*:F :$#6 #J ?CQUdhqs H H H3 H^a Hx|  ~B  yC H8,6 ,6 @DB !S ! !S\ !0*/ */X$3 <@d[] S SS S Sbfglbm S6,F ,0 37TX\eg SC Ss SRU Slpqvlw S> 04$UYbd U UC Us Uimnsit U8.& .9,6 9,v<.f <.|:x .0 0
M6 
Mt 
Mv %F %2	$V 	$5V 5!H& !HF&  rB   r   )ccxt.async_supportccxt ccxt.async_support.base.ws.cacher   r   r   ccxt.base.typesr   r   r   r	   r
   r   r   r   !ccxt.async_support.base.ws.clientr   typingr   ccxt.base.errorsr   r   async_supportr   r  rB   r@   <module>rE     s?     f f P P P 4  * 0}
T&& }
rB   