ccxt 4.3.19__py2.py3-none-any.whl → 4.3.21__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ccxt might be problematic. Click here for more details.
- ccxt/__init__.py +1 -1
- ccxt/abstract/binance.py +1 -0
- ccxt/abstract/binancecoinm.py +1 -0
- ccxt/abstract/binanceus.py +1 -0
- ccxt/abstract/binanceusdm.py +1 -0
- ccxt/abstract/bitget.py +3 -0
- ccxt/abstract/coinex.py +1 -1
- ccxt/abstract/okx.py +3 -0
- ccxt/ascendex.py +1 -1
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/ascendex.py +1 -1
- ccxt/async_support/base/exchange.py +3 -1
- ccxt/async_support/binance.py +8 -2
- ccxt/async_support/bingx.py +1 -1
- ccxt/async_support/bitget.py +4 -1
- ccxt/async_support/bitmex.py +1 -0
- ccxt/async_support/bybit.py +35 -9
- ccxt/async_support/coinex.py +177 -200
- ccxt/async_support/delta.py +1 -1
- ccxt/async_support/digifinex.py +1 -1
- ccxt/async_support/exmo.py +1 -1
- ccxt/async_support/gate.py +1 -1
- ccxt/async_support/hitbtc.py +1 -1
- ccxt/async_support/hyperliquid.py +25 -3
- ccxt/async_support/okx.py +4 -1
- ccxt/async_support/phemex.py +15 -7
- ccxt/base/exchange.py +4 -2
- ccxt/binance.py +8 -2
- ccxt/bingx.py +1 -1
- ccxt/bitget.py +4 -1
- ccxt/bitmex.py +1 -0
- ccxt/bybit.py +35 -9
- ccxt/coinex.py +177 -200
- ccxt/delta.py +1 -1
- ccxt/digifinex.py +1 -1
- ccxt/exmo.py +1 -1
- ccxt/gate.py +1 -1
- ccxt/hitbtc.py +1 -1
- ccxt/hyperliquid.py +25 -3
- ccxt/okx.py +4 -1
- ccxt/phemex.py +15 -7
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/htx.py +12 -6
- ccxt/pro/kucoinfutures.py +89 -1
- ccxt/pro/woo.py +46 -22
- {ccxt-4.3.19.dist-info → ccxt-4.3.21.dist-info}/METADATA +4 -4
- {ccxt-4.3.19.dist-info → ccxt-4.3.21.dist-info}/RECORD +49 -49
- {ccxt-4.3.19.dist-info → ccxt-4.3.21.dist-info}/WHEEL +0 -0
- {ccxt-4.3.19.dist-info → ccxt-4.3.21.dist-info}/top_level.txt +0 -0
ccxt/phemex.py
CHANGED
@@ -2347,12 +2347,14 @@ class phemex(Exchange, ImplicitAPI):
|
|
2347
2347
|
"""
|
2348
2348
|
create a trade order
|
2349
2349
|
:see: https://github.com/phemex/phemex-api-docs/blob/master/Public-Hedged-Perpetual-API.md#place-order
|
2350
|
+
:see: https://phemex-docs.github.io/#place-order-http-put-prefered-3
|
2350
2351
|
:param str symbol: unified symbol of the market to create an order in
|
2351
2352
|
:param str type: 'market' or 'limit'
|
2352
2353
|
:param str side: 'buy' or 'sell'
|
2353
2354
|
:param float amount: how much of currency you want to trade in units of base currency
|
2354
2355
|
:param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
2355
2356
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2357
|
+
:param float [params.trigger]: trigger price for conditional orders
|
2356
2358
|
:param dict [params.takeProfit]: *swap only* *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered(perpetual swap markets only)
|
2357
2359
|
:param float [params.takeProfit.triggerPrice]: take profit trigger price
|
2358
2360
|
:param dict [params.stopLoss]: *swap only* *stopLoss object in params* containing the triggerPrice at which the attached stop loss order will be triggered(perpetual swap markets only)
|
@@ -2363,7 +2365,7 @@ class phemex(Exchange, ImplicitAPI):
|
|
2363
2365
|
market = self.market(symbol)
|
2364
2366
|
requestSide = self.capitalize(side)
|
2365
2367
|
type = self.capitalize(type)
|
2366
|
-
reduceOnly = self.
|
2368
|
+
reduceOnly = self.safe_bool(params, 'reduceOnly')
|
2367
2369
|
request = {
|
2368
2370
|
# common
|
2369
2371
|
'symbol': market['id'],
|
@@ -2404,18 +2406,24 @@ class phemex(Exchange, ImplicitAPI):
|
|
2404
2406
|
else:
|
2405
2407
|
request['clOrdID'] = clientOrderId
|
2406
2408
|
params = self.omit(params, ['clOrdID', 'clientOrderId'])
|
2407
|
-
|
2408
|
-
if
|
2409
|
+
triggerPrice = self.safe_string_n(params, ['stopPx', 'stopPrice', 'triggerPrice'])
|
2410
|
+
if triggerPrice is not None:
|
2409
2411
|
if market['settle'] == 'USDT':
|
2410
|
-
request['stopPxRp'] = self.price_to_precision(symbol,
|
2412
|
+
request['stopPxRp'] = self.price_to_precision(symbol, triggerPrice)
|
2411
2413
|
else:
|
2412
|
-
request['stopPxEp'] = self.to_ep(
|
2414
|
+
request['stopPxEp'] = self.to_ep(triggerPrice, market)
|
2413
2415
|
params = self.omit(params, ['stopPx', 'stopPrice', 'stopLoss', 'takeProfit', 'triggerPrice'])
|
2414
2416
|
if market['spot']:
|
2415
2417
|
qtyType = self.safe_value(params, 'qtyType', 'ByBase')
|
2416
2418
|
if (type == 'Market') or (type == 'Stop') or (type == 'MarketIfTouched'):
|
2417
2419
|
if price is not None:
|
2418
2420
|
qtyType = 'ByQuote'
|
2421
|
+
if triggerPrice is not None:
|
2422
|
+
if type == 'Limit':
|
2423
|
+
request['ordType'] = 'StopLimit'
|
2424
|
+
elif type == 'Market':
|
2425
|
+
request['ordType'] = 'Stop'
|
2426
|
+
request['trigger'] = 'ByLastPrice'
|
2419
2427
|
request['qtyType'] = qtyType
|
2420
2428
|
if qtyType == 'ByQuote':
|
2421
2429
|
cost = self.safe_number(params, 'cost')
|
@@ -2446,7 +2454,7 @@ class phemex(Exchange, ImplicitAPI):
|
|
2446
2454
|
request['orderQtyRq'] = amount
|
2447
2455
|
else:
|
2448
2456
|
request['orderQty'] = self.parse_to_int(amount)
|
2449
|
-
if
|
2457
|
+
if triggerPrice is not None:
|
2450
2458
|
triggerType = self.safe_string(params, 'triggerType', 'ByMarkPrice')
|
2451
2459
|
request['triggerType'] = triggerType
|
2452
2460
|
if stopLossDefined or takeProfitDefined:
|
@@ -3782,7 +3790,7 @@ class phemex(Exchange, ImplicitAPI):
|
|
3782
3790
|
}
|
3783
3791
|
return self.safe_string(statuses, status, status)
|
3784
3792
|
|
3785
|
-
def parse_margin_modification(self, data, market: Market = None) -> MarginModification:
|
3793
|
+
def parse_margin_modification(self, data: dict, market: Market = None) -> MarginModification:
|
3786
3794
|
#
|
3787
3795
|
# {
|
3788
3796
|
# "code": 0,
|
ccxt/pro/__init__.py
CHANGED
ccxt/pro/htx.py
CHANGED
@@ -1772,7 +1772,7 @@ class htx(ccxt.async_support.htx):
|
|
1772
1772
|
# "data": {"user-id": "35930539"}
|
1773
1773
|
# }
|
1774
1774
|
#
|
1775
|
-
promise = client.futures['
|
1775
|
+
promise = client.futures['auth']
|
1776
1776
|
promise.resolve(message)
|
1777
1777
|
|
1778
1778
|
def handle_error_message(self, client: Client, message):
|
@@ -1800,6 +1800,12 @@ class htx(ccxt.async_support.htx):
|
|
1800
1800
|
# 'err-msg': "Non - single account user is not available, please check through the cross and isolated account asset interface",
|
1801
1801
|
# "ts": 1698419490189
|
1802
1802
|
# }
|
1803
|
+
# {
|
1804
|
+
# "action":"req",
|
1805
|
+
# "code":2002,
|
1806
|
+
# "ch":"auth",
|
1807
|
+
# "message":"auth.fail"
|
1808
|
+
# }
|
1803
1809
|
#
|
1804
1810
|
status = self.safe_string(message, 'status')
|
1805
1811
|
if status == 'error':
|
@@ -1810,6 +1816,7 @@ class htx(ccxt.async_support.htx):
|
|
1810
1816
|
errorCode = self.safe_string(message, 'err-code')
|
1811
1817
|
try:
|
1812
1818
|
self.throw_exactly_matched_exception(self.exceptions['ws']['exact'], errorCode, self.json(message))
|
1819
|
+
raise ExchangeError(self.json(message))
|
1813
1820
|
except Exception as e:
|
1814
1821
|
messageHash = self.safe_string(subscription, 'messageHash')
|
1815
1822
|
client.reject(e, messageHash)
|
@@ -1817,11 +1824,12 @@ class htx(ccxt.async_support.htx):
|
|
1817
1824
|
if id in client.subscriptions:
|
1818
1825
|
del client.subscriptions[id]
|
1819
1826
|
return False
|
1820
|
-
code = self.
|
1821
|
-
if code is not None and ((code != 200) and (code != 0)):
|
1827
|
+
code = self.safe_string_2(message, 'code', 'err-code')
|
1828
|
+
if code is not None and ((code != '200') and (code != '0')):
|
1822
1829
|
feedback = self.id + ' ' + self.json(message)
|
1823
1830
|
try:
|
1824
1831
|
self.throw_exactly_matched_exception(self.exceptions['ws']['exact'], code, feedback)
|
1832
|
+
raise ExchangeError(feedback)
|
1825
1833
|
except Exception as e:
|
1826
1834
|
if isinstance(e, AuthenticationError):
|
1827
1835
|
client.reject(e, 'auth')
|
@@ -2137,8 +2145,6 @@ class htx(ccxt.async_support.htx):
|
|
2137
2145
|
'url': url,
|
2138
2146
|
'hostname': hostname,
|
2139
2147
|
}
|
2140
|
-
if type == 'spot':
|
2141
|
-
self.options['ws']['gunzip'] = False
|
2142
2148
|
await self.authenticate(authParams)
|
2143
2149
|
return await self.watch(url, messageHash, self.extend(request, params), channel, extendedSubsription)
|
2144
2150
|
|
@@ -2149,7 +2155,7 @@ class htx(ccxt.async_support.htx):
|
|
2149
2155
|
if url is None or hostname is None or type is None:
|
2150
2156
|
raise ArgumentsRequired(self.id + ' authenticate requires a url, hostname and type argument')
|
2151
2157
|
self.check_required_credentials()
|
2152
|
-
messageHash = '
|
2158
|
+
messageHash = 'auth'
|
2153
2159
|
relativePath = url.replace('wss://' + hostname, '')
|
2154
2160
|
client = self.client(url)
|
2155
2161
|
future = client.future(messageHash)
|
ccxt/pro/kucoinfutures.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
5
5
|
|
6
6
|
import ccxt.async_support
|
7
|
-
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById
|
7
|
+
from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
|
8
8
|
from ccxt.base.types import Balances, Int, Order, OrderBook, Position, Str, Strings, Ticker, Tickers, Trade
|
9
9
|
from ccxt.async_support.base.ws.client import Client
|
10
10
|
from typing import List
|
@@ -22,6 +22,7 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
|
|
22
22
|
'watchTickers': True,
|
23
23
|
'watchBidsAsks': True,
|
24
24
|
'watchTrades': True,
|
25
|
+
'watchOHLCV': True,
|
25
26
|
'watchOrderBook': True,
|
26
27
|
'watchOrders': True,
|
27
28
|
'watchBalance': True,
|
@@ -32,6 +33,21 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
|
|
32
33
|
'watchOrderBookForSymbols': True,
|
33
34
|
},
|
34
35
|
'options': {
|
36
|
+
'timeframes': {
|
37
|
+
'1m': '1min',
|
38
|
+
'3m': '1min',
|
39
|
+
'5m': '5min',
|
40
|
+
'15m': '15min',
|
41
|
+
'30m': '30min',
|
42
|
+
'1h': '1hour',
|
43
|
+
'2h': '2hour',
|
44
|
+
'4h': '4hour',
|
45
|
+
'8h': '8hour',
|
46
|
+
'12h': '12hour',
|
47
|
+
'1d': '1day',
|
48
|
+
'1w': '1week',
|
49
|
+
'1M': '1month',
|
50
|
+
},
|
35
51
|
'accountsByType': {
|
36
52
|
'swap': 'future',
|
37
53
|
'cross': 'margin',
|
@@ -540,6 +556,77 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
|
|
540
556
|
client.resolve(trades, messageHash)
|
541
557
|
return message
|
542
558
|
|
559
|
+
async def watch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
560
|
+
"""
|
561
|
+
:see: https://www.kucoin.com/docs/websocket/futures-trading/public-channels/klines
|
562
|
+
watches historical candlestick data containing the open, high, low, and close price, and the volume of a market
|
563
|
+
:param str symbol: unified symbol of the market to fetch OHLCV data for
|
564
|
+
:param str timeframe: the length of time each candle represents
|
565
|
+
:param int [since]: timestamp in ms of the earliest candle to fetch
|
566
|
+
:param int [limit]: the maximum amount of candles to fetch
|
567
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
568
|
+
:returns int[][]: A list of candles ordered, open, high, low, close, volume
|
569
|
+
"""
|
570
|
+
await self.load_markets()
|
571
|
+
symbol = self.symbol(symbol)
|
572
|
+
url = await self.negotiate(False)
|
573
|
+
marketId = self.market_id(symbol)
|
574
|
+
timeframes = self.safe_dict(self.options, 'timeframes')
|
575
|
+
timeframeId = self.safe_string(timeframes, timeframe, timeframe)
|
576
|
+
topic = '/contractMarket/limitCandle:' + marketId + '_' + timeframeId
|
577
|
+
messageHash = 'ohlcv::' + symbol + '_' + timeframe
|
578
|
+
ohlcv = await self.subscribe(url, messageHash, topic, None, params)
|
579
|
+
if self.newUpdates:
|
580
|
+
limit = ohlcv.getLimit(symbol, limit)
|
581
|
+
return self.filter_by_since_limit(ohlcv, since, limit, 0, True)
|
582
|
+
|
583
|
+
def handle_ohlcv(self, client: Client, message):
|
584
|
+
#
|
585
|
+
# {
|
586
|
+
# "topic":"/contractMarket/limitCandle:LTCUSDTM_1min",
|
587
|
+
# "type":"message",
|
588
|
+
# "data":{
|
589
|
+
# "symbol":"LTCUSDTM",
|
590
|
+
# "candles":[
|
591
|
+
# "1715470980",
|
592
|
+
# "81.38",
|
593
|
+
# "81.38",
|
594
|
+
# "81.38",
|
595
|
+
# "81.38",
|
596
|
+
# "61.0",
|
597
|
+
# "61"
|
598
|
+
# ],
|
599
|
+
# "time":1715470994801
|
600
|
+
# },
|
601
|
+
# "subject":"candle.stick"
|
602
|
+
# }
|
603
|
+
#
|
604
|
+
topic = self.safe_string(message, 'topic')
|
605
|
+
parts = topic.split('_')
|
606
|
+
timeframeId = self.safe_string(parts, 1)
|
607
|
+
data = self.safe_dict(message, 'data')
|
608
|
+
timeframes = self.safe_dict(self.options, 'timeframes')
|
609
|
+
timeframe = self.find_timeframe(timeframeId, timeframes)
|
610
|
+
marketId = self.safe_string(data, 'symbol')
|
611
|
+
symbol = self.safe_symbol(marketId)
|
612
|
+
messageHash = 'ohlcv::' + symbol + '_' + timeframe
|
613
|
+
ohlcv = self.safe_list(data, 'candles')
|
614
|
+
parsed = [
|
615
|
+
self.safe_integer(ohlcv, 0),
|
616
|
+
self.safe_number(ohlcv, 1),
|
617
|
+
self.safe_number(ohlcv, 2),
|
618
|
+
self.safe_number(ohlcv, 3),
|
619
|
+
self.safe_number(ohlcv, 4),
|
620
|
+
self.safe_number(ohlcv, 6), # Note value 5 is incorrect and will be fixed in subsequent versions of kucoin
|
621
|
+
]
|
622
|
+
self.ohlcvs[symbol] = self.safe_dict(self.ohlcvs, symbol, {})
|
623
|
+
if not (timeframe in self.ohlcvs[symbol]):
|
624
|
+
limit = self.safe_integer(self.options, 'OHLCVLimit', 1000)
|
625
|
+
self.ohlcvs[symbol][timeframe] = ArrayCacheByTimestamp(limit)
|
626
|
+
stored = self.ohlcvs[symbol][timeframe]
|
627
|
+
stored.append(parsed)
|
628
|
+
client.resolve(stored, messageHash)
|
629
|
+
|
543
630
|
async def watch_order_book(self, symbol: str, limit: Int = None, params={}) -> OrderBook:
|
544
631
|
"""
|
545
632
|
watches information on open orders with bid(buy) and ask(sell) prices, volumes and other data
|
@@ -923,6 +1010,7 @@ class kucoinfutures(ccxt.async_support.kucoinfutures):
|
|
923
1010
|
methods = {
|
924
1011
|
'level2': self.handle_order_book,
|
925
1012
|
'ticker': self.handle_ticker,
|
1013
|
+
'candle.stick': self.handle_ohlcv,
|
926
1014
|
'tickerV2': self.handle_bid_ask,
|
927
1015
|
'availableBalance.change': self.handle_balance,
|
928
1016
|
'match': self.handle_trade,
|
ccxt/pro/woo.py
CHANGED
@@ -531,6 +531,16 @@ class woo(ccxt.async_support.woo):
|
|
531
531
|
request = self.extend(subscribe, message)
|
532
532
|
return await self.watch(url, messageHash, request, messageHash, subscribe)
|
533
533
|
|
534
|
+
async def watch_private_multiple(self, messageHashes, message, params={}):
|
535
|
+
await self.authenticate(params)
|
536
|
+
url = self.urls['api']['ws']['private'] + '/' + self.uid
|
537
|
+
requestId = self.request_id(url)
|
538
|
+
subscribe = {
|
539
|
+
'id': requestId,
|
540
|
+
}
|
541
|
+
request = self.extend(subscribe, message)
|
542
|
+
return await self.watch_multiple(url, messageHashes, request, messageHashes, subscribe)
|
543
|
+
|
534
544
|
async def watch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
535
545
|
"""
|
536
546
|
:see: https://docs.woo.org/#executionreport
|
@@ -540,10 +550,13 @@ class woo(ccxt.async_support.woo):
|
|
540
550
|
:param int [since]: the earliest time in ms to fetch orders for
|
541
551
|
:param int [limit]: the maximum number of order structures to retrieve
|
542
552
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
553
|
+
:param bool [params.trigger]: True if trigger order
|
543
554
|
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
544
555
|
"""
|
545
556
|
await self.load_markets()
|
546
|
-
|
557
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger', False)
|
558
|
+
topic = 'algoexecutionreportv2' if (trigger) else 'executionreport'
|
559
|
+
params = self.omit(params, ['stop', 'trigger'])
|
547
560
|
messageHash = topic
|
548
561
|
if symbol is not None:
|
549
562
|
market = self.market(symbol)
|
@@ -562,15 +575,19 @@ class woo(ccxt.async_support.woo):
|
|
562
575
|
async def watch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
|
563
576
|
"""
|
564
577
|
:see: https://docs.woo.org/#executionreport
|
578
|
+
:see: https://docs.woo.org/#algoexecutionreportv2
|
565
579
|
watches information on multiple trades made by the user
|
566
580
|
:param str symbol: unified market symbol of the market orders were made in
|
567
581
|
:param int [since]: the earliest time in ms to fetch orders for
|
568
582
|
:param int [limit]: the maximum number of order structures to retrieve
|
569
583
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
584
|
+
:param bool [params.trigger]: True if trigger order
|
570
585
|
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
571
586
|
"""
|
572
587
|
await self.load_markets()
|
573
|
-
|
588
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger', False)
|
589
|
+
topic = 'algoexecutionreportv2' if (trigger) else 'executionreport'
|
590
|
+
params = self.omit(params, ['stop', 'trigger'])
|
574
591
|
messageHash = 'myTrades'
|
575
592
|
if symbol is not None:
|
576
593
|
market = self.market(symbol)
|
@@ -692,14 +709,24 @@ class woo(ccxt.async_support.woo):
|
|
692
709
|
# }
|
693
710
|
# }
|
694
711
|
#
|
695
|
-
|
696
|
-
|
697
|
-
if (
|
698
|
-
|
699
|
-
|
712
|
+
topic = self.safe_string(message, 'topic')
|
713
|
+
data = self.safe_value(message, 'data')
|
714
|
+
if isinstance(data, list):
|
715
|
+
# algoexecutionreportv2
|
716
|
+
for i in range(0, len(data)):
|
717
|
+
order = data[i]
|
718
|
+
tradeId = self.omit_zero(self.safe_string(data, 'tradeId'))
|
719
|
+
if tradeId is not None:
|
720
|
+
self.handle_my_trade(client, order)
|
721
|
+
self.handle_order(client, order, topic)
|
722
|
+
else:
|
723
|
+
# executionreport
|
724
|
+
tradeId = self.omit_zero(self.safe_string(data, 'tradeId'))
|
725
|
+
if tradeId is not None:
|
726
|
+
self.handle_my_trade(client, data)
|
727
|
+
self.handle_order(client, data, topic)
|
700
728
|
|
701
|
-
def handle_order(self, client: Client, message):
|
702
|
-
topic = 'executionreport'
|
729
|
+
def handle_order(self, client: Client, message, topic):
|
703
730
|
parsed = self.parse_ws_order(message)
|
704
731
|
symbol = self.safe_string(parsed, 'symbol')
|
705
732
|
orderId = self.safe_string(parsed, 'id')
|
@@ -776,11 +803,14 @@ class woo(ccxt.async_support.woo):
|
|
776
803
|
:returns dict[]: a list of `position structure <https://docs.ccxt.com/en/latest/manual.html#position-structure>`
|
777
804
|
"""
|
778
805
|
await self.load_markets()
|
779
|
-
|
806
|
+
messageHashes = []
|
780
807
|
symbols = self.market_symbols(symbols)
|
781
808
|
if not self.is_empty(symbols):
|
782
|
-
|
783
|
-
|
809
|
+
for i in range(0, len(symbols)):
|
810
|
+
symbol = symbols[i]
|
811
|
+
messageHashes.append('positions::' + symbol)
|
812
|
+
else:
|
813
|
+
messageHashes.append('positions')
|
784
814
|
url = self.urls['api']['ws']['private'] + '/' + self.uid
|
785
815
|
client = self.client(url)
|
786
816
|
self.set_positions_cache(client, symbols)
|
@@ -793,7 +823,7 @@ class woo(ccxt.async_support.woo):
|
|
793
823
|
'event': 'subscribe',
|
794
824
|
'topic': 'position',
|
795
825
|
}
|
796
|
-
newPositions = await self.
|
826
|
+
newPositions = await self.watch_private_multiple(messageHashes, request, params)
|
797
827
|
if self.newUpdates:
|
798
828
|
return newPositions
|
799
829
|
return self.filter_by_symbols_since_limit(self.positions, symbols, since, limit, True)
|
@@ -862,15 +892,8 @@ class woo(ccxt.async_support.woo):
|
|
862
892
|
position = self.parse_position(rawPosition, market)
|
863
893
|
newPositions.append(position)
|
864
894
|
cache.append(position)
|
865
|
-
|
866
|
-
|
867
|
-
messageHash = messageHashes[i]
|
868
|
-
parts = messageHash.split('::')
|
869
|
-
symbolsString = parts[1]
|
870
|
-
symbols = symbolsString.split(',')
|
871
|
-
positions = self.filter_by_array(newPositions, 'symbol', symbols, False)
|
872
|
-
if not self.is_empty(positions):
|
873
|
-
client.resolve(positions, messageHash)
|
895
|
+
messageHash = 'positions::' + market['symbol']
|
896
|
+
client.resolve(position, messageHash)
|
874
897
|
client.resolve(newPositions, 'positions')
|
875
898
|
|
876
899
|
async def watch_balance(self, params={}) -> Balances:
|
@@ -978,6 +1001,7 @@ class woo(ccxt.async_support.woo):
|
|
978
1001
|
'kline': self.handle_ohlcv,
|
979
1002
|
'auth': self.handle_auth,
|
980
1003
|
'executionreport': self.handle_order_update,
|
1004
|
+
'algoexecutionreportv2': self.handle_order_update,
|
981
1005
|
'trade': self.handle_trade,
|
982
1006
|
'balance': self.handle_balance,
|
983
1007
|
'position': self.handle_positions,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: ccxt
|
3
|
-
Version: 4.3.
|
3
|
+
Version: 4.3.21
|
4
4
|
Summary: A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges
|
5
5
|
Home-page: https://ccxt.com
|
6
6
|
Author: Igor Kroitor
|
@@ -264,13 +264,13 @@ console.log(version, Object.keys(exchanges));
|
|
264
264
|
|
265
265
|
All-in-one browser bundle (dependencies included), served from a CDN of your choice:
|
266
266
|
|
267
|
-
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.
|
268
|
-
* unpkg: https://unpkg.com/ccxt@4.3.
|
267
|
+
* jsDelivr: https://cdn.jsdelivr.net/npm/ccxt@4.3.21/dist/ccxt.browser.js
|
268
|
+
* unpkg: https://unpkg.com/ccxt@4.3.21/dist/ccxt.browser.js
|
269
269
|
|
270
270
|
CDNs are not updated in real-time and may have delays. Defaulting to the most recent version without specifying the version number is not recommended. Please, keep in mind that we are not responsible for the correct operation of those CDN servers.
|
271
271
|
|
272
272
|
```HTML
|
273
|
-
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.
|
273
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/ccxt@4.3.21/dist/ccxt.browser.js"></script>
|
274
274
|
```
|
275
275
|
|
276
276
|
Creates a global `ccxt` object:
|