
    i%                        d dl Zd dlmZmZmZmZ d dlZd dlZd dl	m
Z
mZmZmZmZmZmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ  G d
 dej        j                  ZdS )    N)
ArrayCacheArrayCacheBySymbolByIdArrayCacheBySymbolBySideArrayCacheByTimestamp)
BalancesIntOrder	OrderBookPositionStrStringsTickerTickersTrade)Client)List)ExchangeError)AuthenticationError)ArgumentsRequired)
BadRequestc            
           e Zd Z fdZd Zdddi fdedefdZd Zi fded	e	fd
Z
di fded	efdZdefdZdddi fdededed	ee         fdZdefdZd3d	efdZdi fdeded	efdZdi fdee         ded	efdZdefdZd Zd Zddi fdededed	ee         fdZddi fdee         deded	ee         fdZdefdZd3dZ d Z!dddi fdededed	ee         fdZ"defd Z#dddi fdededed	ee$         fd!Z%d3dedefd"Z&d# Z'd$ Z(dddi fdededed	ee)         fd%Z*defd&Z+d3d'Z,i fd	e-fd(Z.defd)Z/d3d*Z0i fd+Z1i fd,Z2defd-Z3defd.Z4d/ Z5defd0Z6defd1Z7defd2Z8 xZ9S )4bybitc                    |                      t          t          |                                           i ddddddddddddd	dd
ddddddddddddddddddddddddddddddddddddddidd d!d"d#d$d%d&dd%d'ddid(d)d*iddd+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:id,d;d<d=d>d?d@dAdBdCdDdEdFdGd:idH| j        dIdJdK          S )LNwsTcreateOrderWsFeditOrderWsfetchOpenOrdersWsfetchOrderWscancelOrderWscancelOrdersWscancelAllOrdersWsfetchTradesWsfetchBalanceWswatchBalancewatchMyTrades
watchOHLCVwatchOHLCVForSymbolswatchOrderBookwatchOrderBookForSymbolswatchOrders)watchTickerwatchTickerswatchTradeswatchPositionswatchTradesForSymbolsz&wss://stream.{hostname}/v5/public/spotz)wss://stream.{hostname}/v5/public/inversez(wss://stream.{hostname}/v5/public/optionz(wss://stream.{hostname}/v5/public/linear)spotinverseoptionlinearz"wss://stream.{hostname}/v5/privatez'wss://stream.{hostname}/spot/private/v3)unified
nonUnifiedz4wss://stream.{hostname}/trade/option/usdc/private/v1)r0   contractusdc)publicprivatez.wss://stream-testnet.{hostname}/v5/public/spotz1wss://stream-testnet.{hostname}/v5/public/inversez0wss://stream-testnet.{hostname}/v5/public/linearz0wss://stream-testnet.{hostname}/v5/public/option)r0   r1   r3   r2   z*wss://stream-testnet.{hostname}/v5/privatez/wss://stream-testnet.{hostname}/spot/private/v3z<wss://stream-testnet.{hostname}/trade/option/usdc/private/v1)apitestnametickers)fetchPositionsSnapshotawaitPositionsSnapshot
timeframes1m3m5m15m30m1h2h4h6h12h1d1w1M)rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   135153060120240360720DWM)r+   r.   r0   r6   i N  )ping	keepAlive)hasurlsoptions	streaming)deep_extendsuperr   describer[   )self	__class__s    T/var/www/html/crypto-bot/backend/venv/lib/python3.11/site-packages/ccxt/pro/bybit.pyrc   zbybit.describe   s   eT 2 2 ; ; = =d u $U	
    !% $U   !%    d ' !$  +D!" t#$  $ $#"&)--  4 $L'R&P&P	# # ,P.W% % )M$Z$ $ & $T'Z&X&X	# # ,X._% % )U$b$ $ '% %P I  /3.2# #
 !"""$$""""$"""# #$ !!!!##"###$!!!# #3* *X 	" Un@
 n@
 n n n	    c                 z    |                      |                     | j        dd          d          }|| j        d<   |S )N	requestIdr      )sumsafe_integerr_   )rd   ri   s     rf   
request_idzbybit.request_id   s;    HHT..t|[!LLaPP	$-[!rg   NFsymbolmethodc                 `   |rdnd}d }d }d }d }	| j         d         d         }
|*|                     |          }	|	d         dk    }|	d         }nS|                     |d |          \  }}|                     | j        d          }|                     |dd|          }|dk    }|d	k    }|r|r|
|         d
         n|
|         d         }
nQ|r|
|         d	         }
n@|dk    r,d }|                     ||	|d          \  }}|
|         |         }
n|
|         d         }
|                     |
          }
|
S )Nr9   r8   r:   r   settleUSDCtypedefaultSettler0   r7   r6   swapr3   r2   )r^   markethandle_market_type_and_paramssafe_stringr_   safe_string_2handle_sub_type_and_paramsimplode_hostname)rd   rn   	isPrivatero   paramsaccessibilityisUsdcSettledisSpotrs   rv   urlrt   subTypes                rf   get_url_by_market_typezbybit.get_url_by_market_type   ss   %.<		Hit$[[((F"8,6M&>DD==fdFSSLD& ,,T\?KKM ..vxR_``M*f4M&. 	31>c#m$V,,SEWXbEcCC 3-(0"&"A"A&&RXZb"c"c-(1 -(2##C((
rg   c                 6    |                      |g d          }|S )N)rs   r   rq   rt   unifiedMargin)omit)rd   r}   s     rf   clean_paramszbybit.clean_params   s!    6#b#b#bccrg   returnc                   K   |                                   d{V  |                     |          }|d         }d|z   }|                     |dd|          }|                     |          }|                     | j        di           }|                     |dd          }|d         s|dk    rt          | j        d	z             |d
|d         z   z  }|g}| 	                    ||g||           d{V S )a2  
        watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/ticker
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/etp-ticker
        :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>`
        Nrn   ticker:Fr+   r<   r=   r0   z> watchTicker() only supports name tickers for contract markets.id)
load_marketsrv   r   r   
safe_valuer_   rx   r   r   watch_topics)	rd   rn   r}   rv   messageHashr   r_   topictopicss	            rf   watch_tickerzbybit.watch_ticker   s       !!!!!!!!!V$$!&())&%OO""6**//$,rBB  &)<<f~ 	i%9"4"4TW'gghhhvd|##&&s[M66JJJJJJJJJrg   symbolsc                   K   |                                   d{V  |                     |dd          }g }|                     |d         dd|          }|                     |          }|                     | j        di           }|                     |dd          }|                     |          }g }t          dt          |                    D ]C}	||	         }
|
                    |dz   |
z              |
                    d||	         z              D|                     ||||           d{V }| j        ri }|||d	         <   |S |                     | j        d	|          S )
aB  
        watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/ticker
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/etp-ticker
        :param str[] symbols: 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>`
        NFr   r,   r<   r=   r   r   rn   )r   market_symbolsr   r   r   r_   rx   
market_idsrangelenappendr   
newUpdatesfilter_by_arrayr=   )rd   r   r}   messageHashesr   r_   r   	marketIdsr   imarketIdtickerresults                rf   watch_tickerszbybit.watch_tickers   s      !!!!!!!!!%%gtU;;))'!*e^VTT""6**//$,CC  &)<<OOG,,	q#i..)) 	9 	9A |HMM%#+0111  WQZ!78888((mVVLLLLLLLL? 	F'-F6(#$M##DL(GDDDrg   clientc                 d   |                      |dd          }|                      |dd          }|                     |di           }|                      |d          d u}|rdnd}d }d }	|dk    r|                     |          }	|	d	         }n|d
k    r|                    d          }
t	          |
          }|                      |
|dz
            }|                     |d d |          }|d	         }|                     | j        |i           }|                     |di           }|                     ||          }|                     |          }	|                     |d          }||	d<   | 	                    |          |	d<   |	| j        |<   d|z   }|
                    | j        |         |           d S )Nr    rs   datausdIndexPricer0   r6   snapshotrn   deltar   rj   infots	timestampdatetimer   )rx   	safe_dictparse_tickersplitr   safe_marketr=   extendrl   iso8601resolve)rd   r   messager   
updateTyper   r   rs   rn   parsed
topicPartstopicLengthr   rv   r   	rawTickermergedr   r   s                      rf   handle_tickerzbybit.handle_ticker   s   f   '266%%gvr::
~~gvr22!!$88D/vvZ*$$&&t,,FH%FF7""S))Jj//K''
K!ODDH%%hdDAAFH%F^^DL&"==Fvvr::I[[D11F&&v..F%%gt44	'{!\\)44z%V&(t|F+[99999rg   rA   sincelimitc                   K   |                                   d{V  |                     |          }|d         }|                     |dd|          }|                     |          }d}|                     | j        ||          }	d|	z   dz   |d         z   g}
d|	z   d	z   |z   }|                     ||g|
|           d{V }| j        r|                    ||          }| 	                    |||d
d          S )a  
        watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/kline
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/etp-kline
        :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
        Nrn   Fr&   zkline.r   r   kline::r   T)
r   rv   r   r   rx   r@   r   r   getLimitfilter_by_since_limit)rd   rn   	timeframer   r   r}   rv   r   ohlcvtimeframeIdr   r   s               rf   watch_ohlcvzbybit.watch_ohlcvr  s&      !!!!!!!!!V$$!))&%vNN""6**&&t	9MM[(3.=>#k1C7&@''k]FFKKKKKKKK? 	2NN6511E))%q$GGGrg   c                    |                      |di           }|                     |d          }|                    d          }t          |          }|                     |d          }|                     |          }|                     ||dz
            }	|j                            d          dk    }
|
rdnd}|                     |	d d |          }|d         }|                      | j        |          }|
i | j        |<   |                      ||          }|;| 	                    | j
        d	d
          }t          |          }|| j        |         |<   t          dt          |                    D ]2}|                     ||                   }|                    |           3d|z   dz   |z   }|                    ||           d S )Nr   r   r   rj   r0   r6   rn   
OHLCVLimit  r   r   r   )r   rx   r   r   find_timeframer   findr   ohlcvsrl   r_   r   r   parse_ws_ohlcvr   r   )rd   r   r   r   r   r   r   r   r   r   r   
marketTyperv   rn   ohlcvsByTimeframestoredr   r   r   r   s                       rf   handle_ohlcvzbybit.handle_ohlcv  s   . w33  '22[[%%
*oo&&z155''44	##Ja@@((2-%5VV:
!!(D$
CC! OODK@@$"$DK!2I>>>%%dlL$GGE*511F-3DK	*q#d))$$ 	" 	"A((a11FMM&!!!!#k1C7&@v{+++++rg   c           
         |                      |d          |                     |d          |                     |d          |                     |d          |                     |d          |                     |dd          gS )Nstartopenhighlowclosevolumeturnover)rl   safe_numbersafe_number_2)rd   r   rv   s      rf   r   zbybit.parse_ws_ohlcv  s    " eW--UF++UF++UE**UG,,uh
;;
 	
rg   c                 B   K   |                      |g||           d{V S )aF  
        watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/orderbook
        :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
        N)watch_order_book_for_symbols)rd   rn   r   r}   s       rf   watch_order_bookzbybit.watch_order_book  s4       66xOOOOOOOOOrg   c                 X  K   |                                   d{V  t          |          }|dk    rt          | j        dz             |                     |          }|                     |d         dd|          }|                     |          }|                     |d                   }||d         rdnd}n7|d         s/|d	k    r)|dk    r#|d
k    r|dk    rt          | j        dz             g }g }t          dt          |                    D ]f}	||	         }
| 
                    |
          }dt          |          z   dz   |z   }|                    |           d|
z   }|                    |           g|                     ||||           d{V }|                                S )a)  
        watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/orderbook
        :param str[] symbols: unified array of symbols
        :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
        Nr   zA watchOrderBookForSymbols() requires a non-empty array of symbolsFr(   r0   2   i  rj      zB watchOrderBookForSymbols() can only use limit 1, 50, 200 and 500.z
orderbook.r   
orderbook:)r   r   r   r   r   r   r   rv   r   r   	market_idstrr   r   r   )rd   r   r   r}   symbolsLengthr   rv   r   r   r   rn   r   r   r   	orderbooks                  rf   r   z"bybit.watch_order_book_for_symbols  s      !!!!!!!!!GA#DG.q$qrrr%%g..))'!*e=MvVV""6**WQZ((=!&>3BBEE&> uQJJUb[[u||%SV,,$TW/s%stttq#g,,'' 	. 	.AQZF~~f--H 3u::-3h>EMM%   &/K  ----++COOOOOOOO	   rg   c                 `   |j                             d          dk    }|                     |d          }|dk    }|                     |di           }|                     |d          }|rdnd}|                     |d d |          }	|	d         }
|                     |d	          }|                     | j        |
          }||                                 }|r/|                     ||
|d
d          }|	                    |           n|                     |dg           }|                     |d
g           }| 
                    |d         |           | 
                    |d         |           ||d<   |                     |          |d<   d|
z   }|| j        |
<   |                    ||           d S )Nr0   r   rs   r   r   sr6   rn   r   baasksbidsr   r   r   )r   r   rx   r   r   rl   
orderbooks
order_bookparse_order_bookresethandle_deltasr   r   )rd   r   r   r   rs   
isSnapshotr   r   r   rv   rn   r   r   r   r   r   r   s                    rf   handle_order_bookzbybit.handle_order_book  s   D ((A-00j(
w33##D#..%5VV:
!!(D$
CC!%%gt44	OODOV<<	))I 		<,,T69c3OOHOOH%%%%??4b11D??4b11Dy0$777y0$777%.Ik"$(LL$;$;Ij!'&0"+y+.....rg   c                 ^    |                      |dd          }|                    |           d S )Nr   rj   )parse_bid_ask
storeArray)rd   booksider   bidAsks       rf   handle_deltazbybit.handle_delta@  s3    ##E1a00F#####rg   c                 ~    t          dt          |                    D ]}|                     |||                    d S )Nr   )r   r   r   )rd   r   deltasr   s       rf   r   zbybit.handle_deltasD  sH    q#f++&& 	3 	3Ahq	2222	3 	3rg   c                 D   K   |                      |g|||           d{V S )a>  
        watches information on multiple trades made in a market
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/trade
        :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
        :returns dict[]: a list of [trade structures]{@link https://docs.ccxt.com/#/?id=trade-structure
        N)watch_trades_for_symbols)rd   rn   r   r   r}   s        rf   watch_tradeszbybit.watch_tradesH  s6       22F8UE6RRRRRRRRRrg   c                   K   |                                   d{V  |                     |          }t          |          }|dk    rt          | j        dz             |                     |          }|                     |d         dd|          }g }g }t          dt          |                    D ]Y}	||	         }
|                     |
          }d|d         z   }|	                    |           d|
z   }|	                    |           Z| 
                    ||||           d{V }| j        rB|                     |d          }|                     |d	          }|                    ||          }|                     |||d
d          S )a+  
        get the list of most recent trades for a list of symbols
        :see: https://bybit-exchange.github.io/docs/v5/websocket/public/trade
        :param str[] symbols: unified symbol of the market to fetch trades for
        :param int [since]: timestamp in ms of the earliest trade to fetch
        :param int [limit]: the maximum amount of trades to fetch
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=public-trades>`
        Nr   z> watchTradesForSymbols() requires a non-empty array of symbolsFr-   zpublicTrade.r   trade:rn   r   T)r   r   r   r   r   r   r   r   rv   r   r   r   r   rx   r   r   )rd   r   r   r   r}   r   r   r   r   r   rn   rv   r   r   tradesfirsttradeSymbols                    rf   r   zbybit.watch_trades_for_symbolsT  s      !!!!!!!!!%%g..GA#DG.n$nooo""6**))'!*e]FSSq#g,,'' 	. 	.AQZF[[((F"VD\1EMM%   "V+K  ----((mVVLLLLLLLL? 	8OOFA..E**5(;;KOOK77E))&%TRRRrg   c                    |                      |di           }|                     |d          }|}|                    d          }|j                            d          dk    }|rdnd}|                     |d          }	|                     |	d d |          }
|
d         }|                      | j        |          }|5|                     | j        d	d
          }t          |          }|| j        |<   t          dt          |                    D ]3}|                     ||         |
          }|                    |           4d|z   }|                    ||           d S )Nr   r   r   r0   r   r6   rj   rn   tradesLimitr   r  )r   rx   r   r   r   r   r  rl   r_   r   r   r   parse_ws_trader   r   )rd   r   r   r   r   r  partsr   r   r   rv   rn   r   r   jr   r   s                    rf   handle_tradeszbybit.handle_tradesu  s_   ( w33  '22C  ((A- &7VVZ
##E1--!!(D$
CC!f55>%%dlM4HHE&&F"(DKq#f++&& 	" 	"A((F;;FMM&!!!!#f,v{+++++rg   c                 Z   |                      |g d          }d|v }|rdnd}||d         }|                     |d          }|                     ||d |          }|d         }|                     |dd	          }|                     |d
          }	d }
|                     |d          }|	|rdnd}	n|}
|                     |d          }|                     |dd          }|                     |d          }|                     ||||                     |          ||d |	|
||d d d|          S )N)r   TvBTr6   r0   rs   r   rn   tr  Smbuysellpqr  o)r   r   r   r   rn   orderrs   sidetakerOrMakerpriceamountcostfee)	safe_string_nrx   r   safe_integer_2safe_string_lowerr   ry   
safe_trader   )rd   traderv   r   
isContractr   r   rn   r   r  r  r  r  r  orderIds                  rf   r	  zbybit.parse_ws_trade  su   @ 77em
#-9ZZ6
J##E3//!!(FD*EE!''sC88	%%eS11OOE3''<)556DD L  ,,##E344""5#.."Y//( 
  
   	rg   c                 r    |                     d          dk    rdS |                     d          dk    rdS dS )Nr0   r   z
v5/privater4   r7   )r   )rd   r   s     rf   get_private_typezbybit.get_private_type  s?    88Fq  6XXl##q((96rg   c                   K   d}d}|                                   d{V  ||                     |          }|d|z   z  }|                     |d||          }|                     |           d{V  dddd	}|                     ||                     |                    }	|                     ||g|	g|           d{V }
| j        r|
                    ||          }| 	                    |
|||d          S )
a  
        watches information on multiple trades made by the user
        :see: https://bybit-exchange.github.io/docs/v5/websocket/private/execution
        :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
        :param boolean [params.unifiedMargin]: use unified margin account
        :returns dict[]: a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure
        r%   myTradesNr   T
ticketInfo	executionuser.openapi.perp.trader0   r4   r7   
r   rn   r   authenticater   r(  r   r   r   filter_by_symbol_since_limit)rd   rn   r   r   r}   ro   r   r   topicByMarketr   r  s              rf   watch_my_tradeszbybit.watch_my_trades  s:      ! !!!!!!!!![[((F3<'K))&$GG$$$$$$$$$ "-
 

 t/D/DS/I/IJJ(({meWfMMMMMMMM? 	3OOFE22E00tTTTrg   c                 *   |                      |d          }|dk    }|                     |dg           }t          |t                    s|                     |dg           }| j        0|                     | j        dd          }t          |          | _        | j        }i }t          dt          |                    D ][}	||	         }
d }|r| 
                    |
          }n|                     |
          }|d         }d	||<   |                    |           \t          |                                          }t          dt          |                    D ]#}	d
||	         z   }|                    ||           $d}|                    ||           d S )Nr   r+  r   r   r  r   r   rn   Tz	myTrades:r*  )rx   r   
isinstancelistr*  rl   r_   r   r   r   r	  parse_trader   keysr   )rd   r   r   r   r0   r   r   r  r   r   rawTrader   rn   r8  currentMessageHashr   s                   rf   handle_my_tradeszbybit.handle_my_trades  s   ~   '22$w33$%% 	7??4266D= %%dlM4HHE2599DMq#d))$$ 		" 		"AAwHF 4,,X66))(33H%F"GFOMM&!!!!GLLNN##q#d))$$ 	7 	7A!,tAw!6NN6#56666 v{+++++rg   c                   K   |                                   d{V  d}d}|                     |          s-|                     |          }dd                    |          z   }|                     |d          }|                     |d||          }d|z   }|                     |          }	|                     |           d{V  |                     |	|           | j	        }
| 
                    dd	d          }|                     dd
d          }|r8|r6|
4|	                    d	           d{V }|                     ||||d          S dg}|                     ||g||           d{V }| j        r|S |                     |
|||d          S )a  
        :see: https://bybit-exchange.github.io/docs/v5/websocket/private/position
        watch all open positions
        :param str[] [symbols]: list of unified market symbols
        :param dict params: extra parameters specific to the exchange API endpoint
        :returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
        Nr.   r   ::,r   T	positionsr>   r?   position)r   is_emptyr   joinrx   r   r   r0  set_positions_cacher?  handle_option	safe_boolfuturefilter_by_symbols_since_limitr   r   )rd   r   r   r   r}   ro   r   firstSymbolr   r   cacher>   r?   r   r   newPositionss                   rf   watch_positionszbybit.watch_positionsb  s      !!!!!!!!!!}}W%% 	3))'22G'!2!22K&&w22))+tVVLL!K/S!!$$$$$$$$$  111!%!3!34DF^`d!e!e!%0@BZ\`!a!a! 	]&< 	]#]]+CDDDDDDDDH55hPUW[\\\!..s[M66RRRRRRRR? 	 11%%PTUUUrg   c                     | j         d S |                     ddd          }|r@d}||j        vr3|                    |           |                     | j        ||           d S d S t                      | _         d S )Nr.   r>   T)r?  rD  futuresrF  spawnload_positions_snapshotr   )rd   r   r   r>   r   s        rf   rC  zbybit.set_positions_cache  s    >%F!%!3!34DF^`d!e!e! 	82K6>11k***

47MMMMM 21 677DNNNrg   c                   K   |                      d ddd          |                      d ddd          g}t          j        |  d {V }t                      | _        | j        }t          dt          |                    D ]G}||         }t          dt          |                    D ]}||         }	|                    |	            H|j        |         }
|
	                    |           |	                    |d           d S )Nru   r3   )rs   r   r1   r   r@  )
fetch_positionsasynciogatherr   r?  r   r   r   rM  r   )rd   r   r   fetchFunctionspromisesrI  r   r?  iir@  rF  s              rf   rO  zbybit.load_positions_snapshot  s        8'L'LMM  9'M'MNN
 !8888888133q#h--(( 	' 	'A IAs9~~.. ' '$R=X&&&&' ,uuj)))))rg   c                    | j         t                      | _         | j         }g }|                     |dg           }t          dt	          |                    D ]}||         }|                     |          }|                     |d          }	|                    |           |	|	dk    r:d|d<   |                    |           d|d<   |                    |           d |d<   |                    |           |                     |d          }
t          dt	          |
                    D ]}|
|         }|	                    d          }|d	         }|	                    d
          }| 
                    |d|d          }|                     |          s|                    ||           |                    |d           d S )Nr   r   r  r   longshortzpositions::r=  rj   r>  rn   Fr?  )r?  r   r   r   r   parse_positionrx   r   find_message_hashesr   r   rA  r   )rd   r   r   rI  rJ  rawPositionsr   rawPositionr@  r  r   r   r
  symbolsStringr   r?  s                   rf   handle_positionszbybit.handle_positions  s   P >!577DNw;;q#l++,, 	' 	'A&q/K**;77H##Hf55D )))|trzz $* X&&&#* X&&&#'   X&&&&00GGq#m,,-- 	7 	7A'*K%%d++E!!HM#))#..G,,\8WeTTI==++ 7y+666|[11111rg   c                   K   |                                   d{V  d}d}||                     |          }|d|z   z  }|                     |d||          }|                     |           d{V  ddgdgdgd	}|                     ||                     |                    }	|                     ||g|	|           d{V }
| j        r|
                    ||          }| 	                    |
|||d          S )
a?  
        watches information on multiple orders made by the user
        :see: https://bybit-exchange.github.io/docs/v5/websocket/private/order
        :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]{@link https://docs.ccxt.com/#/?id=order-structure
        Nr*   ordersr   Tr  	stopOrderzuser.openapi.perp.orderr.  r/  )rd   rn   r   r   r}   ro   r   r   topicsByMarketr   ra  s              rf   watch_orderszbybit.watch_orders  sB      !!!!!!!!![[((F3<'K))&$GG$$$$$$$$$k*y./
 

 1F1Fs1K1KLL(({mVVLLLLLLLL? 	3OOFE22E00tTTTrg   c                 :   | j         0|                     | j        dd          }t          |          | _         | j         }|                     |dg           }|                     |di           }|                     |d          }|dk    }|s|                     |d|          }i }	t          dt          |                    D ]_}
d }|r|                     ||
                   }n| 	                    ||
                   }|d         }d	|	|<   |
                    |           `t          |	                                          }t          dt          |                    D ]#}
d
||
         z   }|                    ||           $d}|                    ||           d S )NordersLimitr   r   r   categoryr0   r   rn   Tzorders:ra  )ra  rl   r_   r   r   rx   r   r   parse_ws_spot_orderparse_orderr   r6  r8  r   )rd   r   r   r   ra  	rawOrdersr  rg  r   r   r   r   rn   symbolsArrayr:  r   s                   rf   handle_orderzbybit.handle_order  s   h ;%%dlM4HHE077DKOOGVR88		1b11##E:66V# 	H	8YGGIq#i..)) 	" 	"AF 811)A,??)))A,77H%F"GFOMM&!!!!GLLNN++q#l++,, 	7 	7A!*\!_!<NN6#56666v{+++++rg   c                 v   |                      |dd          }|                      |dd          }|                     ||d d          }|                     |dd          }|                      |dd	          }|d
k    rd }|                      |dd          }|                     |                      |dd                    }	|                     |dd          }
|                      |dd          }|                      |dd          }d }|                      |dd          }|                     |dd          }||                    d          dk    rd}|dk    r	|
dk    r|}n|                      |dd          }d }|                      |dd          }|6|d
k    r0|                     |d           }|                     |          }||d!}|                     |                     |d"                    }| 	                    i d#|d$|d%|                      |d&d'          d(|d)| 
                    |          d*|d|d+|d|d,d d|
d	|d-|d"|d.|                     |d/          d0|                     |d1          d2|                     |d2          |||                     |d3          |d |	|d4|          S )5Nr   r&  r   rn   r0   OcreatedTimer  r  0z
cumExecQtyXorderStatusr  r  EupdatedTimeftimeInForceZcumExecValuer  	orderTyperv   r   r  orderQtyqtyn
cumExecFeeN)r  currencytriggerPricer   r   clientOrderIdcorderLinkIdr   r   lastTradeTimestamprs   postOnly	stopPricetakeProfitPrice
takeProfitstopLossPricestopLoss
reduceOnlyavgPrice)r  r  averagefilled	remainingstatusr  )ry   safe_symbolr!  parse_order_statussafe_string_lower_2r   rx   safe_currency_code	omit_zero
safe_orderr   r   )rd   r  rv   r   r   rn   r   r  r  r  r  r  rx  r  r  rs   r  feeCostfeeCurrencyIdfeeCurrencyCoder  s                        rf   rh  zbybit.parse_ws_spot_orderw  s   R sI66%%eS(;;!!(FD&AA''sMBB	""5#w77C<<E##E3==((););E3)V)VWW''sF;;!//sMJJ((]CC!!%n==''sK@@499X#6#6!#;#;D8FF''z5AAF$$UC>>7c>> ,,UC88M"55mDDO+ C ~~d&6&6un&M&MNN  
E 
" 
 T//sMJJ 
 	 

 Y// 
 !"4 
 f 
 D 
 ; 
  
 D 
 U 
  
 L 
 t//|DD 
  T--eZ@@! 
" $//%>># 
$ ''z::1 
  
  
2 3  	rg   c                   K   |                                   d{V  d}d}d}|                     dd|          \  }}d}|                     dd|          \  }}|                                  d{V }|                     |dd          }|                     |dd          }|                     dd||          }	|                     |	           d{V  dd	d
}
|r|dk    r|dz  }n|dz  }|s|s|dk    r|dz  }n|dz  }|r|dk    r|dz  }n|dk    r|dz  }n|dz  }|                     |
|                     |	                    g}| 	                    |	|g||           d{V S )am  
        watch balance and get the amount of funds available for trading or funds locked in orders
        :see: https://bybit-exchange.github.io/docs/v5/websocket/private/wallet
        :param dict [params]: extra parameters specific to the exchange API endpoint
        :returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
        Nr$   balancesr   Frj   ToutboundAccountInfowallet)r0   r4   r1   z	:contractz:unifiedr0   z:spotr3   )
r   rw   rz   isUnifiedEnabledrE  r   r0  r   r(  r   )rd   r}   ro   r   rs   r   r4   isUnifiedMarginisUnifiedAccountr   r2  r   s               rf   watch_balancezbybit.watch_balance  s      !!!!!!!!! 99.$PVWWf99.$PVWW--////////..!U;;>>'1e<<))$ffEE$$$$$$$$$)
 
  	*)##{*z) 	+'7 	+v~~w&{* 	/v~~w&h&&:-KK;.K//-1F1Fs1K1KLLM&&s[M66JJJJJJJJJrg   c           	         | j         i | _         d}|                     |d          }d }g }d }|dk    rnd}|                     |dg           }t          dt          |                    D ]5}	|                     ||	         dg           }
|                     ||
          }6|}|dk    r|                     |di           }t          dt          |                    D ]Z}	|                     |di           }|                     |d	          }|                     ||                     |d
g                     }[|}t          dt          |                    D ]}	|                     ||	         |           ||                     | j         |          
i | j         |<   || j         |         d<   |                     |d          }|| j         |         d<   |                     |          | j         |         d<   | 	                    | j         |                   | j         |<   d|z   }|
                    | j         |         |           d S || j         d<   |                     |d          }|| j         d<   |                     |          | j         d<   | 	                    | j                   | _         d}|
                    | j         |           d S )Nbalancer   r  r0   r   r   Br  accountTypecoinr   r   r   r   z	balances:r  )r  r   r   r   array_concatr"  parse_ws_balancerl   r   safe_balancer   )rd   r   r   r   r   r   rawBalancesaccountr   r   r  r   r   s                rf   handle_balancezbybit.handle_balance)  s   ^ <DL11)))G??7FB77D1c$ii(( @ @OODGS"55"//Q??DH??7FB77D1c$ii(( b bq"5500GG"//T__VU[]_=`=`aaDq#k**++ 	; 	;A!!+a.'::::t|W55=(*W%,0DL!&)))'488I1:DL!+.04Y0G0GDL!*-$($5$5dl76K$L$LDL!%/KNN4<0+>>>>>#'DL ))'488I(1DL%'+||I'>'>DL$,,T\::DL$KNN4<55555rg   c                    |                                  }|                     |dd          }|                     |          }|                     |g d          |d<   |                     |dd          |d<   |                     |d          |d	<   |7|                     | j        |          
i | j        |<   || j        |         |<   d S || j        |<   d S )
Nr   r  )availableToWithdrawrw  freer  r  llockedusedwalletBalancetotal)r  ry   r  r   rx   r   r  )rd   r  r  r  
currencyIdcodes         rf   r  zbybit.parse_ws_balance  s    4 ,,..''f==
&&z22,,W6q6q6qrr,,Wc8DD++G_EE"t|[99A,.[).5DL%d+++!(DLrg   c                    K   d|                                  |d}|                     ||          }|                     ||||           d {V S )N	subscribe)opreq_idargs)rm   r   watch_multiple)rd   r   r   r   r}   requestr   s          rf   r   zbybit.watch_topics	  sf      oo''
 

 ++gv..((mWfMMMMMMMMMrg   c                 F  K   |                                   d}|                     |          }|                    |          }|                     |j        |          }||                                 dz   }|                     |          }d}	|	|z   }
|                     |                     |
          |                     | j	                  t          j        d          }d| j        ||gd}|                     ||          }|                     ||||           | d {V S )Nauthenticatedi'  zGET/realtimehexauth)r  r  )check_required_credentialsr   rF  r   subscriptionsmillisecondsnumber_to_stringhmacencodesecrethashlibsha256apiKeyr   watch)rd   r   r}   r   r   rF  r  
expiresIntexpirespathr  	signaturer  r   s                 rf   r0  zbybit.authenticate  s"     '')))%S!!{++(<kJJ **,,u4J++J77G!D'>D		$++d"3"3T[[5M5Mw~_deeIK) G kk'622GJJsK+>>>||||||rg   c                    |                      |dd          }	 |B| j        dz   |                     |          z   }|                     | j        d         ||           |                     |d          }|w|su|                     |d          }|                     |di           }|                     |d          }|d	k    rt          d
|z             t          | j        dz   |z             dS # t          $ r_}	t          |	t                    r*d}
|                    |	|
           |
|j        v r|j        |
= n|                    |	           Y d }	~	dS d }	~	ww xY w)Nr  ret_code exactsuccessret_msgr  r  r  zAuthentication failed: Fr  T)ry   r   jsonthrow_exactly_matched_exception
exceptionsr   rx   r   r   	Exceptionr5  rejectr  )rd   r   r   r  feedbackr  r  r  r  errorr   s              rf   handle_error_messagezbybit.handle_error_message(  s~   4 !!'6:>>	7S=499W+=+==44T_W5MtU]^^^oogy99G"7"**7I>>//'9bAA%%gt44<<-.G'.QRRR'#(?@@@5 	 	 	%!455 %-e[111&"666,[9e$$$44444	s   CC. .
E8AEEc                 h   |                      ||          rd S |                     |d          }|dk    r|                     ||           d S |                     |d          }||                     ||           d S |                     |d          }|dk    r|                     ||           d S |                     |d          }|dk    r|                     ||           d S |                     |dd          }| j        | j        | j        | j        | j        | j	        | j	        | j        | j
        | j
        | j        | j        | j        | j        d}|                     ||          }	|	 |	||           d S t          |                                          }
t!          d	t#          |
                    D ]@}|
|         }|                    |
|                   d	k    r||         } |||            d S A|                     |d
          }|dk    s|dk    r|                     ||           d S d S )Nr  pongr  eventsubr   r   )r   kliner  rb  r   r$  publicTradedepthr  r  r,  r+  r-  r@  r   rs   r  	AUTH_RESP)r  rx   handle_pongrl   handle_subscription_statusr   r   rl  r   r  r  r;  r_  r   r6  r8  r   r   r   handle_authenticate)rd   r   r   r  r  r  r  r   methods
exacMethodr8  r   keyro   rs   s                  rf   handle_messagezbybit.handle_message[  sx   $$VW55 	F""7I66fVW---F  &11VW---Fgt,,<<VW---F  '22E>>++FG<<<F  '266/&&*('-+)#'#6./'+'<-
 
  __We44
!Jvw'''FGLLNN##q#d))$$ 	 	Aq'Czz$q'""a'' vw''' (
 00&LLdk11$$VW55555 21rg   c                 0    |                                  ddS )Nr[   )r  r  )rm   )rd   r   s     rf   r[   z
bybit.ping  s!    oo''
 
 	
rg   c                 <    |                      |d          |_        |S )Nr  )rl   lastPongrd   r   r   s      rf   r  zbybit.handle_pong  s      ++GV<<rg   c                 D   |                      |d          }d}|r1|                      |j        |          }|                    d           nTt          | j        dz   |                     |          z             }|                    ||           ||j        v r|j        |= |S )Nr  r  Tr  )r   rM  r   r   r   r  r  r  )rd   r   r   r  r   rF  r  s          rf   r  zbybit.handle_authenticate  s     //'955% 	6__V^[AAFNN4    '#		'8J8J(JKKEMM%---f222(5rg   c                     |S N r  s      rf   r  z bybit.handle_subscription_status  s	     rg   r  ):__name__
__module____qualname__rc   rm   r   r   r   r   r   r   r   r   r   r   r   r   r   r6  r   r   r   r
   r   r   r   r   r   r   r  r   r  r	  r(  r3  r;  r   rK  rC  rO  r_  r	   rd  rl  rh  r   r  r  r  r   r0  r  r  r[   r  r  r  __classcell__)re   s   @rf   r   r      s!       o o o o ob  
 485X\eg  S RU    @   68 K K KF K K K K. 6:" E E7 E E E E E:M:F M: M: M: M:^ 8<$]ajl H H HC HWZ Hquvzq{ H H H H4.,6 ., ., ., .,`
 
D 
 
 
 
2 @DB 	P 	PS 	P 	PS\ 	P 	P 	P 	P SW_a "! "!$s) "!C "!fo "! "! "! "!H:/ :/ :/ :/ :/x$ $ $3 3 3 <@d[] 
S 
S 
SS 
S 
Sbfglbm 
S 
S 
S 
S OSaenp S Sd3i S S[^ Suyz  vA S S S SB&,F &, &, &, &,PB B B BH   37TX\eg U UC Us URU Ulpqvlw U U U U<Y,v Y, Y, Y, Y,v 8<$]ajl V VW VC VWZ Vquv~q V V V V@
8 
8& 
87 
8 
8 
8 
8* * *&H2 H2 H2T 04$UYbd U U UC Us Uimnsit U U U U:m,6 m, m, m, m,^A A A AF *, -K -K -K -K -K -K^w6V w6 w6 w6 w6r%) %) %) %)N EG N N N N .0    ,16 1 1 1 1f56V 56 56 56 56n
 
 
&    &    *        rg   r   )ccxt.async_supportccxt ccxt.async_support.base.ws.cacher   r   r   r   rR  r  ccxt.base.typesr   r   r	   r
   r   r   r   r   r   r   !ccxt.async_support.base.ws.clientr   typingr   ccxt.base.errorsr   r   r   r   async_supportr   r  rg   rf   <module>r     se       A  A  A  A  A  A  A  A  A  A  A  A   k k k k k k k k k k k k k k k k k k k k k k k k 4 4 4 4 4 4       * * * * * * 0 0 0 0 0 0 . . . . . . ' ' ' ' ' 'w w w w wD$ w w w w wrg   