ccxt 4.3.5 → 4.3.6

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 (58) hide show
  1. package/README.md +3 -3
  2. package/dist/cjs/ccxt.js +1 -1
  3. package/dist/cjs/src/base/Exchange.js +3 -0
  4. package/dist/cjs/src/binance.js +2 -0
  5. package/dist/cjs/src/bingx.js +45 -0
  6. package/dist/cjs/src/bitmex.js +24 -0
  7. package/dist/cjs/src/bybit.js +86 -0
  8. package/dist/cjs/src/coinbase.js +5 -4
  9. package/dist/cjs/src/coinex.js +30 -32
  10. package/dist/cjs/src/cryptocom.js +32 -0
  11. package/dist/cjs/src/htx.js +28 -0
  12. package/dist/cjs/src/hyperliquid.js +40 -0
  13. package/dist/cjs/src/kraken.js +30 -0
  14. package/dist/cjs/src/krakenfutures.js +28 -0
  15. package/dist/cjs/src/kucoinfutures.js +2 -2
  16. package/dist/cjs/src/okx.js +113 -0
  17. package/dist/cjs/src/pro/bitget.js +1 -1
  18. package/dist/cjs/src/whitebit.js +42 -0
  19. package/dist/cjs/src/woo.js +29 -0
  20. package/js/ccxt.d.ts +1 -1
  21. package/js/ccxt.js +1 -1
  22. package/js/src/abstract/binance.d.ts +1 -0
  23. package/js/src/abstract/binancecoinm.d.ts +1 -0
  24. package/js/src/abstract/binanceus.d.ts +1 -0
  25. package/js/src/abstract/binanceusdm.d.ts +1 -0
  26. package/js/src/abstract/bingx.d.ts +1 -0
  27. package/js/src/abstract/woo.d.ts +1 -0
  28. package/js/src/base/Exchange.d.ts +1 -0
  29. package/js/src/base/Exchange.js +3 -0
  30. package/js/src/binance.js +2 -0
  31. package/js/src/bingx.d.ts +1 -0
  32. package/js/src/bingx.js +45 -0
  33. package/js/src/bitmex.d.ts +1 -0
  34. package/js/src/bitmex.js +24 -0
  35. package/js/src/bybit.d.ts +2 -1
  36. package/js/src/bybit.js +86 -0
  37. package/js/src/coinbase.js +5 -4
  38. package/js/src/coinex.js +30 -32
  39. package/js/src/cryptocom.d.ts +2 -1
  40. package/js/src/cryptocom.js +32 -0
  41. package/js/src/htx.d.ts +1 -0
  42. package/js/src/htx.js +28 -0
  43. package/js/src/hyperliquid.d.ts +1 -0
  44. package/js/src/hyperliquid.js +40 -0
  45. package/js/src/kraken.d.ts +1 -0
  46. package/js/src/kraken.js +30 -0
  47. package/js/src/krakenfutures.d.ts +1 -0
  48. package/js/src/krakenfutures.js +28 -0
  49. package/js/src/kucoinfutures.js +2 -2
  50. package/js/src/okx.d.ts +3 -1
  51. package/js/src/okx.js +113 -0
  52. package/js/src/pro/bitget.d.ts +1 -1
  53. package/js/src/pro/bitget.js +1 -1
  54. package/js/src/whitebit.d.ts +1 -0
  55. package/js/src/whitebit.js +42 -0
  56. package/js/src/woo.d.ts +2 -1
  57. package/js/src/woo.js +29 -0
  58. package/package.json +1 -1
package/js/src/coinex.js CHANGED
@@ -1132,14 +1132,13 @@ export default class coinex extends Exchange {
1132
1132
  //
1133
1133
  // Spot and Swap fetchTrades (public)
1134
1134
  //
1135
- // {
1136
- // "id": 2611511379,
1137
- // "type": "buy",
1138
- // "price": "192.63",
1139
- // "amount": "0.02266931",
1140
- // "date": 1638990110,
1141
- // "date_ms": 1638990110518
1142
- // },
1135
+ // {
1136
+ // "amount": "0.00049432",
1137
+ // "created_at": 1713849825667,
1138
+ // "deal_id": 4137517302,
1139
+ // "price": "66251",
1140
+ // "side": "buy"
1141
+ // }
1143
1142
  //
1144
1143
  // Spot and Margin fetchMyTrades (private)
1145
1144
  //
@@ -1193,9 +1192,9 @@ export default class coinex extends Exchange {
1193
1192
  //
1194
1193
  let timestamp = this.safeTimestamp2(trade, 'create_time', 'time');
1195
1194
  if (timestamp === undefined) {
1196
- timestamp = this.safeInteger(trade, 'date_ms');
1195
+ timestamp = this.safeInteger(trade, 'created_at');
1197
1196
  }
1198
- const tradeId = this.safeString(trade, 'id');
1197
+ const tradeId = this.safeString2(trade, 'id', 'deal_id');
1199
1198
  const orderId = this.safeString(trade, 'order_id');
1200
1199
  const priceString = this.safeString(trade, 'price');
1201
1200
  const amountString = this.safeString(trade, 'amount');
@@ -1232,11 +1231,11 @@ export default class coinex extends Exchange {
1232
1231
  side = 'buy';
1233
1232
  }
1234
1233
  if (side === undefined) {
1235
- side = this.safeString(trade, 'type');
1234
+ side = this.safeString2(trade, 'type', 'side');
1236
1235
  }
1237
1236
  }
1238
1237
  else {
1239
- side = this.safeString(trade, 'type');
1238
+ side = this.safeString2(trade, 'type', 'side');
1240
1239
  }
1241
1240
  return this.safeTrade({
1242
1241
  'info': trade,
@@ -1258,9 +1257,9 @@ export default class coinex extends Exchange {
1258
1257
  /**
1259
1258
  * @method
1260
1259
  * @name coinex#fetchTrades
1261
- * @description get the list of most recent trades for a particular symbol
1262
- * @see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot001_market005_market_deals
1263
- * @see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http011_market_deals
1260
+ * @description get the list of the most recent trades for a particular symbol
1261
+ * @see https://docs.coinex.com/api/v2/spot/market/http/list-market-deals
1262
+ * @see https://docs.coinex.com/api/v2/futures/market/http/list-market-deals
1264
1263
  * @param {string} symbol unified symbol of the market to fetch trades for
1265
1264
  * @param {int} [since] timestamp in ms of the earliest trade to fetch
1266
1265
  * @param {int} [limit] the maximum amount of trades to fetch
@@ -1278,28 +1277,27 @@ export default class coinex extends Exchange {
1278
1277
  }
1279
1278
  let response = undefined;
1280
1279
  if (market['swap']) {
1281
- response = await this.v1PerpetualPublicGetMarketDeals(this.extend(request, params));
1280
+ response = await this.v2PublicGetFuturesDeals(this.extend(request, params));
1282
1281
  }
1283
1282
  else {
1284
- response = await this.v1PublicGetMarketDeals(this.extend(request, params));
1283
+ response = await this.v2PublicGetSpotDeals(this.extend(request, params));
1285
1284
  }
1286
1285
  //
1287
1286
  // Spot and Swap
1288
1287
  //
1289
- // {
1290
- // "code": 0,
1291
- // "data": [
1292
- // {
1293
- // "id": 2611511379,
1294
- // "type": "buy",
1295
- // "price": "192.63",
1296
- // "amount": "0.02266931",
1297
- // "date": 1638990110,
1298
- // "date_ms": 1638990110518
1299
- // },
1300
- // ],
1301
- // "message": "OK"
1302
- // }
1288
+ // {
1289
+ // "code": 0,
1290
+ // "data": [
1291
+ // {
1292
+ // "amount": "0.00049432",
1293
+ // "created_at": 1713849825667,
1294
+ // "deal_id": 4137517302,
1295
+ // "price": "66251",
1296
+ // "side": "buy"
1297
+ // },
1298
+ // ],
1299
+ // "message": "OK"
1300
+ // }
1303
1301
  //
1304
1302
  return this.parseTrades(response['data'], market, since, limit);
1305
1303
  }
@@ -4487,7 +4485,7 @@ export default class coinex extends Exchange {
4487
4485
  }
4488
4486
  async fetchFundingRates(symbols = undefined, params = {}) {
4489
4487
  /**
4490
- * @method
4488
+ * @method
4491
4489
  * @name coinex#fetchFundingRates
4492
4490
  * @description fetch the current funding rates
4493
4491
  * @see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http009_market_ticker_all
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/cryptocom.js';
2
- import type { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, Str, Ticker, OrderRequest, Balances, Transaction, OrderBook, Tickers, Strings, Currency, Market, Num, Account } from './base/types.js';
2
+ import type { Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, Str, Ticker, OrderRequest, Balances, Transaction, OrderBook, Tickers, Strings, Currency, Market, Num, Account, CancellationRequest } from './base/types.js';
3
3
  /**
4
4
  * @class cryptocom
5
5
  * @augments Exchange
@@ -23,6 +23,7 @@ export default class cryptocom extends Exchange {
23
23
  cancelAllOrders(symbol?: Str, params?: {}): Promise<any>;
24
24
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
25
25
  cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<Order[]>;
26
+ cancelOrdersForSymbols(orders: CancellationRequest[], params?: {}): Promise<Order[]>;
26
27
  fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
27
28
  fetchMyTrades(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
28
29
  parseAddress(addressString: any): any[];
@@ -35,6 +35,7 @@ export default class cryptocom extends Exchange {
35
35
  'cancelAllOrders': true,
36
36
  'cancelOrder': true,
37
37
  'cancelOrders': true,
38
+ 'cancelOrdersForSymbols': true,
38
39
  'closeAllPositions': false,
39
40
  'closePosition': true,
40
41
  'createMarketBuyOrderWithCost': false,
@@ -1467,6 +1468,37 @@ export default class cryptocom extends Exchange {
1467
1468
  const result = this.safeList(response, 'result', []);
1468
1469
  return this.parseOrders(result, market, undefined, undefined, params);
1469
1470
  }
1471
+ async cancelOrdersForSymbols(orders, params = {}) {
1472
+ /**
1473
+ * @method
1474
+ * @name cryptocom#cancelOrdersForSymbols
1475
+ * @description cancel multiple orders for multiple symbols
1476
+ * @see https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#private-cancel-order-list-list
1477
+ * @param {CancellationRequest[]} orders each order should contain the parameters required by cancelOrder namely id and symbol
1478
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1479
+ * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
1480
+ */
1481
+ await this.loadMarkets();
1482
+ const orderRequests = [];
1483
+ for (let i = 0; i < orders.length; i++) {
1484
+ const order = orders[i];
1485
+ const id = this.safeString(order, 'id');
1486
+ const symbol = this.safeString(order, 'symbol');
1487
+ const market = this.market(symbol);
1488
+ const orderItem = {
1489
+ 'instrument_name': market['id'],
1490
+ 'order_id': id.toString(),
1491
+ };
1492
+ orderRequests.push(orderItem);
1493
+ }
1494
+ const request = {
1495
+ 'contingency_type': 'LIST',
1496
+ 'order_list': orderRequests,
1497
+ };
1498
+ const response = await this.v1PrivatePostPrivateCancelOrderList(this.extend(request, params));
1499
+ const result = this.safeList(response, 'result', []);
1500
+ return this.parseOrders(result, undefined, undefined, undefined, params);
1501
+ }
1470
1502
  async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1471
1503
  /**
1472
1504
  * @method
package/js/src/htx.d.ts CHANGED
@@ -92,6 +92,7 @@ export default class htx extends Exchange {
92
92
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
93
93
  cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<any>;
94
94
  cancelAllOrders(symbol?: Str, params?: {}): Promise<any>;
95
+ cancelAllOrdersAfter(timeout: Int, params?: {}): Promise<any>;
95
96
  parseDepositAddress(depositAddress: any, currency?: Currency): {
96
97
  currency: string;
97
98
  address: string;
package/js/src/htx.js CHANGED
@@ -38,6 +38,7 @@ export default class htx extends Exchange {
38
38
  'borrowCrossMargin': true,
39
39
  'borrowIsolatedMargin': true,
40
40
  'cancelAllOrders': true,
41
+ 'cancelAllOrdersAfter': true,
41
42
  'cancelOrder': true,
42
43
  'cancelOrders': true,
43
44
  'createDepositAddress': undefined,
@@ -6166,6 +6167,33 @@ export default class htx extends Exchange {
6166
6167
  //
6167
6168
  return response;
6168
6169
  }
6170
+ async cancelAllOrdersAfter(timeout, params = {}) {
6171
+ /**
6172
+ * @method
6173
+ * @name huobi#cancelAllOrdersAfter
6174
+ * @description dead man's switch, cancel all orders after the given timeout
6175
+ * @see https://huobiapi.github.io/docs/spot/v1/en/#dead-man-s-switch
6176
+ * @param {number} timeout time in milliseconds, 0 represents cancel the timer
6177
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
6178
+ * @returns {object} the api result
6179
+ */
6180
+ await this.loadMarkets();
6181
+ const request = {
6182
+ 'timeout': (timeout > 0) ? this.parseToInt(timeout / 1000) : 0,
6183
+ };
6184
+ const response = await this.v2PrivatePostAlgoOrdersCancelAllAfter(this.extend(request, params));
6185
+ //
6186
+ // {
6187
+ // "code": 200,
6188
+ // "message": "success",
6189
+ // "data": {
6190
+ // "currentTime": 1630491627230,
6191
+ // "triggerTime": 1630491637230
6192
+ // }
6193
+ // }
6194
+ //
6195
+ return response;
6196
+ }
6169
6197
  parseDepositAddress(depositAddress, currency = undefined) {
6170
6198
  //
6171
6199
  // {
@@ -56,6 +56,7 @@ export default class hyperliquid extends Exchange {
56
56
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
57
57
  cancelOrders(ids: string[], symbol?: Str, params?: {}): Promise<any>;
58
58
  cancelOrdersForSymbols(orders: CancellationRequest[], params?: {}): Promise<any>;
59
+ cancelAllOrdersAfter(timeout: Int, params?: {}): Promise<any>;
59
60
  editOrder(id: string, symbol: string, type: string, side: string, amount?: Num, price?: Num, params?: {}): Promise<Order>;
60
61
  fetchFundingRateHistory(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<FundingRateHistory[]>;
61
62
  fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
@@ -38,6 +38,7 @@ export default class hyperliquid extends Exchange {
38
38
  'borrowCrossMargin': false,
39
39
  'borrowIsolatedMargin': false,
40
40
  'cancelAllOrders': false,
41
+ 'cancelAllOrdersAfter': true,
41
42
  'cancelOrder': true,
42
43
  'cancelOrders': true,
43
44
  'cancelOrdersForSymbols': true,
@@ -1364,6 +1365,45 @@ export default class hyperliquid extends Exchange {
1364
1365
  //
1365
1366
  return response;
1366
1367
  }
1368
+ async cancelAllOrdersAfter(timeout, params = {}) {
1369
+ /**
1370
+ * @method
1371
+ * @name hyperliquid#cancelAllOrdersAfter
1372
+ * @description dead man's switch, cancel all orders after the given timeout
1373
+ * @param {number} timeout time in milliseconds, 0 represents cancel the timer
1374
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1375
+ * @param {string} [params.vaultAddress] the vault address
1376
+ * @returns {object} the api result
1377
+ */
1378
+ this.checkRequiredCredentials();
1379
+ await this.loadMarkets();
1380
+ params = this.omit(params, ['clientOrderId', 'client_id']);
1381
+ const nonce = this.milliseconds();
1382
+ const request = {
1383
+ 'nonce': nonce,
1384
+ // 'vaultAddress': vaultAddress,
1385
+ };
1386
+ const cancelAction = {
1387
+ 'type': 'scheduleCancel',
1388
+ 'time': nonce + timeout,
1389
+ };
1390
+ const vaultAddress = this.formatVaultAddress(this.safeString(params, 'vaultAddress'));
1391
+ const signature = this.signL1Action(cancelAction, nonce, vaultAddress);
1392
+ request['action'] = cancelAction;
1393
+ request['signature'] = signature;
1394
+ if (vaultAddress !== undefined) {
1395
+ params = this.omit(params, 'vaultAddress');
1396
+ request['vaultAddress'] = vaultAddress;
1397
+ }
1398
+ const response = await this.privatePostExchange(this.extend(request, params));
1399
+ //
1400
+ // {
1401
+ // "status":"err",
1402
+ // "response":"Cannot set scheduled cancel time until enough volume traded. Required: $1000000. Traded: $373.47205."
1403
+ // }
1404
+ //
1405
+ return response;
1406
+ }
1367
1407
  async editOrder(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
1368
1408
  /**
1369
1409
  * @method
@@ -71,6 +71,7 @@ export default class kraken extends Exchange {
71
71
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
72
72
  cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<any>;
73
73
  cancelAllOrders(symbol?: Str, params?: {}): Promise<any>;
74
+ cancelAllOrdersAfter(timeout: Int, params?: {}): Promise<any>;
74
75
  fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
75
76
  fetchClosedOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
76
77
  parseTransactionStatus(status: any): string;
package/js/src/kraken.js CHANGED
@@ -39,6 +39,7 @@ export default class kraken extends Exchange {
39
39
  'option': false,
40
40
  'addMargin': false,
41
41
  'cancelAllOrders': true,
42
+ 'cancelAllOrdersAfter': true,
42
43
  'cancelOrder': true,
43
44
  'cancelOrders': true,
44
45
  'createDepositAddress': true,
@@ -2139,6 +2140,35 @@ export default class kraken extends Exchange {
2139
2140
  await this.loadMarkets();
2140
2141
  return await this.privatePostCancelAll(params);
2141
2142
  }
2143
+ async cancelAllOrdersAfter(timeout, params = {}) {
2144
+ /**
2145
+ * @method
2146
+ * @name kraken#cancelAllOrdersAfter
2147
+ * @description dead man's switch, cancel all orders after the given timeout
2148
+ * @see https://docs.kraken.com/rest/#tag/Spot-Trading/operation/cancelAllOrdersAfter
2149
+ * @param {number} timeout time in milliseconds, 0 represents cancel the timer
2150
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2151
+ * @returns {object} the api result
2152
+ */
2153
+ if (timeout > 86400000) {
2154
+ throw new BadRequest(this.id + 'cancelAllOrdersAfter timeout should be less than 86400000 milliseconds');
2155
+ }
2156
+ await this.loadMarkets();
2157
+ const request = {
2158
+ 'timeout': (timeout > 0) ? (this.parseToInt(timeout / 1000)) : 0,
2159
+ };
2160
+ const response = await this.privatePostCancelAllOrdersAfter(this.extend(request, params));
2161
+ //
2162
+ // {
2163
+ // "error": [ ],
2164
+ // "result": {
2165
+ // "currentTime": "2023-03-24T17:41:56Z",
2166
+ // "triggerTime": "2023-03-24T17:42:56Z"
2167
+ // }
2168
+ // }
2169
+ //
2170
+ return response;
2171
+ }
2142
2172
  async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2143
2173
  /**
2144
2174
  * @method
@@ -21,6 +21,7 @@ export default class krakenfutures extends Exchange {
21
21
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
22
22
  cancelOrders(ids: string[], symbol?: Str, params?: {}): Promise<Order[]>;
23
23
  cancelAllOrders(symbol?: Str, params?: {}): Promise<any>;
24
+ cancelAllOrdersAfter(timeout: Int, params?: {}): Promise<any>;
24
25
  fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
25
26
  fetchClosedOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
26
27
  fetchCanceledOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
@@ -34,6 +34,7 @@ export default class krakenfutures extends Exchange {
34
34
  'future': true,
35
35
  'option': false,
36
36
  'cancelAllOrders': true,
37
+ 'cancelAllOrdersAfter': true,
37
38
  'cancelOrder': true,
38
39
  'cancelOrders': true,
39
40
  'createMarketOrder': false,
@@ -1272,6 +1273,33 @@ export default class krakenfutures extends Exchange {
1272
1273
  const response = await this.privatePostCancelallorders(this.extend(request, params));
1273
1274
  return response;
1274
1275
  }
1276
+ async cancelAllOrdersAfter(timeout, params = {}) {
1277
+ /**
1278
+ * @method
1279
+ * @name krakenfutures#cancelAllOrdersAfter
1280
+ * @description dead man's switch, cancel all orders after the given timeout
1281
+ * @see https://docs.futures.kraken.com/#http-api-trading-v3-api-order-management-dead-man-39-s-switch
1282
+ * @param {number} timeout time in milliseconds, 0 represents cancel the timer
1283
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1284
+ * @returns {object} the api result
1285
+ */
1286
+ await this.loadMarkets();
1287
+ const request = {
1288
+ 'timeout': (timeout > 0) ? (this.parseToInt(timeout / 1000)) : 0,
1289
+ };
1290
+ const response = await this.privatePostCancelallordersafter(this.extend(request, params));
1291
+ //
1292
+ // {
1293
+ // "result": "success",
1294
+ // "serverTime": "2018-06-19T16:51:23.839Z",
1295
+ // "status": {
1296
+ // "currentTime": "2018-06-19T16:51:23.839Z",
1297
+ // "triggerTime": "0"
1298
+ // }
1299
+ // }
1300
+ //
1301
+ return response;
1302
+ }
1275
1303
  async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
1276
1304
  /**
1277
1305
  * @method
@@ -2198,8 +2198,8 @@ export default class kucoinfutures extends kucoin {
2198
2198
  // symbol (String) [optional] Symbol of the contract
2199
2199
  // side (String) [optional] buy or sell
2200
2200
  // type (String) [optional] limit, market, limit_stop or market_stop
2201
- // startAt (long) [optional] Start time (milisecond)
2202
- // endAt (long) [optional] End time (milisecond)
2201
+ // startAt (long) [optional] Start time (millisecond)
2202
+ // endAt (long) [optional] End time (millisecond)
2203
2203
  };
2204
2204
  let market = undefined;
2205
2205
  if (symbol !== undefined) {
package/js/src/okx.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/okx.js';
2
- import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency, Leverage, Num, Account, OptionChain, Option, MarginModification, TradingFeeInterface, Currencies, Conversion } from './base/types.js';
2
+ import type { TransferEntry, Int, OrderSide, OrderType, Trade, OHLCV, Order, FundingRateHistory, OrderRequest, FundingHistory, Str, Transaction, Ticker, OrderBook, Balances, Tickers, Market, Greeks, Strings, MarketInterface, Currency, Leverage, Num, Account, OptionChain, Option, MarginModification, TradingFeeInterface, Currencies, Conversion, CancellationRequest } from './base/types.js';
3
3
  /**
4
4
  * @class okx
5
5
  * @augments Exchange
@@ -49,6 +49,8 @@ export default class okx extends Exchange {
49
49
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
50
50
  parseIds(ids: any): any;
51
51
  cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<Order[]>;
52
+ cancelOrdersForSymbols(orders: CancellationRequest[], params?: {}): Promise<Order[]>;
53
+ cancelAllOrdersAfter(timeout: Int, params?: {}): Promise<any>;
52
54
  parseOrderStatus(status: any): string;
53
55
  parseOrder(order: any, market?: Market): Order;
54
56
  fetchOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
package/js/src/okx.js CHANGED
@@ -34,8 +34,10 @@ export default class okx extends Exchange {
34
34
  'option': true,
35
35
  'addMargin': true,
36
36
  'cancelAllOrders': false,
37
+ 'cancelAllOrdersAfter': true,
37
38
  'cancelOrder': true,
38
39
  'cancelOrders': true,
40
+ 'cancelOrdersForSymbols': true,
39
41
  'closeAllPositions': false,
40
42
  'closePosition': true,
41
43
  'createConvertTrade': true,
@@ -3285,6 +3287,117 @@ export default class okx extends Exchange {
3285
3287
  const ordersData = this.safeList(response, 'data', []);
3286
3288
  return this.parseOrders(ordersData, market, undefined, undefined, params);
3287
3289
  }
3290
+ async cancelOrdersForSymbols(orders, params = {}) {
3291
+ /**
3292
+ * @method
3293
+ * @name okx#cancelOrdersForSymbols
3294
+ * @description cancel multiple orders for multiple symbols
3295
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-post-cancel-multiple-orders
3296
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-algo-trading-post-cancel-algo-order
3297
+ * @param {CancellationRequest[]} orders each order should contain the parameters required by cancelOrder namely id and symbol
3298
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3299
+ * @param {boolean} [params.trigger] whether the order is a stop/trigger order
3300
+ * @param {boolean} [params.trailing] set to true if you want to cancel trailing orders
3301
+ * @returns {object} an list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
3302
+ */
3303
+ await this.loadMarkets();
3304
+ const request = [];
3305
+ const options = this.safeDict(this.options, 'cancelOrders', {});
3306
+ const defaultMethod = this.safeString(options, 'method', 'privatePostTradeCancelBatchOrders');
3307
+ let method = this.safeString(params, 'method', defaultMethod);
3308
+ const stop = this.safeBool2(params, 'stop', 'trigger');
3309
+ const trailing = this.safeBool(params, 'trailing', false);
3310
+ const isStopOrTrailing = stop || trailing;
3311
+ if (isStopOrTrailing) {
3312
+ method = 'privatePostTradeCancelAlgos';
3313
+ }
3314
+ for (let i = 0; i < orders.length; i++) {
3315
+ const order = orders[i];
3316
+ const id = this.safeString(order, 'id');
3317
+ const clientOrderId = this.safeString2(order, 'clOrdId', 'clientOrderId');
3318
+ const symbol = this.safeString(order, 'symbol');
3319
+ const market = this.market(symbol);
3320
+ let idKey = 'ordId';
3321
+ if (isStopOrTrailing) {
3322
+ idKey = 'algoId';
3323
+ }
3324
+ else if (clientOrderId !== undefined) {
3325
+ idKey = 'clOrdId';
3326
+ }
3327
+ const requestItem = {
3328
+ 'instId': market['id'],
3329
+ };
3330
+ requestItem[idKey] = (clientOrderId !== undefined) ? clientOrderId : id;
3331
+ request.push(requestItem);
3332
+ }
3333
+ let response = undefined;
3334
+ if (method === 'privatePostTradeCancelAlgos') {
3335
+ response = await this.privatePostTradeCancelAlgos(request); // * dont extend with params, otherwise ARRAY will be turned into OBJECT
3336
+ }
3337
+ else {
3338
+ response = await this.privatePostTradeCancelBatchOrders(request); // * dont extend with params, otherwise ARRAY will be turned into OBJECT
3339
+ }
3340
+ //
3341
+ // {
3342
+ // "code": "0",
3343
+ // "data": [
3344
+ // {
3345
+ // "clOrdId": "e123456789ec4dBC1123456ba123b45e",
3346
+ // "ordId": "405071912345641543",
3347
+ // "sCode": "0",
3348
+ // "sMsg": ""
3349
+ // },
3350
+ // ...
3351
+ // ],
3352
+ // "msg": ""
3353
+ // }
3354
+ //
3355
+ // Algo order
3356
+ //
3357
+ // {
3358
+ // "code": "0",
3359
+ // "data": [
3360
+ // {
3361
+ // "algoId": "431375349042380800",
3362
+ // "sCode": "0",
3363
+ // "sMsg": ""
3364
+ // }
3365
+ // ],
3366
+ // "msg": ""
3367
+ // }
3368
+ //
3369
+ const ordersData = this.safeList(response, 'data', []);
3370
+ return this.parseOrders(ordersData, undefined, undefined, undefined, params);
3371
+ }
3372
+ async cancelAllOrdersAfter(timeout, params = {}) {
3373
+ /**
3374
+ * @method
3375
+ * @name okx#cancelAllOrdersAfter
3376
+ * @description dead man's switch, cancel all orders after the given timeout
3377
+ * @see https://www.okx.com/docs-v5/en/#order-book-trading-trade-post-cancel-all-after
3378
+ * @param {number} timeout time in milliseconds, 0 represents cancel the timer
3379
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3380
+ * @returns {object} the api result
3381
+ */
3382
+ await this.loadMarkets();
3383
+ const request = {
3384
+ 'timeOut': (timeout > 0) ? this.parseToInt(timeout / 1000) : 0,
3385
+ };
3386
+ const response = await this.privatePostTradeCancelAllAfter(this.extend(request, params));
3387
+ //
3388
+ // {
3389
+ // "code":"0",
3390
+ // "msg":"",
3391
+ // "data":[
3392
+ // {
3393
+ // "triggerTime":"1587971460",
3394
+ // "ts":"1587971400"
3395
+ // }
3396
+ // ]
3397
+ // }
3398
+ //
3399
+ return response;
3400
+ }
3288
3401
  parseOrderStatus(status) {
3289
3402
  const statuses = {
3290
3403
  'canceled': 'canceled',
@@ -29,7 +29,7 @@ export default class bitget extends bitgetRest {
29
29
  handlePositions(client: Client, message: any): void;
30
30
  parseWsPosition(position: any, market?: any): Position;
31
31
  watchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
32
- handleOrder(client: Client, message: any, subscription?: any): void;
32
+ handleOrder(client: Client, message: any): void;
33
33
  parseWsOrder(order: any, market?: any): Order;
34
34
  parseWsOrderStatus(status: any): string;
35
35
  watchMyTrades(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
@@ -1007,7 +1007,7 @@ export default class bitget extends bitgetRest {
1007
1007
  }
1008
1008
  return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
1009
1009
  }
1010
- handleOrder(client, message, subscription = undefined) {
1010
+ handleOrder(client, message) {
1011
1011
  //
1012
1012
  // spot
1013
1013
  //
@@ -38,6 +38,7 @@ export default class whitebit extends Exchange {
38
38
  editOrder(id: string, symbol: string, type: OrderType, side: OrderSide, amount?: Num, price?: Num, params?: {}): Promise<Order>;
39
39
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
40
40
  cancelAllOrders(symbol?: Str, params?: {}): Promise<any>;
41
+ cancelAllOrdersAfter(timeout: Int, params?: {}): Promise<any>;
41
42
  parseBalance(response: any): Balances;
42
43
  fetchBalance(params?: {}): Promise<Balances>;
43
44
  fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
@@ -32,6 +32,7 @@ export default class whitebit extends Exchange {
32
32
  'future': false,
33
33
  'option': false,
34
34
  'cancelAllOrders': true,
35
+ 'cancelAllOrdersAfter': true,
35
36
  'cancelOrder': true,
36
37
  'cancelOrders': false,
37
38
  'createOrder': true,
@@ -1412,6 +1413,47 @@ export default class whitebit extends Exchange {
1412
1413
  //
1413
1414
  return response;
1414
1415
  }
1416
+ async cancelAllOrdersAfter(timeout, params = {}) {
1417
+ /**
1418
+ * @method
1419
+ * @name whitebit#cancelAllOrdersAfter
1420
+ * @description dead man's switch, cancel all orders after the given timeout
1421
+ * @see https://docs.whitebit.com/private/http-trade-v4/#sync-kill-switch-timer
1422
+ * @param {number} timeout time in milliseconds, 0 represents cancel the timer
1423
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
1424
+ * @param {string} [params.types] Order types value. Example: "spot", "margin", "futures" or null
1425
+ * @param {string} [params.symbol] symbol unified symbol of the market the order was made in
1426
+ * @returns {object} the api result
1427
+ */
1428
+ await this.loadMarkets();
1429
+ const symbol = this.safeString(params, 'symbol');
1430
+ if (symbol === undefined) {
1431
+ throw new ArgumentsRequired(this.id + ' cancelAllOrdersAfter() requires a symbol argument in params');
1432
+ }
1433
+ const market = this.market(symbol);
1434
+ params = this.omit(params, 'symbol');
1435
+ const isBiggerThanZero = (timeout > 0);
1436
+ const request = {
1437
+ 'market': market['id'],
1438
+ // 'timeout': (timeout > 0) ? this.numberToString (timeout / 1000) : null,
1439
+ };
1440
+ if (isBiggerThanZero) {
1441
+ request['timeout'] = this.numberToString(timeout / 1000);
1442
+ }
1443
+ else {
1444
+ request['timeout'] = 'null';
1445
+ }
1446
+ const response = await this.v4PrivatePostOrderKillSwitch(this.extend(request, params));
1447
+ //
1448
+ // {
1449
+ // "market": "BTC_USDT", // currency market,
1450
+ // "startTime": 1662478154, // now timestamp,
1451
+ // "cancellationTime": 1662478154, // now + timer_value,
1452
+ // "types": ["spot", "margin"]
1453
+ // }
1454
+ //
1455
+ return response;
1456
+ }
1415
1457
  parseBalance(response) {
1416
1458
  const balanceKeys = Object.keys(response);
1417
1459
  const result = {};