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.

@@ -33,8 +33,7 @@ class bingx(Exchange, ImplicitAPI):
33
33
  'id': 'bingx',
34
34
  'name': 'BingX',
35
35
  'countries': ['US'], # North America, Canada, the EU, Hong Kong and Taiwan
36
- # cheapest is 60 requests a minute = 1 requests per second on average =>( 1000ms / 1) = 1000 ms between requests on average
37
- 'rateLimit': 1000,
36
+ 'rateLimit': 100,
38
37
  'version': 'v1',
39
38
  'certified': True,
40
39
  'pro': True,
@@ -147,44 +146,54 @@ class bingx(Exchange, ImplicitAPI):
147
146
  'v1': {
148
147
  'public': {
149
148
  'get': {
150
- 'server/time': 3,
151
- 'common/symbols': 3,
152
- 'market/trades': 3,
153
- 'market/depth': 3,
154
- 'market/kline': 3,
149
+ 'server/time': 1,
150
+ 'common/symbols': 1,
151
+ 'market/trades': 1,
152
+ 'market/depth': 1,
153
+ 'market/kline': 1,
155
154
  'ticker/24hr': 1,
155
+ 'ticker/price': 1,
156
+ 'ticker/bookTicker': 1,
156
157
  },
157
158
  },
158
159
  'private': {
159
160
  'get': {
160
- 'trade/query': 3,
161
- 'trade/openOrders': 3,
162
- 'trade/historyOrders': 3,
163
- 'trade/myTrades': 3,
164
- 'user/commissionRate': 3,
165
- 'account/balance': 3,
161
+ 'trade/query': 1,
162
+ 'trade/openOrders': 1,
163
+ 'trade/historyOrders': 1,
164
+ 'trade/myTrades': 2,
165
+ 'user/commissionRate': 5,
166
+ 'account/balance': 2,
166
167
  },
167
168
  'post': {
168
- 'trade/order': 3,
169
- 'trade/cancel': 3,
170
- 'trade/batchOrders': 3,
171
- 'trade/order/cancelReplace': 3,
172
- 'trade/cancelOrders': 3,
173
- 'trade/cancelOpenOrders': 3,
174
- 'trade/cancelAllAfter': 1,
169
+ 'trade/order': 2,
170
+ 'trade/cancel': 2,
171
+ 'trade/batchOrders': 5,
172
+ 'trade/order/cancelReplace': 5,
173
+ 'trade/cancelOrders': 5,
174
+ 'trade/cancelOpenOrders': 5,
175
+ 'trade/cancelAllAfter': 5,
176
+ },
177
+ },
178
+ },
179
+ 'v2': {
180
+ 'public': {
181
+ 'get': {
182
+ 'market/depth': 1,
183
+ 'market/kline': 1,
175
184
  },
176
185
  },
177
186
  },
178
187
  'v3': {
179
188
  'private': {
180
189
  'get': {
181
- 'get/asset/transfer': 3,
182
- 'asset/transfer': 3,
183
- 'capital/deposit/hisrec': 3,
184
- 'capital/withdraw/history': 3,
190
+ 'get/asset/transfer': 1,
191
+ 'asset/transfer': 1,
192
+ 'capital/deposit/hisrec': 1,
193
+ 'capital/withdraw/history': 1,
185
194
  },
186
195
  'post': {
187
- 'post/asset/transfer': 3,
196
+ 'post/asset/transfer': 5,
188
197
  },
189
198
  },
190
199
  },
@@ -194,26 +203,27 @@ class bingx(Exchange, ImplicitAPI):
194
203
  'public': {
195
204
  'get': {
196
205
  'ticker/price': 1,
206
+ 'market/historicalTrades': 1,
197
207
  },
198
208
  },
199
209
  'private': {
200
210
  'get': {
201
- 'positionSide/dual': 1,
211
+ 'positionSide/dual': 5,
202
212
  'market/markPriceKlines': 1,
203
- 'trade/batchCancelReplace': 1,
204
- 'trade/fullOrder': 1,
213
+ 'trade/batchCancelReplace': 5,
214
+ 'trade/fullOrder': 2,
205
215
  },
206
216
  'post': {
207
- 'trade/cancelReplace': 1,
208
- 'positionSide/dual': 1,
209
- 'trade/closePosition': 1,
217
+ 'trade/cancelReplace': 2,
218
+ 'positionSide/dual': 5,
219
+ 'trade/closePosition': 2,
210
220
  },
211
221
  },
212
222
  },
213
223
  'v2': {
214
224
  'public': {
215
225
  'get': {
216
- 'server/time': 3,
226
+ 'server/time': 1,
217
227
  'quote/contracts': 1,
218
228
  'quote/price': 1,
219
229
  'quote/depth': 1,
@@ -228,35 +238,35 @@ class bingx(Exchange, ImplicitAPI):
228
238
  },
229
239
  'private': {
230
240
  'get': {
231
- 'user/balance': 3,
232
- 'user/positions': 3,
233
- 'user/income': 3,
234
- 'trade/openOrders': 3,
235
- 'trade/openOrder': 3,
236
- 'trade/order': 3,
237
- 'trade/marginType': 3,
238
- 'trade/leverage': 3,
239
- 'trade/forceOrders': 3,
240
- 'trade/allOrders': 3,
241
- 'trade/allFillOrders': 3,
242
- 'user/income/export': 3,
243
- 'user/commissionRate': 3,
244
- 'quote/bookTicker': 3,
241
+ 'user/balance': 2,
242
+ 'user/positions': 2,
243
+ 'user/income': 2,
244
+ 'trade/openOrders': 2,
245
+ 'trade/openOrder': 2,
246
+ 'trade/order': 2,
247
+ 'trade/marginType': 5,
248
+ 'trade/leverage': 2,
249
+ 'trade/forceOrders': 1,
250
+ 'trade/allOrders': 2,
251
+ 'trade/allFillOrders': 2,
252
+ 'user/income/export': 2,
253
+ 'user/commissionRate': 2,
254
+ 'quote/bookTicker': 1,
245
255
  },
246
256
  'post': {
247
- 'trade/order': 3,
248
- 'trade/batchOrders': 3,
249
- 'trade/closeAllPositions': 3,
250
- 'trade/cancelAllAfter': 3,
251
- 'trade/marginType': 3,
252
- 'trade/leverage': 3,
253
- 'trade/positionMargin': 3,
254
- 'trade/order/test': 3,
257
+ 'trade/order': 2,
258
+ 'trade/batchOrders': 2,
259
+ 'trade/closeAllPositions': 2,
260
+ 'trade/cancelAllAfter': 5,
261
+ 'trade/marginType': 5,
262
+ 'trade/leverage': 5,
263
+ 'trade/positionMargin': 5,
264
+ 'trade/order/test': 2,
255
265
  },
256
266
  'delete': {
257
- 'trade/order': 3,
258
- 'trade/batchOrders': 3,
259
- 'trade/allOpenOrders': 3,
267
+ 'trade/order': 2,
268
+ 'trade/batchOrders': 2,
269
+ 'trade/allOpenOrders': 2,
260
270
  },
261
271
  },
262
272
  },
@@ -272,9 +282,9 @@ class bingx(Exchange, ImplicitAPI):
272
282
  'v1': {
273
283
  'private': {
274
284
  'get': {
275
- 'allPosition': 3,
276
- 'allOrders': 3,
277
- 'balance': 3,
285
+ 'allPosition': 2,
286
+ 'allOrders': 2,
287
+ 'balance': 2,
278
288
  },
279
289
  },
280
290
  },
@@ -283,18 +293,19 @@ class bingx(Exchange, ImplicitAPI):
283
293
  'v1': {
284
294
  'private': {
285
295
  'get': {
286
- 'capital/config/getall': 3,
287
- 'capital/deposit/address': 1,
296
+ 'capital/config/getall': 5,
297
+ 'capital/deposit/address': 5,
288
298
  'capital/innerTransfer/records': 1,
289
- 'capital/subAccount/deposit/address': 1,
290
- 'capital/deposit/subHisrec': 1,
299
+ 'capital/subAccount/deposit/address': 5,
300
+ 'capital/deposit/subHisrec': 2,
291
301
  'capital/subAccount/innerTransfer/records': 1,
302
+ 'capital/deposit/riskRecords': 5,
292
303
  },
293
304
  'post': {
294
- 'capital/withdraw/apply': 3,
295
- 'capital/innerTransfer/apply': 3,
296
- 'capital/subAccountInnerTransfer/apply': 3,
297
- 'capital/deposit/createSubAddress': 1,
305
+ 'capital/withdraw/apply': 5,
306
+ 'capital/innerTransfer/apply': 5,
307
+ 'capital/subAccountInnerTransfer/apply': 2,
308
+ 'capital/deposit/createSubAddress': 2,
298
309
  },
299
310
  },
300
311
  },
@@ -303,15 +314,15 @@ class bingx(Exchange, ImplicitAPI):
303
314
  'v1': {
304
315
  'private': {
305
316
  'get': {
306
- 'list': 3,
307
- 'assets': 3,
317
+ 'list': 10,
318
+ 'assets': 2,
308
319
  },
309
320
  'post': {
310
- 'create': 3,
311
- 'apiKey/create': 3,
312
- 'apiKey/edit': 3,
313
- 'apiKey/del': 3,
314
- 'updateStatus': 3,
321
+ 'create': 10,
322
+ 'apiKey/create': 2,
323
+ 'apiKey/edit': 2,
324
+ 'apiKey/del': 2,
325
+ 'updateStatus': 10,
315
326
  },
316
327
  },
317
328
  },
@@ -321,10 +332,10 @@ class bingx(Exchange, ImplicitAPI):
321
332
  'private': {
322
333
  'get': {
323
334
  'uid': 1,
324
- 'apiKey/query': 1,
335
+ 'apiKey/query': 2,
325
336
  },
326
337
  'post': {
327
- 'innerTransfer/authorizeSubAccount': 3,
338
+ 'innerTransfer/authorizeSubAccount': 1,
328
339
  },
329
340
  },
330
341
  },
@@ -333,10 +344,13 @@ class bingx(Exchange, ImplicitAPI):
333
344
  'auth': {
334
345
  'private': {
335
346
  'post': {
336
- 'userDataStream': 1,
347
+ 'userDataStream': 2,
337
348
  },
338
349
  'put': {
339
- 'userDataStream': 1,
350
+ 'userDataStream': 2,
351
+ },
352
+ 'delete': {
353
+ 'userDataStream': 2,
340
354
  },
341
355
  },
342
356
  },
@@ -345,12 +359,12 @@ class bingx(Exchange, ImplicitAPI):
345
359
  'v1': {
346
360
  'private': {
347
361
  'get': {
348
- 'swap/trace/currentTrack': 1,
362
+ 'swap/trace/currentTrack': 2,
349
363
  },
350
364
  'post': {
351
- 'swap/trace/closeTrackOrder': 1,
352
- 'swap/trace/setTPSL': 1,
353
- 'spot/trader/sellOrder': 1,
365
+ 'swap/trace/closeTrackOrder': 2,
366
+ 'swap/trace/setTPSL': 2,
367
+ 'spot/trader/sellOrder': 10,
354
368
  },
355
369
  },
356
370
  },
@@ -2376,7 +2390,7 @@ class bingx(Exchange, ImplicitAPI):
2376
2390
  'stopLossPrice': stopLossPrice,
2377
2391
  'takeProfitPrice': takeProfitPrice,
2378
2392
  'average': self.safe_string_2(order, 'avgPrice', 'ap'),
2379
- 'cost': None,
2393
+ 'cost': self.safe_string(order, 'cummulativeQuoteQty'),
2380
2394
  'amount': self.safe_string_n(order, ['origQty', 'q', 'quantity']),
2381
2395
  'filled': self.safe_string_2(order, 'executedQty', 'z'),
2382
2396
  'remaining': None,
@@ -6,7 +6,7 @@
6
6
  from ccxt.async_support.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
+ async 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
+ await 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 = await 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