ccxt 4.1.19 → 4.1.22

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.
@@ -631,13 +631,16 @@ export default class kucoin extends kucoinRest {
631
631
  * @description watches information on multiple orders made by the user
632
632
  * @param {string} symbol unified market symbol of the market orders were made in
633
633
  * @param {int} [since] the earliest time in ms to fetch orders for
634
- * @param {int} [limit] the maximum number of orde structures to retrieve
634
+ * @param {int} [limit] the maximum number of order structures to retrieve
635
635
  * @param {object} [params] extra parameters specific to the kucoin api endpoint
636
+ * @param {boolean} [params.stop] trigger orders are watched if true
636
637
  * @returns {object[]} a list of [order structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
637
638
  */
638
639
  await this.loadMarkets();
640
+ const stop = this.safeValue2(params, 'stop', 'trigger');
641
+ params = this.omit(params, ['stop', 'trigger']);
639
642
  const url = await this.negotiate(true);
640
- const topic = '/spotMarket/tradeOrders';
643
+ const topic = stop ? '/spotMarket/advancedOrders' : '/spotMarket/tradeOrders';
641
644
  const request = {
642
645
  'privateChannel': true,
643
646
  };
@@ -660,59 +663,79 @@ export default class kucoin extends kucoinRest {
660
663
  'match': 'open',
661
664
  'update': 'open',
662
665
  'canceled': 'canceled',
666
+ 'cancel': 'canceled',
667
+ 'TRIGGERED': 'triggered',
663
668
  };
664
669
  return this.safeString(statuses, status, status);
665
670
  }
666
671
  parseWsOrder(order, market = undefined) {
667
672
  //
668
- // {
669
- // 'symbol': 'XCAD-USDT',
670
- // 'orderType': 'limit',
671
- // 'side': 'buy',
672
- // 'orderId': '6249167327218b000135e749',
673
- // 'type': 'canceled',
674
- // 'orderTime': 1648957043065280224,
675
- // 'size': '100.452',
676
- // 'filledSize': '0',
677
- // 'price': '2.9635',
678
- // 'clientOid': 'buy-XCAD-USDT-1648957043010159',
679
- // 'remainSize': '0',
680
- // 'status': 'done',
681
- // 'ts': 1648957054031001037
682
- // }
673
+ // /spotMarket/tradeOrders
674
+ //
675
+ // {
676
+ // 'symbol': 'XCAD-USDT',
677
+ // 'orderType': 'limit',
678
+ // 'side': 'buy',
679
+ // 'orderId': '6249167327218b000135e749',
680
+ // 'type': 'canceled',
681
+ // 'orderTime': 1648957043065280224,
682
+ // 'size': '100.452',
683
+ // 'filledSize': '0',
684
+ // 'price': '2.9635',
685
+ // 'clientOid': 'buy-XCAD-USDT-1648957043010159',
686
+ // 'remainSize': '0',
687
+ // 'status': 'done',
688
+ // 'ts': 1648957054031001037
689
+ // }
690
+ //
691
+ // /spotMarket/advancedOrders
692
+ //
693
+ // {
694
+ // "createdAt": 1589789942337,
695
+ // "orderId": "5ec244f6a8a75e0009958237",
696
+ // "orderPrice": "0.00062",
697
+ // "orderType": "stop",
698
+ // "side": "sell",
699
+ // "size": "1",
700
+ // "stop": "entry",
701
+ // "stopPrice": "0.00062",
702
+ // "symbol": "KCS-BTC",
703
+ // "tradeType": "TRADE",
704
+ // "triggerSuccess": true,
705
+ // "ts": 1589790121382281286,
706
+ // "type": "triggered"
707
+ // }
683
708
  //
684
- const id = this.safeString(order, 'orderId');
685
- const clientOrderId = this.safeString(order, 'clientOid');
686
- const orderType = this.safeStringLower(order, 'orderType');
687
- const price = this.safeString(order, 'price');
688
- const filled = this.safeString(order, 'filledSize');
689
- const amount = this.safeString(order, 'size');
690
709
  const rawType = this.safeString(order, 'type');
691
- const status = this.parseWsOrderStatus(rawType);
692
- const timestamp = this.safeInteger(order, 'orderTime');
710
+ let status = this.parseWsOrderStatus(rawType);
711
+ const timestamp = this.safeInteger2(order, 'orderTime', 'createdAt');
693
712
  const marketId = this.safeString(order, 'symbol');
694
713
  market = this.safeMarket(marketId, market);
695
- const symbol = market['symbol'];
696
- const side = this.safeStringLower(order, 'side');
714
+ const triggerPrice = this.safeString(order, 'stopPrice');
715
+ const triggerSuccess = this.safeValue(order, 'triggerSuccess');
716
+ const triggerFail = (triggerSuccess !== true) && (triggerSuccess !== undefined); // TODO: updated to triggerSuccess === False once transpiler transpiles it correctly
717
+ if ((status === 'triggered') && triggerFail) {
718
+ status = 'canceled';
719
+ }
697
720
  return this.safeOrder({
698
721
  'info': order,
699
- 'symbol': symbol,
700
- 'id': id,
701
- 'clientOrderId': clientOrderId,
722
+ 'symbol': market['symbol'],
723
+ 'id': this.safeString(order, 'orderId'),
724
+ 'clientOrderId': this.safeString(order, 'clientOid'),
702
725
  'timestamp': timestamp,
703
726
  'datetime': this.iso8601(timestamp),
704
727
  'lastTradeTimestamp': undefined,
705
- 'type': orderType,
728
+ 'type': this.safeStringLower(order, 'orderType'),
706
729
  'timeInForce': undefined,
707
730
  'postOnly': undefined,
708
- 'side': side,
709
- 'price': price,
710
- 'stopPrice': undefined,
711
- 'triggerPrice': undefined,
712
- 'amount': amount,
731
+ 'side': this.safeStringLower(order, 'side'),
732
+ 'price': this.safeString2(order, 'price', 'orderPrice'),
733
+ 'stopPrice': triggerPrice,
734
+ 'triggerPrice': triggerPrice,
735
+ 'amount': this.safeString(order, 'size'),
713
736
  'cost': undefined,
714
737
  'average': undefined,
715
- 'filled': filled,
738
+ 'filled': this.safeString(order, 'filledSize'),
716
739
  'remaining': undefined,
717
740
  'status': status,
718
741
  'fee': undefined,
@@ -720,32 +743,51 @@ export default class kucoin extends kucoinRest {
720
743
  }, market);
721
744
  }
722
745
  handleOrder(client, message) {
746
+ //
747
+ // Trigger Orders
748
+ //
749
+ // {
750
+ // createdAt: 1692745706437,
751
+ // error: 'Balance insufficient!', // not always there
752
+ // orderId: 'vs86kp757vlda6ni003qs70v',
753
+ // orderPrice: '0.26',
754
+ // orderType: 'stop',
755
+ // side: 'sell',
756
+ // size: '5',
757
+ // stop: 'loss',
758
+ // stopPrice: '0.26',
759
+ // symbol: 'ADA-USDT',
760
+ // tradeType: 'TRADE',
761
+ // triggerSuccess: false, // not always there
762
+ // ts: '1692745706442929298',
763
+ // type: 'open'
764
+ // }
765
+ //
723
766
  const messageHash = 'orders';
724
767
  const data = this.safeValue(message, 'data');
725
768
  const parsed = this.parseWsOrder(data);
726
769
  const symbol = this.safeString(parsed, 'symbol');
727
770
  const orderId = this.safeString(parsed, 'id');
771
+ const triggerPrice = this.safeValue(parsed, 'triggerPrice');
772
+ const isTriggerOrder = (triggerPrice !== undefined);
728
773
  if (this.orders === undefined) {
729
774
  const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
730
775
  this.orders = new ArrayCacheBySymbolById(limit);
776
+ this.triggerOrders = new ArrayCacheBySymbolById(limit);
731
777
  }
732
- const cachedOrders = this.orders;
778
+ const cachedOrders = isTriggerOrder ? this.triggerOrders : this.orders;
733
779
  const orders = this.safeValue(cachedOrders.hashmap, symbol, {});
734
780
  const order = this.safeValue(orders, orderId);
735
781
  if (order !== undefined) {
736
782
  // todo add others to calculate average etc
737
- const stopPrice = this.safeValue(order, 'stopPrice');
738
- if (stopPrice !== undefined) {
739
- parsed['stopPrice'] = stopPrice;
740
- }
741
783
  if (order['status'] === 'closed') {
742
784
  parsed['status'] = 'closed';
743
785
  }
744
786
  }
745
787
  cachedOrders.append(parsed);
746
- client.resolve(this.orders, messageHash);
788
+ client.resolve(cachedOrders, messageHash);
747
789
  const symbolSpecificMessageHash = messageHash + ':' + symbol;
748
- client.resolve(this.orders, symbolSpecificMessageHash);
790
+ client.resolve(cachedOrders, symbolSpecificMessageHash);
749
791
  }
750
792
  async watchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
751
793
  /**
@@ -942,6 +984,7 @@ export default class kucoin extends kucoinRest {
942
984
  'account.balance': this.handleBalance,
943
985
  '/spot/tradeFills': this.handleMyTrade,
944
986
  'orderChange': this.handleOrder,
987
+ 'stopOrder': this.handleOrder,
945
988
  };
946
989
  const method = this.safeValue(methods, subject);
947
990
  if (method === undefined) {
package/js/src/pro/okx.js CHANGED
@@ -869,8 +869,8 @@ export default class okx extends okxRest {
869
869
  let type = undefined;
870
870
  // By default, receive order updates from any instrument type
871
871
  [type, params] = this.handleOptionAndParams(params, 'watchOrders', 'type', 'ANY');
872
- const isStop = this.safeValue(params, 'stop', false);
873
- params = this.omit(params, ['stop']);
872
+ const isStop = this.safeValue2(params, 'stop', 'trigger', false);
873
+ params = this.omit(params, ['stop', 'trigger']);
874
874
  await this.loadMarkets();
875
875
  await this.authenticate({ 'access': isStop ? 'business' : 'private' });
876
876
  let market = undefined;
@@ -957,8 +957,9 @@ export default class okx extends okxRest {
957
957
  const limit = this.safeInteger(this.options, 'ordersLimit', 1000);
958
958
  if (this.orders === undefined) {
959
959
  this.orders = new ArrayCacheBySymbolById(limit);
960
+ this.triggerOrders = new ArrayCacheBySymbolById(limit);
960
961
  }
961
- const stored = this.orders;
962
+ const stored = (channel === 'orders-algo') ? this.triggerOrders : this.orders;
962
963
  const marketIds = [];
963
964
  const parsed = this.parseOrders(orders);
964
965
  for (let i = 0; i < parsed.length; i++) {
@@ -968,10 +969,10 @@ export default class okx extends okxRest {
968
969
  const market = this.market(symbol);
969
970
  marketIds.push(market['id']);
970
971
  }
971
- client.resolve(this.orders, channel);
972
+ client.resolve(stored, channel);
972
973
  for (let i = 0; i < marketIds.length; i++) {
973
974
  const messageHash = channel + ':' + marketIds[i];
974
- client.resolve(this.orders, messageHash);
975
+ client.resolve(stored, messageHash);
975
976
  }
976
977
  }
977
978
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ccxt",
3
- "version": "4.1.19",
3
+ "version": "4.1.22",
4
4
  "description": "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 130+ exchanges",
5
5
  "unpkg": "dist/ccxt.browser.js",
6
6
  "type": "module",