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
package/js/src/bingx.js CHANGED
@@ -21,8 +21,7 @@ export default class bingx extends Exchange {
21
21
  'id': 'bingx',
22
22
  'name': 'BingX',
23
23
  'countries': ['US'],
24
- // cheapest is 60 requests a minute = 1 requests per second on average => ( 1000ms / 1) = 1000 ms between requests on average
25
- 'rateLimit': 1000,
24
+ 'rateLimit': 100,
26
25
  'version': 'v1',
27
26
  'certified': true,
28
27
  'pro': true,
@@ -135,44 +134,54 @@ export default class bingx extends Exchange {
135
134
  'v1': {
136
135
  'public': {
137
136
  'get': {
138
- 'server/time': 3,
139
- 'common/symbols': 3,
140
- 'market/trades': 3,
141
- 'market/depth': 3,
142
- 'market/kline': 3,
137
+ 'server/time': 1,
138
+ 'common/symbols': 1,
139
+ 'market/trades': 1,
140
+ 'market/depth': 1,
141
+ 'market/kline': 1,
143
142
  'ticker/24hr': 1,
143
+ 'ticker/price': 1,
144
+ 'ticker/bookTicker': 1,
144
145
  },
145
146
  },
146
147
  'private': {
147
148
  'get': {
148
- 'trade/query': 3,
149
- 'trade/openOrders': 3,
150
- 'trade/historyOrders': 3,
151
- 'trade/myTrades': 3,
152
- 'user/commissionRate': 3,
153
- 'account/balance': 3,
149
+ 'trade/query': 1,
150
+ 'trade/openOrders': 1,
151
+ 'trade/historyOrders': 1,
152
+ 'trade/myTrades': 2,
153
+ 'user/commissionRate': 5,
154
+ 'account/balance': 2,
154
155
  },
155
156
  'post': {
156
- 'trade/order': 3,
157
- 'trade/cancel': 3,
158
- 'trade/batchOrders': 3,
159
- 'trade/order/cancelReplace': 3,
160
- 'trade/cancelOrders': 3,
161
- 'trade/cancelOpenOrders': 3,
162
- 'trade/cancelAllAfter': 1,
157
+ 'trade/order': 2,
158
+ 'trade/cancel': 2,
159
+ 'trade/batchOrders': 5,
160
+ 'trade/order/cancelReplace': 5,
161
+ 'trade/cancelOrders': 5,
162
+ 'trade/cancelOpenOrders': 5,
163
+ 'trade/cancelAllAfter': 5,
164
+ },
165
+ },
166
+ },
167
+ 'v2': {
168
+ 'public': {
169
+ 'get': {
170
+ 'market/depth': 1,
171
+ 'market/kline': 1,
163
172
  },
164
173
  },
165
174
  },
166
175
  'v3': {
167
176
  'private': {
168
177
  'get': {
169
- 'get/asset/transfer': 3,
170
- 'asset/transfer': 3,
171
- 'capital/deposit/hisrec': 3,
172
- 'capital/withdraw/history': 3,
178
+ 'get/asset/transfer': 1,
179
+ 'asset/transfer': 1,
180
+ 'capital/deposit/hisrec': 1,
181
+ 'capital/withdraw/history': 1,
173
182
  },
174
183
  'post': {
175
- 'post/asset/transfer': 3,
184
+ 'post/asset/transfer': 5,
176
185
  },
177
186
  },
178
187
  },
@@ -182,26 +191,27 @@ export default class bingx extends Exchange {
182
191
  'public': {
183
192
  'get': {
184
193
  'ticker/price': 1,
194
+ 'market/historicalTrades': 1,
185
195
  },
186
196
  },
187
197
  'private': {
188
198
  'get': {
189
- 'positionSide/dual': 1,
199
+ 'positionSide/dual': 5,
190
200
  'market/markPriceKlines': 1,
191
- 'trade/batchCancelReplace': 1,
192
- 'trade/fullOrder': 1,
201
+ 'trade/batchCancelReplace': 5,
202
+ 'trade/fullOrder': 2,
193
203
  },
194
204
  'post': {
195
- 'trade/cancelReplace': 1,
196
- 'positionSide/dual': 1,
197
- 'trade/closePosition': 1,
205
+ 'trade/cancelReplace': 2,
206
+ 'positionSide/dual': 5,
207
+ 'trade/closePosition': 2,
198
208
  },
199
209
  },
200
210
  },
201
211
  'v2': {
202
212
  'public': {
203
213
  'get': {
204
- 'server/time': 3,
214
+ 'server/time': 1,
205
215
  'quote/contracts': 1,
206
216
  'quote/price': 1,
207
217
  'quote/depth': 1,
@@ -216,35 +226,35 @@ export default class bingx extends Exchange {
216
226
  },
217
227
  'private': {
218
228
  'get': {
219
- 'user/balance': 3,
220
- 'user/positions': 3,
221
- 'user/income': 3,
222
- 'trade/openOrders': 3,
223
- 'trade/openOrder': 3,
224
- 'trade/order': 3,
225
- 'trade/marginType': 3,
226
- 'trade/leverage': 3,
227
- 'trade/forceOrders': 3,
228
- 'trade/allOrders': 3,
229
- 'trade/allFillOrders': 3,
230
- 'user/income/export': 3,
231
- 'user/commissionRate': 3,
232
- 'quote/bookTicker': 3,
229
+ 'user/balance': 2,
230
+ 'user/positions': 2,
231
+ 'user/income': 2,
232
+ 'trade/openOrders': 2,
233
+ 'trade/openOrder': 2,
234
+ 'trade/order': 2,
235
+ 'trade/marginType': 5,
236
+ 'trade/leverage': 2,
237
+ 'trade/forceOrders': 1,
238
+ 'trade/allOrders': 2,
239
+ 'trade/allFillOrders': 2,
240
+ 'user/income/export': 2,
241
+ 'user/commissionRate': 2,
242
+ 'quote/bookTicker': 1,
233
243
  },
234
244
  'post': {
235
- 'trade/order': 3,
236
- 'trade/batchOrders': 3,
237
- 'trade/closeAllPositions': 3,
238
- 'trade/cancelAllAfter': 3,
239
- 'trade/marginType': 3,
240
- 'trade/leverage': 3,
241
- 'trade/positionMargin': 3,
242
- 'trade/order/test': 3,
245
+ 'trade/order': 2,
246
+ 'trade/batchOrders': 2,
247
+ 'trade/closeAllPositions': 2,
248
+ 'trade/cancelAllAfter': 5,
249
+ 'trade/marginType': 5,
250
+ 'trade/leverage': 5,
251
+ 'trade/positionMargin': 5,
252
+ 'trade/order/test': 2,
243
253
  },
244
254
  'delete': {
245
- 'trade/order': 3,
246
- 'trade/batchOrders': 3,
247
- 'trade/allOpenOrders': 3,
255
+ 'trade/order': 2,
256
+ 'trade/batchOrders': 2,
257
+ 'trade/allOpenOrders': 2,
248
258
  },
249
259
  },
250
260
  },
@@ -260,9 +270,9 @@ export default class bingx extends Exchange {
260
270
  'v1': {
261
271
  'private': {
262
272
  'get': {
263
- 'allPosition': 3,
264
- 'allOrders': 3,
265
- 'balance': 3,
273
+ 'allPosition': 2,
274
+ 'allOrders': 2,
275
+ 'balance': 2,
266
276
  },
267
277
  },
268
278
  },
@@ -271,18 +281,19 @@ export default class bingx extends Exchange {
271
281
  'v1': {
272
282
  'private': {
273
283
  'get': {
274
- 'capital/config/getall': 3,
275
- 'capital/deposit/address': 1,
284
+ 'capital/config/getall': 5,
285
+ 'capital/deposit/address': 5,
276
286
  'capital/innerTransfer/records': 1,
277
- 'capital/subAccount/deposit/address': 1,
278
- 'capital/deposit/subHisrec': 1,
287
+ 'capital/subAccount/deposit/address': 5,
288
+ 'capital/deposit/subHisrec': 2,
279
289
  'capital/subAccount/innerTransfer/records': 1,
290
+ 'capital/deposit/riskRecords': 5,
280
291
  },
281
292
  'post': {
282
- 'capital/withdraw/apply': 3,
283
- 'capital/innerTransfer/apply': 3,
284
- 'capital/subAccountInnerTransfer/apply': 3,
285
- 'capital/deposit/createSubAddress': 1,
293
+ 'capital/withdraw/apply': 5,
294
+ 'capital/innerTransfer/apply': 5,
295
+ 'capital/subAccountInnerTransfer/apply': 2,
296
+ 'capital/deposit/createSubAddress': 2,
286
297
  },
287
298
  },
288
299
  },
@@ -291,15 +302,15 @@ export default class bingx extends Exchange {
291
302
  'v1': {
292
303
  'private': {
293
304
  'get': {
294
- 'list': 3,
295
- 'assets': 3,
305
+ 'list': 10,
306
+ 'assets': 2,
296
307
  },
297
308
  'post': {
298
- 'create': 3,
299
- 'apiKey/create': 3,
300
- 'apiKey/edit': 3,
301
- 'apiKey/del': 3,
302
- 'updateStatus': 3,
309
+ 'create': 10,
310
+ 'apiKey/create': 2,
311
+ 'apiKey/edit': 2,
312
+ 'apiKey/del': 2,
313
+ 'updateStatus': 10,
303
314
  },
304
315
  },
305
316
  },
@@ -309,10 +320,10 @@ export default class bingx extends Exchange {
309
320
  'private': {
310
321
  'get': {
311
322
  'uid': 1,
312
- 'apiKey/query': 1,
323
+ 'apiKey/query': 2,
313
324
  },
314
325
  'post': {
315
- 'innerTransfer/authorizeSubAccount': 3,
326
+ 'innerTransfer/authorizeSubAccount': 1,
316
327
  },
317
328
  },
318
329
  },
@@ -321,10 +332,13 @@ export default class bingx extends Exchange {
321
332
  'auth': {
322
333
  'private': {
323
334
  'post': {
324
- 'userDataStream': 1,
335
+ 'userDataStream': 2,
325
336
  },
326
337
  'put': {
327
- 'userDataStream': 1,
338
+ 'userDataStream': 2,
339
+ },
340
+ 'delete': {
341
+ 'userDataStream': 2,
328
342
  },
329
343
  },
330
344
  },
@@ -333,12 +347,12 @@ export default class bingx extends Exchange {
333
347
  'v1': {
334
348
  'private': {
335
349
  'get': {
336
- 'swap/trace/currentTrack': 1,
350
+ 'swap/trace/currentTrack': 2,
337
351
  },
338
352
  'post': {
339
- 'swap/trace/closeTrackOrder': 1,
340
- 'swap/trace/setTPSL': 1,
341
- 'spot/trader/sellOrder': 1,
353
+ 'swap/trace/closeTrackOrder': 2,
354
+ 'swap/trace/setTPSL': 2,
355
+ 'spot/trader/sellOrder': 10,
342
356
  },
343
357
  },
344
358
  },
@@ -2217,6 +2231,10 @@ export default class bingx extends Exchange {
2217
2231
  const types = {
2218
2232
  'trigger_market': 'market',
2219
2233
  'trigger_limit': 'limit',
2234
+ 'stop_limit': 'limit',
2235
+ 'stop_market': 'market',
2236
+ 'take_profit_market': 'market',
2237
+ 'stop': 'limit',
2220
2238
  };
2221
2239
  return this.safeString(types, type, type);
2222
2240
  }
@@ -2420,6 +2438,25 @@ export default class bingx extends Exchange {
2420
2438
  // side: 'SELL'
2421
2439
  // }
2422
2440
  // }
2441
+ // stop loss order
2442
+ // {
2443
+ // "symbol": "ETH-USDT",
2444
+ // "orderId": "1792461744476422144",
2445
+ // "price": "2775.65",
2446
+ // "StopPrice": "2778.42",
2447
+ // "origQty": "0.032359",
2448
+ // "executedQty": "0",
2449
+ // "cummulativeQuoteQty": "0",
2450
+ // "status": "NEW",
2451
+ // "type": "TAKE_STOP_LIMIT",
2452
+ // "side": "SELL",
2453
+ // "time": "1716191156868",
2454
+ // "updateTime": "1716191156868",
2455
+ // "origQuoteOrderQty": "0",
2456
+ // "fee": "0",
2457
+ // "feeAsset": "USDT",
2458
+ // "clientOrderID": ""
2459
+ // }
2423
2460
  //
2424
2461
  const info = order;
2425
2462
  const newOrder = this.safeDict2(order, 'newOrderResponse', 'orderOpenResponse');
@@ -2454,26 +2491,39 @@ export default class bingx extends Exchange {
2454
2491
  let stopLoss = this.safeValue(order, 'stopLoss');
2455
2492
  let stopLossPrice = undefined;
2456
2493
  if ((stopLoss !== undefined) && (stopLoss !== '')) {
2457
- stopLossPrice = this.safeNumber(stopLoss, 'stopLoss');
2494
+ stopLossPrice = this.omitZero(this.safeString(stopLoss, 'stopLoss'));
2458
2495
  }
2459
2496
  if ((stopLoss !== undefined) && (typeof stopLoss !== 'number') && (stopLoss !== '')) {
2460
2497
  // stopLoss: '{"stopPrice":50,"workingType":"MARK_PRICE","type":"STOP_MARKET","quantity":1}',
2461
2498
  if (typeof stopLoss === 'string') {
2462
2499
  stopLoss = this.parseJson(stopLoss);
2463
2500
  }
2464
- stopLossPrice = this.safeNumber(stopLoss, 'stopPrice');
2501
+ stopLossPrice = this.omitZero(this.safeString(stopLoss, 'stopPrice'));
2465
2502
  }
2466
2503
  let takeProfit = this.safeValue(order, 'takeProfit');
2467
2504
  let takeProfitPrice = undefined;
2468
2505
  if (takeProfit !== undefined && (takeProfit !== '')) {
2469
- takeProfitPrice = this.safeNumber(takeProfit, 'takeProfit');
2506
+ takeProfitPrice = this.omitZero(this.safeString(takeProfit, 'takeProfit'));
2470
2507
  }
2471
2508
  if ((takeProfit !== undefined) && (typeof takeProfit !== 'number') && (takeProfit !== '')) {
2472
2509
  // takeProfit: '{"stopPrice":150,"workingType":"MARK_PRICE","type":"TAKE_PROFIT_MARKET","quantity":1}',
2473
2510
  if (typeof takeProfit === 'string') {
2474
2511
  takeProfit = this.parseJson(takeProfit);
2475
2512
  }
2476
- takeProfitPrice = this.safeNumber(takeProfit, 'stopPrice');
2513
+ takeProfitPrice = this.omitZero(this.safeString(takeProfit, 'stopPrice'));
2514
+ }
2515
+ const rawType = this.safeStringLower2(order, 'type', 'o');
2516
+ const stopPrice = this.omitZero(this.safeString2(order, 'StopPrice', 'stopPrice'));
2517
+ let triggerPrice = stopPrice;
2518
+ if (stopPrice !== undefined) {
2519
+ if ((rawType.indexOf('stop') > -1) && (stopLossPrice === undefined)) {
2520
+ stopLossPrice = stopPrice;
2521
+ triggerPrice = undefined;
2522
+ }
2523
+ if ((rawType.indexOf('take') > -1) && (takeProfitPrice === undefined)) {
2524
+ takeProfitPrice = stopPrice;
2525
+ triggerPrice = undefined;
2526
+ }
2477
2527
  }
2478
2528
  return this.safeOrder({
2479
2529
  'info': info,
@@ -2484,13 +2534,13 @@ export default class bingx extends Exchange {
2484
2534
  'datetime': this.iso8601(timestamp),
2485
2535
  'lastTradeTimestamp': lastTradeTimestamp,
2486
2536
  'lastUpdateTimestamp': this.safeInteger(order, 'updateTime'),
2487
- 'type': this.parseOrderType(this.safeStringLower2(order, 'type', 'o')),
2537
+ 'type': this.parseOrderType(rawType),
2488
2538
  'timeInForce': this.safeString(order, 'timeInForce'),
2489
2539
  'postOnly': undefined,
2490
2540
  'side': this.parseOrderSide(side),
2491
2541
  'price': this.safeString2(order, 'price', 'p'),
2492
- 'stopPrice': this.safeNumber(order, 'stopPrice'),
2493
- 'triggerPrice': this.safeNumber(order, 'stopPrice'),
2542
+ 'stopPrice': triggerPrice,
2543
+ 'triggerPrice': triggerPrice,
2494
2544
  'stopLossPrice': stopLossPrice,
2495
2545
  'takeProfitPrice': takeProfitPrice,
2496
2546
  'average': this.safeString2(order, 'avgPrice', 'ap'),
package/js/src/bitget.js CHANGED
@@ -760,6 +760,7 @@ export default class bitget extends Exchange {
760
760
  'v2/earn/loan/borrow-history': 2,
761
761
  'v2/earn/loan/debts': 2,
762
762
  'v2/earn/loan/reduces': 2,
763
+ 'v2/earn/account/assets': 2,
763
764
  },
764
765
  'post': {
765
766
  'v2/earn/savings/subscribe': 2,
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/bitmart.js';
2
- import type { Int, OrderSide, Balances, OrderType, OHLCV, Order, Str, Trade, Transaction, Ticker, OrderBook, Tickers, Strings, Currency, Market, TransferEntry, Num, TradingFeeInterface, Currencies, IsolatedBorrowRates, IsolatedBorrowRate, Dict, TransferEntries } from './base/types.js';
2
+ import type { Int, OrderSide, Balances, OrderType, OHLCV, Order, Str, Trade, Transaction, Ticker, OrderBook, Tickers, Strings, Currency, Market, TransferEntry, Num, TradingFeeInterface, Currencies, IsolatedBorrowRates, IsolatedBorrowRate, Dict, TransferEntries, OrderRequest } from './base/types.js';
3
3
  /**
4
4
  * @class bitmart
5
5
  * @augments Exchange
@@ -56,9 +56,11 @@ export default class bitmart extends Exchange {
56
56
  parseOrderStatusByType(type: any, status: any): string;
57
57
  createMarketBuyOrderWithCost(symbol: string, cost: number, params?: {}): Promise<Order>;
58
58
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
59
+ createOrders(orders: OrderRequest[], params?: {}): Promise<Order[]>;
59
60
  createSwapOrderRequest(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): any;
60
61
  createSpotOrderRequest(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): any;
61
62
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
63
+ cancelOrders(ids: string[], symbol?: Str, params?: {}): Promise<any[]>;
62
64
  cancelAllOrders(symbol?: Str, params?: {}): Promise<any>;
63
65
  fetchOrdersByStatus(status: any, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
64
66
  fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
package/js/src/bitmart.js CHANGED
@@ -38,11 +38,12 @@ export default class bitmart extends Exchange {
38
38
  'borrowIsolatedMargin': true,
39
39
  'cancelAllOrders': true,
40
40
  'cancelOrder': true,
41
- 'cancelOrders': false,
41
+ 'cancelOrders': true,
42
42
  'createMarketBuyOrderWithCost': true,
43
43
  'createMarketOrderWithCost': false,
44
44
  'createMarketSellOrderWithCost': false,
45
45
  'createOrder': true,
46
+ 'createOrders': true,
46
47
  'createPostOnlyOrder': true,
47
48
  'createStopLimitOrder': false,
48
49
  'createStopMarketOrder': false,
@@ -182,7 +183,7 @@ export default class bitmart extends Exchange {
182
183
  'spot/v2/orders': 5,
183
184
  'spot/v1/trades': 5,
184
185
  // newer order endpoint
185
- 'spot/v2/trades': 5,
186
+ 'spot/v2/trades': 4,
186
187
  'spot/v3/orders': 5,
187
188
  'spot/v2/order_detail': 1,
188
189
  // margin
@@ -226,6 +227,8 @@ export default class bitmart extends Exchange {
226
227
  'spot/v4/query/history-orders': 5,
227
228
  'spot/v4/query/trades': 5,
228
229
  'spot/v4/query/order-trades': 5,
230
+ 'spot/v4/cancel_orders': 3,
231
+ 'spot/v4/batch_orders': 3,
229
232
  // newer endpoint
230
233
  'spot/v3/cancel_order': 1,
231
234
  'spot/v2/batch_orders': 1,
@@ -2393,6 +2396,76 @@ export default class bitmart extends Exchange {
2393
2396
  order['price'] = price;
2394
2397
  return order;
2395
2398
  }
2399
+ async createOrders(orders, params = {}) {
2400
+ /**
2401
+ * @method
2402
+ * @name bitmart#createOrders
2403
+ * @description create a list of trade orders
2404
+ * @see https://developer-pro.bitmart.com/en/spot/#new-batch-order-v4-signed
2405
+ * @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
2406
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2407
+ * @returns {object} an [order structure]{@link https://docs.ccxt.com/#/?id=order-structure}
2408
+ */
2409
+ await this.loadMarkets();
2410
+ const ordersRequests = [];
2411
+ let symbol = undefined;
2412
+ let market = undefined;
2413
+ for (let i = 0; i < orders.length; i++) {
2414
+ const rawOrder = orders[i];
2415
+ const marketId = this.safeString(rawOrder, 'symbol');
2416
+ market = this.market(marketId);
2417
+ if (!market['spot']) {
2418
+ throw new NotSupported(this.id + ' createOrders() supports spot orders only');
2419
+ }
2420
+ if (symbol === undefined) {
2421
+ symbol = marketId;
2422
+ }
2423
+ else {
2424
+ if (symbol !== marketId) {
2425
+ throw new BadRequest(this.id + ' createOrders() requires all orders to have the same symbol');
2426
+ }
2427
+ }
2428
+ const type = this.safeString(rawOrder, 'type');
2429
+ const side = this.safeString(rawOrder, 'side');
2430
+ const amount = this.safeValue(rawOrder, 'amount');
2431
+ const price = this.safeValue(rawOrder, 'price');
2432
+ const orderParams = this.safeDict(rawOrder, 'params', {});
2433
+ let orderRequest = this.createSpotOrderRequest(marketId, type, side, amount, price, orderParams);
2434
+ orderRequest = this.omit(orderRequest, ['symbol']); // not needed because it goes in the outter object
2435
+ ordersRequests.push(orderRequest);
2436
+ }
2437
+ const request = {
2438
+ 'symbol': market['id'],
2439
+ 'orderParams': ordersRequests,
2440
+ };
2441
+ const response = await this.privatePostSpotV4BatchOrders(request);
2442
+ //
2443
+ // {
2444
+ // "message": "OK",
2445
+ // "code": 1000,
2446
+ // "trace": "5fc697fb817a4b5396284786a9b2609a.263.17022620476480263",
2447
+ // "data": {
2448
+ // "code": 0,
2449
+ // "msg": "success",
2450
+ // "data": {
2451
+ // "orderIds": [
2452
+ // "212751308355553320"
2453
+ // ]
2454
+ // }
2455
+ // }
2456
+ // }
2457
+ //
2458
+ const data = this.safeDict(response, 'data', {});
2459
+ const innderData = this.safeDict(data, 'data', {});
2460
+ const orderIds = this.safeList(innderData, 'orderIds', []);
2461
+ const parsedOrders = [];
2462
+ for (let i = 0; i < orderIds.length; i++) {
2463
+ const orderId = orderIds[i];
2464
+ const order = this.safeOrder({ 'id': orderId }, market);
2465
+ parsedOrders.push(order);
2466
+ }
2467
+ return parsedOrders;
2468
+ }
2396
2469
  createSwapOrderRequest(symbol, type, side, amount, price = undefined, params = {}) {
2397
2470
  /**
2398
2471
  * @method
@@ -2675,6 +2748,68 @@ export default class bitmart extends Exchange {
2675
2748
  const order = this.parseOrder(id, market);
2676
2749
  return this.extend(order, { 'id': id });
2677
2750
  }
2751
+ async cancelOrders(ids, symbol = undefined, params = {}) {
2752
+ /**
2753
+ * @method
2754
+ * @name bitmart#cancelOrders
2755
+ * @description cancel multiple orders
2756
+ * @see https://developer-pro.bitmart.com/en/spot/#cancel-batch-order-v4-signed
2757
+ * @param {string[]} ids order ids
2758
+ * @param {string} symbol unified symbol of the market the order was made in
2759
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2760
+ * @param {string[]} [params.clientOrderIds] client order ids
2761
+ * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
2762
+ */
2763
+ if (symbol === undefined) {
2764
+ throw new ArgumentsRequired(this.id + ' cancelOrders() requires a symbol argument');
2765
+ }
2766
+ await this.loadMarkets();
2767
+ const market = this.market(symbol);
2768
+ if (!market['spot']) {
2769
+ throw new NotSupported(this.id + ' cancelOrders() does not support ' + market['type'] + ' orders, only spot orders are accepted');
2770
+ }
2771
+ const clientOrderIds = this.safeList(params, 'clientOrderIds');
2772
+ params = this.omit(params, ['clientOrderIds']);
2773
+ const request = {
2774
+ 'symbol': market['id'],
2775
+ };
2776
+ if (clientOrderIds !== undefined) {
2777
+ request['clientOrderIds'] = clientOrderIds;
2778
+ }
2779
+ else {
2780
+ request['orderIds'] = ids;
2781
+ }
2782
+ const response = await this.privatePostSpotV4CancelOrders(this.extend(request, params));
2783
+ //
2784
+ // {
2785
+ // "message": "OK",
2786
+ // "code": 1000,
2787
+ // "trace": "c4edbce860164203954f7c3c81d60fc6.309.17022669632770001",
2788
+ // "data": {
2789
+ // "successIds": [
2790
+ // "213055379155243012"
2791
+ // ],
2792
+ // "failIds": [],
2793
+ // "totalCount": 1,
2794
+ // "successCount": 1,
2795
+ // "failedCount": 0
2796
+ // }
2797
+ // }
2798
+ //
2799
+ const data = this.safeDict(response, 'data', {});
2800
+ const allOrders = [];
2801
+ const successIds = this.safeList(data, 'successIds', []);
2802
+ for (let i = 0; i < successIds.length; i++) {
2803
+ const id = successIds[i];
2804
+ allOrders.push(this.safeOrder({ 'id': id, 'status': 'canceled' }, market));
2805
+ }
2806
+ const failIds = this.safeList(data, 'failIds', []);
2807
+ for (let i = 0; i < failIds.length; i++) {
2808
+ const id = failIds[i];
2809
+ allOrders.push(this.safeOrder({ 'id': id, 'status': 'failed' }, market));
2810
+ }
2811
+ return allOrders;
2812
+ }
2678
2813
  async cancelAllOrders(symbol = undefined, params = {}) {
2679
2814
  /**
2680
2815
  * @method
package/js/src/bybit.js CHANGED
@@ -2489,14 +2489,14 @@ export default class bybit extends Exchange {
2489
2489
  throw new ArgumentsRequired(this.id + ' fetchFundingRateHistory() requires a symbol argument');
2490
2490
  }
2491
2491
  await this.loadMarkets();
2492
- if (limit === undefined) {
2493
- limit = 200;
2494
- }
2495
2492
  let paginate = false;
2496
2493
  [paginate, params] = this.handleOptionAndParams(params, 'fetchFundingRateHistory', 'paginate');
2497
2494
  if (paginate) {
2498
2495
  return await this.fetchPaginatedCallDeterministic('fetchFundingRateHistory', symbol, since, limit, '8h', params, 200);
2499
2496
  }
2497
+ if (limit === undefined) {
2498
+ limit = 200;
2499
+ }
2500
2500
  const request = {
2501
2501
  // 'category': '', // Product type. linear,inverse
2502
2502
  // 'symbol': '', // Symbol name
@@ -2981,7 +2981,7 @@ export default class coinbase extends Exchange {
2981
2981
  const marketId = this.safeString(order, 'product_id');
2982
2982
  const symbol = this.safeSymbol(marketId, market, '-');
2983
2983
  if (symbol !== undefined) {
2984
- market = this.market(symbol);
2984
+ market = this.safeMarket(symbol, market);
2985
2985
  }
2986
2986
  const orderConfiguration = this.safeDict(order, 'order_configuration', {});
2987
2987
  const limitGTC = this.safeDict(orderConfiguration, 'limit_limit_gtc');
@@ -2240,7 +2240,7 @@ export default class krakenfutures extends Exchange {
2240
2240
  /**
2241
2241
  * @method
2242
2242
  * @name krakenfutures#fetchPositions
2243
- * @see https://docs.futures.kraken.com/#websocket-api-private-feeds-open-positions
2243
+ * @see https://docs.futures.kraken.com/#http-api-trading-v3-api-account-information-get-open-positions
2244
2244
  * @description Fetches current contract trading positions
2245
2245
  * @param {string[]} symbols List of unified symbols
2246
2246
  * @param {object} [params] Not used by krakenfutures
package/js/src/kucoin.js CHANGED
@@ -430,6 +430,7 @@ export default class kucoin extends Exchange {
430
430
  'The withdrawal amount is below the minimum requirement.': ExchangeError,
431
431
  'Unsuccessful! Exceeded the max. funds out-transfer limit': InsufficientFunds,
432
432
  'The amount increment is invalid.': BadRequest,
433
+ 'The quantity is below the minimum requirement.': InvalidOrder,
433
434
  '400': BadRequest,
434
435
  '401': AuthenticationError,
435
436
  '403': NotSupported,