ccxt 4.3.27 → 4.3.29

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.
Files changed (56) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.min.js +30 -0
  3. package/dist/ccxt.browser.min.js.LICENSE.txt +12 -0
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/src/ascendex.js +1 -1
  6. package/dist/cjs/src/base/Exchange.js +2 -1
  7. package/dist/cjs/src/base/ws/OrderBookSide.js +4 -4
  8. package/dist/cjs/src/bingx.js +140 -90
  9. package/dist/cjs/src/bitget.js +1 -0
  10. package/dist/cjs/src/bitmart.js +137 -2
  11. package/dist/cjs/src/bybit.js +3 -3
  12. package/dist/cjs/src/coinbase.js +1 -1
  13. package/dist/cjs/src/krakenfutures.js +1 -1
  14. package/dist/cjs/src/kucoin.js +1 -0
  15. package/dist/cjs/src/pro/bitfinex.js +4 -4
  16. package/dist/cjs/src/pro/bitfinex2.js +2 -2
  17. package/dist/cjs/src/pro/bitmex.js +3 -3
  18. package/dist/cjs/src/pro/blockchaincom.js +2 -2
  19. package/dist/cjs/src/pro/coinbase.js +5 -1
  20. package/dist/cjs/src/pro/cryptocom.js +4 -4
  21. package/dist/cjs/src/pro/deribit.js +9 -9
  22. package/dist/cjs/src/pro/idex.js +1 -1
  23. package/dist/cjs/src/pro/luno.js +4 -5
  24. package/dist/cjs/src/pro/mexc.js +2 -2
  25. package/dist/cjs/src/whitebit.js +1 -1
  26. package/js/ccxt.d.ts +1 -1
  27. package/js/ccxt.js +1 -1
  28. package/js/src/abstract/bingx.d.ts +7 -0
  29. package/js/src/abstract/bitget.d.ts +1 -0
  30. package/js/src/abstract/bitmart.d.ts +2 -0
  31. package/js/src/ascendex.js +1 -1
  32. package/js/src/base/Exchange.js +2 -1
  33. package/js/src/base/ws/Cache.d.ts +1 -1
  34. package/js/src/base/ws/OrderBookSide.d.ts +4 -5
  35. package/js/src/base/ws/OrderBookSide.js +4 -4
  36. package/js/src/bingx.js +140 -90
  37. package/js/src/bitget.js +1 -0
  38. package/js/src/bitmart.d.ts +3 -1
  39. package/js/src/bitmart.js +137 -2
  40. package/js/src/bybit.js +3 -3
  41. package/js/src/coinbase.js +1 -1
  42. package/js/src/krakenfutures.js +1 -1
  43. package/js/src/kucoin.js +1 -0
  44. package/js/src/pro/bitfinex.js +4 -4
  45. package/js/src/pro/bitfinex2.js +2 -2
  46. package/js/src/pro/bitmex.js +3 -3
  47. package/js/src/pro/blockchaincom.js +2 -2
  48. package/js/src/pro/coinbase.js +5 -1
  49. package/js/src/pro/cryptocom.js +4 -4
  50. package/js/src/pro/deribit.js +9 -9
  51. package/js/src/pro/idex.js +1 -1
  52. package/js/src/pro/luno.js +4 -5
  53. package/js/src/pro/mexc.js +2 -2
  54. package/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +1 -1
  55. package/js/src/whitebit.js +1 -1
  56. package/package.json +2 -2
@@ -0,0 +1,12 @@
1
+ /*!
2
+ Copyright (c) 2011, Yahoo! Inc. All rights reserved.
3
+ Code licensed under the BSD License:
4
+ http://developer.yahoo.com/yui/license.html
5
+ version: 2.9.0
6
+ */
7
+
8
+ /*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
9
+
10
+ /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
11
+
12
+ /*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */
package/dist/cjs/ccxt.js CHANGED
@@ -185,7 +185,7 @@ var woofipro$1 = require('./src/pro/woofipro.js');
185
185
 
186
186
  //-----------------------------------------------------------------------------
187
187
  // this is updated by vss.js when building
188
- const version = '4.3.27';
188
+ const version = '4.3.29';
189
189
  Exchange["default"].ccxtVersion = version;
190
190
  const exchanges = {
191
191
  'ace': ace,
@@ -1403,7 +1403,7 @@ class ascendex extends ascendex$1 {
1403
1403
  'currency': feeCurrencyCode,
1404
1404
  };
1405
1405
  }
1406
- const stopPrice = this.safeNumber(order, 'stopPrice');
1406
+ const stopPrice = this.omitZero(this.safeString(order, 'stopPrice'));
1407
1407
  let reduceOnly = undefined;
1408
1408
  const execInst = this.safeString(order, 'execInst');
1409
1409
  if (execInst === 'reduceOnly') {
@@ -2506,6 +2506,7 @@ class Exchange {
2506
2506
  const shouldParseFees = parseFee || parseFees;
2507
2507
  const fees = this.safeList(order, 'fees', []);
2508
2508
  let trades = [];
2509
+ const isTriggerOrSLTpOrder = ((this.safeString(order, 'triggerPrice') !== undefined || (this.safeString(order, 'stopLossPrice') !== undefined)) || (this.safeString(order, 'takeProfitPrice') !== undefined));
2509
2510
  if (parseFilled || parseCost || shouldParseFees) {
2510
2511
  const rawTrades = this.safeValue(order, 'trades', trades);
2511
2512
  const oldNumber = this.number;
@@ -2708,7 +2709,7 @@ class Exchange {
2708
2709
  let postOnly = this.safeValue(order, 'postOnly');
2709
2710
  // timeInForceHandling
2710
2711
  if (timeInForce === undefined) {
2711
- if (this.safeString(order, 'type') === 'market') {
2712
+ if (!isTriggerOrSLTpOrder && (this.safeString(order, 'type') === 'market')) {
2712
2713
  timeInForce = 'IOC';
2713
2714
  }
2714
2715
  // allow postOnly override
@@ -99,8 +99,8 @@ class OrderBookSide extends Array {
99
99
  // or deletes price levels based on order counts (3rd value in a bidask delta)
100
100
  // this class stores vector arrays of values indexed by price
101
101
  class CountedOrderBookSide extends OrderBookSide {
102
- store(price, size, count) {
103
- this.storeArray([price, size, count]);
102
+ store(price, size) {
103
+ throw new Error('CountedOrderBookSide.store() is not supported, use storeArray([price, size, count]) instead');
104
104
  }
105
105
  storeArray(delta) {
106
106
  const price = delta[0];
@@ -164,8 +164,8 @@ class IndexedOrderBookSide extends Array {
164
164
  this.storeArray(deltas[i].slice()); // slice is muy importante
165
165
  }
166
166
  }
167
- store(price, size, id) {
168
- this.storeArray([price, size, id]);
167
+ store(price, size) {
168
+ throw new Error('IndexedOrderBook.store() is not supported, use storeArray([price, size, id]) instead');
169
169
  }
170
170
  storeArray(delta) {
171
171
  const price = delta[0];
@@ -18,8 +18,7 @@ class bingx extends bingx$1 {
18
18
  'id': 'bingx',
19
19
  'name': 'BingX',
20
20
  'countries': ['US'],
21
- // cheapest is 60 requests a minute = 1 requests per second on average => ( 1000ms / 1) = 1000 ms between requests on average
22
- 'rateLimit': 1000,
21
+ 'rateLimit': 100,
23
22
  'version': 'v1',
24
23
  'certified': true,
25
24
  'pro': true,
@@ -132,44 +131,54 @@ class bingx extends bingx$1 {
132
131
  'v1': {
133
132
  'public': {
134
133
  'get': {
135
- 'server/time': 3,
136
- 'common/symbols': 3,
137
- 'market/trades': 3,
138
- 'market/depth': 3,
139
- 'market/kline': 3,
134
+ 'server/time': 1,
135
+ 'common/symbols': 1,
136
+ 'market/trades': 1,
137
+ 'market/depth': 1,
138
+ 'market/kline': 1,
140
139
  'ticker/24hr': 1,
140
+ 'ticker/price': 1,
141
+ 'ticker/bookTicker': 1,
141
142
  },
142
143
  },
143
144
  'private': {
144
145
  'get': {
145
- 'trade/query': 3,
146
- 'trade/openOrders': 3,
147
- 'trade/historyOrders': 3,
148
- 'trade/myTrades': 3,
149
- 'user/commissionRate': 3,
150
- 'account/balance': 3,
146
+ 'trade/query': 1,
147
+ 'trade/openOrders': 1,
148
+ 'trade/historyOrders': 1,
149
+ 'trade/myTrades': 2,
150
+ 'user/commissionRate': 5,
151
+ 'account/balance': 2,
151
152
  },
152
153
  'post': {
153
- 'trade/order': 3,
154
- 'trade/cancel': 3,
155
- 'trade/batchOrders': 3,
156
- 'trade/order/cancelReplace': 3,
157
- 'trade/cancelOrders': 3,
158
- 'trade/cancelOpenOrders': 3,
159
- 'trade/cancelAllAfter': 1,
154
+ 'trade/order': 2,
155
+ 'trade/cancel': 2,
156
+ 'trade/batchOrders': 5,
157
+ 'trade/order/cancelReplace': 5,
158
+ 'trade/cancelOrders': 5,
159
+ 'trade/cancelOpenOrders': 5,
160
+ 'trade/cancelAllAfter': 5,
161
+ },
162
+ },
163
+ },
164
+ 'v2': {
165
+ 'public': {
166
+ 'get': {
167
+ 'market/depth': 1,
168
+ 'market/kline': 1,
160
169
  },
161
170
  },
162
171
  },
163
172
  'v3': {
164
173
  'private': {
165
174
  'get': {
166
- 'get/asset/transfer': 3,
167
- 'asset/transfer': 3,
168
- 'capital/deposit/hisrec': 3,
169
- 'capital/withdraw/history': 3,
175
+ 'get/asset/transfer': 1,
176
+ 'asset/transfer': 1,
177
+ 'capital/deposit/hisrec': 1,
178
+ 'capital/withdraw/history': 1,
170
179
  },
171
180
  'post': {
172
- 'post/asset/transfer': 3,
181
+ 'post/asset/transfer': 5,
173
182
  },
174
183
  },
175
184
  },
@@ -179,26 +188,27 @@ class bingx extends bingx$1 {
179
188
  'public': {
180
189
  'get': {
181
190
  'ticker/price': 1,
191
+ 'market/historicalTrades': 1,
182
192
  },
183
193
  },
184
194
  'private': {
185
195
  'get': {
186
- 'positionSide/dual': 1,
196
+ 'positionSide/dual': 5,
187
197
  'market/markPriceKlines': 1,
188
- 'trade/batchCancelReplace': 1,
189
- 'trade/fullOrder': 1,
198
+ 'trade/batchCancelReplace': 5,
199
+ 'trade/fullOrder': 2,
190
200
  },
191
201
  'post': {
192
- 'trade/cancelReplace': 1,
193
- 'positionSide/dual': 1,
194
- 'trade/closePosition': 1,
202
+ 'trade/cancelReplace': 2,
203
+ 'positionSide/dual': 5,
204
+ 'trade/closePosition': 2,
195
205
  },
196
206
  },
197
207
  },
198
208
  'v2': {
199
209
  'public': {
200
210
  'get': {
201
- 'server/time': 3,
211
+ 'server/time': 1,
202
212
  'quote/contracts': 1,
203
213
  'quote/price': 1,
204
214
  'quote/depth': 1,
@@ -213,35 +223,35 @@ class bingx extends bingx$1 {
213
223
  },
214
224
  'private': {
215
225
  'get': {
216
- 'user/balance': 3,
217
- 'user/positions': 3,
218
- 'user/income': 3,
219
- 'trade/openOrders': 3,
220
- 'trade/openOrder': 3,
221
- 'trade/order': 3,
222
- 'trade/marginType': 3,
223
- 'trade/leverage': 3,
224
- 'trade/forceOrders': 3,
225
- 'trade/allOrders': 3,
226
- 'trade/allFillOrders': 3,
227
- 'user/income/export': 3,
228
- 'user/commissionRate': 3,
229
- 'quote/bookTicker': 3,
226
+ 'user/balance': 2,
227
+ 'user/positions': 2,
228
+ 'user/income': 2,
229
+ 'trade/openOrders': 2,
230
+ 'trade/openOrder': 2,
231
+ 'trade/order': 2,
232
+ 'trade/marginType': 5,
233
+ 'trade/leverage': 2,
234
+ 'trade/forceOrders': 1,
235
+ 'trade/allOrders': 2,
236
+ 'trade/allFillOrders': 2,
237
+ 'user/income/export': 2,
238
+ 'user/commissionRate': 2,
239
+ 'quote/bookTicker': 1,
230
240
  },
231
241
  'post': {
232
- 'trade/order': 3,
233
- 'trade/batchOrders': 3,
234
- 'trade/closeAllPositions': 3,
235
- 'trade/cancelAllAfter': 3,
236
- 'trade/marginType': 3,
237
- 'trade/leverage': 3,
238
- 'trade/positionMargin': 3,
239
- 'trade/order/test': 3,
242
+ 'trade/order': 2,
243
+ 'trade/batchOrders': 2,
244
+ 'trade/closeAllPositions': 2,
245
+ 'trade/cancelAllAfter': 5,
246
+ 'trade/marginType': 5,
247
+ 'trade/leverage': 5,
248
+ 'trade/positionMargin': 5,
249
+ 'trade/order/test': 2,
240
250
  },
241
251
  'delete': {
242
- 'trade/order': 3,
243
- 'trade/batchOrders': 3,
244
- 'trade/allOpenOrders': 3,
252
+ 'trade/order': 2,
253
+ 'trade/batchOrders': 2,
254
+ 'trade/allOpenOrders': 2,
245
255
  },
246
256
  },
247
257
  },
@@ -257,9 +267,9 @@ class bingx extends bingx$1 {
257
267
  'v1': {
258
268
  'private': {
259
269
  'get': {
260
- 'allPosition': 3,
261
- 'allOrders': 3,
262
- 'balance': 3,
270
+ 'allPosition': 2,
271
+ 'allOrders': 2,
272
+ 'balance': 2,
263
273
  },
264
274
  },
265
275
  },
@@ -268,18 +278,19 @@ class bingx extends bingx$1 {
268
278
  'v1': {
269
279
  'private': {
270
280
  'get': {
271
- 'capital/config/getall': 3,
272
- 'capital/deposit/address': 1,
281
+ 'capital/config/getall': 5,
282
+ 'capital/deposit/address': 5,
273
283
  'capital/innerTransfer/records': 1,
274
- 'capital/subAccount/deposit/address': 1,
275
- 'capital/deposit/subHisrec': 1,
284
+ 'capital/subAccount/deposit/address': 5,
285
+ 'capital/deposit/subHisrec': 2,
276
286
  'capital/subAccount/innerTransfer/records': 1,
287
+ 'capital/deposit/riskRecords': 5,
277
288
  },
278
289
  'post': {
279
- 'capital/withdraw/apply': 3,
280
- 'capital/innerTransfer/apply': 3,
281
- 'capital/subAccountInnerTransfer/apply': 3,
282
- 'capital/deposit/createSubAddress': 1,
290
+ 'capital/withdraw/apply': 5,
291
+ 'capital/innerTransfer/apply': 5,
292
+ 'capital/subAccountInnerTransfer/apply': 2,
293
+ 'capital/deposit/createSubAddress': 2,
283
294
  },
284
295
  },
285
296
  },
@@ -288,15 +299,15 @@ class bingx extends bingx$1 {
288
299
  'v1': {
289
300
  'private': {
290
301
  'get': {
291
- 'list': 3,
292
- 'assets': 3,
302
+ 'list': 10,
303
+ 'assets': 2,
293
304
  },
294
305
  'post': {
295
- 'create': 3,
296
- 'apiKey/create': 3,
297
- 'apiKey/edit': 3,
298
- 'apiKey/del': 3,
299
- 'updateStatus': 3,
306
+ 'create': 10,
307
+ 'apiKey/create': 2,
308
+ 'apiKey/edit': 2,
309
+ 'apiKey/del': 2,
310
+ 'updateStatus': 10,
300
311
  },
301
312
  },
302
313
  },
@@ -306,10 +317,10 @@ class bingx extends bingx$1 {
306
317
  'private': {
307
318
  'get': {
308
319
  'uid': 1,
309
- 'apiKey/query': 1,
320
+ 'apiKey/query': 2,
310
321
  },
311
322
  'post': {
312
- 'innerTransfer/authorizeSubAccount': 3,
323
+ 'innerTransfer/authorizeSubAccount': 1,
313
324
  },
314
325
  },
315
326
  },
@@ -318,10 +329,13 @@ class bingx extends bingx$1 {
318
329
  'auth': {
319
330
  'private': {
320
331
  'post': {
321
- 'userDataStream': 1,
332
+ 'userDataStream': 2,
322
333
  },
323
334
  'put': {
324
- 'userDataStream': 1,
335
+ 'userDataStream': 2,
336
+ },
337
+ 'delete': {
338
+ 'userDataStream': 2,
325
339
  },
326
340
  },
327
341
  },
@@ -330,12 +344,12 @@ class bingx extends bingx$1 {
330
344
  'v1': {
331
345
  'private': {
332
346
  'get': {
333
- 'swap/trace/currentTrack': 1,
347
+ 'swap/trace/currentTrack': 2,
334
348
  },
335
349
  'post': {
336
- 'swap/trace/closeTrackOrder': 1,
337
- 'swap/trace/setTPSL': 1,
338
- 'spot/trader/sellOrder': 1,
350
+ 'swap/trace/closeTrackOrder': 2,
351
+ 'swap/trace/setTPSL': 2,
352
+ 'spot/trader/sellOrder': 10,
339
353
  },
340
354
  },
341
355
  },
@@ -2214,6 +2228,10 @@ class bingx extends bingx$1 {
2214
2228
  const types = {
2215
2229
  'trigger_market': 'market',
2216
2230
  'trigger_limit': 'limit',
2231
+ 'stop_limit': 'limit',
2232
+ 'stop_market': 'market',
2233
+ 'take_profit_market': 'market',
2234
+ 'stop': 'limit',
2217
2235
  };
2218
2236
  return this.safeString(types, type, type);
2219
2237
  }
@@ -2417,6 +2435,25 @@ class bingx extends bingx$1 {
2417
2435
  // side: 'SELL'
2418
2436
  // }
2419
2437
  // }
2438
+ // stop loss order
2439
+ // {
2440
+ // "symbol": "ETH-USDT",
2441
+ // "orderId": "1792461744476422144",
2442
+ // "price": "2775.65",
2443
+ // "StopPrice": "2778.42",
2444
+ // "origQty": "0.032359",
2445
+ // "executedQty": "0",
2446
+ // "cummulativeQuoteQty": "0",
2447
+ // "status": "NEW",
2448
+ // "type": "TAKE_STOP_LIMIT",
2449
+ // "side": "SELL",
2450
+ // "time": "1716191156868",
2451
+ // "updateTime": "1716191156868",
2452
+ // "origQuoteOrderQty": "0",
2453
+ // "fee": "0",
2454
+ // "feeAsset": "USDT",
2455
+ // "clientOrderID": ""
2456
+ // }
2420
2457
  //
2421
2458
  const info = order;
2422
2459
  const newOrder = this.safeDict2(order, 'newOrderResponse', 'orderOpenResponse');
@@ -2451,26 +2488,39 @@ class bingx extends bingx$1 {
2451
2488
  let stopLoss = this.safeValue(order, 'stopLoss');
2452
2489
  let stopLossPrice = undefined;
2453
2490
  if ((stopLoss !== undefined) && (stopLoss !== '')) {
2454
- stopLossPrice = this.safeNumber(stopLoss, 'stopLoss');
2491
+ stopLossPrice = this.omitZero(this.safeString(stopLoss, 'stopLoss'));
2455
2492
  }
2456
2493
  if ((stopLoss !== undefined) && (typeof stopLoss !== 'number') && (stopLoss !== '')) {
2457
2494
  // stopLoss: '{"stopPrice":50,"workingType":"MARK_PRICE","type":"STOP_MARKET","quantity":1}',
2458
2495
  if (typeof stopLoss === 'string') {
2459
2496
  stopLoss = this.parseJson(stopLoss);
2460
2497
  }
2461
- stopLossPrice = this.safeNumber(stopLoss, 'stopPrice');
2498
+ stopLossPrice = this.omitZero(this.safeString(stopLoss, 'stopPrice'));
2462
2499
  }
2463
2500
  let takeProfit = this.safeValue(order, 'takeProfit');
2464
2501
  let takeProfitPrice = undefined;
2465
2502
  if (takeProfit !== undefined && (takeProfit !== '')) {
2466
- takeProfitPrice = this.safeNumber(takeProfit, 'takeProfit');
2503
+ takeProfitPrice = this.omitZero(this.safeString(takeProfit, 'takeProfit'));
2467
2504
  }
2468
2505
  if ((takeProfit !== undefined) && (typeof takeProfit !== 'number') && (takeProfit !== '')) {
2469
2506
  // takeProfit: '{"stopPrice":150,"workingType":"MARK_PRICE","type":"TAKE_PROFIT_MARKET","quantity":1}',
2470
2507
  if (typeof takeProfit === 'string') {
2471
2508
  takeProfit = this.parseJson(takeProfit);
2472
2509
  }
2473
- takeProfitPrice = this.safeNumber(takeProfit, 'stopPrice');
2510
+ takeProfitPrice = this.omitZero(this.safeString(takeProfit, 'stopPrice'));
2511
+ }
2512
+ const rawType = this.safeStringLower2(order, 'type', 'o');
2513
+ const stopPrice = this.omitZero(this.safeString2(order, 'StopPrice', 'stopPrice'));
2514
+ let triggerPrice = stopPrice;
2515
+ if (stopPrice !== undefined) {
2516
+ if ((rawType.indexOf('stop') > -1) && (stopLossPrice === undefined)) {
2517
+ stopLossPrice = stopPrice;
2518
+ triggerPrice = undefined;
2519
+ }
2520
+ if ((rawType.indexOf('take') > -1) && (takeProfitPrice === undefined)) {
2521
+ takeProfitPrice = stopPrice;
2522
+ triggerPrice = undefined;
2523
+ }
2474
2524
  }
2475
2525
  return this.safeOrder({
2476
2526
  'info': info,
@@ -2481,13 +2531,13 @@ class bingx extends bingx$1 {
2481
2531
  'datetime': this.iso8601(timestamp),
2482
2532
  'lastTradeTimestamp': lastTradeTimestamp,
2483
2533
  'lastUpdateTimestamp': this.safeInteger(order, 'updateTime'),
2484
- 'type': this.parseOrderType(this.safeStringLower2(order, 'type', 'o')),
2534
+ 'type': this.parseOrderType(rawType),
2485
2535
  'timeInForce': this.safeString(order, 'timeInForce'),
2486
2536
  'postOnly': undefined,
2487
2537
  'side': this.parseOrderSide(side),
2488
2538
  'price': this.safeString2(order, 'price', 'p'),
2489
- 'stopPrice': this.safeNumber(order, 'stopPrice'),
2490
- 'triggerPrice': this.safeNumber(order, 'stopPrice'),
2539
+ 'stopPrice': triggerPrice,
2540
+ 'triggerPrice': triggerPrice,
2491
2541
  'stopLossPrice': stopLossPrice,
2492
2542
  'takeProfitPrice': takeProfitPrice,
2493
2543
  'average': this.safeString2(order, 'avgPrice', 'ap'),
@@ -757,6 +757,7 @@ class bitget extends bitget$1 {
757
757
  'v2/earn/loan/borrow-history': 2,
758
758
  'v2/earn/loan/debts': 2,
759
759
  'v2/earn/loan/reduces': 2,
760
+ 'v2/earn/account/assets': 2,
760
761
  },
761
762
  'post': {
762
763
  'v2/earn/savings/subscribe': 2,
@@ -35,11 +35,12 @@ class bitmart extends bitmart$1 {
35
35
  'borrowIsolatedMargin': true,
36
36
  'cancelAllOrders': true,
37
37
  'cancelOrder': true,
38
- 'cancelOrders': false,
38
+ 'cancelOrders': true,
39
39
  'createMarketBuyOrderWithCost': true,
40
40
  'createMarketOrderWithCost': false,
41
41
  'createMarketSellOrderWithCost': false,
42
42
  'createOrder': true,
43
+ 'createOrders': true,
43
44
  'createPostOnlyOrder': true,
44
45
  'createStopLimitOrder': false,
45
46
  'createStopMarketOrder': false,
@@ -179,7 +180,7 @@ class bitmart extends bitmart$1 {
179
180
  'spot/v2/orders': 5,
180
181
  'spot/v1/trades': 5,
181
182
  // newer order endpoint
182
- 'spot/v2/trades': 5,
183
+ 'spot/v2/trades': 4,
183
184
  'spot/v3/orders': 5,
184
185
  'spot/v2/order_detail': 1,
185
186
  // margin
@@ -223,6 +224,8 @@ class bitmart extends bitmart$1 {
223
224
  'spot/v4/query/history-orders': 5,
224
225
  'spot/v4/query/trades': 5,
225
226
  'spot/v4/query/order-trades': 5,
227
+ 'spot/v4/cancel_orders': 3,
228
+ 'spot/v4/batch_orders': 3,
226
229
  // newer endpoint
227
230
  'spot/v3/cancel_order': 1,
228
231
  'spot/v2/batch_orders': 1,
@@ -2390,6 +2393,76 @@ class bitmart extends bitmart$1 {
2390
2393
  order['price'] = price;
2391
2394
  return order;
2392
2395
  }
2396
+ async createOrders(orders, params = {}) {
2397
+ /**
2398
+ * @method
2399
+ * @name bitmart#createOrders
2400
+ * @description create a list of trade orders
2401
+ * @see https://developer-pro.bitmart.com/en/spot/#new-batch-order-v4-signed
2402
+ * @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
2403
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2404
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2405
+ */
2406
+ await this.loadMarkets();
2407
+ const ordersRequests = [];
2408
+ let symbol = undefined;
2409
+ let market = undefined;
2410
+ for (let i = 0; i < orders.length; i++) {
2411
+ const rawOrder = orders[i];
2412
+ const marketId = this.safeString(rawOrder, 'symbol');
2413
+ market = this.market(marketId);
2414
+ if (!market['spot']) {
2415
+ throw new errors.NotSupported(this.id + ' createOrders() supports spot orders only');
2416
+ }
2417
+ if (symbol === undefined) {
2418
+ symbol = marketId;
2419
+ }
2420
+ else {
2421
+ if (symbol !== marketId) {
2422
+ throw new errors.BadRequest(this.id + ' createOrders() requires all orders to have the same symbol');
2423
+ }
2424
+ }
2425
+ const type = this.safeString(rawOrder, 'type');
2426
+ const side = this.safeString(rawOrder, 'side');
2427
+ const amount = this.safeValue(rawOrder, 'amount');
2428
+ const price = this.safeValue(rawOrder, 'price');
2429
+ const orderParams = this.safeDict(rawOrder, 'params', {});
2430
+ let orderRequest = this.createSpotOrderRequest(marketId, type, side, amount, price, orderParams);
2431
+ orderRequest = this.omit(orderRequest, ['symbol']); // not needed because it goes in the outter object
2432
+ ordersRequests.push(orderRequest);
2433
+ }
2434
+ const request = {
2435
+ 'symbol': market['id'],
2436
+ 'orderParams': ordersRequests,
2437
+ };
2438
+ const response = await this.privatePostSpotV4BatchOrders(request);
2439
+ //
2440
+ // {
2441
+ // "message": "OK",
2442
+ // "code": 1000,
2443
+ // "trace": "5fc697fb817a4b5396284786a9b2609a.263.17022620476480263",
2444
+ // "data": {
2445
+ // "code": 0,
2446
+ // "msg": "success",
2447
+ // "data": {
2448
+ // "orderIds": [
2449
+ // "212751308355553320"
2450
+ // ]
2451
+ // }
2452
+ // }
2453
+ // }
2454
+ //
2455
+ const data = this.safeDict(response, 'data', {});
2456
+ const innderData = this.safeDict(data, 'data', {});
2457
+ const orderIds = this.safeList(innderData, 'orderIds', []);
2458
+ const parsedOrders = [];
2459
+ for (let i = 0; i < orderIds.length; i++) {
2460
+ const orderId = orderIds[i];
2461
+ const order = this.safeOrder({ 'id': orderId }, market);
2462
+ parsedOrders.push(order);
2463
+ }
2464
+ return parsedOrders;
2465
+ }
2393
2466
  createSwapOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
2394
2467
  /**
2395
2468
  * @method
@@ -2672,6 +2745,68 @@ class bitmart extends bitmart$1 {
2672
2745
  const order = this.parseOrder(id, market);
2673
2746
  return this.extend(order, { 'id': id });
2674
2747
  }
2748
+ async cancelOrders(ids, symbol = undefined, params = {}) {
2749
+ /**
2750
+ * @method
2751
+ * @name bitmart#cancelOrders
2752
+ * @description cancel multiple orders
2753
+ * @see https://developer-pro.bitmart.com/en/spot/#cancel-batch-order-v4-signed
2754
+ * @param {string[]} ids order ids
2755
+ * @param {string} symbol unified symbol of the market the order was made in
2756
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2757
+ * @param {string[]} [params.clientOrderIds] client order ids
2758
+ * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2759
+ */
2760
+ if (symbol === undefined) {
2761
+ throw new errors.ArgumentsRequired(this.id + ' cancelOrders() requires a symbol argument');
2762
+ }
2763
+ await this.loadMarkets();
2764
+ const market = this.market(symbol);
2765
+ if (!market['spot']) {
2766
+ throw new errors.NotSupported(this.id + ' cancelOrders() does not support ' + market['type'] + ' orders, only spot orders are accepted');
2767
+ }
2768
+ const clientOrderIds = this.safeList(params, 'clientOrderIds');
2769
+ params = this.omit(params, ['clientOrderIds']);
2770
+ const request = {
2771
+ 'symbol': market['id'],
2772
+ };
2773
+ if (clientOrderIds !== undefined) {
2774
+ request['clientOrderIds'] = clientOrderIds;
2775
+ }
2776
+ else {
2777
+ request['orderIds'] = ids;
2778
+ }
2779
+ const response = await this.privatePostSpotV4CancelOrders(this.extend(request, params));
2780
+ //
2781
+ // {
2782
+ // "message": "OK",
2783
+ // "code": 1000,
2784
+ // "trace": "c4edbce860164203954f7c3c81d60fc6.309.17022669632770001",
2785
+ // "data": {
2786
+ // "successIds": [
2787
+ // "213055379155243012"
2788
+ // ],
2789
+ // "failIds": [],
2790
+ // "totalCount": 1,
2791
+ // "successCount": 1,
2792
+ // "failedCount": 0
2793
+ // }
2794
+ // }
2795
+ //
2796
+ const data = this.safeDict(response, 'data', {});
2797
+ const allOrders = [];
2798
+ const successIds = this.safeList(data, 'successIds', []);
2799
+ for (let i = 0; i < successIds.length; i++) {
2800
+ const id = successIds[i];
2801
+ allOrders.push(this.safeOrder({ 'id': id, 'status': 'canceled' }, market));
2802
+ }
2803
+ const failIds = this.safeList(data, 'failIds', []);
2804
+ for (let i = 0; i < failIds.length; i++) {
2805
+ const id = failIds[i];
2806
+ allOrders.push(this.safeOrder({ 'id': id, 'status': 'failed' }, market));
2807
+ }
2808
+ return allOrders;
2809
+ }
2675
2810
  async cancelAllOrders(symbol = undefined, params = {}) {
2676
2811
  /**
2677
2812
  * @method