ccxt 4.3.28__py2.py3-none-any.whl → 4.3.30__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/bingx.py +88 -81
- ccxt/abstract/bitmart.py +1 -0
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/base/ws/aiohttp_client.py +1 -0
- ccxt/async_support/base/ws/future.py +27 -29
- ccxt/async_support/base/ws/order_book_side.py +3 -0
- ccxt/async_support/bingx.py +98 -84
- ccxt/async_support/bitmart.py +65 -1
- ccxt/async_support/coinex.py +254 -307
- ccxt/async_support/kucoin.py +1 -0
- ccxt/async_support/whitebit.py +44 -4
- ccxt/base/exchange.py +5 -1
- ccxt/bingx.py +98 -84
- ccxt/bitmart.py +65 -1
- ccxt/coinex.py +254 -307
- ccxt/kucoin.py +1 -0
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/bitfinex.py +4 -4
- ccxt/pro/bitfinex2.py +2 -2
- ccxt/pro/bitmex.py +3 -3
- ccxt/pro/blockchaincom.py +2 -2
- ccxt/pro/cryptocom.py +4 -4
- ccxt/pro/deribit.py +9 -9
- ccxt/pro/idex.py +1 -1
- ccxt/pro/luno.py +4 -5
- ccxt/pro/mexc.py +2 -2
- ccxt/whitebit.py +44 -4
- {ccxt-4.3.28.dist-info → ccxt-4.3.30.dist-info}/METADATA +4 -4
- {ccxt-4.3.28.dist-info → ccxt-4.3.30.dist-info}/RECORD +33 -33
- {ccxt-4.3.28.dist-info → ccxt-4.3.30.dist-info}/WHEEL +0 -0
- {ccxt-4.3.28.dist-info → ccxt-4.3.30.dist-info}/top_level.txt +0 -0
ccxt/async_support/kucoin.py
CHANGED
@@ -447,6 +447,7 @@ class kucoin(Exchange, ImplicitAPI):
|
|
447
447
|
'The withdrawal amount is below the minimum requirement.': ExchangeError, # {"code":"400100","msg":"The withdrawal amount is below the minimum requirement."}
|
448
448
|
'Unsuccessful! Exceeded the max. funds out-transfer limit': InsufficientFunds, # {"code":"200000","msg":"Unsuccessful! Exceeded the max. funds out-transfer limit"}
|
449
449
|
'The amount increment is invalid.': BadRequest,
|
450
|
+
'The quantity is below the minimum requirement.': InvalidOrder, # {"msg":"The quantity is below the minimum requirement.","code":"400100"}
|
450
451
|
'400': BadRequest,
|
451
452
|
'401': AuthenticationError,
|
452
453
|
'403': NotSupported,
|
ccxt/async_support/whitebit.py
CHANGED
@@ -45,6 +45,9 @@ class whitebit(Exchange, ImplicitAPI):
|
|
45
45
|
'cancelAllOrdersAfter': True,
|
46
46
|
'cancelOrder': True,
|
47
47
|
'cancelOrders': False,
|
48
|
+
'createMarketBuyOrderWithCost': True,
|
49
|
+
'createMarketOrderWithCost': False,
|
50
|
+
'createMarketSellOrderWithCost': False,
|
48
51
|
'createOrder': True,
|
49
52
|
'createStopLimitOrder': True,
|
50
53
|
'createStopMarketOrder': True,
|
@@ -1162,6 +1165,29 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1162
1165
|
#
|
1163
1166
|
return self.safe_integer(response, 'time')
|
1164
1167
|
|
1168
|
+
async def create_market_order_with_cost(self, symbol: str, side: OrderSide, cost: float, params={}):
|
1169
|
+
"""
|
1170
|
+
create a market order by providing the symbol, side and cost
|
1171
|
+
:param str symbol: unified symbol of the market to create an order in
|
1172
|
+
:param str side: 'buy' or 'sell'
|
1173
|
+
:param float cost: how much you want to trade in units of the quote currency
|
1174
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1175
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1176
|
+
"""
|
1177
|
+
params['cost'] = cost
|
1178
|
+
# only buy side is supported
|
1179
|
+
return await self.create_order(symbol, 'market', side, 0, None, params)
|
1180
|
+
|
1181
|
+
async def create_market_buy_order_with_cost(self, symbol: str, cost: float, params={}) -> Order:
|
1182
|
+
"""
|
1183
|
+
create a market buy order by providing the symbol and cost
|
1184
|
+
:param str symbol: unified symbol of the market to create an order in
|
1185
|
+
:param float cost: how much you want to trade in units of the quote currency
|
1186
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1187
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1188
|
+
"""
|
1189
|
+
return await self.create_market_order_with_cost(symbol, 'buy', cost, params)
|
1190
|
+
|
1165
1191
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
1166
1192
|
"""
|
1167
1193
|
create a trade order
|
@@ -1176,6 +1202,7 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1176
1202
|
:param float amount: how much of currency you want to trade in units of base currency
|
1177
1203
|
:param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
1178
1204
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1205
|
+
:param float [params.cost]: *market orders only* the cost of the order in units of the base currency
|
1179
1206
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1180
1207
|
"""
|
1181
1208
|
await self.load_markets()
|
@@ -1183,8 +1210,15 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1183
1210
|
request = {
|
1184
1211
|
'market': market['id'],
|
1185
1212
|
'side': side,
|
1186
|
-
'amount': self.amount_to_precision(symbol, amount),
|
1187
1213
|
}
|
1214
|
+
cost = None
|
1215
|
+
cost, params = self.handle_param_string(params, 'cost')
|
1216
|
+
if cost is not None:
|
1217
|
+
if (side != 'buy') or (type != 'market'):
|
1218
|
+
raise InvalidOrder(self.id + ' createOrder() cost is only supported for market buy orders')
|
1219
|
+
request['amount'] = self.cost_to_precision(symbol, cost)
|
1220
|
+
else:
|
1221
|
+
request['amount'] = self.amount_to_precision(symbol, amount)
|
1188
1222
|
clientOrderId = self.safe_string_2(params, 'clOrdId', 'clientOrderId')
|
1189
1223
|
if clientOrderId is None:
|
1190
1224
|
brokerId = self.safe_string(self.options, 'brokerId')
|
@@ -1232,7 +1266,10 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1232
1266
|
if useCollateralEndpoint:
|
1233
1267
|
response = await self.v4PrivatePostOrderCollateralMarket(self.extend(request, params))
|
1234
1268
|
else:
|
1235
|
-
|
1269
|
+
if cost is not None:
|
1270
|
+
response = await self.v4PrivatePostOrderMarket(self.extend(request, params))
|
1271
|
+
else:
|
1272
|
+
response = await self.v4PrivatePostOrderStockMarket(self.extend(request, params))
|
1236
1273
|
return self.parse_order(response)
|
1237
1274
|
|
1238
1275
|
async def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
|
@@ -1388,7 +1425,7 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1388
1425
|
balance = response[id]
|
1389
1426
|
if isinstance(balance, dict) and balance is not None:
|
1390
1427
|
account = self.account()
|
1391
|
-
account['free'] = self.
|
1428
|
+
account['free'] = self.safe_string_2(balance, 'available', 'main_balance')
|
1392
1429
|
account['used'] = self.safe_string(balance, 'freeze')
|
1393
1430
|
account['total'] = self.safe_string(balance, 'main_balance')
|
1394
1431
|
result[code] = account
|
@@ -1601,6 +1638,9 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1601
1638
|
stopPrice = self.safe_number(order, 'activation_price')
|
1602
1639
|
orderId = self.safe_string_2(order, 'orderId', 'id')
|
1603
1640
|
type = self.safe_string(order, 'type')
|
1641
|
+
orderType = self.parse_order_type(type)
|
1642
|
+
if orderType == 'market':
|
1643
|
+
remaining = None
|
1604
1644
|
amount = self.safe_string(order, 'amount')
|
1605
1645
|
cost = self.safe_string(order, 'dealMoney')
|
1606
1646
|
if (side == 'buy') and ((type == 'market') or (type == 'stop market')):
|
@@ -1627,7 +1667,7 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1627
1667
|
'status': None,
|
1628
1668
|
'side': side,
|
1629
1669
|
'price': price,
|
1630
|
-
'type':
|
1670
|
+
'type': orderType,
|
1631
1671
|
'stopPrice': stopPrice,
|
1632
1672
|
'triggerPrice': stopPrice,
|
1633
1673
|
'amount': amount,
|
ccxt/base/exchange.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
|
7
|
-
__version__ = '4.3.
|
7
|
+
__version__ = '4.3.30'
|
8
8
|
|
9
9
|
# -----------------------------------------------------------------------------
|
10
10
|
|
@@ -5712,6 +5712,8 @@ class Exchange(object):
|
|
5712
5712
|
|
5713
5713
|
def parse_margin_modes(self, response: List[object], symbols: List[str] = None, symbolKey: Str = None, marketType: MarketType = None):
|
5714
5714
|
marginModeStructures = {}
|
5715
|
+
if marketType is None:
|
5716
|
+
marketType = 'swap' # default to swap
|
5715
5717
|
for i in range(0, len(response)):
|
5716
5718
|
info = response[i]
|
5717
5719
|
marketId = self.safe_string(info, symbolKey)
|
@@ -5725,6 +5727,8 @@ class Exchange(object):
|
|
5725
5727
|
|
5726
5728
|
def parse_leverages(self, response: List[object], symbols: List[str] = None, symbolKey: Str = None, marketType: MarketType = None):
|
5727
5729
|
leverageStructures = {}
|
5730
|
+
if marketType is None:
|
5731
|
+
marketType = 'swap' # default to swap
|
5728
5732
|
for i in range(0, len(response)):
|
5729
5733
|
info = response[i]
|
5730
5734
|
marketId = self.safe_string(info, symbolKey)
|
ccxt/bingx.py
CHANGED
@@ -32,8 +32,7 @@ class bingx(Exchange, ImplicitAPI):
|
|
32
32
|
'id': 'bingx',
|
33
33
|
'name': 'BingX',
|
34
34
|
'countries': ['US'], # North America, Canada, the EU, Hong Kong and Taiwan
|
35
|
-
|
36
|
-
'rateLimit': 1000,
|
35
|
+
'rateLimit': 100,
|
37
36
|
'version': 'v1',
|
38
37
|
'certified': True,
|
39
38
|
'pro': True,
|
@@ -146,44 +145,54 @@ class bingx(Exchange, ImplicitAPI):
|
|
146
145
|
'v1': {
|
147
146
|
'public': {
|
148
147
|
'get': {
|
149
|
-
'server/time':
|
150
|
-
'common/symbols':
|
151
|
-
'market/trades':
|
152
|
-
'market/depth':
|
153
|
-
'market/kline':
|
148
|
+
'server/time': 1,
|
149
|
+
'common/symbols': 1,
|
150
|
+
'market/trades': 1,
|
151
|
+
'market/depth': 1,
|
152
|
+
'market/kline': 1,
|
154
153
|
'ticker/24hr': 1,
|
154
|
+
'ticker/price': 1,
|
155
|
+
'ticker/bookTicker': 1,
|
155
156
|
},
|
156
157
|
},
|
157
158
|
'private': {
|
158
159
|
'get': {
|
159
|
-
'trade/query':
|
160
|
-
'trade/openOrders':
|
161
|
-
'trade/historyOrders':
|
162
|
-
'trade/myTrades':
|
163
|
-
'user/commissionRate':
|
164
|
-
'account/balance':
|
160
|
+
'trade/query': 1,
|
161
|
+
'trade/openOrders': 1,
|
162
|
+
'trade/historyOrders': 1,
|
163
|
+
'trade/myTrades': 2,
|
164
|
+
'user/commissionRate': 5,
|
165
|
+
'account/balance': 2,
|
165
166
|
},
|
166
167
|
'post': {
|
167
|
-
'trade/order':
|
168
|
-
'trade/cancel':
|
169
|
-
'trade/batchOrders':
|
170
|
-
'trade/order/cancelReplace':
|
171
|
-
'trade/cancelOrders':
|
172
|
-
'trade/cancelOpenOrders':
|
173
|
-
'trade/cancelAllAfter':
|
168
|
+
'trade/order': 2,
|
169
|
+
'trade/cancel': 2,
|
170
|
+
'trade/batchOrders': 5,
|
171
|
+
'trade/order/cancelReplace': 5,
|
172
|
+
'trade/cancelOrders': 5,
|
173
|
+
'trade/cancelOpenOrders': 5,
|
174
|
+
'trade/cancelAllAfter': 5,
|
175
|
+
},
|
176
|
+
},
|
177
|
+
},
|
178
|
+
'v2': {
|
179
|
+
'public': {
|
180
|
+
'get': {
|
181
|
+
'market/depth': 1,
|
182
|
+
'market/kline': 1,
|
174
183
|
},
|
175
184
|
},
|
176
185
|
},
|
177
186
|
'v3': {
|
178
187
|
'private': {
|
179
188
|
'get': {
|
180
|
-
'get/asset/transfer':
|
181
|
-
'asset/transfer':
|
182
|
-
'capital/deposit/hisrec':
|
183
|
-
'capital/withdraw/history':
|
189
|
+
'get/asset/transfer': 1,
|
190
|
+
'asset/transfer': 1,
|
191
|
+
'capital/deposit/hisrec': 1,
|
192
|
+
'capital/withdraw/history': 1,
|
184
193
|
},
|
185
194
|
'post': {
|
186
|
-
'post/asset/transfer':
|
195
|
+
'post/asset/transfer': 5,
|
187
196
|
},
|
188
197
|
},
|
189
198
|
},
|
@@ -193,26 +202,27 @@ class bingx(Exchange, ImplicitAPI):
|
|
193
202
|
'public': {
|
194
203
|
'get': {
|
195
204
|
'ticker/price': 1,
|
205
|
+
'market/historicalTrades': 1,
|
196
206
|
},
|
197
207
|
},
|
198
208
|
'private': {
|
199
209
|
'get': {
|
200
|
-
'positionSide/dual':
|
210
|
+
'positionSide/dual': 5,
|
201
211
|
'market/markPriceKlines': 1,
|
202
|
-
'trade/batchCancelReplace':
|
203
|
-
'trade/fullOrder':
|
212
|
+
'trade/batchCancelReplace': 5,
|
213
|
+
'trade/fullOrder': 2,
|
204
214
|
},
|
205
215
|
'post': {
|
206
|
-
'trade/cancelReplace':
|
207
|
-
'positionSide/dual':
|
208
|
-
'trade/closePosition':
|
216
|
+
'trade/cancelReplace': 2,
|
217
|
+
'positionSide/dual': 5,
|
218
|
+
'trade/closePosition': 2,
|
209
219
|
},
|
210
220
|
},
|
211
221
|
},
|
212
222
|
'v2': {
|
213
223
|
'public': {
|
214
224
|
'get': {
|
215
|
-
'server/time':
|
225
|
+
'server/time': 1,
|
216
226
|
'quote/contracts': 1,
|
217
227
|
'quote/price': 1,
|
218
228
|
'quote/depth': 1,
|
@@ -227,35 +237,35 @@ class bingx(Exchange, ImplicitAPI):
|
|
227
237
|
},
|
228
238
|
'private': {
|
229
239
|
'get': {
|
230
|
-
'user/balance':
|
231
|
-
'user/positions':
|
232
|
-
'user/income':
|
233
|
-
'trade/openOrders':
|
234
|
-
'trade/openOrder':
|
235
|
-
'trade/order':
|
236
|
-
'trade/marginType':
|
237
|
-
'trade/leverage':
|
238
|
-
'trade/forceOrders':
|
239
|
-
'trade/allOrders':
|
240
|
-
'trade/allFillOrders':
|
241
|
-
'user/income/export':
|
242
|
-
'user/commissionRate':
|
243
|
-
'quote/bookTicker':
|
240
|
+
'user/balance': 2,
|
241
|
+
'user/positions': 2,
|
242
|
+
'user/income': 2,
|
243
|
+
'trade/openOrders': 2,
|
244
|
+
'trade/openOrder': 2,
|
245
|
+
'trade/order': 2,
|
246
|
+
'trade/marginType': 5,
|
247
|
+
'trade/leverage': 2,
|
248
|
+
'trade/forceOrders': 1,
|
249
|
+
'trade/allOrders': 2,
|
250
|
+
'trade/allFillOrders': 2,
|
251
|
+
'user/income/export': 2,
|
252
|
+
'user/commissionRate': 2,
|
253
|
+
'quote/bookTicker': 1,
|
244
254
|
},
|
245
255
|
'post': {
|
246
|
-
'trade/order':
|
247
|
-
'trade/batchOrders':
|
248
|
-
'trade/closeAllPositions':
|
249
|
-
'trade/cancelAllAfter':
|
250
|
-
'trade/marginType':
|
251
|
-
'trade/leverage':
|
252
|
-
'trade/positionMargin':
|
253
|
-
'trade/order/test':
|
256
|
+
'trade/order': 2,
|
257
|
+
'trade/batchOrders': 2,
|
258
|
+
'trade/closeAllPositions': 2,
|
259
|
+
'trade/cancelAllAfter': 5,
|
260
|
+
'trade/marginType': 5,
|
261
|
+
'trade/leverage': 5,
|
262
|
+
'trade/positionMargin': 5,
|
263
|
+
'trade/order/test': 2,
|
254
264
|
},
|
255
265
|
'delete': {
|
256
|
-
'trade/order':
|
257
|
-
'trade/batchOrders':
|
258
|
-
'trade/allOpenOrders':
|
266
|
+
'trade/order': 2,
|
267
|
+
'trade/batchOrders': 2,
|
268
|
+
'trade/allOpenOrders': 2,
|
259
269
|
},
|
260
270
|
},
|
261
271
|
},
|
@@ -271,9 +281,9 @@ class bingx(Exchange, ImplicitAPI):
|
|
271
281
|
'v1': {
|
272
282
|
'private': {
|
273
283
|
'get': {
|
274
|
-
'allPosition':
|
275
|
-
'allOrders':
|
276
|
-
'balance':
|
284
|
+
'allPosition': 2,
|
285
|
+
'allOrders': 2,
|
286
|
+
'balance': 2,
|
277
287
|
},
|
278
288
|
},
|
279
289
|
},
|
@@ -282,18 +292,19 @@ class bingx(Exchange, ImplicitAPI):
|
|
282
292
|
'v1': {
|
283
293
|
'private': {
|
284
294
|
'get': {
|
285
|
-
'capital/config/getall':
|
286
|
-
'capital/deposit/address':
|
295
|
+
'capital/config/getall': 5,
|
296
|
+
'capital/deposit/address': 5,
|
287
297
|
'capital/innerTransfer/records': 1,
|
288
|
-
'capital/subAccount/deposit/address':
|
289
|
-
'capital/deposit/subHisrec':
|
298
|
+
'capital/subAccount/deposit/address': 5,
|
299
|
+
'capital/deposit/subHisrec': 2,
|
290
300
|
'capital/subAccount/innerTransfer/records': 1,
|
301
|
+
'capital/deposit/riskRecords': 5,
|
291
302
|
},
|
292
303
|
'post': {
|
293
|
-
'capital/withdraw/apply':
|
294
|
-
'capital/innerTransfer/apply':
|
295
|
-
'capital/subAccountInnerTransfer/apply':
|
296
|
-
'capital/deposit/createSubAddress':
|
304
|
+
'capital/withdraw/apply': 5,
|
305
|
+
'capital/innerTransfer/apply': 5,
|
306
|
+
'capital/subAccountInnerTransfer/apply': 2,
|
307
|
+
'capital/deposit/createSubAddress': 2,
|
297
308
|
},
|
298
309
|
},
|
299
310
|
},
|
@@ -302,15 +313,15 @@ class bingx(Exchange, ImplicitAPI):
|
|
302
313
|
'v1': {
|
303
314
|
'private': {
|
304
315
|
'get': {
|
305
|
-
'list':
|
306
|
-
'assets':
|
316
|
+
'list': 10,
|
317
|
+
'assets': 2,
|
307
318
|
},
|
308
319
|
'post': {
|
309
|
-
'create':
|
310
|
-
'apiKey/create':
|
311
|
-
'apiKey/edit':
|
312
|
-
'apiKey/del':
|
313
|
-
'updateStatus':
|
320
|
+
'create': 10,
|
321
|
+
'apiKey/create': 2,
|
322
|
+
'apiKey/edit': 2,
|
323
|
+
'apiKey/del': 2,
|
324
|
+
'updateStatus': 10,
|
314
325
|
},
|
315
326
|
},
|
316
327
|
},
|
@@ -320,10 +331,10 @@ class bingx(Exchange, ImplicitAPI):
|
|
320
331
|
'private': {
|
321
332
|
'get': {
|
322
333
|
'uid': 1,
|
323
|
-
'apiKey/query':
|
334
|
+
'apiKey/query': 2,
|
324
335
|
},
|
325
336
|
'post': {
|
326
|
-
'innerTransfer/authorizeSubAccount':
|
337
|
+
'innerTransfer/authorizeSubAccount': 1,
|
327
338
|
},
|
328
339
|
},
|
329
340
|
},
|
@@ -332,10 +343,13 @@ class bingx(Exchange, ImplicitAPI):
|
|
332
343
|
'auth': {
|
333
344
|
'private': {
|
334
345
|
'post': {
|
335
|
-
'userDataStream':
|
346
|
+
'userDataStream': 2,
|
336
347
|
},
|
337
348
|
'put': {
|
338
|
-
'userDataStream':
|
349
|
+
'userDataStream': 2,
|
350
|
+
},
|
351
|
+
'delete': {
|
352
|
+
'userDataStream': 2,
|
339
353
|
},
|
340
354
|
},
|
341
355
|
},
|
@@ -344,12 +358,12 @@ class bingx(Exchange, ImplicitAPI):
|
|
344
358
|
'v1': {
|
345
359
|
'private': {
|
346
360
|
'get': {
|
347
|
-
'swap/trace/currentTrack':
|
361
|
+
'swap/trace/currentTrack': 2,
|
348
362
|
},
|
349
363
|
'post': {
|
350
|
-
'swap/trace/closeTrackOrder':
|
351
|
-
'swap/trace/setTPSL':
|
352
|
-
'spot/trader/sellOrder':
|
364
|
+
'swap/trace/closeTrackOrder': 2,
|
365
|
+
'swap/trace/setTPSL': 2,
|
366
|
+
'spot/trader/sellOrder': 10,
|
353
367
|
},
|
354
368
|
},
|
355
369
|
},
|
@@ -2375,7 +2389,7 @@ class bingx(Exchange, ImplicitAPI):
|
|
2375
2389
|
'stopLossPrice': stopLossPrice,
|
2376
2390
|
'takeProfitPrice': takeProfitPrice,
|
2377
2391
|
'average': self.safe_string_2(order, 'avgPrice', 'ap'),
|
2378
|
-
'cost':
|
2392
|
+
'cost': self.safe_string(order, 'cummulativeQuoteQty'),
|
2379
2393
|
'amount': self.safe_string_n(order, ['origQty', 'q', 'quantity']),
|
2380
2394
|
'filled': self.safe_string_2(order, 'executedQty', 'z'),
|
2381
2395
|
'remaining': None,
|
ccxt/bitmart.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from ccxt.base.exchange import Exchange
|
7
7
|
from ccxt.abstract.bitmart import ImplicitAPI
|
8
8
|
import hashlib
|
9
|
-
from ccxt.base.types import Balances, Currencies, Currency, Int, IsolatedBorrowRate, IsolatedBorrowRates, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry, TransferEntries
|
9
|
+
from ccxt.base.types import Balances, Currencies, Currency, Int, IsolatedBorrowRate, IsolatedBorrowRates, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry, TransferEntries
|
10
10
|
from typing import List
|
11
11
|
from ccxt.base.errors import ExchangeError
|
12
12
|
from ccxt.base.errors import AuthenticationError
|
@@ -59,6 +59,7 @@ class bitmart(Exchange, ImplicitAPI):
|
|
59
59
|
'createMarketOrderWithCost': False,
|
60
60
|
'createMarketSellOrderWithCost': False,
|
61
61
|
'createOrder': True,
|
62
|
+
'createOrders': True,
|
62
63
|
'createPostOnlyOrder': True,
|
63
64
|
'createStopLimitOrder': False,
|
64
65
|
'createStopMarketOrder': False,
|
@@ -243,6 +244,7 @@ class bitmart(Exchange, ImplicitAPI):
|
|
243
244
|
'spot/v4/query/trades': 5, # 12 times/2 sec = 6/s => 30/6 = 5
|
244
245
|
'spot/v4/query/order-trades': 5, # 12 times/2 sec = 6/s => 30/6 = 5
|
245
246
|
'spot/v4/cancel_orders': 3,
|
247
|
+
'spot/v4/batch_orders': 3,
|
246
248
|
# newer endpoint
|
247
249
|
'spot/v3/cancel_order': 1,
|
248
250
|
'spot/v2/batch_orders': 1,
|
@@ -2292,6 +2294,68 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2292
2294
|
order['price'] = price
|
2293
2295
|
return order
|
2294
2296
|
|
2297
|
+
def create_orders(self, orders: List[OrderRequest], params={}):
|
2298
|
+
"""
|
2299
|
+
create a list of trade orders
|
2300
|
+
:see: https://developer-pro.bitmart.com/en/spot/#new-batch-order-v4-signed
|
2301
|
+
:param Array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
|
2302
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2303
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
2304
|
+
"""
|
2305
|
+
self.load_markets()
|
2306
|
+
ordersRequests = []
|
2307
|
+
symbol = None
|
2308
|
+
market = None
|
2309
|
+
for i in range(0, len(orders)):
|
2310
|
+
rawOrder = orders[i]
|
2311
|
+
marketId = self.safe_string(rawOrder, 'symbol')
|
2312
|
+
market = self.market(marketId)
|
2313
|
+
if not market['spot']:
|
2314
|
+
raise NotSupported(self.id + ' createOrders() supports spot orders only')
|
2315
|
+
if symbol is None:
|
2316
|
+
symbol = marketId
|
2317
|
+
else:
|
2318
|
+
if symbol != marketId:
|
2319
|
+
raise BadRequest(self.id + ' createOrders() requires all orders to have the same symbol')
|
2320
|
+
type = self.safe_string(rawOrder, 'type')
|
2321
|
+
side = self.safe_string(rawOrder, 'side')
|
2322
|
+
amount = self.safe_value(rawOrder, 'amount')
|
2323
|
+
price = self.safe_value(rawOrder, 'price')
|
2324
|
+
orderParams = self.safe_dict(rawOrder, 'params', {})
|
2325
|
+
orderRequest = self.create_spot_order_request(marketId, type, side, amount, price, orderParams)
|
2326
|
+
orderRequest = self.omit(orderRequest, ['symbol']) # not needed because it goes in the outter object
|
2327
|
+
ordersRequests.append(orderRequest)
|
2328
|
+
request = {
|
2329
|
+
'symbol': market['id'],
|
2330
|
+
'orderParams': ordersRequests,
|
2331
|
+
}
|
2332
|
+
response = self.privatePostSpotV4BatchOrders(request)
|
2333
|
+
#
|
2334
|
+
# {
|
2335
|
+
# "message": "OK",
|
2336
|
+
# "code": 1000,
|
2337
|
+
# "trace": "5fc697fb817a4b5396284786a9b2609a.263.17022620476480263",
|
2338
|
+
# "data": {
|
2339
|
+
# "code": 0,
|
2340
|
+
# "msg": "success",
|
2341
|
+
# "data": {
|
2342
|
+
# "orderIds": [
|
2343
|
+
# "212751308355553320"
|
2344
|
+
# ]
|
2345
|
+
# }
|
2346
|
+
# }
|
2347
|
+
# }
|
2348
|
+
#
|
2349
|
+
data = self.safe_dict(response, 'data', {})
|
2350
|
+
innderData = self.safe_dict(data, 'data', {})
|
2351
|
+
orderIds = self.safe_list(innderData, 'orderIds', [])
|
2352
|
+
parsedOrders = []
|
2353
|
+
for i in range(0, len(orderIds)):
|
2354
|
+
orderId = orderIds[i]
|
2355
|
+
order = self.safe_order({'id': orderId}, market)
|
2356
|
+
parsedOrders.append(order)
|
2357
|
+
return parsedOrders
|
2358
|
+
|
2295
2359
|
def create_swap_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
2296
2360
|
"""
|
2297
2361
|
* @ignore
|