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.
- package/CHANGELOG.md +192 -0
- package/README.md +4 -8
- package/dist/ccxt.browser.js +2520 -3029
- package/dist/ccxt.browser.min.js +2 -2
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/base/Exchange.js +1 -0
- package/dist/cjs/src/bitget.js +373 -126
- package/dist/cjs/src/bybit.js +2 -2
- package/dist/cjs/src/krakenfutures.js +1 -0
- package/dist/cjs/src/okcoin.js +2056 -2858
- package/dist/cjs/src/pro/kucoin.js +87 -44
- package/dist/cjs/src/pro/okx.js +6 -5
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/okcoin.d.ts +70 -206
- package/js/src/base/Exchange.d.ts +1 -0
- package/js/src/base/Exchange.js +1 -0
- package/js/src/bitget.js +373 -126
- package/js/src/bybit.js +2 -2
- package/js/src/krakenfutures.js +1 -0
- package/js/src/okcoin.d.ts +27 -33
- package/js/src/okcoin.js +2057 -2859
- package/js/src/pro/kucoin.js +87 -44
- package/js/src/pro/okx.js +6 -5
- package/package.json +1 -1
package/js/src/pro/kucoin.js
CHANGED
|
@@ -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
|
|
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
|
-
//
|
|
670
|
-
//
|
|
671
|
-
//
|
|
672
|
-
//
|
|
673
|
-
//
|
|
674
|
-
//
|
|
675
|
-
//
|
|
676
|
-
//
|
|
677
|
-
//
|
|
678
|
-
//
|
|
679
|
-
//
|
|
680
|
-
//
|
|
681
|
-
//
|
|
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
|
-
|
|
692
|
-
const timestamp = this.
|
|
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
|
|
696
|
-
const
|
|
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':
|
|
701
|
-
'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':
|
|
711
|
-
'triggerPrice':
|
|
712
|
-
'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':
|
|
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(
|
|
788
|
+
client.resolve(cachedOrders, messageHash);
|
|
747
789
|
const symbolSpecificMessageHash = messageHash + ':' + symbol;
|
|
748
|
-
client.resolve(
|
|
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.
|
|
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(
|
|
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(
|
|
975
|
+
client.resolve(stored, messageHash);
|
|
975
976
|
}
|
|
976
977
|
}
|
|
977
978
|
}
|
package/package.json
CHANGED