ccxt 4.2.13 → 4.2.15

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 (53) hide show
  1. package/README.md +3 -3
  2. package/dist/ccxt.browser.js +781 -133
  3. package/dist/ccxt.browser.min.js +7 -7
  4. package/dist/cjs/ccxt.js +1 -1
  5. package/dist/cjs/js/ccxt.js +1 -1
  6. package/dist/cjs/js/src/base/Exchange.js +148 -1
  7. package/dist/cjs/js/src/bigone.js +36 -32
  8. package/dist/cjs/js/src/binance.js +108 -0
  9. package/dist/cjs/js/src/binanceus.js +8 -0
  10. package/dist/cjs/js/src/bingx.js +5 -0
  11. package/dist/cjs/js/src/bitget.js +4 -0
  12. package/dist/cjs/js/src/bybit.js +4 -0
  13. package/dist/cjs/js/src/coinex.js +3 -0
  14. package/dist/cjs/js/src/delta.js +7 -1
  15. package/dist/cjs/js/src/gate.js +5 -0
  16. package/dist/cjs/js/src/htx.js +126 -1
  17. package/dist/cjs/js/src/kraken.js +43 -9
  18. package/dist/cjs/js/src/kucoin.js +5 -0
  19. package/dist/cjs/js/src/kucoinfutures.js +131 -77
  20. package/dist/cjs/js/src/okx.js +9 -8
  21. package/dist/cjs/js/src/pro/htx.js +6 -1
  22. package/dist/cjs/js/src/pro/woo.js +126 -0
  23. package/dist/cjs/js/src/woo.js +6 -2
  24. package/js/ccxt.d.ts +1 -1
  25. package/js/ccxt.js +1 -1
  26. package/js/src/abstract/bigone.d.ts +1 -0
  27. package/js/src/abstract/kucoin.d.ts +4 -0
  28. package/js/src/abstract/kucoinfutures.d.ts +4 -0
  29. package/js/src/base/Exchange.d.ts +8 -0
  30. package/js/src/base/Exchange.js +148 -1
  31. package/js/src/bigone.js +36 -32
  32. package/js/src/binance.d.ts +9 -0
  33. package/js/src/binance.js +108 -0
  34. package/js/src/binanceus.js +8 -0
  35. package/js/src/bingx.js +5 -0
  36. package/js/src/bitget.js +4 -0
  37. package/js/src/bybit.js +4 -0
  38. package/js/src/coinex.js +3 -0
  39. package/js/src/delta.js +7 -1
  40. package/js/src/gate.js +5 -0
  41. package/js/src/htx.d.ts +9 -0
  42. package/js/src/htx.js +126 -1
  43. package/js/src/kraken.d.ts +1 -0
  44. package/js/src/kraken.js +43 -9
  45. package/js/src/kucoin.js +5 -0
  46. package/js/src/kucoinfutures.d.ts +4 -2
  47. package/js/src/kucoinfutures.js +131 -77
  48. package/js/src/okx.js +9 -8
  49. package/js/src/pro/htx.js +6 -1
  50. package/js/src/pro/woo.d.ts +5 -1
  51. package/js/src/pro/woo.js +127 -1
  52. package/js/src/woo.js +6 -2
  53. package/package.json +1 -1
package/js/src/binance.js CHANGED
@@ -52,9 +52,12 @@ export default class binance extends Exchange {
52
52
  'createPostOnlyOrder': true,
53
53
  'createReduceOnlyOrder': true,
54
54
  'createStopLimitOrder': true,
55
+ 'createStopLossOrder': true,
55
56
  'createStopMarketOrder': false,
56
57
  'createStopOrder': true,
58
+ 'createTakeProfitOrder': true,
57
59
  'createTrailingPercentOrder': true,
60
+ 'createTriggerOrder': true,
58
61
  'editOrder': true,
59
62
  'fetchAccounts': undefined,
60
63
  'fetchBalance': true,
@@ -85,6 +88,7 @@ export default class binance extends Exchange {
85
88
  'fetchIsolatedBorrowRate': false,
86
89
  'fetchIsolatedBorrowRates': false,
87
90
  'fetchL3OrderBook': false,
91
+ 'fetchLastPrices': true,
88
92
  'fetchLedger': true,
89
93
  'fetchLeverage': false,
90
94
  'fetchLeverageTiers': true,
@@ -3160,6 +3164,110 @@ export default class binance extends Exchange {
3160
3164
  }
3161
3165
  return this.parseTickers(response, symbols);
3162
3166
  }
3167
+ async fetchLastPrices(symbols = undefined, params = {}) {
3168
+ /**
3169
+ * @method
3170
+ * @name binance#fetchLastPrices
3171
+ * @description fetches the last price for multiple markets
3172
+ * @see https://binance-docs.github.io/apidocs/spot/en/#symbol-price-ticker // spot
3173
+ * @see https://binance-docs.github.io/apidocs/future/en/#symbol-price-ticker // swap
3174
+ * @see https://binance-docs.github.io/apidocs/delivery/en/#symbol-price-ticker // future
3175
+ * @param {string[]|undefined} symbols unified symbols of the markets to fetch the last prices
3176
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
3177
+ * @returns {object} a dictionary of lastprices structures
3178
+ */
3179
+ await this.loadMarkets();
3180
+ symbols = this.marketSymbols(symbols);
3181
+ const market = this.getMarketFromSymbols(symbols);
3182
+ let type = undefined;
3183
+ let subType = undefined;
3184
+ [subType, params] = this.handleSubTypeAndParams('fetchLastPrices', market, params);
3185
+ [type, params] = this.handleMarketTypeAndParams('fetchLastPrices', market, params);
3186
+ let response = undefined;
3187
+ if (this.isLinear(type, subType)) {
3188
+ response = await this.fapiPublicV2GetTickerPrice(params);
3189
+ //
3190
+ // [
3191
+ // {
3192
+ // "symbol": "LTCBTC",
3193
+ // "price": "4.00000200"
3194
+ // "time": 1589437530011
3195
+ // },
3196
+ // ...
3197
+ // ]
3198
+ //
3199
+ }
3200
+ else if (this.isInverse(type, subType)) {
3201
+ response = await this.dapiPublicGetTickerPrice(params);
3202
+ //
3203
+ // [
3204
+ // {
3205
+ // "symbol": "BTCUSD_200626",
3206
+ // "ps": "9647.8",
3207
+ // "price": "9647.8",
3208
+ // "time": 1591257246176
3209
+ // }
3210
+ // ]
3211
+ //
3212
+ }
3213
+ else if (type === 'spot') {
3214
+ response = await this.publicGetTickerPrice(params);
3215
+ //
3216
+ // [
3217
+ // {
3218
+ // "symbol": "LTCBTC",
3219
+ // "price": "4.00000200"
3220
+ // },
3221
+ // ...
3222
+ // ]
3223
+ //
3224
+ }
3225
+ else {
3226
+ throw new NotSupported(this.id + ' fetchLastPrices() does not support ' + type + ' markets yet');
3227
+ }
3228
+ return this.parseLastPrices(response, symbols);
3229
+ }
3230
+ parseLastPrice(entry, market = undefined) {
3231
+ //
3232
+ // spot
3233
+ //
3234
+ // {
3235
+ // "symbol": "LTCBTC",
3236
+ // "price": "4.00000200"
3237
+ // }
3238
+ //
3239
+ // usdm (swap/future)
3240
+ //
3241
+ // {
3242
+ // "symbol": "BTCUSDT",
3243
+ // "price": "6000.01",
3244
+ // "time": 1589437530011 // Transaction time
3245
+ // }
3246
+ //
3247
+ //
3248
+ // coinm (swap/future)
3249
+ //
3250
+ // {
3251
+ // "symbol": "BTCUSD_200626", // symbol ("BTCUSD_200626", "BTCUSD_PERP", etc..)
3252
+ // "ps": "BTCUSD", // pair
3253
+ // "price": "9647.8",
3254
+ // "time": 1591257246176
3255
+ // }
3256
+ //
3257
+ const timestamp = this.safeInteger(entry, 'time');
3258
+ const type = (timestamp === undefined) ? 'spot' : 'swap';
3259
+ const marketId = this.safeString(entry, 'symbol');
3260
+ market = this.safeMarket(marketId, market, undefined, type);
3261
+ const price = this.safeNumber(entry, 'price');
3262
+ return {
3263
+ 'symbol': market['symbol'],
3264
+ 'timestamp': timestamp,
3265
+ 'datetime': this.iso8601(timestamp),
3266
+ 'price': price,
3267
+ 'side': undefined,
3268
+ 'info': entry,
3269
+ };
3270
+ }
3163
3271
  async fetchTickers(symbols = undefined, params = {}) {
3164
3272
  /**
3165
3273
  * @method
@@ -13,6 +13,7 @@ export default class binanceus extends binance {
13
13
  'id': 'binanceus',
14
14
  'name': 'Binance US',
15
15
  'countries': ['US'],
16
+ 'rateLimit': 50,
16
17
  'certified': false,
17
18
  'pro': true,
18
19
  'urls': {
@@ -80,6 +81,13 @@ export default class binanceus extends binance {
80
81
  'setMarginMode': false,
81
82
  'setPositionMode': false,
82
83
  },
84
+ 'api': {
85
+ 'public': {
86
+ 'get': {
87
+ 'ticker/price': { 'cost': 1, 'noSymbol': 2 },
88
+ },
89
+ },
90
+ },
83
91
  });
84
92
  }
85
93
  }
package/js/src/bingx.js CHANGED
@@ -39,8 +39,12 @@ export default class bingx extends Exchange {
39
39
  'createMarketSellOrderWithCost': true,
40
40
  'createOrder': true,
41
41
  'createOrders': true,
42
+ 'createOrderWithTakeProfitAndStopLoss': true,
43
+ 'createStopLossOrder': true,
44
+ 'createTakeProfitOrder': true,
42
45
  'createTrailingAmountOrder': true,
43
46
  'createTrailingPercentOrder': true,
47
+ 'createTriggerOrder': true,
44
48
  'fetchBalance': true,
45
49
  'fetchClosedOrders': true,
46
50
  'fetchCurrencies': true,
@@ -360,6 +364,7 @@ export default class bingx extends Exchange {
360
364
  '80016': OrderNotFound,
361
365
  '80017': OrderNotFound,
362
366
  '100414': AccountSuspended,
367
+ '100419': PermissionDenied,
363
368
  '100437': BadRequest, // {"code":100437,"msg":"The withdrawal amount is lower than the minimum limit, please re-enter.","timestamp":1689258588845}
364
369
  },
365
370
  'broad': {},
package/js/src/bitget.js CHANGED
@@ -45,8 +45,12 @@ export default class bitget extends Exchange {
45
45
  'createMarketSellOrderWithCost': false,
46
46
  'createOrder': true,
47
47
  'createOrders': true,
48
+ 'createOrderWithTakeProfitAndStopLoss': true,
48
49
  'createReduceOnlyOrder': false,
50
+ 'createStopLossOrder': true,
51
+ 'createTakeProfitOrder': true,
49
52
  'createTrailingPercentOrder': true,
53
+ 'createTriggerOrder': true,
50
54
  'editOrder': true,
51
55
  'fetchAccounts': false,
52
56
  'fetchBalance': true,
package/js/src/bybit.js CHANGED
@@ -44,12 +44,16 @@ export default class bybit extends Exchange {
44
44
  'createMarketSellOrderWithCost': false,
45
45
  'createOrder': true,
46
46
  'createOrders': true,
47
+ 'createOrderWithTakeProfitAndStopLoss': true,
47
48
  'createPostOnlyOrder': true,
48
49
  'createReduceOnlyOrder': true,
49
50
  'createStopLimitOrder': true,
51
+ 'createStopLossOrder': true,
50
52
  'createStopMarketOrder': true,
51
53
  'createStopOrder': true,
54
+ 'createTakeProfitOrder': true,
52
55
  'createTrailingAmountOrder': true,
56
+ 'createTriggerOrder': true,
53
57
  'editOrder': true,
54
58
  'fetchBalance': true,
55
59
  'fetchBorrowInterest': false,
package/js/src/coinex.js CHANGED
@@ -54,6 +54,9 @@ export default class coinex extends Exchange {
54
54
  'createOrder': true,
55
55
  'createOrders': true,
56
56
  'createReduceOnlyOrder': true,
57
+ 'createStopLossOrder': true,
58
+ 'createTakeProfitOrder': true,
59
+ 'createTriggerOrder': true,
57
60
  'editOrder': true,
58
61
  'fetchBalance': true,
59
62
  'fetchBorrowInterest': true,
package/js/src/delta.js CHANGED
@@ -2074,7 +2074,13 @@ export default class delta extends Exchange {
2074
2074
  if (limit !== undefined) {
2075
2075
  request['page_size'] = limit;
2076
2076
  }
2077
- const response = await this[method](this.extend(request, params));
2077
+ let response = undefined;
2078
+ if (method === 'privateGetOrders') {
2079
+ response = await this.privateGetOrders(this.extend(request, params));
2080
+ }
2081
+ else if (method === 'privateGetOrdersHistory') {
2082
+ response = await this.privateGetOrdersHistory(this.extend(request, params));
2083
+ }
2078
2084
  //
2079
2085
  // {
2080
2086
  // "success": true,
package/js/src/gate.js CHANGED
@@ -92,8 +92,11 @@ export default class gate extends Exchange {
92
92
  'createPostOnlyOrder': true,
93
93
  'createReduceOnlyOrder': true,
94
94
  'createStopLimitOrder': true,
95
+ 'createStopLossOrder': true,
95
96
  'createStopMarketOrder': false,
96
97
  'createStopOrder': true,
98
+ 'createTakeProfitOrder': true,
99
+ 'createTriggerOrder': true,
97
100
  'editOrder': true,
98
101
  'fetchBalance': true,
99
102
  'fetchBorrowRateHistories': false,
@@ -3769,6 +3772,8 @@ export default class gate extends Exchange {
3769
3772
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3770
3773
  * @param {float} [params.stopPrice] The price at which a trigger order is triggered at
3771
3774
  * @param {string} [params.timeInForce] "GTC", "IOC", or "PO"
3775
+ * @param {float} [params.stopLossPrice] The price at which a stop loss order is triggered at
3776
+ * @param {float} [params.takeProfitPrice] The price at which a take profit order is triggered at
3772
3777
  * @param {string} [params.marginMode] 'cross' or 'isolated' - marginMode for margin trading if not provided this.options['defaultMarginMode'] is used
3773
3778
  * @param {int} [params.iceberg] Amount to display for the iceberg order, Null or 0 for normal orders, Set to -1 to hide the order completely
3774
3779
  * @param {string} [params.text] User defined information
package/js/src/htx.d.ts CHANGED
@@ -51,6 +51,15 @@ export default class htx extends Exchange {
51
51
  parseTicker(ticker: any, market?: Market): Ticker;
52
52
  fetchTicker(symbol: string, params?: {}): Promise<Ticker>;
53
53
  fetchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
54
+ fetchLastPrices(symbols?: Strings, params?: {}): Promise<any>;
55
+ parseLastPrice(entry: any, market?: Market): {
56
+ symbol: string;
57
+ timestamp: any;
58
+ datetime: any;
59
+ price: number;
60
+ side: string;
61
+ info: any;
62
+ };
54
63
  fetchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
55
64
  parseTrade(trade: any, market?: Market): Trade;
56
65
  fetchOrderTrades(id: string, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
package/js/src/htx.js CHANGED
@@ -48,9 +48,12 @@ export default class htx extends Exchange {
48
48
  'createOrders': true,
49
49
  'createReduceOnlyOrder': false,
50
50
  'createStopLimitOrder': true,
51
+ 'createStopLossOrder': true,
51
52
  'createStopMarketOrder': true,
52
53
  'createStopOrder': true,
54
+ 'createTakeProfitOrder': true,
53
55
  'createTrailingPercentOrder': true,
56
+ 'createTriggerOrder': true,
54
57
  'fetchAccounts': true,
55
58
  'fetchBalance': true,
56
59
  'fetchBidsAsks': undefined,
@@ -78,6 +81,7 @@ export default class htx extends Exchange {
78
81
  'fetchIsolatedBorrowRate': false,
79
82
  'fetchIsolatedBorrowRates': true,
80
83
  'fetchL3OrderBook': undefined,
84
+ 'fetchLastPrices': true,
81
85
  'fetchLedger': true,
82
86
  'fetchLedgerEntry': undefined,
83
87
  'fetchLeverage': false,
@@ -2270,6 +2274,127 @@ export default class htx extends Exchange {
2270
2274
  }
2271
2275
  return this.filterByArrayTickers(result, 'symbol', symbols);
2272
2276
  }
2277
+ async fetchLastPrices(symbols = undefined, params = {}) {
2278
+ /**
2279
+ * @method
2280
+ * @name binance#fetchLastPrices
2281
+ * @description fetches the last price for multiple markets
2282
+ * @see https://www.htx.com/en-us/opend/newApiPages/?id=8cb81024-77b5-11ed-9966-0242ac110003 linear swap & linear future
2283
+ * @see https://www.htx.com/en-us/opend/newApiPages/?id=28c2e8fc-77ae-11ed-9966-0242ac110003 inverse future
2284
+ * @see https://www.htx.com/en-us/opend/newApiPages/?id=5d517ef5-77b6-11ed-9966-0242ac110003 inverse swap
2285
+ * @param {string[]|undefined} symbols unified symbols of the markets to fetch the last prices
2286
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
2287
+ * @returns {object} a dictionary of lastprices structures
2288
+ */
2289
+ await this.loadMarkets();
2290
+ symbols = this.marketSymbols(symbols);
2291
+ const market = this.getMarketFromSymbols(symbols);
2292
+ let type = undefined;
2293
+ let subType = undefined;
2294
+ [subType, params] = this.handleSubTypeAndParams('fetchLastPrices', market, params);
2295
+ [type, params] = this.handleMarketTypeAndParams('fetchLastPrices', market, params);
2296
+ let response = undefined;
2297
+ if (((type === 'swap') || (type === 'future')) && (subType === 'linear')) {
2298
+ response = await this.contractPublicGetLinearSwapExMarketTrade(params);
2299
+ //
2300
+ // {
2301
+ // "ch": "market.*.trade.detail",
2302
+ // "status": "ok",
2303
+ // "tick": {
2304
+ // "data": [
2305
+ // {
2306
+ // "amount": "4",
2307
+ // "quantity": "40",
2308
+ // "trade_turnover": "22.176",
2309
+ // "ts": 1703697705028,
2310
+ // "id": 1000003558478170000,
2311
+ // "price": "0.5544",
2312
+ // "direction": "buy",
2313
+ // "contract_code": "MANA-USDT",
2314
+ // "business_type": "swap",
2315
+ // "trade_partition": "USDT"
2316
+ // },
2317
+ // ],
2318
+ // "id": 1703697740147,
2319
+ // "ts": 1703697740147
2320
+ // },
2321
+ // "ts": 1703697740147
2322
+ // }
2323
+ //
2324
+ }
2325
+ else if ((type === 'swap') && (subType === 'inverse')) {
2326
+ response = await this.contractPublicGetSwapExMarketTrade(params);
2327
+ //
2328
+ // {
2329
+ // "ch": "market.*.trade.detail",
2330
+ // "status": "ok",
2331
+ // "tick": {
2332
+ // "data": [
2333
+ // {
2334
+ // "amount": "6",
2335
+ // "quantity": "94.5000945000945000945000945000945000945",
2336
+ // "ts": 1703698704594,
2337
+ // "id": 1000001187811060000,
2338
+ // "price": "0.63492",
2339
+ // "direction": "buy",
2340
+ // "contract_code": "XRP-USD"
2341
+ // },
2342
+ // ],
2343
+ // "id": 1703698706589,
2344
+ // "ts": 1703698706589
2345
+ // },
2346
+ // "ts": 1703698706589
2347
+ // }
2348
+ //
2349
+ }
2350
+ else if ((type === 'future') && (subType === 'inverse')) {
2351
+ response = await this.contractPublicGetMarketTrade(params);
2352
+ //
2353
+ // {
2354
+ // "ch": "market.*.trade.detail",
2355
+ // "status": "ok",
2356
+ // "tick": {
2357
+ // "data": [
2358
+ // {
2359
+ // "amount": "20",
2360
+ // "quantity": "44.4444444444444444444444444444444444444",
2361
+ // "ts": 1686134498885,
2362
+ // "id": 2323000000174820000,
2363
+ // "price": "4.5",
2364
+ // "direction": "sell",
2365
+ // "symbol": "DORA_CW"
2366
+ // },
2367
+ // ],
2368
+ // "id": 1703698855142,
2369
+ // "ts": 1703698855142
2370
+ // },
2371
+ // "ts": 1703698855142
2372
+ // }
2373
+ //
2374
+ }
2375
+ else {
2376
+ throw new NotSupported(this.id + ' fetchLastPrices() does not support ' + type + ' markets yet');
2377
+ }
2378
+ const tick = this.safeValue(response, 'tick', {});
2379
+ const data = this.safeValue(tick, 'data', []);
2380
+ return this.parseLastPrices(data, symbols);
2381
+ }
2382
+ parseLastPrice(entry, market = undefined) {
2383
+ // example responses are documented in fetchLastPrices
2384
+ const marketId = this.safeString2(entry, 'symbol', 'contract_code');
2385
+ market = this.safeMarket(marketId, market);
2386
+ const price = this.safeNumber(entry, 'price');
2387
+ const direction = this.safeString(entry, 'direction'); // "buy" or "sell"
2388
+ // group timestamp should not be assigned to the individual trades' times
2389
+ return {
2390
+ 'symbol': market['symbol'],
2391
+ 'timestamp': undefined,
2392
+ 'datetime': undefined,
2393
+ 'price': price,
2394
+ 'side': direction,
2395
+ 'info': entry,
2396
+ };
2397
+ }
2273
2398
  async fetchOrderBook(symbol, limit = undefined, params = {}) {
2274
2399
  /**
2275
2400
  * @method
@@ -4975,7 +5100,7 @@ export default class htx extends Exchange {
4975
5100
  async createTrailingPercentOrder(symbol, type, side, amount, price = undefined, trailingPercent = undefined, trailingTriggerPrice = undefined, params = {}) {
4976
5101
  /**
4977
5102
  * @method
4978
- * @name createTrailingPercentOrder
5103
+ * @name htx#createTrailingPercentOrder
4979
5104
  * @description create a trailing order by providing the symbol, type, side, amount, price and trailingPercent
4980
5105
  * @param {string} symbol unified symbol of the market to create an order in
4981
5106
  * @param {string} type 'market' or 'limit'
@@ -66,6 +66,7 @@ export default class kraken extends Exchange {
66
66
  findMarketByAltnameOrId(id: any): any;
67
67
  getDelistedMarketById(id: any): any;
68
68
  parseOrderStatus(status: any): string;
69
+ parseOrderType(status: any): string;
69
70
  parseOrder(order: any, market?: Market): Order;
70
71
  orderRequest(method: any, symbol: any, type: any, request: any, price?: any, params?: {}): any[];
71
72
  editOrder(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<Order>;
package/js/src/kraken.js CHANGED
@@ -1441,6 +1441,16 @@ export default class kraken extends Exchange {
1441
1441
  };
1442
1442
  return this.safeString(statuses, status, status);
1443
1443
  }
1444
+ parseOrderType(status) {
1445
+ const statuses = {
1446
+ 'take-profit': 'market',
1447
+ 'stop-loss-limit': 'limit',
1448
+ 'stop-loss': 'market',
1449
+ 'take-profit-limit': 'limit',
1450
+ 'trailing-stop-limit': 'limit',
1451
+ };
1452
+ return this.safeString(statuses, status, status);
1453
+ }
1444
1454
  parseOrder(order, market = undefined) {
1445
1455
  //
1446
1456
  // createOrder for regular orders
@@ -1583,7 +1593,17 @@ export default class kraken extends Exchange {
1583
1593
  trades.push(rawTrade);
1584
1594
  }
1585
1595
  }
1586
- stopPrice = this.safeNumber(order, 'stopprice', stopPrice);
1596
+ stopPrice = this.omitZero(this.safeString(order, 'stopprice', stopPrice));
1597
+ let stopLossPrice = undefined;
1598
+ let takeProfitPrice = undefined;
1599
+ if (type.startsWith('take-profit')) {
1600
+ takeProfitPrice = this.safeString(description, 'price');
1601
+ price = this.omitZero(this.safeString(description, 'price2'));
1602
+ }
1603
+ else if (type.startsWith('stop-loss')) {
1604
+ stopLossPrice = this.safeString(description, 'price');
1605
+ price = this.omitZero(this.safeString(description, 'price2'));
1606
+ }
1587
1607
  return this.safeOrder({
1588
1608
  'id': id,
1589
1609
  'clientOrderId': clientOrderId,
@@ -1593,13 +1613,15 @@ export default class kraken extends Exchange {
1593
1613
  'lastTradeTimestamp': undefined,
1594
1614
  'status': status,
1595
1615
  'symbol': symbol,
1596
- 'type': type,
1616
+ 'type': this.parseOrderType(type),
1597
1617
  'timeInForce': undefined,
1598
1618
  'postOnly': isPostOnly,
1599
1619
  'side': side,
1600
1620
  'price': price,
1601
1621
  'stopPrice': stopPrice,
1602
1622
  'triggerPrice': stopPrice,
1623
+ 'takeProfitPrice': takeProfitPrice,
1624
+ 'stopLossPrice': stopLossPrice,
1603
1625
  'cost': undefined,
1604
1626
  'amount': amount,
1605
1627
  'filled': filled,
@@ -1623,27 +1645,39 @@ export default class kraken extends Exchange {
1623
1645
  const trailingAmount = this.safeString(params, 'trailingAmount');
1624
1646
  const trailingLimitAmount = this.safeString(params, 'trailingLimitAmount');
1625
1647
  const isTrailingAmountOrder = trailingAmount !== undefined;
1626
- if ((type === 'limit') && !isTrailingAmountOrder) {
1648
+ const isLimitOrder = type.endsWith('limit'); // supporting limit, stop-loss-limit, take-profit-limit, etc
1649
+ if (isLimitOrder && !isTrailingAmountOrder) {
1627
1650
  request['price'] = this.priceToPrecision(symbol, price);
1628
1651
  }
1629
- let reduceOnly = this.safeValue2(params, 'reduceOnly', 'reduce_only');
1652
+ const reduceOnly = this.safeValue2(params, 'reduceOnly', 'reduce_only');
1630
1653
  if (isStopLossOrTakeProfitTrigger) {
1631
1654
  if (isStopLossTriggerOrder) {
1632
1655
  request['price'] = this.priceToPrecision(symbol, stopLossTriggerPrice);
1633
- request['ordertype'] = 'stop-loss-limit';
1656
+ if (isLimitOrder) {
1657
+ request['ordertype'] = 'stop-loss-limit';
1658
+ }
1659
+ else {
1660
+ request['ordertype'] = 'stop-loss';
1661
+ }
1634
1662
  }
1635
1663
  else if (isTakeProfitTriggerOrder) {
1636
1664
  request['price'] = this.priceToPrecision(symbol, takeProfitTriggerPrice);
1637
- request['ordertype'] = 'take-profit-limit';
1665
+ if (isLimitOrder) {
1666
+ request['ordertype'] = 'take-profit-limit';
1667
+ }
1668
+ else {
1669
+ request['ordertype'] = 'take-profit';
1670
+ }
1671
+ }
1672
+ if (isLimitOrder) {
1673
+ request['price2'] = this.priceToPrecision(symbol, price);
1638
1674
  }
1639
- request['price2'] = this.priceToPrecision(symbol, price);
1640
- reduceOnly = true;
1641
1675
  }
1642
1676
  else if (isTrailingAmountOrder) {
1643
1677
  const trailingActivationPriceType = this.safeString(params, 'trigger', 'last');
1644
1678
  const trailingAmountString = '+' + trailingAmount;
1645
1679
  request['trigger'] = trailingActivationPriceType;
1646
- if ((type === 'limit') || (trailingLimitAmount !== undefined)) {
1680
+ if (isLimitOrder || (trailingLimitAmount !== undefined)) {
1647
1681
  const offset = this.safeString(params, 'offset', '-');
1648
1682
  const trailingLimitAmountString = offset + this.numberToString(trailingLimitAmount);
1649
1683
  request['price'] = trailingAmountString;
package/js/src/kucoin.js CHANGED
@@ -50,6 +50,7 @@ export default class kucoin extends Exchange {
50
50
  'createStopLimitOrder': true,
51
51
  'createStopMarketOrder': true,
52
52
  'createStopOrder': true,
53
+ 'createTriggerOrder': true,
53
54
  'editOrder': true,
54
55
  'fetchAccounts': true,
55
56
  'fetchBalance': true,
@@ -316,6 +317,7 @@ export default class kucoin extends Exchange {
316
317
  'premium/query': 4.5,
317
318
  'trade-statistics': 4.5,
318
319
  'funding-rate/{symbol}/current': 3,
320
+ 'contract/funding-rates': 7.5,
319
321
  'timestamp': 3,
320
322
  'status': 6,
321
323
  // ?
@@ -345,6 +347,7 @@ export default class kucoin extends Exchange {
345
347
  'openOrderStatistics': 15,
346
348
  'position': 3,
347
349
  'positions': 3,
350
+ 'margin/maxWithdrawMargin': 15,
348
351
  'contracts/risk-limit/{symbol}': 7.5,
349
352
  'funding-history': 7.5, // 5FW
350
353
  },
@@ -355,7 +358,9 @@ export default class kucoin extends Exchange {
355
358
  // futures
356
359
  'orders': 3,
357
360
  'orders/test': 3,
361
+ 'orders/multi': 4.5,
358
362
  'position/margin/auto-deposit-status': 6,
363
+ 'margin/withdrawMargin': 15,
359
364
  'position/margin/deposit-margin': 6,
360
365
  'position/risk-limit-level/change': 6,
361
366
  // ws
@@ -1,5 +1,5 @@
1
1
  import kucoin from './abstract/kucoinfutures.js';
2
- import type { Int, OrderSide, OrderType, OHLCV, Order, Trade, FundingRateHistory, FundingHistory, Balances, Str, Ticker, OrderBook, Transaction, Strings, Market, Currency } from './base/types.js';
2
+ import type { Int, OrderSide, OrderType, OHLCV, Order, Trade, FundingHistory, Balances, Str, Ticker, OrderBook, Transaction, Strings, Market, Currency, OrderRequest } from './base/types.js';
3
3
  export default class kucoinfutures extends kucoin {
4
4
  describe(): any;
5
5
  fetchStatus(params?: {}): Promise<{
@@ -28,6 +28,8 @@ export default class kucoinfutures extends kucoin {
28
28
  fetchPositions(symbols?: Strings, params?: {}): Promise<import("./base/types.js").Position[]>;
29
29
  parsePosition(position: any, market?: Market): import("./base/types.js").Position;
30
30
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, params?: {}): Promise<Order>;
31
+ createOrders(orders: OrderRequest[], params?: {}): Promise<Order[]>;
32
+ createContractOrderRequest(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, params?: {}): any;
31
33
  cancelOrder(id: string, symbol?: Str, params?: {}): Promise<any>;
32
34
  cancelAllOrders(symbol?: Str, params?: {}): Promise<any>;
33
35
  addMargin(symbol: string, amount: any, params?: {}): Promise<any>;
@@ -85,7 +87,7 @@ export default class kucoinfutures extends kucoin {
85
87
  fetchWithdrawals(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<Transaction[]>;
86
88
  fetchMarketLeverageTiers(symbol: string, params?: {}): Promise<any[]>;
87
89
  parseMarketLeverageTiers(info: any, market?: Market): any[];
88
- fetchFundingRateHistory(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<FundingRateHistory[]>;
90
+ fetchFundingRateHistory(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").FundingRateHistory[]>;
89
91
  parseFundingRateHistory(info: any, market?: Market): {
90
92
  info: any;
91
93
  symbol: string;