ccxt 4.4.25 → 4.4.26

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 (67) hide show
  1. package/README.md +4 -4
  2. package/dist/ccxt.browser.min.js +3 -3
  3. package/dist/cjs/ccxt.js +1 -1
  4. package/dist/cjs/src/alpaca.js +257 -11
  5. package/dist/cjs/src/base/Exchange.js +14 -1
  6. package/dist/cjs/src/binance.js +2 -3
  7. package/dist/cjs/src/bingx.js +7 -1
  8. package/dist/cjs/src/bitget.js +2 -2
  9. package/dist/cjs/src/bitmart.js +3 -3
  10. package/dist/cjs/src/bybit.js +3 -14
  11. package/dist/cjs/src/cex.js +40 -0
  12. package/dist/cjs/src/coinex.js +2 -4
  13. package/dist/cjs/src/digifinex.js +2 -2
  14. package/dist/cjs/src/exmo.js +1 -0
  15. package/dist/cjs/src/gate.js +3 -3
  16. package/dist/cjs/src/htx.js +2 -3
  17. package/dist/cjs/src/hyperliquid.js +14 -4
  18. package/dist/cjs/src/kucoin.js +2 -2
  19. package/dist/cjs/src/okx.js +3 -2
  20. package/dist/cjs/src/phemex.js +4 -2
  21. package/dist/cjs/src/pro/exmo.js +216 -3
  22. package/dist/cjs/src/whitebit.js +2 -2
  23. package/dist/cjs/src/xt.js +39 -27
  24. package/js/ccxt.d.ts +1 -1
  25. package/js/ccxt.js +1 -1
  26. package/js/src/abstract/alpaca.d.ts +1 -0
  27. package/js/src/abstract/bingx.d.ts +1 -0
  28. package/js/src/abstract/okx.d.ts +1 -0
  29. package/js/src/abstract/phemex.d.ts +1 -0
  30. package/js/src/alpaca.d.ts +6 -1
  31. package/js/src/alpaca.js +258 -12
  32. package/js/src/base/Exchange.d.ts +7 -6
  33. package/js/src/base/Exchange.js +14 -1
  34. package/js/src/base/types.d.ts +3 -3
  35. package/js/src/binance.d.ts +3 -14
  36. package/js/src/binance.js +2 -3
  37. package/js/src/bingx.js +7 -1
  38. package/js/src/bitget.d.ts +3 -13
  39. package/js/src/bitget.js +2 -2
  40. package/js/src/bitmart.d.ts +3 -13
  41. package/js/src/bitmart.js +3 -3
  42. package/js/src/bybit.d.ts +3 -14
  43. package/js/src/bybit.js +3 -14
  44. package/js/src/cex.d.ts +2 -0
  45. package/js/src/cex.js +40 -0
  46. package/js/src/coinex.d.ts +3 -15
  47. package/js/src/coinex.js +2 -4
  48. package/js/src/digifinex.d.ts +3 -13
  49. package/js/src/digifinex.js +2 -2
  50. package/js/src/exmo.js +1 -0
  51. package/js/src/gate.d.ts +3 -13
  52. package/js/src/gate.js +3 -3
  53. package/js/src/htx.d.ts +3 -14
  54. package/js/src/htx.js +2 -3
  55. package/js/src/hyperliquid.js +14 -4
  56. package/js/src/kucoin.d.ts +3 -13
  57. package/js/src/kucoin.js +2 -2
  58. package/js/src/okx.d.ts +3 -13
  59. package/js/src/okx.js +3 -2
  60. package/js/src/phemex.js +4 -2
  61. package/js/src/pro/exmo.d.ts +5 -1
  62. package/js/src/pro/exmo.js +216 -3
  63. package/js/src/whitebit.d.ts +3 -13
  64. package/js/src/whitebit.js +2 -2
  65. package/js/src/woo.d.ts +1 -1
  66. package/js/src/xt.js +39 -27
  67. package/package.json +1 -1
@@ -20,7 +20,7 @@ export default class exmo extends exmoRest {
20
20
  'watchTickers': true,
21
21
  'watchTrades': true,
22
22
  'watchMyTrades': true,
23
- 'watchOrders': false,
23
+ 'watchOrders': true,
24
24
  'watchOrderBook': true,
25
25
  'watchOHLCV': false,
26
26
  },
@@ -573,6 +573,219 @@ export default class exmo extends exmoRest {
573
573
  this.handleDelta(bookside, deltas[i]);
574
574
  }
575
575
  }
576
+ async watchOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
577
+ /**
578
+ * @method
579
+ * @name exmo#watchOrders
580
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#85f7bc03-b1c9-4cd2-bd22-8fd422272825
581
+ * @see https://documenter.getpostman.com/view/10287440/SzYXWKPi#95e4ed18-1791-4e6d-83ad-cbfe9be1051c
582
+ * @description watches information on multiple orders made by the user
583
+ * @param {string} symbol unified market symbol of the market orders were made in
584
+ * @param {int} [since] the earliest time in ms to fetch orders for
585
+ * @param {int} [limit] the maximum number of order structures to retrieve
586
+ * @param {object} [params] extra parameters specific to the exchange API endpoint
587
+ * @returns {object[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
588
+ */
589
+ await this.loadMarkets();
590
+ await this.authenticate(params);
591
+ const [type, query] = this.handleMarketTypeAndParams('watchOrders', undefined, params);
592
+ const url = this.urls['api']['ws'][type];
593
+ let messageHash = undefined;
594
+ if (symbol === undefined) {
595
+ messageHash = 'orders:' + type;
596
+ }
597
+ else {
598
+ const market = this.market(symbol);
599
+ symbol = market['symbol'];
600
+ messageHash = 'orders:' + market['symbol'];
601
+ }
602
+ const message = {
603
+ 'method': 'subscribe',
604
+ 'topics': [
605
+ type + '/orders',
606
+ ],
607
+ 'id': this.requestId(),
608
+ };
609
+ const request = this.deepExtend(message, query);
610
+ const orders = await this.watch(url, messageHash, request, messageHash, request);
611
+ return this.filterBySymbolSinceLimit(orders, symbol, since, limit, true);
612
+ }
613
+ handleOrders(client, message) {
614
+ //
615
+ // spot
616
+ // {
617
+ // "ts": 1574427585174,
618
+ // "event": "snapshot",
619
+ // "topic": "spot/orders",
620
+ // "data": [
621
+ // {
622
+ // "order_id": "14",
623
+ // "client_id":"100500",
624
+ // "created": "1574427585",
625
+ // "pair": "BTC_USD",
626
+ // "price": "7750",
627
+ // "quantity": "0.1",
628
+ // "amount": "775",
629
+ // "original_quantity": "0.1",
630
+ // "original_amount": "775",
631
+ // "type": "sell",
632
+ // "status": "open"
633
+ // }
634
+ // ]
635
+ // }
636
+ //
637
+ // margin
638
+ // {
639
+ // "ts":1624371281773,
640
+ // "event":"snapshot",
641
+ // "topic":"margin/orders",
642
+ // "data":[
643
+ // {
644
+ // "order_id":"692844278081168665",
645
+ // "created":"1624371250919761600",
646
+ // "type":"limit_buy",
647
+ // "previous_type":"limit_buy",
648
+ // "pair":"BTC_USD",
649
+ // "leverage":"2",
650
+ // "price":"10000",
651
+ // "stop_price":"0",
652
+ // "distance":"0",
653
+ // "trigger_price":"10000",
654
+ // "init_quantity":"0.1",
655
+ // "quantity":"0.1",
656
+ // "funding_currency":"USD",
657
+ // "funding_quantity":"1000",
658
+ // "funding_rate":"0",
659
+ // "client_id":"111111",
660
+ // "expire":0,
661
+ // "src":1,
662
+ // "comment":"comment1",
663
+ // "updated":1624371250938136600,
664
+ // "status":"active"
665
+ // }
666
+ // ]
667
+ // }
668
+ //
669
+ const topic = this.safeString(message, 'topic');
670
+ const parts = topic.split('/');
671
+ const type = this.safeString(parts, 0);
672
+ const messageHash = 'orders:' + type;
673
+ const event = this.safeString(message, 'event');
674
+ if (this.orders === undefined) {
675
+ const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
676
+ this.orders = new ArrayCacheBySymbolById(limit);
677
+ }
678
+ const cachedOrders = this.orders;
679
+ let rawOrders = [];
680
+ if (event === 'snapshot') {
681
+ rawOrders = this.safeValue(message, 'data', []);
682
+ }
683
+ else if (event === 'update') {
684
+ const rawOrder = this.safeDict(message, 'data', {});
685
+ rawOrders.push(rawOrder);
686
+ }
687
+ const symbols = {};
688
+ for (let j = 0; j < rawOrders.length; j++) {
689
+ const order = this.parseWsOrder(rawOrders[j]);
690
+ cachedOrders.append(order);
691
+ symbols[order['symbol']] = true;
692
+ }
693
+ const symbolKeys = Object.keys(symbols);
694
+ for (let i = 0; i < symbolKeys.length; i++) {
695
+ const symbol = symbolKeys[i];
696
+ const symbolSpecificMessageHash = 'orders:' + symbol;
697
+ client.resolve(cachedOrders, symbolSpecificMessageHash);
698
+ }
699
+ client.resolve(cachedOrders, messageHash);
700
+ }
701
+ parseWsOrder(order, market = undefined) {
702
+ //
703
+ // {
704
+ // order_id: '43226756791',
705
+ // client_id: 0,
706
+ // created: '1730371416',
707
+ // type: 'market_buy',
708
+ // pair: 'TRX_USD',
709
+ // quantity: '0',
710
+ // original_quantity: '30',
711
+ // status: 'cancelled',
712
+ // last_trade_id: '726480870',
713
+ // last_trade_price: '0.17',
714
+ // last_trade_quantity: '30'
715
+ // }
716
+ //
717
+ const id = this.safeString(order, 'order_id');
718
+ const timestamp = this.safeTimestamp(order, 'created');
719
+ const orderType = this.safeString(order, 'type');
720
+ const side = this.parseSide(orderType);
721
+ const marketId = this.safeString(order, 'pair');
722
+ market = this.safeMarket(marketId, market);
723
+ const symbol = market['symbol'];
724
+ let amount = this.safeString(order, 'quantity');
725
+ if (amount === undefined) {
726
+ const amountField = (side === 'buy') ? 'in_amount' : 'out_amount';
727
+ amount = this.safeString(order, amountField);
728
+ }
729
+ const price = this.safeString(order, 'price');
730
+ const clientOrderId = this.omitZero(this.safeString(order, 'client_id'));
731
+ const triggerPrice = this.omitZero(this.safeString(order, 'stop_price'));
732
+ let type = undefined;
733
+ if ((orderType !== 'buy') && (orderType !== 'sell')) {
734
+ type = orderType;
735
+ }
736
+ let trades = undefined;
737
+ if ('last_trade_id' in order) {
738
+ const trade = this.parseWsTrade(order, market);
739
+ trades = [trade];
740
+ }
741
+ return this.safeOrder({
742
+ 'id': id,
743
+ 'clientOrderId': clientOrderId,
744
+ 'datetime': this.iso8601(timestamp),
745
+ 'timestamp': timestamp,
746
+ 'lastTradeTimestamp': undefined,
747
+ 'status': this.parseStatus(this.safeString(order, 'status')),
748
+ 'symbol': symbol,
749
+ 'type': type,
750
+ 'timeInForce': undefined,
751
+ 'postOnly': undefined,
752
+ 'side': side,
753
+ 'price': price,
754
+ 'stopPrice': triggerPrice,
755
+ 'triggerPrice': triggerPrice,
756
+ 'cost': undefined,
757
+ 'amount': this.safeString(order, 'original_quantity'),
758
+ 'filled': undefined,
759
+ 'remaining': this.safeString(order, 'quantity'),
760
+ 'average': undefined,
761
+ 'trades': trades,
762
+ 'fee': undefined,
763
+ 'info': order,
764
+ }, market);
765
+ }
766
+ parseWsTrade(trade, market = undefined) {
767
+ const id = this.safeString(trade, 'order_id');
768
+ const orderType = this.safeString(trade, 'type');
769
+ const side = this.parseSide(orderType);
770
+ const marketId = this.safeString(trade, 'pair');
771
+ market = this.safeMarket(marketId, market);
772
+ const symbol = market['symbol'];
773
+ let type = undefined;
774
+ if ((orderType !== 'buy') && (orderType !== 'sell')) {
775
+ type = orderType;
776
+ }
777
+ return this.safeTrade({
778
+ 'id': this.safeString(trade, 'last_trade_id'),
779
+ 'symbol': symbol,
780
+ 'order': id,
781
+ 'type': type,
782
+ 'side': side,
783
+ 'price': this.safeString(trade, 'last_trade_price'),
784
+ 'amount': this.safeString(trade, 'last_trade_quantity'),
785
+ 'cost': undefined,
786
+ 'fee': undefined,
787
+ }, market);
788
+ }
576
789
  handleMessage(client, message) {
577
790
  //
578
791
  // {
@@ -613,8 +826,8 @@ export default class exmo extends exmoRest {
613
826
  'spot/trades': this.handleTrades,
614
827
  'margin/trades': this.handleTrades,
615
828
  'spot/order_book_updates': this.handleOrderBook,
616
- // 'spot/orders': this.handleOrders,
617
- // 'margin/orders': this.handleOrders,
829
+ 'spot/orders': this.handleOrders,
830
+ 'margin/orders': this.handleOrders,
618
831
  'spot/user_trades': this.handleMyTrades,
619
832
  'margin/user_trades': this.handleMyTrades,
620
833
  };
@@ -1,5 +1,5 @@
1
1
  import Exchange from './abstract/whitebit.js';
2
- import type { TransferEntry, Balances, Currency, Int, Market, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, Num, Currencies, TradingFees, Dict, int, FundingRate, FundingRates, DepositAddress } from './base/types.js';
2
+ import type { TransferEntry, Balances, Currency, Int, Market, OHLCV, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, Num, Currencies, TradingFees, Dict, int, FundingRate, FundingRates, DepositAddress, BorrowInterest } from './base/types.js';
3
3
  /**
4
4
  * @class whitebit
5
5
  * @augments Exchange
@@ -57,18 +57,8 @@ export default class whitebit extends Exchange {
57
57
  parseTransactionStatus(status: Str): string;
58
58
  fetchDeposit(id: string, code?: Str, params?: {}): Promise<Transaction>;
59
59
  fetchDeposits(code?: Str, since?: Int, limit?: Int, params?: {}): Promise<Transaction[]>;
60
- fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<any>;
61
- parseBorrowInterest(info: Dict, market?: Market): {
62
- symbol: string;
63
- marginMode: string;
64
- currency: string;
65
- interest: number;
66
- interestRate: number;
67
- amountBorrowed: number;
68
- timestamp: number;
69
- datetime: string;
70
- info: Dict;
71
- };
60
+ fetchBorrowInterest(code?: Str, symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<BorrowInterest[]>;
61
+ parseBorrowInterest(info: Dict, market?: Market): BorrowInterest;
72
62
  fetchFundingRate(symbol: string, params?: {}): Promise<FundingRate>;
73
63
  fetchFundingRates(symbols?: Strings, params?: {}): Promise<FundingRates>;
74
64
  parseFundingRate(contract: any, market?: Market): FundingRate;
@@ -2360,15 +2360,15 @@ export default class whitebit extends Exchange {
2360
2360
  const symbol = this.safeSymbol(marketId, market, '_');
2361
2361
  const timestamp = this.safeTimestamp(info, 'modifyDate');
2362
2362
  return {
2363
+ 'info': info,
2363
2364
  'symbol': symbol,
2364
- 'marginMode': 'cross',
2365
2365
  'currency': 'USDT',
2366
2366
  'interest': this.safeNumber(info, 'unrealizedFunding'),
2367
2367
  'interestRate': 0.00098,
2368
2368
  'amountBorrowed': this.safeNumber(info, 'amount'),
2369
+ 'marginMode': 'cross',
2369
2370
  'timestamp': timestamp,
2370
2371
  'datetime': this.iso8601(timestamp),
2371
- 'info': info,
2372
2372
  };
2373
2373
  }
2374
2374
  async fetchFundingRate(symbol, params = {}) {
package/js/src/woo.d.ts CHANGED
@@ -69,7 +69,7 @@ export default class woo extends Exchange {
69
69
  parseTransfer(transfer: Dict, currency?: Currency): TransferEntry;
70
70
  parseTransferStatus(status: Str): Str;
71
71
  withdraw(code: string, amount: number, address: string, tag?: any, params?: {}): Promise<Transaction>;
72
- repayMargin(code: string, amount: any, symbol?: Str, params?: {}): Promise<any>;
72
+ repayMargin(code: string, amount: number, symbol?: Str, params?: {}): Promise<any>;
73
73
  parseMarginLoan(info: any, currency?: Currency): {
74
74
  id: any;
75
75
  currency: string;
package/js/src/xt.js CHANGED
@@ -1973,6 +1973,17 @@ export default class xt extends Exchange {
1973
1973
  // "b": true
1974
1974
  // }
1975
1975
  //
1976
+ // spot: watchTrades
1977
+ //
1978
+ // {
1979
+ // s: 'btc_usdt',
1980
+ // i: '228825383103928709',
1981
+ // t: 1684258222702,
1982
+ // p: '27003.65',
1983
+ // q: '0.000796',
1984
+ // b: true
1985
+ // }
1986
+ //
1976
1987
  // spot: watchMyTrades
1977
1988
  //
1978
1989
  // {
@@ -1985,17 +1996,6 @@ export default class xt extends Exchange {
1985
1996
  // "v": "90000" // volume trade amount
1986
1997
  // }
1987
1998
  //
1988
- // spot: watchTrades
1989
- //
1990
- // {
1991
- // s: 'btc_usdt',
1992
- // i: '228825383103928709',
1993
- // t: 1684258222702,
1994
- // p: '27003.65',
1995
- // q: '0.000796',
1996
- // b: true
1997
- // }
1998
- //
1999
1999
  // swap and future: fetchTrades
2000
2000
  //
2001
2001
  // {
@@ -2075,22 +2075,34 @@ export default class xt extends Exchange {
2075
2075
  marketType = hasSpotKeys ? 'spot' : 'contract';
2076
2076
  }
2077
2077
  market = this.safeMarket(marketId, market, '_', marketType);
2078
- const bidOrAsk = this.safeString(trade, 'm');
2079
- let side = this.safeStringLower(trade, 'orderSide');
2080
- if (bidOrAsk !== undefined) {
2081
- side = (bidOrAsk === 'BID') ? 'buy' : 'sell';
2082
- }
2083
- const buyerMaker = this.safeValue(trade, 'b');
2084
- if (buyerMaker !== undefined) {
2085
- side = 'buy';
2086
- }
2087
- let takerOrMaker = this.safeStringLower(trade, 'takerMaker');
2088
- if (buyerMaker !== undefined) {
2089
- takerOrMaker = buyerMaker ? 'maker' : 'taker';
2090
- }
2091
- const isMaker = this.safeBool(trade, 'isMaker');
2092
- if (isMaker !== undefined) {
2093
- takerOrMaker = isMaker ? 'maker' : 'taker';
2078
+ let side = undefined;
2079
+ let takerOrMaker = undefined;
2080
+ const isBuyerMaker = this.safeBool(trade, 'b');
2081
+ if (isBuyerMaker !== undefined) {
2082
+ side = isBuyerMaker ? 'sell' : 'buy';
2083
+ takerOrMaker = 'taker'; // public trades always taker
2084
+ }
2085
+ else {
2086
+ const takerMaker = this.safeStringLower(trade, 'takerMaker');
2087
+ if (takerMaker !== undefined) {
2088
+ takerOrMaker = takerMaker;
2089
+ }
2090
+ else {
2091
+ const isMaker = this.safeBool(trade, 'isMaker');
2092
+ if (isMaker !== undefined) {
2093
+ takerOrMaker = isMaker ? 'maker' : 'taker';
2094
+ }
2095
+ }
2096
+ const orderSide = this.safeStringLower(trade, 'orderSide');
2097
+ if (orderSide !== undefined) {
2098
+ side = orderSide;
2099
+ }
2100
+ else {
2101
+ const bidOrAsk = this.safeString(trade, 'm');
2102
+ if (bidOrAsk !== undefined) {
2103
+ side = (bidOrAsk === 'BID') ? 'buy' : 'sell';
2104
+ }
2105
+ }
2094
2106
  }
2095
2107
  const timestamp = this.safeIntegerN(trade, ['t', 'time', 'timestamp']);
2096
2108
  const quantity = this.safeString2(trade, 'q', 'quantity');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.4.25",
3
+ "version": "4.4.26",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.min.js",
6
6
  "type": "module",