ccxt 4.3.18 → 4.3.20

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 (173) hide show
  1. package/README.md +7 -5
  2. package/dist/cjs/ccxt.js +6 -1
  3. package/dist/cjs/src/abstract/woofipro.js +9 -0
  4. package/dist/cjs/src/ascendex.js +3 -4
  5. package/dist/cjs/src/base/Exchange.js +45 -2
  6. package/dist/cjs/src/base/functions/crypto.js +10 -3
  7. package/dist/cjs/src/base/functions/encode.js +6 -3
  8. package/dist/cjs/src/base/functions/number.js +8 -5
  9. package/dist/cjs/src/base/functions/rsa.js +5 -5
  10. package/dist/cjs/src/bigone.js +1 -1
  11. package/dist/cjs/src/bitfinex.js +25 -1
  12. package/dist/cjs/src/bitfinex2.js +59 -51
  13. package/dist/cjs/src/bitget.js +4 -5
  14. package/dist/cjs/src/bitmart.js +3 -3
  15. package/dist/cjs/src/bitstamp.js +1 -3
  16. package/dist/cjs/src/bybit.js +39 -9
  17. package/dist/cjs/src/coinex.js +360 -560
  18. package/dist/cjs/src/coinlist.js +1 -2
  19. package/dist/cjs/src/deribit.js +1 -1
  20. package/dist/cjs/src/hollaex.js +3 -3
  21. package/dist/cjs/src/indodax.js +1 -1
  22. package/dist/cjs/src/latoken.js +1 -1
  23. package/dist/cjs/src/mexc.js +1 -1
  24. package/dist/cjs/src/novadax.js +0 -1
  25. package/dist/cjs/src/okx.js +17 -0
  26. package/dist/cjs/src/phemex.js +17 -6
  27. package/dist/cjs/src/poloniex.js +1 -2
  28. package/dist/cjs/src/pro/bitget.js +136 -192
  29. package/dist/cjs/src/pro/coinbaseinternational.js +9 -1
  30. package/dist/cjs/src/pro/htx.js +12 -7
  31. package/dist/cjs/src/pro/okx.js +85 -0
  32. package/dist/cjs/src/pro/woofipro.js +1263 -0
  33. package/dist/cjs/src/wavesexchange.js +2 -2
  34. package/dist/cjs/src/woo.js +17 -3
  35. package/dist/cjs/src/woofipro.js +2698 -0
  36. package/js/ccxt.d.ts +8 -2
  37. package/js/ccxt.js +6 -2
  38. package/js/src/abstract/bitget.d.ts +3 -0
  39. package/js/src/abstract/bybit.d.ts +1 -0
  40. package/js/src/abstract/okx.d.ts +1 -0
  41. package/js/src/abstract/woofipro.d.ts +122 -0
  42. package/js/src/abstract/woofipro.js +11 -0
  43. package/js/src/ace.d.ts +2 -2
  44. package/js/src/ascendex.d.ts +5 -15
  45. package/js/src/ascendex.js +3 -4
  46. package/js/src/base/Exchange.d.ts +26 -17
  47. package/js/src/base/Exchange.js +45 -2
  48. package/js/src/base/functions/crypto.d.ts +1 -1
  49. package/js/src/base/functions/crypto.js +10 -3
  50. package/js/src/base/functions/encode.d.ts +1 -1
  51. package/js/src/base/functions/encode.js +6 -3
  52. package/js/src/base/functions/number.d.ts +1 -1
  53. package/js/src/base/functions/number.js +8 -5
  54. package/js/src/base/functions/rsa.js +6 -6
  55. package/js/src/base/types.d.ts +4 -0
  56. package/js/src/bigone.d.ts +4 -14
  57. package/js/src/bigone.js +1 -1
  58. package/js/src/binance.d.ts +13 -71
  59. package/js/src/binancecoinm.d.ts +2 -22
  60. package/js/src/binanceusdm.d.ts +2 -22
  61. package/js/src/bingx.d.ts +4 -14
  62. package/js/src/bit2c.d.ts +2 -2
  63. package/js/src/bitbank.d.ts +2 -2
  64. package/js/src/bitbns.d.ts +2 -2
  65. package/js/src/bitfinex.d.ts +6 -16
  66. package/js/src/bitfinex.js +25 -1
  67. package/js/src/bitfinex2.d.ts +6 -16
  68. package/js/src/bitfinex2.js +59 -51
  69. package/js/src/bitflyer.d.ts +2 -2
  70. package/js/src/bitget.d.ts +7 -17
  71. package/js/src/bitget.js +4 -5
  72. package/js/src/bithumb.d.ts +3 -3
  73. package/js/src/bitmart.d.ts +5 -14
  74. package/js/src/bitmart.js +3 -3
  75. package/js/src/bitmex.d.ts +4 -4
  76. package/js/src/bitopro.d.ts +2 -2
  77. package/js/src/bitrue.d.ts +5 -5
  78. package/js/src/bitso.d.ts +2 -2
  79. package/js/src/bitstamp.d.ts +3 -3
  80. package/js/src/bitstamp.js +1 -3
  81. package/js/src/bitteam.d.ts +2 -2
  82. package/js/src/bitvavo.d.ts +5 -5
  83. package/js/src/bl3p.d.ts +2 -2
  84. package/js/src/blockchaincom.d.ts +2 -2
  85. package/js/src/blofin.d.ts +4 -14
  86. package/js/src/btcalpha.d.ts +2 -2
  87. package/js/src/btcbox.d.ts +2 -2
  88. package/js/src/btcmarkets.d.ts +2 -2
  89. package/js/src/btcturk.d.ts +2 -2
  90. package/js/src/bybit.d.ts +9 -56
  91. package/js/src/bybit.js +39 -9
  92. package/js/src/cex.d.ts +2 -2
  93. package/js/src/coinbase.d.ts +4 -4
  94. package/js/src/coinbasepro.d.ts +3 -3
  95. package/js/src/coincheck.d.ts +2 -2
  96. package/js/src/coinex.d.ts +7 -17
  97. package/js/src/coinex.js +360 -560
  98. package/js/src/coinlist.d.ts +5 -15
  99. package/js/src/coinlist.js +1 -2
  100. package/js/src/coinmate.d.ts +2 -2
  101. package/js/src/coinmetro.d.ts +3 -3
  102. package/js/src/coinone.d.ts +2 -2
  103. package/js/src/coinsph.d.ts +2 -2
  104. package/js/src/coinspot.d.ts +2 -2
  105. package/js/src/cryptocom.d.ts +2 -2
  106. package/js/src/currencycom.d.ts +3 -3
  107. package/js/src/delta.d.ts +5 -43
  108. package/js/src/deribit.d.ts +7 -55
  109. package/js/src/deribit.js +1 -1
  110. package/js/src/digifinex.d.ts +5 -15
  111. package/js/src/exmo.d.ts +2 -2
  112. package/js/src/gate.d.ts +6 -54
  113. package/js/src/gemini.d.ts +2 -2
  114. package/js/src/hitbtc.d.ts +4 -14
  115. package/js/src/hollaex.d.ts +3 -3
  116. package/js/src/hollaex.js +3 -3
  117. package/js/src/htx.d.ts +4 -14
  118. package/js/src/huobijp.d.ts +4 -4
  119. package/js/src/hyperliquid.d.ts +1 -1
  120. package/js/src/idex.d.ts +3 -3
  121. package/js/src/independentreserve.d.ts +2 -2
  122. package/js/src/indodax.d.ts +2 -2
  123. package/js/src/indodax.js +1 -1
  124. package/js/src/kraken.d.ts +4 -14
  125. package/js/src/krakenfutures.d.ts +4 -14
  126. package/js/src/kucoin.d.ts +5 -15
  127. package/js/src/kucoinfutures.d.ts +4 -14
  128. package/js/src/kuna.d.ts +2 -2
  129. package/js/src/latoken.d.ts +5 -15
  130. package/js/src/latoken.js +1 -1
  131. package/js/src/lbank.d.ts +2 -2
  132. package/js/src/luno.d.ts +2 -2
  133. package/js/src/lykke.d.ts +2 -2
  134. package/js/src/mercado.d.ts +2 -2
  135. package/js/src/mexc.d.ts +8 -28
  136. package/js/src/mexc.js +1 -1
  137. package/js/src/ndax.d.ts +2 -2
  138. package/js/src/novadax.d.ts +4 -15
  139. package/js/src/novadax.js +0 -1
  140. package/js/src/okcoin.d.ts +4 -14
  141. package/js/src/okx.d.ts +10 -68
  142. package/js/src/okx.js +17 -0
  143. package/js/src/onetrading.d.ts +2 -2
  144. package/js/src/paymium.d.ts +4 -14
  145. package/js/src/phemex.d.ts +5 -15
  146. package/js/src/phemex.js +17 -6
  147. package/js/src/poloniex.d.ts +3 -13
  148. package/js/src/poloniex.js +1 -2
  149. package/js/src/poloniexfutures.d.ts +2 -2
  150. package/js/src/pro/bitget.js +137 -193
  151. package/js/src/pro/coinbaseinternational.d.ts +3 -3
  152. package/js/src/pro/coinbaseinternational.js +9 -1
  153. package/js/src/pro/htx.js +12 -7
  154. package/js/src/pro/okx.d.ts +4 -1
  155. package/js/src/pro/okx.js +85 -0
  156. package/js/src/pro/woofipro.d.ts +47 -0
  157. package/js/src/pro/woofipro.js +1264 -0
  158. package/js/src/probit.d.ts +3 -3
  159. package/js/src/timex.d.ts +2 -2
  160. package/js/src/tokocrypto.d.ts +3 -3
  161. package/js/src/upbit.d.ts +2 -2
  162. package/js/src/wavesexchange.d.ts +3 -3
  163. package/js/src/wavesexchange.js +2 -2
  164. package/js/src/wazirx.d.ts +2 -2
  165. package/js/src/whitebit.d.ts +3 -13
  166. package/js/src/woo.d.ts +7 -17
  167. package/js/src/woo.js +17 -3
  168. package/js/src/woofipro.d.ts +131 -0
  169. package/js/src/woofipro.js +2699 -0
  170. package/js/src/yobit.d.ts +2 -2
  171. package/js/src/zaif.d.ts +2 -2
  172. package/js/src/zonda.d.ts +4 -14
  173. package/package.json +1 -1
@@ -1729,10 +1729,9 @@ class coinlist extends coinlist$1 {
1729
1729
  */
1730
1730
  await this.loadMarkets();
1731
1731
  const currency = this.currency(code);
1732
- amount = this.currencyToPrecision(code, amount);
1733
1732
  const request = {
1734
1733
  'asset': currency['id'],
1735
- 'amount': amount,
1734
+ 'amount': this.currencyToPrecision(code, amount),
1736
1735
  };
1737
1736
  const accountsByType = this.safeValue(this.options, 'accountsByType', {});
1738
1737
  const fromAcc = this.safeString(accountsByType, fromAccount, fromAccount);
@@ -2887,7 +2887,7 @@ class deribit extends deribit$1 {
2887
2887
  'id': this.safeString(transfer, 'id'),
2888
2888
  'status': this.parseTransferStatus(status),
2889
2889
  'amount': this.safeNumber(transfer, 'amount'),
2890
- 'code': this.safeCurrencyCode(currencyId, currency),
2890
+ 'currency': this.safeCurrencyCode(currencyId, currency),
2891
2891
  'fromAccount': direction !== 'payment' ? account : undefined,
2892
2892
  'toAccount': direction === 'payment' ? account : undefined,
2893
2893
  'timestamp': timestamp,
@@ -534,12 +534,12 @@ class hollaex extends hollaex$1 {
534
534
  //
535
535
  return this.parseTickers(response, symbols);
536
536
  }
537
- parseTickers(response, symbols = undefined, params = {}) {
537
+ parseTickers(tickers, symbols = undefined, params = {}) {
538
538
  const result = {};
539
- const keys = Object.keys(response);
539
+ const keys = Object.keys(tickers);
540
540
  for (let i = 0; i < keys.length; i++) {
541
541
  const key = keys[i];
542
- const ticker = response[key];
542
+ const ticker = tickers[key];
543
543
  const marketId = this.safeString(ticker, 'symbol', key);
544
544
  const market = this.safeMarket(marketId, undefined, '-');
545
545
  const symbol = market['symbol'];
@@ -510,7 +510,7 @@ class indodax extends indodax$1 {
510
510
  // }
511
511
  //
512
512
  const response = await this.publicGetApiTickerAll(params);
513
- const tickers = this.safeList(response, 'tickers');
513
+ const tickers = this.safeDict(response, 'tickers', {});
514
514
  return this.parseTickers(tickers, symbols);
515
515
  }
516
516
  parseTrade(trade, market = undefined) {
@@ -616,7 +616,7 @@ class latoken extends latoken$1 {
616
616
  //
617
617
  const marketId = this.safeString(ticker, 'symbol');
618
618
  const last = this.safeString(ticker, 'lastPrice');
619
- const timestamp = this.safeInteger(ticker, 'updateTimestamp');
619
+ const timestamp = this.safeIntegerOmitZero(ticker, 'updateTimestamp'); // sometimes latoken provided '0' ts from /ticker endpoint
620
620
  return this.safeTicker({
621
621
  'symbol': this.safeSymbol(marketId, market),
622
622
  'timestamp': timestamp,
@@ -4967,7 +4967,7 @@ class mexc extends mexc$1 {
4967
4967
  'lastUpdateTimestamp': undefined,
4968
4968
  });
4969
4969
  }
4970
- async fetchTransfer(id, since = undefined, limit = undefined, params = {}) {
4970
+ async fetchTransfer(id, code = undefined, params = {}) {
4971
4971
  const [marketType, query] = this.handleMarketTypeAndParams('fetchTransfer', undefined, params);
4972
4972
  await this.loadMarkets();
4973
4973
  if (marketType === 'spot') {
@@ -1189,7 +1189,6 @@ class novadax extends novadax$1 {
1189
1189
  'info': transfer,
1190
1190
  'id': id,
1191
1191
  'amount': undefined,
1192
- 'code': currencyCode,
1193
1192
  'currency': currencyCode,
1194
1193
  'fromAccount': undefined,
1195
1194
  'toAccount': undefined,
@@ -480,6 +480,7 @@ class okx extends okx$1 {
480
480
  'tradingBot/grid/compute-margin-balance': 1,
481
481
  'tradingBot/grid/margin-balance': 1,
482
482
  'tradingBot/grid/min-investment': 1,
483
+ 'tradingBot/grid/adjust-investment': 1,
483
484
  'tradingBot/signal/create-signal': 1,
484
485
  'tradingBot/signal/order-algo': 1,
485
486
  'tradingBot/signal/stop-order-algo': 1,
@@ -6010,6 +6011,22 @@ class okx extends okx$1 {
6010
6011
  // "nextFundingRate": "0.00017",
6011
6012
  // "nextFundingTime": "1634284800000"
6012
6013
  // }
6014
+ // ws
6015
+ // {
6016
+ // "fundingRate":"0.0001875391284828",
6017
+ // "fundingTime":"1700726400000",
6018
+ // "instId":"BTC-USD-SWAP",
6019
+ // "instType":"SWAP",
6020
+ // "method": "next_period",
6021
+ // "maxFundingRate":"0.00375",
6022
+ // "minFundingRate":"-0.00375",
6023
+ // "nextFundingRate":"0.0002608059239328",
6024
+ // "nextFundingTime":"1700755200000",
6025
+ // "premium": "0.0001233824646391",
6026
+ // "settFundingRate":"0.0001699799259033",
6027
+ // "settState":"settled",
6028
+ // "ts":"1700724675402"
6029
+ // }
6013
6030
  //
6014
6031
  // in the response above nextFundingRate is actually two funding rates from now
6015
6032
  //
@@ -2432,12 +2432,14 @@ class phemex extends phemex$1 {
2432
2432
  * @name phemex#createOrder
2433
2433
  * @description create a trade order
2434
2434
  * @see https://github.com/phemex/phemex-api-docs/blob/master/Public-Hedged-Perpetual-API.md#place-order
2435
+ * @see https://phemex-docs.github.io/#place-order-http-put-prefered-3
2435
2436
  * @param {string} symbol unified symbol of the market to create an order in
2436
2437
  * @param {string} type 'market' or 'limit'
2437
2438
  * @param {string} side 'buy' or 'sell'
2438
2439
  * @param {float} amount how much of currency you want to trade in units of base currency
2439
2440
  * @param {float} [price] the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
2440
2441
  * @param {object} [params] extra parameters specific to the exchange API endpoint
2442
+ * @param {float} [params.trigger] trigger price for conditional orders
2441
2443
  * @param {object} [params.takeProfit] *swap only* *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered (perpetual swap markets only)
2442
2444
  * @param {float} [params.takeProfit.triggerPrice] take profit trigger price
2443
2445
  * @param {object} [params.stopLoss] *swap only* *stopLoss object in params* containing the triggerPrice at which the attached stop loss order will be triggered (perpetual swap markets only)
@@ -2448,7 +2450,7 @@ class phemex extends phemex$1 {
2448
2450
  const market = this.market(symbol);
2449
2451
  const requestSide = this.capitalize(side);
2450
2452
  type = this.capitalize(type);
2451
- const reduceOnly = this.safeValue(params, 'reduceOnly');
2453
+ const reduceOnly = this.safeBool(params, 'reduceOnly');
2452
2454
  const request = {
2453
2455
  // common
2454
2456
  'symbol': market['id'],
@@ -2492,13 +2494,13 @@ class phemex extends phemex$1 {
2492
2494
  request['clOrdID'] = clientOrderId;
2493
2495
  params = this.omit(params, ['clOrdID', 'clientOrderId']);
2494
2496
  }
2495
- const stopPrice = this.safeStringN(params, ['stopPx', 'stopPrice', 'triggerPrice']);
2496
- if (stopPrice !== undefined) {
2497
+ const triggerPrice = this.safeStringN(params, ['stopPx', 'stopPrice', 'triggerPrice']);
2498
+ if (triggerPrice !== undefined) {
2497
2499
  if (market['settle'] === 'USDT') {
2498
- request['stopPxRp'] = this.priceToPrecision(symbol, stopPrice);
2500
+ request['stopPxRp'] = this.priceToPrecision(symbol, triggerPrice);
2499
2501
  }
2500
2502
  else {
2501
- request['stopPxEp'] = this.toEp(stopPrice, market);
2503
+ request['stopPxEp'] = this.toEp(triggerPrice, market);
2502
2504
  }
2503
2505
  }
2504
2506
  params = this.omit(params, ['stopPx', 'stopPrice', 'stopLoss', 'takeProfit', 'triggerPrice']);
@@ -2509,6 +2511,15 @@ class phemex extends phemex$1 {
2509
2511
  qtyType = 'ByQuote';
2510
2512
  }
2511
2513
  }
2514
+ if (triggerPrice !== undefined) {
2515
+ if (type === 'Limit') {
2516
+ request['ordType'] = 'StopLimit';
2517
+ }
2518
+ else if (type === 'Market') {
2519
+ request['ordType'] = 'Stop';
2520
+ }
2521
+ request['trigger'] = 'ByLastPrice';
2522
+ }
2512
2523
  request['qtyType'] = qtyType;
2513
2524
  if (qtyType === 'ByQuote') {
2514
2525
  let cost = this.safeNumber(params, 'cost');
@@ -2549,7 +2560,7 @@ class phemex extends phemex$1 {
2549
2560
  else {
2550
2561
  request['orderQty'] = this.parseToInt(amount);
2551
2562
  }
2552
- if (stopPrice !== undefined) {
2563
+ if (triggerPrice !== undefined) {
2553
2564
  const triggerType = this.safeString(params, 'triggerType', 'ByMarkPrice');
2554
2565
  request['triggerType'] = triggerType;
2555
2566
  }
@@ -1846,12 +1846,11 @@ class poloniex extends poloniex$1 {
1846
1846
  */
1847
1847
  await this.loadMarkets();
1848
1848
  const currency = this.currency(code);
1849
- amount = this.currencyToPrecision(code, amount);
1850
1849
  const accountsByType = this.safeValue(this.options, 'accountsByType', {});
1851
1850
  const fromId = this.safeString(accountsByType, fromAccount, fromAccount);
1852
1851
  const toId = this.safeString(accountsByType, toAccount, fromAccount);
1853
1852
  const request = {
1854
- 'amount': amount,
1853
+ 'amount': this.currencyToPrecision(code, amount),
1855
1854
  'currency': currency['id'],
1856
1855
  'fromAccount': fromId,
1857
1856
  'toAccount': toId,
@@ -972,9 +972,9 @@ class bitget extends bitget$1 {
972
972
  await this.loadMarkets();
973
973
  let market = undefined;
974
974
  let marketId = undefined;
975
- const isStop = this.safeBool(params, 'stop', false);
976
- params = this.omit(params, 'stop');
977
- let messageHash = (isStop) ? 'triggerOrder' : 'order';
975
+ let isTrigger = undefined;
976
+ [isTrigger, params] = this.isTriggerOrder(params);
977
+ let messageHash = (isTrigger) ? 'triggerOrder' : 'order';
978
978
  let subscriptionHash = 'order:trades';
979
979
  if (symbol !== undefined) {
980
980
  market = this.market(symbol);
@@ -987,19 +987,16 @@ class bitget extends bitget$1 {
987
987
  if ((type === 'spot') && (symbol === undefined)) {
988
988
  throw new errors.ArgumentsRequired(this.id + ' watchOrders requires a symbol argument for ' + type + ' markets.');
989
989
  }
990
- if (isStop && type === 'spot') {
991
- throw new errors.NotSupported(this.id + ' watchOrders does not support stop orders for ' + type + ' markets.');
992
- }
993
990
  let instType = undefined;
994
991
  [instType, params] = this.getInstType(market, params);
995
992
  if (type === 'spot') {
996
993
  subscriptionHash = subscriptionHash + ':' + symbol;
997
994
  }
998
- if (isStop) {
995
+ if (isTrigger) {
999
996
  subscriptionHash = subscriptionHash + ':stop'; // we don't want to re-use the same subscription hash for stop orders
1000
997
  }
1001
998
  const instId = (type === 'spot') ? marketId : 'default'; // different from other streams here the 'rest' id is required for spot markets, contract markets require default here
1002
- let channel = isStop ? 'orders-algo' : 'orders';
999
+ let channel = isTrigger ? 'orders-algo' : 'orders';
1003
1000
  let marginMode = undefined;
1004
1001
  [marginMode, params] = this.handleMarginModeAndParams('watchOrders', params);
1005
1002
  if (marginMode !== undefined) {
@@ -1030,25 +1027,7 @@ class bitget extends bitget$1 {
1030
1027
  // "action": "snapshot",
1031
1028
  // "arg": { "instType": "SPOT", "channel": "orders", "instId": "BTCUSDT" },
1032
1029
  // "data": [
1033
- // {
1034
- // "instId": "BTCUSDT",
1035
- // "orderId": "1116512721422422017",
1036
- // "clientOid": "798d1425-d31d-4ada-a51b-ec701e00a1d9",
1037
- // "price": "35000.00",
1038
- // "size": "7.0000",
1039
- // "newSize": "500.0000",
1040
- // "notional": "7.000000",
1041
- // "orderType": "limit",
1042
- // "force": "gtc",
1043
- // "side": "buy",
1044
- // "accBaseVolume": "0.0000",
1045
- // "priceAvg": "0.00",
1046
- // "status": "live",
1047
- // "cTime": "1701923297267",
1048
- // "uTime": "1701923297267",
1049
- // "feeDetail": [],
1050
- // "enterPointSource": "WEB"
1051
- // }
1030
+ // // see all examples in parseWsOrder
1052
1031
  // ],
1053
1032
  // "ts": 1701923297285
1054
1033
  // }
@@ -1059,98 +1038,18 @@ class bitget extends bitget$1 {
1059
1038
  // "action": "snapshot",
1060
1039
  // "arg": { "instType": "USDT-FUTURES", "channel": "orders", "instId": "default" },
1061
1040
  // "data": [
1062
- // {
1063
- // "accBaseVolume": "0",
1064
- // "cTime": "1701920553759",
1065
- // "clientOid": "1116501214318198793",
1066
- // "enterPointSource": "WEB",
1067
- // "feeDetail": [{
1068
- // "feeCoin": "USDT",
1069
- // "fee": "-0.162003"
1070
- // }],
1071
- // "force": "gtc",
1072
- // "instId": "BTCUSDT",
1073
- // "leverage": "20",
1074
- // "marginCoin": "USDT",
1075
- // "marginMode": "isolated",
1076
- // "notionalUsd": "105",
1077
- // "orderId": "1116501214293032964",
1078
- // "orderType": "limit",
1079
- // "posMode": "hedge_mode",
1080
- // "posSide": "long",
1081
- // "price": "35000",
1082
- // "reduceOnly": "no",
1083
- // "side": "buy",
1084
- // "size": "0.003",
1085
- // "status": "canceled",
1086
- // "tradeSide": "open",
1087
- // "uTime": "1701920595866"
1088
- // }
1041
+ // // see all examples in parseWsOrder
1089
1042
  // ],
1090
1043
  // "ts": 1701920595879
1091
1044
  // }
1092
1045
  //
1093
- // trigger
1094
- //
1095
- // {
1096
- // "action": "snapshot",
1097
- // "arg": {
1098
- // "instType": "USDT-FUTURES",
1099
- // "channel": "orders-algo",
1100
- // "instId": "default"
1101
- // },
1102
- // "data": [
1103
- // {
1104
- // "instId": "BTCUSDT",
1105
- // "orderId": "1116508960750899201",
1106
- // "clientOid": "1116508960750899200",
1107
- // "triggerPrice": "35000.000000000",
1108
- // "triggerType": "mark_price",
1109
- // "triggerTime": "1701922464373",
1110
- // "planType": "pl",
1111
- // "price": "35000.000000000",
1112
- // "size": "0.001000000",
1113
- // "actualSize": "0.000000000",
1114
- // "orderType": "limit",
1115
- // "side": "buy",
1116
- // "tradeSide": "open",
1117
- // "posSide": "long",
1118
- // "marginCoin": "USDT",
1119
- // "status": "cancelled",
1120
- // "posMode": "hedge_mode",
1121
- // "enterPointSource": "api",
1122
- // "stopSurplusTriggerType": "fill_price",
1123
- // "stopLossTriggerType": "fill_price",
1124
- // "cTime": "1701922400653",
1125
- // "uTime": "1701922464373"
1126
- // }
1127
- // ],
1128
- // "ts": 1701922464417
1129
- // }
1130
- //
1131
1046
  // isolated and cross margin
1132
1047
  //
1133
1048
  // {
1134
1049
  // "action": "snapshot",
1135
1050
  // "arg": { "instType": "MARGIN", "channel": "orders-crossed", "instId": "BTCUSDT" },
1136
1051
  // "data": [
1137
- // {
1138
- // "enterPointSource": "web",
1139
- // "force": "gtc",
1140
- // "orderType": "limit",
1141
- // "price": "35000.000000000",
1142
- // "quoteSize": "10.500000000",
1143
- // "side": "buy",
1144
- // "status": "live",
1145
- // "baseSize": "0.000300000",
1146
- // "cTime": "1701923982427",
1147
- // "clientOid": "4902047879864dc980c4840e9906db4e",
1148
- // "fillPrice": "0.000000000",
1149
- // "baseVolume": "0.000000000",
1150
- // "fillTotalAmount": "0.000000000",
1151
- // "loanType": "auto-loan-and-repay",
1152
- // "orderId": "1116515595178356737"
1153
- // }
1052
+ // // see examples in parseWsOrder
1154
1053
  // ],
1155
1054
  // "ts": 1701923982497
1156
1055
  // }
@@ -1174,8 +1073,9 @@ class bitget extends bitget$1 {
1174
1073
  this.orders = new Cache.ArrayCacheBySymbolById(limit);
1175
1074
  this.triggerOrders = new Cache.ArrayCacheBySymbolById(limit);
1176
1075
  }
1177
- const stored = (channel === 'ordersAlgo') ? this.triggerOrders : this.orders;
1178
- const messageHash = (channel === 'ordersAlgo') ? 'triggerOrder' : 'order';
1076
+ const isTrigger = (channel === 'orders-algo') || (channel === 'ordersAlgo');
1077
+ const stored = isTrigger ? this.triggerOrders : this.orders;
1078
+ const messageHash = isTrigger ? 'triggerOrder' : 'order';
1179
1079
  const marketSymbols = {};
1180
1080
  for (let i = 0; i < data.length; i++) {
1181
1081
  const order = data[i];
@@ -1198,81 +1098,90 @@ class bitget extends bitget$1 {
1198
1098
  //
1199
1099
  // spot
1200
1100
  //
1201
- // {
1202
- // "instId": "BTCUSDT",
1203
- // "orderId": "1116512721422422017",
1204
- // "clientOid": "798d1425-d31d-4ada-a51b-ec701e00a1d9",
1205
- // "price": "35000.00",
1206
- // "size": "7.0000",
1207
- // "newSize": "500.0000",
1208
- // "notional": "7.000000",
1209
- // "orderType": "limit",
1210
- // "force": "gtc",
1211
- // "side": "buy",
1212
- // "accBaseVolume": "0.0000",
1213
- // "priceAvg": "0.00",
1214
- // "status": "live",
1215
- // "cTime": "1701923297267",
1216
- // "uTime": "1701923297267",
1217
- // "feeDetail": [],
1218
- // "enterPointSource": "WEB"
1219
- // }
1101
+ // {
1102
+ // instId: 'EOSUSDT',
1103
+ // orderId: '1171779081105780739',
1104
+ // price: '0.81075', // limit price, field not present for market orders
1105
+ // clientOid: 'a2330139-1d04-4d78-98be-07de3cfd1055',
1106
+ // notional: '5.675250', // this is not cost! but notional
1107
+ // newSize: '7.0000', // this is not cost! quanity (for limit order or market sell) or cost (for market buy order)
1108
+ // size: '5.6752', // this is not cost, neither quanity, but notional! this field for "spot" can be ignored at all
1109
+ // // Note: for limit order (even filled) we don't have cost value in response, only in market order
1110
+ // orderType: 'limit', // limit, market
1111
+ // force: 'gtc',
1112
+ // side: 'buy',
1113
+ // accBaseVolume: '0.0000', // in case of 'filled', this would be set (for limit orders, this is the only indicator of the amount filled)
1114
+ // priceAvg: '0.00000', // in case of 'filled', this would be set
1115
+ // status: 'live', // live, filled, partially_filled
1116
+ // cTime: '1715099824215',
1117
+ // uTime: '1715099824215',
1118
+ // feeDetail: [],
1119
+ // enterPointSource: 'API'
1120
+ // #### trigger order has these additional fields: ####
1121
+ // "triggerPrice": "35100",
1122
+ // "price": "35100", // this is same as trigger price
1123
+ // "executePrice": "35123", // this is limit price
1124
+ // "triggerType": "fill_price",
1125
+ // "planType": "amount",
1126
+ // #### in case order had fill: ####
1127
+ // fillPrice: '35123',
1128
+ // tradeId: '1171775539946528779',
1129
+ // baseVolume: '7', // field present in market order
1130
+ // fillTime: '1715098979937',
1131
+ // fillFee: '-0.0069987',
1132
+ // fillFeeCoin: 'BTC',
1133
+ // tradeScope: 'T',
1134
+ // }
1220
1135
  //
1221
1136
  // contract
1222
1137
  //
1223
1138
  // {
1224
- // "accBaseVolume": "0",
1225
- // "cTime": "1701920553759",
1226
- // "clientOid": "1116501214318198793",
1227
- // "enterPointSource": "WEB",
1228
- // "feeDetail": [{
1139
+ // accBaseVolume: '0', // total amount filled during lifetime for order
1140
+ // cTime: '1715065875539',
1141
+ // clientOid: '1171636690041344003',
1142
+ // enterPointSource: 'API',
1143
+ // feeDetail: [ {
1229
1144
  // "feeCoin": "USDT",
1230
1145
  // "fee": "-0.162003"
1231
- // }],
1232
- // "force": "gtc",
1233
- // "instId": "BTCUSDT",
1234
- // "leverage": "20",
1235
- // "marginCoin": "USDT",
1236
- // "marginMode": "isolated",
1237
- // "notionalUsd": "105",
1238
- // "orderId": "1116501214293032964",
1239
- // "orderType": "limit",
1240
- // "posMode": "hedge_mode",
1241
- // "posSide": "long",
1242
- // "price": "35000",
1243
- // "reduceOnly": "no",
1244
- // "side": "buy",
1245
- // "size": "0.003",
1246
- // "status": "canceled",
1247
- // "tradeSide": "open",
1248
- // "uTime": "1701920595866"
1249
- // }
1250
- //
1251
- // trigger
1252
- //
1253
- // {
1254
- // "instId": "BTCUSDT",
1255
- // "orderId": "1116508960750899201",
1256
- // "clientOid": "1116508960750899200",
1257
- // "triggerPrice": "35000.000000000",
1146
+ // } ],
1147
+ // force: 'gtc',
1148
+ // instId: 'SEOSSUSDT',
1149
+ // leverage: '10',
1150
+ // marginCoin: 'USDT',
1151
+ // marginMode: 'crossed',
1152
+ // notionalUsd: '10.4468',
1153
+ // orderId: '1171636690028761089',
1154
+ // orderType: 'market',
1155
+ // posMode: 'hedge_mode', // one_way_mode, hedge_mode
1156
+ // posSide: 'short', // short, long, net
1157
+ // price: '0', // zero for market order
1158
+ // reduceOnly: 'no',
1159
+ // side: 'sell',
1160
+ // size: '13', // this is contracts amount
1161
+ // status: 'live', // live, filled, cancelled
1162
+ // tradeSide: 'open',
1163
+ // uTime: '1715065875539'
1164
+ // #### when filled order is incoming, these additional fields are present too: ###
1165
+ // baseVolume: '9', // amount filled for the incoming update/trade
1166
+ // accBaseVolume: '13', // i.e. 9 has been filled from 13 amount (this value is same as 'size')
1167
+ // fillFee: '-0.0062712',
1168
+ // fillFeeCoin: 'SUSDT',
1169
+ // fillNotionalUsd: '10.452',
1170
+ // fillPrice: '0.804',
1171
+ // fillTime: '1715065875605',
1172
+ // pnl: '0',
1173
+ // priceAvg: '0.804',
1174
+ // tradeId: '1171636690314407937',
1175
+ // tradeScope: 'T',
1176
+ // #### trigger order has these additional fields:
1177
+ // "triggerPrice": "0.800000000",
1178
+ // "price": "0.800000000", // <-- this is same as trigger price, actual limit-price is not present in initial response
1258
1179
  // "triggerType": "mark_price",
1259
- // "triggerTime": "1701922464373",
1180
+ // "triggerTime": "1715082796679",
1260
1181
  // "planType": "pl",
1261
- // "price": "35000.000000000",
1262
- // "size": "0.001000000",
1263
1182
  // "actualSize": "0.000000000",
1264
- // "orderType": "limit",
1265
- // "side": "buy",
1266
- // "tradeSide": "open",
1267
- // "posSide": "long",
1268
- // "marginCoin": "USDT",
1269
- // "status": "cancelled",
1270
- // "posMode": "hedge_mode",
1271
- // "enterPointSource": "api",
1272
1183
  // "stopSurplusTriggerType": "fill_price",
1273
1184
  // "stopLossTriggerType": "fill_price",
1274
- // "cTime": "1701922400653",
1275
- // "uTime": "1701922464373"
1276
1185
  // }
1277
1186
  //
1278
1187
  // isolated and cross margin
@@ -1280,6 +1189,7 @@ class bitget extends bitget$1 {
1280
1189
  // {
1281
1190
  // "enterPointSource": "web",
1282
1191
  // "force": "gtc",
1192
+ // "feeDetail": [],
1283
1193
  // "orderType": "limit",
1284
1194
  // "price": "35000.000000000",
1285
1195
  // "quoteSize": "10.500000000",
@@ -1295,6 +1205,8 @@ class bitget extends bitget$1 {
1295
1205
  // "orderId": "1116515595178356737"
1296
1206
  // }
1297
1207
  //
1208
+ const isSpot = !('posMode' in order);
1209
+ const isMargin = ('loanType' in order);
1298
1210
  const marketId = this.safeString(order, 'instId');
1299
1211
  market = this.safeMarket(marketId, market);
1300
1212
  const timestamp = this.safeInteger(order, 'cTime');
@@ -1312,24 +1224,54 @@ class bitget extends bitget$1 {
1312
1224
  };
1313
1225
  }
1314
1226
  const triggerPrice = this.safeNumber(order, 'triggerPrice');
1315
- const price = this.safeString(order, 'price');
1227
+ const isTriggerOrder = (triggerPrice !== undefined);
1228
+ let price = undefined;
1229
+ if (!isTriggerOrder) {
1230
+ price = this.safeNumber(order, 'price');
1231
+ }
1232
+ else if (isSpot && isTriggerOrder) {
1233
+ // for spot trigger order, limit price is this
1234
+ price = this.safeNumber(order, 'executePrice');
1235
+ }
1316
1236
  const avgPrice = this.omitZero(this.safeString2(order, 'priceAvg', 'fillPrice'));
1317
- let cost = this.safeStringN(order, ['notional', 'notionalUsd', 'quoteSize']);
1318
1237
  const side = this.safeString(order, 'side');
1319
1238
  const type = this.safeString(order, 'orderType');
1320
- if (side === 'buy' && market['spot'] && (type === 'market')) {
1321
- cost = this.safeString(order, 'newSize', cost);
1322
- }
1323
- const filled = this.safeString2(order, 'accBaseVolume', 'baseVolume');
1324
- // if (market['spot'] && (rawStatus !== 'live')) {
1325
- // filled = Precise.stringDiv (cost, avgPrice);
1326
- // }
1327
- let amount = this.safeString(order, 'baseVolume');
1328
- if (!market['spot'] || !(side === 'buy' && type === 'market')) {
1329
- amount = this.safeString(order, 'newSize', amount);
1239
+ const accBaseVolume = this.omitZero(this.safeString(order, 'accBaseVolume'));
1240
+ const newSizeValue = this.omitZero(this.safeString(order, 'newSize'));
1241
+ const isMarketOrder = (type === 'market');
1242
+ const isBuy = (side === 'buy');
1243
+ let totalAmount = undefined;
1244
+ let filledAmount = undefined;
1245
+ let cost = undefined;
1246
+ if (isSpot) {
1247
+ if (isMargin) {
1248
+ filledAmount = this.omitZero(this.safeString(order, 'fillTotalAmount'));
1249
+ totalAmount = this.omitZero(this.safeString(order, 'baseSize')); // for margin trading
1250
+ cost = this.safeString(order, 'quoteSize');
1251
+ }
1252
+ else {
1253
+ filledAmount = this.omitZero(this.safeString2(order, 'accBaseVolume', 'baseVolume'));
1254
+ if (isMarketOrder) {
1255
+ if (isBuy) {
1256
+ totalAmount = accBaseVolume;
1257
+ cost = newSizeValue;
1258
+ }
1259
+ else {
1260
+ totalAmount = newSizeValue;
1261
+ // we don't have cost for market-sell order
1262
+ }
1263
+ }
1264
+ else {
1265
+ totalAmount = this.safeString(order, 'newSize');
1266
+ // we don't have cost for limit order
1267
+ }
1268
+ }
1330
1269
  }
1331
- if (market['swap'] && (amount === undefined)) {
1332
- amount = this.safeString(order, 'size');
1270
+ else {
1271
+ // baseVolume should not be used for "amount" for contracts !
1272
+ filledAmount = this.safeString(order, 'baseVolume');
1273
+ totalAmount = this.safeString(order, 'size');
1274
+ cost = this.safeString(order, 'fillNotionalUsd');
1333
1275
  }
1334
1276
  return this.safeOrder({
1335
1277
  'info': order,
@@ -1344,12 +1286,11 @@ class bitget extends bitget$1 {
1344
1286
  'postOnly': undefined,
1345
1287
  'side': side,
1346
1288
  'price': price,
1347
- 'stopPrice': triggerPrice,
1348
1289
  'triggerPrice': triggerPrice,
1349
- 'amount': amount,
1290
+ 'amount': totalAmount,
1350
1291
  'cost': cost,
1351
1292
  'average': avgPrice,
1352
- 'filled': filled,
1293
+ 'filled': filledAmount,
1353
1294
  'remaining': undefined,
1354
1295
  'status': this.parseWsOrderStatus(rawStatus),
1355
1296
  'fee': feeObject,
@@ -1774,6 +1715,9 @@ class bitget extends bitget$1 {
1774
1715
  'fill': this.handleMyTrades,
1775
1716
  'orders': this.handleOrder,
1776
1717
  'ordersAlgo': this.handleOrder,
1718
+ 'orders-algo': this.handleOrder,
1719
+ 'orders-crossed': this.handleOrder,
1720
+ 'orders-isolated': this.handleOrder,
1777
1721
  'account': this.handleBalance,
1778
1722
  'positions': this.handlePositions,
1779
1723
  'account-isolated': this.handleBalance,