ccxt 4.3.56__py2.py3-none-any.whl → 4.3.57__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/async_support/__init__.py +1 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/base/ws/client.py +25 -5
- ccxt/async_support/bingx.py +45 -7
- ccxt/async_support/bitget.py +56 -47
- ccxt/async_support/coinone.py +15 -19
- ccxt/async_support/gate.py +96 -2
- ccxt/async_support/htx.py +84 -25
- ccxt/async_support/huobijp.py +61 -2
- ccxt/base/exchange.py +1 -1
- ccxt/bingx.py +45 -7
- ccxt/bitget.py +56 -47
- ccxt/coinone.py +15 -19
- ccxt/gate.py +96 -2
- ccxt/htx.py +84 -25
- ccxt/huobijp.py +61 -2
- ccxt/pro/__init__.py +1 -1
- {ccxt-4.3.56.dist-info → ccxt-4.3.57.dist-info}/METADATA +4 -4
- {ccxt-4.3.56.dist-info → ccxt-4.3.57.dist-info}/RECORD +23 -23
- {ccxt-4.3.56.dist-info → ccxt-4.3.57.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.3.56.dist-info → ccxt-4.3.57.dist-info}/WHEEL +0 -0
- {ccxt-4.3.56.dist-info → ccxt-4.3.57.dist-info}/top_level.txt +0 -0
ccxt/__init__.py
CHANGED
ccxt/async_support/__init__.py
CHANGED
@@ -4,7 +4,7 @@ from asyncio import sleep, ensure_future, wait_for, TimeoutError
|
|
4
4
|
from .functions import milliseconds, iso8601, deep_extend
|
5
5
|
from ccxt import NetworkError, RequestTimeout, NotSupported
|
6
6
|
from ccxt.async_support.base.ws.future import Future
|
7
|
-
|
7
|
+
from collections import deque
|
8
8
|
|
9
9
|
class Client(object):
|
10
10
|
|
@@ -14,6 +14,8 @@ class Client(object):
|
|
14
14
|
options = {} # ws-specific options
|
15
15
|
subscriptions = {}
|
16
16
|
rejections = {}
|
17
|
+
message_queue = {}
|
18
|
+
useMessageQueue = True
|
17
19
|
on_message_callback = None
|
18
20
|
on_error_callback = None
|
19
21
|
on_close_callback = None
|
@@ -68,15 +70,32 @@ class Client(object):
|
|
68
70
|
if message_hash in self.rejections:
|
69
71
|
future.reject(self.rejections[message_hash])
|
70
72
|
del self.rejections[message_hash]
|
73
|
+
del self.message_queue[message_hash]
|
74
|
+
return future
|
75
|
+
if self.useMessageQueue and message_hash in self.message_queue:
|
76
|
+
queue = self.message_queue[message_hash]
|
77
|
+
if len(queue):
|
78
|
+
future.resolve(queue.popleft())
|
71
79
|
return future
|
72
80
|
|
73
81
|
def resolve(self, result, message_hash):
|
74
82
|
if self.verbose and message_hash is None:
|
75
83
|
self.log(iso8601(milliseconds()), 'resolve received None messageHash')
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
84
|
+
|
85
|
+
if self.useMessageQueue:
|
86
|
+
if message_hash not in self.message_queue:
|
87
|
+
self.message_queue[message_hash] = deque(maxlen=10)
|
88
|
+
queue = self.message_queue[message_hash]
|
89
|
+
queue.append(result)
|
90
|
+
if message_hash in self.futures:
|
91
|
+
future = self.futures[message_hash]
|
92
|
+
future.resolve(queue.popleft())
|
93
|
+
del self.futures[message_hash]
|
94
|
+
else:
|
95
|
+
if message_hash in self.futures:
|
96
|
+
future = self.futures[message_hash]
|
97
|
+
future.resolve(result)
|
98
|
+
del self.futures[message_hash]
|
80
99
|
return result
|
81
100
|
|
82
101
|
def reject(self, result, message_hash=None):
|
@@ -165,6 +184,7 @@ class Client(object):
|
|
165
184
|
ensure_future(self.close(code), loop=self.asyncio_loop)
|
166
185
|
|
167
186
|
def reset(self, error):
|
187
|
+
self.message_queue = {}
|
168
188
|
self.reject(error)
|
169
189
|
|
170
190
|
async def ping_loop(self):
|
ccxt/async_support/bingx.py
CHANGED
@@ -675,6 +675,29 @@ class bingx(Exchange, ImplicitAPI):
|
|
675
675
|
markets = self.safe_list(response, 'data', [])
|
676
676
|
return self.parse_markets(markets)
|
677
677
|
|
678
|
+
async def fetch_inverse_swap_markets(self, params):
|
679
|
+
response = await self.cswapV1PublicGetMarketContracts(params)
|
680
|
+
#
|
681
|
+
# {
|
682
|
+
# "code": 0,
|
683
|
+
# "msg": "",
|
684
|
+
# "timestamp": 1720074487610,
|
685
|
+
# "data": [
|
686
|
+
# {
|
687
|
+
# "symbol": "BNB-USD",
|
688
|
+
# "pricePrecision": 2,
|
689
|
+
# "minTickSize": "10",
|
690
|
+
# "minTradeValue": "10",
|
691
|
+
# "minQty": "1.00000000",
|
692
|
+
# "status": 1,
|
693
|
+
# "timeOnline": 1713175200000
|
694
|
+
# },
|
695
|
+
# ]
|
696
|
+
# }
|
697
|
+
#
|
698
|
+
markets = self.safe_list(response, 'data', [])
|
699
|
+
return self.parse_markets(markets)
|
700
|
+
|
678
701
|
def parse_market(self, market: dict) -> Market:
|
679
702
|
id = self.safe_string(market, 'symbol')
|
680
703
|
symbolParts = id.split('-')
|
@@ -683,6 +706,14 @@ class bingx(Exchange, ImplicitAPI):
|
|
683
706
|
base = self.safe_currency_code(baseId)
|
684
707
|
quote = self.safe_currency_code(quoteId)
|
685
708
|
currency = self.safe_string(market, 'currency')
|
709
|
+
checkIsInverse = False
|
710
|
+
checkIsLinear = True
|
711
|
+
minTickSize = self.safe_number(market, 'minTickSize')
|
712
|
+
if minTickSize is not None:
|
713
|
+
# inverse swap market
|
714
|
+
currency = baseId
|
715
|
+
checkIsInverse = True
|
716
|
+
checkIsLinear = False
|
686
717
|
settle = self.safe_currency_code(currency)
|
687
718
|
pricePrecision = self.safe_number(market, 'tickSize')
|
688
719
|
if pricePrecision is None:
|
@@ -699,8 +730,11 @@ class bingx(Exchange, ImplicitAPI):
|
|
699
730
|
fees = self.safe_dict(self.fees, type, {})
|
700
731
|
contractSize = self.parse_number('1') if (swap) else None
|
701
732
|
isActive = self.safe_string(market, 'status') == '1'
|
702
|
-
isInverse = None if (spot) else
|
703
|
-
isLinear = None if (spot) else
|
733
|
+
isInverse = None if (spot) else checkIsInverse
|
734
|
+
isLinear = None if (spot) else checkIsLinear
|
735
|
+
timeOnline = self.safe_integer(market, 'timeOnline')
|
736
|
+
if timeOnline == 0:
|
737
|
+
timeOnline = None
|
704
738
|
return self.safe_market_structure({
|
705
739
|
'id': id,
|
706
740
|
'symbol': symbol,
|
@@ -742,15 +776,15 @@ class bingx(Exchange, ImplicitAPI):
|
|
742
776
|
'max': self.safe_number(market, 'maxQty'),
|
743
777
|
},
|
744
778
|
'price': {
|
745
|
-
'min':
|
779
|
+
'min': minTickSize,
|
746
780
|
'max': None,
|
747
781
|
},
|
748
782
|
'cost': {
|
749
|
-
'min': self.
|
783
|
+
'min': self.safe_number_n(market, ['minNotional', 'tradeMinUSDT', 'minTradeValue']),
|
750
784
|
'max': self.safe_number(market, 'maxNotional'),
|
751
785
|
},
|
752
786
|
},
|
753
|
-
'created':
|
787
|
+
'created': timeOnline,
|
754
788
|
'info': market,
|
755
789
|
})
|
756
790
|
|
@@ -759,16 +793,20 @@ class bingx(Exchange, ImplicitAPI):
|
|
759
793
|
retrieves data on all markets for bingx
|
760
794
|
:see: https://bingx-api.github.io/docs/#/spot/market-api.html#Query%20Symbols
|
761
795
|
:see: https://bingx-api.github.io/docs/#/swapV2/market-api.html#Contract%20Information
|
796
|
+
:see: https://bingx-api.github.io/docs/#/en-us/cswap/market-api.html#Contract%20Information
|
762
797
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
763
798
|
:returns dict[]: an array of objects representing market data
|
764
799
|
"""
|
765
800
|
requests = [self.fetch_swap_markets(params)]
|
766
801
|
isSandbox = self.safe_bool(self.options, 'sandboxMode', False)
|
767
802
|
if not isSandbox:
|
803
|
+
requests.append(self.fetch_inverse_swap_markets(params))
|
768
804
|
requests.append(self.fetch_spot_markets(params)) # sandbox is swap only
|
769
805
|
promises = await asyncio.gather(*requests)
|
770
|
-
|
771
|
-
|
806
|
+
linearSwapMarkets = self.safe_list(promises, 0, [])
|
807
|
+
inverseSwapMarkets = self.safe_list(promises, 1, [])
|
808
|
+
spotMarkets = self.safe_list(promises, 2, [])
|
809
|
+
swapMarkets = self.array_concat(linearSwapMarkets, inverseSwapMarkets)
|
772
810
|
return self.array_concat(spotMarkets, swapMarkets)
|
773
811
|
|
774
812
|
async def fetch_ohlcv(self, symbol: str, timeframe='1m', since: Int = None, limit: Int = None, params={}) -> List[list]:
|
ccxt/async_support/bitget.py
CHANGED
@@ -4692,6 +4692,22 @@ class bitget(Exchange, ImplicitAPI):
|
|
4692
4692
|
response = await self.privateMarginPostMarginV1CrossOrderBatchCancelOrder(self.extend(request, params))
|
4693
4693
|
else:
|
4694
4694
|
response = await self.privateMarginPostMarginV1IsolatedOrderBatchCancelOrder(self.extend(request, params))
|
4695
|
+
#
|
4696
|
+
# {
|
4697
|
+
# "code": "00000",
|
4698
|
+
# "msg": "success",
|
4699
|
+
# "requestTime": 1700717155622,
|
4700
|
+
# "data": {
|
4701
|
+
# "resultList": [
|
4702
|
+
# {
|
4703
|
+
# "orderId": "1111453253721796609",
|
4704
|
+
# "clientOid": "2ae7fc8a4ff949b6b60d770ca3950e2d"
|
4705
|
+
# },
|
4706
|
+
# ],
|
4707
|
+
# "failure": []
|
4708
|
+
# }
|
4709
|
+
# }
|
4710
|
+
#
|
4695
4711
|
else:
|
4696
4712
|
if stop:
|
4697
4713
|
stopRequest: dict = {
|
@@ -4700,6 +4716,27 @@ class bitget(Exchange, ImplicitAPI):
|
|
4700
4716
|
response = await self.privateSpotPostV2SpotTradeBatchCancelPlanOrder(self.extend(stopRequest, params))
|
4701
4717
|
else:
|
4702
4718
|
response = await self.privateSpotPostV2SpotTradeCancelSymbolOrder(self.extend(request, params))
|
4719
|
+
#
|
4720
|
+
# {
|
4721
|
+
# "code": "00000",
|
4722
|
+
# "msg": "success",
|
4723
|
+
# "requestTime": 1700716953996,
|
4724
|
+
# "data": {
|
4725
|
+
# "symbol": "BTCUSDT"
|
4726
|
+
# }
|
4727
|
+
# }
|
4728
|
+
#
|
4729
|
+
timestamp = self.safe_integer(response, 'requestTime')
|
4730
|
+
responseData = self.safe_dict(response, 'data')
|
4731
|
+
marketId = self.safe_string(responseData, 'symbol')
|
4732
|
+
return [
|
4733
|
+
self.safe_order({
|
4734
|
+
'info': response,
|
4735
|
+
'symbol': self.safe_symbol(marketId, None, None, 'spot'),
|
4736
|
+
'timestamp': timestamp,
|
4737
|
+
'datetime': self.iso8601(timestamp),
|
4738
|
+
}),
|
4739
|
+
]
|
4703
4740
|
else:
|
4704
4741
|
productType = None
|
4705
4742
|
productType, params = self.handle_product_type_and_params(market, params)
|
@@ -4708,53 +4745,25 @@ class bitget(Exchange, ImplicitAPI):
|
|
4708
4745
|
response = await self.privateMixPostV2MixOrderCancelPlanOrder(self.extend(request, params))
|
4709
4746
|
else:
|
4710
4747
|
response = await self.privateMixPostV2MixOrderBatchCancelOrders(self.extend(request, params))
|
4711
|
-
|
4712
|
-
|
4713
|
-
|
4714
|
-
|
4715
|
-
|
4716
|
-
|
4717
|
-
|
4718
|
-
|
4719
|
-
|
4720
|
-
|
4721
|
-
|
4722
|
-
|
4723
|
-
|
4724
|
-
|
4725
|
-
|
4726
|
-
|
4727
|
-
|
4728
|
-
|
4729
|
-
|
4730
|
-
# "successList": [
|
4731
|
-
# {
|
4732
|
-
# "orderId": "1024598257429823488",
|
4733
|
-
# "clientOid": "876493ce-c287-4bfc-9f4a-8b1905881313"
|
4734
|
-
# },
|
4735
|
-
# ],
|
4736
|
-
# "failureList": []
|
4737
|
-
# }
|
4738
|
-
# }
|
4739
|
-
#
|
4740
|
-
# spot margin
|
4741
|
-
#
|
4742
|
-
# {
|
4743
|
-
# "code": "00000",
|
4744
|
-
# "msg": "success",
|
4745
|
-
# "requestTime": 1700717155622,
|
4746
|
-
# "data": {
|
4747
|
-
# "resultList": [
|
4748
|
-
# {
|
4749
|
-
# "orderId": "1111453253721796609",
|
4750
|
-
# "clientOid": "2ae7fc8a4ff949b6b60d770ca3950e2d"
|
4751
|
-
# },
|
4752
|
-
# ],
|
4753
|
-
# "failure": []
|
4754
|
-
# }
|
4755
|
-
# }
|
4756
|
-
#
|
4757
|
-
return response
|
4748
|
+
# {
|
4749
|
+
# "code": "00000",
|
4750
|
+
# "msg": "success",
|
4751
|
+
# "requestTime": "1680008815965",
|
4752
|
+
# "data": {
|
4753
|
+
# "successList": [
|
4754
|
+
# {
|
4755
|
+
# "orderId": "1024598257429823488",
|
4756
|
+
# "clientOid": "876493ce-c287-4bfc-9f4a-8b1905881313"
|
4757
|
+
# },
|
4758
|
+
# ],
|
4759
|
+
# "failureList": []
|
4760
|
+
# }
|
4761
|
+
# }
|
4762
|
+
data = self.safe_dict(response, 'data')
|
4763
|
+
resultList = self.safe_list_2(data, 'resultList', 'successList')
|
4764
|
+
failureList = self.safe_list_2(data, 'failure', 'failureList')
|
4765
|
+
responseList = self.array_concat(resultList, failureList)
|
4766
|
+
return self.parse_orders(responseList)
|
4758
4767
|
|
4759
4768
|
async def fetch_order(self, id: str, symbol: Str = None, params={}):
|
4760
4769
|
"""
|
ccxt/async_support/coinone.py
CHANGED
@@ -25,8 +25,7 @@ class coinone(Exchange, ImplicitAPI):
|
|
25
25
|
'id': 'coinone',
|
26
26
|
'name': 'CoinOne',
|
27
27
|
'countries': ['KR'], # Korea
|
28
|
-
|
29
|
-
'rateLimit': 667,
|
28
|
+
'rateLimit': 50,
|
30
29
|
'version': 'v2',
|
31
30
|
'pro': False,
|
32
31
|
'has': {
|
@@ -198,10 +197,10 @@ class coinone(Exchange, ImplicitAPI):
|
|
198
197
|
},
|
199
198
|
'precisionMode': TICK_SIZE,
|
200
199
|
'exceptions': {
|
201
|
-
'
|
202
|
-
'
|
203
|
-
'108': BadSymbol,
|
204
|
-
'
|
200
|
+
'104': OrderNotFound,
|
201
|
+
'107': BadRequest,
|
202
|
+
'108': BadSymbol,
|
203
|
+
'405': OnMaintenance,
|
205
204
|
},
|
206
205
|
'commonCurrencies': {
|
207
206
|
'SOC': 'Soda Coin',
|
@@ -1111,17 +1110,14 @@ class coinone(Exchange, ImplicitAPI):
|
|
1111
1110
|
|
1112
1111
|
def handle_errors(self, code: int, reason: str, url: str, method: str, headers: dict, body: str, response, requestHeaders, requestBody):
|
1113
1112
|
if response is None:
|
1114
|
-
return None
|
1115
|
-
|
1116
|
-
|
1117
|
-
|
1118
|
-
|
1119
|
-
|
1120
|
-
|
1121
|
-
|
1122
|
-
|
1123
|
-
|
1124
|
-
raise ExchangeError(feedback)
|
1125
|
-
else:
|
1126
|
-
raise ExchangeError(self.id + ' ' + body)
|
1113
|
+
return None # fallback to default error handler
|
1114
|
+
#
|
1115
|
+
# {"result":"error","error_code":"107","error_msg":"Parameter value is wrong"}
|
1116
|
+
# {"result":"error","error_code":"108","error_msg":"Unknown CryptoCurrency"}
|
1117
|
+
#
|
1118
|
+
errorCode = self.safe_string(response, 'error_code')
|
1119
|
+
if errorCode != '0':
|
1120
|
+
feedback = self.id + ' ' + body
|
1121
|
+
self.throw_exactly_matched_exception(self.exceptions, errorCode, feedback)
|
1122
|
+
raise ExchangeError(feedback) # unknown message
|
1127
1123
|
return None
|
ccxt/async_support/gate.py
CHANGED
@@ -7,7 +7,7 @@ from ccxt.async_support.base.exchange import Exchange
|
|
7
7
|
from ccxt.abstract.gate import ImplicitAPI
|
8
8
|
import asyncio
|
9
9
|
import hashlib
|
10
|
-
from ccxt.base.types import Balances, Currencies, Currency, FundingHistory, Greeks, Int, Leverage, Leverages, LeverageTier, LeverageTiers, MarginModification, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
|
10
|
+
from ccxt.base.types import Balances, Currencies, Currency, FundingHistory, Greeks, Int, Leverage, Leverages, LeverageTier, LeverageTiers, MarginModification, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
|
11
11
|
from typing import List
|
12
12
|
from ccxt.base.errors import ExchangeError
|
13
13
|
from ccxt.base.errors import AuthenticationError
|
@@ -100,6 +100,8 @@ class gate(Exchange, ImplicitAPI):
|
|
100
100
|
'borrowIsolatedMargin': True,
|
101
101
|
'cancelAllOrders': True,
|
102
102
|
'cancelOrder': True,
|
103
|
+
'cancelOrders': True,
|
104
|
+
'cancelOrdersForSymbols': True,
|
103
105
|
'createMarketBuyOrderWithCost': True,
|
104
106
|
'createMarketOrder': True,
|
105
107
|
'createMarketOrderWithCost': False,
|
@@ -4185,6 +4187,8 @@ class gate(Exchange, ImplicitAPI):
|
|
4185
4187
|
# "message": "Not enough balance"
|
4186
4188
|
# }
|
4187
4189
|
#
|
4190
|
+
# {"user_id":10406147,"id":"id","succeeded":false,"message":"INVALID_PROTOCOL","label":"INVALID_PROTOCOL"}
|
4191
|
+
#
|
4188
4192
|
succeeded = self.safe_bool(order, 'succeeded', True)
|
4189
4193
|
if not succeeded:
|
4190
4194
|
# cancelOrders response
|
@@ -4192,6 +4196,7 @@ class gate(Exchange, ImplicitAPI):
|
|
4192
4196
|
'clientOrderId': self.safe_string(order, 'text'),
|
4193
4197
|
'info': order,
|
4194
4198
|
'status': 'rejected',
|
4199
|
+
'id': self.safe_string(order, 'id'),
|
4195
4200
|
})
|
4196
4201
|
put = self.safe_value_2(order, 'put', 'initial', {})
|
4197
4202
|
trigger = self.safe_value(order, 'trigger', {})
|
@@ -4727,6 +4732,81 @@ class gate(Exchange, ImplicitAPI):
|
|
4727
4732
|
#
|
4728
4733
|
return self.parse_order(response, market)
|
4729
4734
|
|
4735
|
+
async def cancel_orders(self, ids: List[str], symbol: Str = None, params={}):
|
4736
|
+
"""
|
4737
|
+
cancel multiple orders
|
4738
|
+
:see: https://www.gate.io/docs/developers/apiv4/en/#cancel-a-batch-of-orders-with-an-id-list
|
4739
|
+
:see: https://www.gate.io/docs/developers/apiv4/en/#cancel-a-batch-of-orders-with-an-id-list-2
|
4740
|
+
:param str[] ids: order ids
|
4741
|
+
:param str symbol: unified symbol of the market the order was made in
|
4742
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
4743
|
+
:returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
4744
|
+
"""
|
4745
|
+
await self.load_markets()
|
4746
|
+
market = None
|
4747
|
+
if symbol is not None:
|
4748
|
+
market = self.market(symbol)
|
4749
|
+
type = None
|
4750
|
+
defaultSettle = 'usdt' if (market is None) else market['settle']
|
4751
|
+
settle = self.safe_string_lower(params, 'settle', defaultSettle)
|
4752
|
+
type, params = self.handle_market_type_and_params('cancelOrders', market, params)
|
4753
|
+
isSpot = (type == 'spot')
|
4754
|
+
if isSpot and (symbol is None):
|
4755
|
+
raise ArgumentsRequired(self.id + ' cancelOrders requires a symbol argument for spot markets')
|
4756
|
+
if isSpot:
|
4757
|
+
ordersRequests = []
|
4758
|
+
for i in range(0, len(ids)):
|
4759
|
+
id = ids[i]
|
4760
|
+
orderItem: dict = {
|
4761
|
+
'id': id,
|
4762
|
+
'symbol': symbol,
|
4763
|
+
}
|
4764
|
+
ordersRequests.append(orderItem)
|
4765
|
+
return await self.cancel_orders_for_symbols(ordersRequests, params)
|
4766
|
+
request = {
|
4767
|
+
'settle': settle,
|
4768
|
+
}
|
4769
|
+
finalList = [request] # hacky but needs to be done here
|
4770
|
+
for i in range(0, len(ids)):
|
4771
|
+
finalList.append(ids[i])
|
4772
|
+
response = await self.privateFuturesPostSettleBatchCancelOrders(finalList)
|
4773
|
+
return self.parse_orders(response)
|
4774
|
+
|
4775
|
+
async def cancel_orders_for_symbols(self, orders: List[CancellationRequest], params={}):
|
4776
|
+
"""
|
4777
|
+
cancel multiple orders for multiple symbols
|
4778
|
+
:see: https://www.gate.io/docs/developers/apiv4/en/#cancel-a-batch-of-orders-with-an-id-list
|
4779
|
+
:param str[] ids: order ids
|
4780
|
+
:param str symbol: unified symbol of the market the order was made in
|
4781
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
4782
|
+
:param str[] [params.clientOrderIds]: client order ids
|
4783
|
+
:returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
4784
|
+
"""
|
4785
|
+
await self.load_markets()
|
4786
|
+
ordersRequests = []
|
4787
|
+
for i in range(0, len(orders)):
|
4788
|
+
order = orders[i]
|
4789
|
+
symbol = self.safe_string(order, 'symbol')
|
4790
|
+
market = self.market(symbol)
|
4791
|
+
if not market['spot']:
|
4792
|
+
raise NotSupported(self.id + ' cancelOrdersForSymbols() supports only spot markets')
|
4793
|
+
id = self.safe_string(order, 'id')
|
4794
|
+
orderItem: dict = {
|
4795
|
+
'id': id,
|
4796
|
+
'currency_pair': market['id'],
|
4797
|
+
}
|
4798
|
+
ordersRequests.append(orderItem)
|
4799
|
+
response = await self.privateSpotPostCancelBatchOrders(ordersRequests)
|
4800
|
+
#
|
4801
|
+
# [
|
4802
|
+
# {
|
4803
|
+
# "currency_pair": "BTC_USDT",
|
4804
|
+
# "id": "123456"
|
4805
|
+
# }
|
4806
|
+
# ]
|
4807
|
+
#
|
4808
|
+
return self.parse_orders(response)
|
4809
|
+
|
4730
4810
|
async def cancel_all_orders(self, symbol: Str = None, params={}):
|
4731
4811
|
"""
|
4732
4812
|
cancel all open orders
|
@@ -5653,7 +5733,20 @@ class gate(Exchange, ImplicitAPI):
|
|
5653
5733
|
authentication = api[0] # public, private
|
5654
5734
|
type = api[1] # spot, margin, future, delivery
|
5655
5735
|
query = self.omit(params, self.extract_params(path))
|
5656
|
-
|
5736
|
+
containsSettle = path.find('settle') > -1
|
5737
|
+
if containsSettle and path.endswith('batch_cancel_orders'): # weird check to prevent $settle in php and converting {settle} to array(settle)
|
5738
|
+
# special case where we need to extract the settle from the path
|
5739
|
+
# but the body is an array of strings
|
5740
|
+
settle = self.safe_dict(params, 0)
|
5741
|
+
path = self.implode_params(path, settle)
|
5742
|
+
# remove the first element from params
|
5743
|
+
newParams = []
|
5744
|
+
anyParams = params
|
5745
|
+
for i in range(1, len(anyParams)):
|
5746
|
+
newParams.append(params[i])
|
5747
|
+
params = newParams
|
5748
|
+
query = newParams
|
5749
|
+
elif isinstance(params, list):
|
5657
5750
|
# endpoints like createOrders use an array instead of an object
|
5658
5751
|
# so we infer the settle from one of the elements
|
5659
5752
|
# they have to be all the same so relying on the first one is fine
|
@@ -7012,6 +7105,7 @@ class gate(Exchange, ImplicitAPI):
|
|
7012
7105
|
# {"label": "INVALID_PARAM_VALUE", "message": "invalid argument: Trigger.rule"}
|
7013
7106
|
# {"label": "INVALID_PARAM_VALUE", "message": "invalid argument: trigger.expiration invalid range"}
|
7014
7107
|
# {"label": "INVALID_ARGUMENT", "detail": "invalid size"}
|
7108
|
+
# {"user_id":10406147,"id":"id","succeeded":false,"message":"INVALID_PROTOCOL","label":"INVALID_PROTOCOL"}
|
7015
7109
|
#
|
7016
7110
|
label = self.safe_string(response, 'label')
|
7017
7111
|
if label is not None:
|
ccxt/async_support/htx.py
CHANGED
@@ -5522,7 +5522,62 @@ class htx(Exchange, ImplicitAPI):
|
|
5522
5522
|
# "ts": 1604367997451
|
5523
5523
|
# }
|
5524
5524
|
#
|
5525
|
-
|
5525
|
+
data = self.safe_dict(response, 'data')
|
5526
|
+
return self.parse_cancel_orders(data)
|
5527
|
+
|
5528
|
+
def parse_cancel_orders(self, orders):
|
5529
|
+
#
|
5530
|
+
# {
|
5531
|
+
# "success": [
|
5532
|
+
# "5983466"
|
5533
|
+
# ],
|
5534
|
+
# "failed": [
|
5535
|
+
# {
|
5536
|
+
# "err-msg": "Incorrect order state",
|
5537
|
+
# "order-state": 7,
|
5538
|
+
# "order-id": "",
|
5539
|
+
# "err-code": "order-orderstate-error",
|
5540
|
+
# "client-order-id": "first"
|
5541
|
+
# },
|
5542
|
+
# ...
|
5543
|
+
# ]
|
5544
|
+
# }
|
5545
|
+
#
|
5546
|
+
# {
|
5547
|
+
# "errors": [
|
5548
|
+
# {
|
5549
|
+
# "order_id": "769206471845261312",
|
5550
|
+
# "err_code": 1061,
|
5551
|
+
# "err_msg": "This order doesnt exist."
|
5552
|
+
# }
|
5553
|
+
# ],
|
5554
|
+
# "successes": "1258075374411399168,1258075393254871040"
|
5555
|
+
# }
|
5556
|
+
#
|
5557
|
+
successes = self.safe_string(orders, 'successes')
|
5558
|
+
success = None
|
5559
|
+
if successes is not None:
|
5560
|
+
success = successes.split(',')
|
5561
|
+
else:
|
5562
|
+
success = self.safe_list(orders, 'success', [])
|
5563
|
+
failed = self.safe_list_2(orders, 'errors', 'failed', [])
|
5564
|
+
result = []
|
5565
|
+
for i in range(0, len(success)):
|
5566
|
+
order = success[i]
|
5567
|
+
result.append(self.safe_order({
|
5568
|
+
'info': order,
|
5569
|
+
'id': order,
|
5570
|
+
'status': 'canceled',
|
5571
|
+
}))
|
5572
|
+
for i in range(0, len(failed)):
|
5573
|
+
order = failed[i]
|
5574
|
+
result.append(self.safe_order({
|
5575
|
+
'info': order,
|
5576
|
+
'id': self.safe_string_2(order, 'order-id', 'order_id'),
|
5577
|
+
'status': 'failed',
|
5578
|
+
'clientOrderId': self.safe_string(order, 'client-order-id'),
|
5579
|
+
}))
|
5580
|
+
return result
|
5526
5581
|
|
5527
5582
|
async def cancel_all_orders(self, symbol: Str = None, params={}):
|
5528
5583
|
"""
|
@@ -5559,6 +5614,22 @@ class htx(Exchange, ImplicitAPI):
|
|
5559
5614
|
if symbol is not None:
|
5560
5615
|
request['symbol'] = market['id']
|
5561
5616
|
response = await self.spotPrivatePostV1OrderOrdersBatchCancelOpenOrders(self.extend(request, params))
|
5617
|
+
#
|
5618
|
+
# {
|
5619
|
+
# "code": 200,
|
5620
|
+
# "data": {
|
5621
|
+
# "success-count": 2,
|
5622
|
+
# "failed-count": 0,
|
5623
|
+
# "next-id": 5454600
|
5624
|
+
# }
|
5625
|
+
# }
|
5626
|
+
#
|
5627
|
+
data = self.safe_dict(response, 'data')
|
5628
|
+
return [
|
5629
|
+
self.safe_order({
|
5630
|
+
'info': data,
|
5631
|
+
}),
|
5632
|
+
]
|
5562
5633
|
else:
|
5563
5634
|
if symbol is None:
|
5564
5635
|
raise ArgumentsRequired(self.id + ' cancelAllOrders() requires a symbol argument')
|
@@ -5612,30 +5683,18 @@ class htx(Exchange, ImplicitAPI):
|
|
5612
5683
|
response = await self.contractPrivatePostApiV1ContractCancelall(self.extend(request, params))
|
5613
5684
|
else:
|
5614
5685
|
raise NotSupported(self.id + ' cancelAllOrders() does not support ' + marketType + ' markets')
|
5615
|
-
|
5616
|
-
|
5617
|
-
|
5618
|
-
|
5619
|
-
|
5620
|
-
|
5621
|
-
|
5622
|
-
|
5623
|
-
|
5624
|
-
|
5625
|
-
|
5626
|
-
|
5627
|
-
# future and swap
|
5628
|
-
#
|
5629
|
-
# {
|
5630
|
-
# "status": "ok",
|
5631
|
-
# "data": {
|
5632
|
-
# "errors": [],
|
5633
|
-
# "successes": "1104754904426696704"
|
5634
|
-
# },
|
5635
|
-
# "ts": "1683435723755"
|
5636
|
-
# }
|
5637
|
-
#
|
5638
|
-
return response
|
5686
|
+
#
|
5687
|
+
# {
|
5688
|
+
# "status": "ok",
|
5689
|
+
# "data": {
|
5690
|
+
# "errors": [],
|
5691
|
+
# "successes": "1104754904426696704"
|
5692
|
+
# },
|
5693
|
+
# "ts": "1683435723755"
|
5694
|
+
# }
|
5695
|
+
#
|
5696
|
+
data = self.safe_dict(response, 'data')
|
5697
|
+
return self.parse_cancel_orders(data)
|
5639
5698
|
|
5640
5699
|
async def cancel_all_orders_after(self, timeout: Int, params={}):
|
5641
5700
|
"""
|