ccxt 4.3.55 → 4.3.57
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/README.md +3 -5
- package/dist/ccxt.browser.min.js +2 -2
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/base/Exchange.js +26 -2
- package/dist/cjs/src/base/ws/Client.js +34 -4
- package/dist/cjs/src/binance.js +7 -7
- package/dist/cjs/src/bingx.js +83 -9
- package/dist/cjs/src/bitflyer.js +7 -1
- package/dist/cjs/src/bitget.js +56 -47
- package/dist/cjs/src/bitopro.js +20 -3
- package/dist/cjs/src/btcmarkets.js +26 -27
- package/dist/cjs/src/bybit.js +9 -5
- package/dist/cjs/src/coinone.js +13 -19
- package/dist/cjs/src/delta.js +5 -1
- package/dist/cjs/src/gate.js +109 -1
- package/dist/cjs/src/htx.js +88 -25
- package/dist/cjs/src/huobijp.js +65 -2
- package/dist/cjs/src/hyperliquid.js +1 -1
- package/dist/cjs/src/lbank.js +27 -6
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/bingx.d.ts +16 -0
- package/js/src/base/Exchange.d.ts +1 -0
- package/js/src/base/Exchange.js +26 -2
- package/js/src/base/ws/Client.d.ts +2 -0
- package/js/src/base/ws/Client.js +34 -4
- package/js/src/binance.js +7 -7
- package/js/src/bingx.d.ts +1 -0
- package/js/src/bingx.js +83 -9
- package/js/src/bitflyer.d.ts +1 -1
- package/js/src/bitflyer.js +7 -1
- package/js/src/bitget.d.ts +1 -1
- package/js/src/bitget.js +56 -47
- package/js/src/bitopro.d.ts +3 -2
- package/js/src/bitopro.js +20 -3
- package/js/src/btcmarkets.js +27 -28
- package/js/src/bybit.js +9 -5
- package/js/src/coinone.js +13 -19
- package/js/src/delta.d.ts +1 -1
- package/js/src/delta.js +5 -1
- package/js/src/gate.d.ts +3 -1
- package/js/src/gate.js +109 -1
- package/js/src/htx.d.ts +3 -2
- package/js/src/htx.js +88 -25
- package/js/src/huobijp.d.ts +3 -2
- package/js/src/huobijp.js +65 -2
- package/js/src/hyperliquid.js +1 -1
- package/js/src/lbank.d.ts +2 -2
- package/js/src/lbank.js +27 -6
- package/package.json +7 -3
|
@@ -5,6 +5,8 @@ export default class Client {
|
|
|
5
5
|
disconnected: ReturnType<typeof Future>;
|
|
6
6
|
futures: Dictionary<any>;
|
|
7
7
|
rejections: Dictionary<any>;
|
|
8
|
+
messageQueue: Dictionary<string, any>;
|
|
9
|
+
useMessageQueue: boolean;
|
|
8
10
|
keepAlive: number;
|
|
9
11
|
connection: any;
|
|
10
12
|
connectionTimeout: any;
|
package/js/src/base/ws/Client.js
CHANGED
|
@@ -11,6 +11,7 @@ import { isNode, isJsonEncodedObject, deepExtend, milliseconds, } from '../../ba
|
|
|
11
11
|
import { utf8 } from '../../static_dependencies/scure-base/index.js';
|
|
12
12
|
export default class Client {
|
|
13
13
|
constructor(url, onMessageCallback, onErrorCallback, onCloseCallback, onConnectedCallback, config = {}) {
|
|
14
|
+
this.useMessageQueue = true;
|
|
14
15
|
this.verbose = false;
|
|
15
16
|
const defaults = {
|
|
16
17
|
url,
|
|
@@ -24,6 +25,8 @@ export default class Client {
|
|
|
24
25
|
futures: {},
|
|
25
26
|
subscriptions: {},
|
|
26
27
|
rejections: {},
|
|
28
|
+
messageQueue: {},
|
|
29
|
+
useMessageQueue: true,
|
|
27
30
|
connected: undefined,
|
|
28
31
|
error: undefined,
|
|
29
32
|
connectionStarted: undefined,
|
|
@@ -54,6 +57,15 @@ export default class Client {
|
|
|
54
57
|
if (messageHash in this.rejections) {
|
|
55
58
|
future.reject(this.rejections[messageHash]);
|
|
56
59
|
delete this.rejections[messageHash];
|
|
60
|
+
delete this.messageQueue[messageHash];
|
|
61
|
+
return future;
|
|
62
|
+
}
|
|
63
|
+
if (this.useMessageQueue) {
|
|
64
|
+
const queue = this.messageQueue[messageHash];
|
|
65
|
+
if (queue && queue.length) {
|
|
66
|
+
future.resolve(queue.shift());
|
|
67
|
+
delete this.futures[messageHash];
|
|
68
|
+
}
|
|
57
69
|
}
|
|
58
70
|
return future;
|
|
59
71
|
}
|
|
@@ -61,10 +73,27 @@ export default class Client {
|
|
|
61
73
|
if (this.verbose && (messageHash === undefined)) {
|
|
62
74
|
this.log(new Date(), 'resolve received undefined messageHash');
|
|
63
75
|
}
|
|
64
|
-
if (
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
76
|
+
if (this.useMessageQueue === true) {
|
|
77
|
+
if (!(messageHash in this.messageQueue)) {
|
|
78
|
+
this.messageQueue[messageHash] = [];
|
|
79
|
+
}
|
|
80
|
+
const queue = this.messageQueue[messageHash];
|
|
81
|
+
queue.push(result);
|
|
82
|
+
while (queue.length > 10) { // limit size to 10 messages in the queue
|
|
83
|
+
queue.shift();
|
|
84
|
+
}
|
|
85
|
+
if ((messageHash !== undefined) && (messageHash in this.futures)) {
|
|
86
|
+
const promise = this.futures[messageHash];
|
|
87
|
+
promise.resolve(queue.shift());
|
|
88
|
+
delete this.futures[messageHash];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
if (messageHash in this.futures) {
|
|
93
|
+
const promise = this.futures[messageHash];
|
|
94
|
+
promise.resolve(result);
|
|
95
|
+
delete this.futures[messageHash];
|
|
96
|
+
}
|
|
68
97
|
}
|
|
69
98
|
return result;
|
|
70
99
|
}
|
|
@@ -105,6 +134,7 @@ export default class Client {
|
|
|
105
134
|
reset(error) {
|
|
106
135
|
this.clearConnectionTimeout();
|
|
107
136
|
this.clearPingInterval();
|
|
137
|
+
this.messageQueue = {};
|
|
108
138
|
this.reject(error);
|
|
109
139
|
}
|
|
110
140
|
onConnectionTimeout() {
|
package/js/src/binance.js
CHANGED
|
@@ -1546,7 +1546,7 @@ export default class binance extends Exchange {
|
|
|
1546
1546
|
'-3042': BadRequest,
|
|
1547
1547
|
'-3043': PermissionDenied,
|
|
1548
1548
|
'-3044': OperationFailed,
|
|
1549
|
-
'-3045':
|
|
1549
|
+
'-3045': OperationRejected,
|
|
1550
1550
|
'-3999': PermissionDenied,
|
|
1551
1551
|
//
|
|
1552
1552
|
// 4xxx (different from contract markets)
|
|
@@ -1565,7 +1565,7 @@ export default class binance extends Exchange {
|
|
|
1565
1565
|
'-4011': BadRequest,
|
|
1566
1566
|
'-4012': PermissionDenied,
|
|
1567
1567
|
'-4013': AuthenticationError,
|
|
1568
|
-
'-4014':
|
|
1568
|
+
'-4014': OperationRejected,
|
|
1569
1569
|
'-4015': PermissionDenied,
|
|
1570
1570
|
'-4016': PermissionDenied,
|
|
1571
1571
|
'-4017': PermissionDenied,
|
|
@@ -1574,7 +1574,7 @@ export default class binance extends Exchange {
|
|
|
1574
1574
|
'-4020': ExchangeError,
|
|
1575
1575
|
'-4021': BadRequest,
|
|
1576
1576
|
'-4022': BadRequest,
|
|
1577
|
-
'-4023':
|
|
1577
|
+
'-4023': OperationRejected,
|
|
1578
1578
|
'-4024': InsufficientFunds,
|
|
1579
1579
|
'-4025': InsufficientFunds,
|
|
1580
1580
|
'-4026': InsufficientFunds,
|
|
@@ -1583,7 +1583,7 @@ export default class binance extends Exchange {
|
|
|
1583
1583
|
'-4029': BadRequest,
|
|
1584
1584
|
'-4030': BadResponse,
|
|
1585
1585
|
'-4031': OperationFailed,
|
|
1586
|
-
'-4032':
|
|
1586
|
+
'-4032': OperationRejected,
|
|
1587
1587
|
'-4033': BadRequest,
|
|
1588
1588
|
'-4034': OperationRejected,
|
|
1589
1589
|
'-4035': PermissionDenied,
|
|
@@ -1706,7 +1706,7 @@ export default class binance extends Exchange {
|
|
|
1706
1706
|
'-5003': InsufficientFunds,
|
|
1707
1707
|
'-5004': OperationRejected,
|
|
1708
1708
|
'-5005': OperationRejected,
|
|
1709
|
-
'-5006':
|
|
1709
|
+
'-5006': OperationRejected,
|
|
1710
1710
|
'-5007': BadRequest,
|
|
1711
1711
|
'-5008': OperationRejected,
|
|
1712
1712
|
'-5009': BadSymbol,
|
|
@@ -1724,8 +1724,8 @@ export default class binance extends Exchange {
|
|
|
1724
1724
|
'-6004': BadRequest,
|
|
1725
1725
|
'-6005': BadRequest,
|
|
1726
1726
|
'-6006': BadRequest,
|
|
1727
|
-
'-6007':
|
|
1728
|
-
'-6008':
|
|
1727
|
+
'-6007': OperationRejected,
|
|
1728
|
+
'-6008': OperationRejected,
|
|
1729
1729
|
'-6009': RateLimitExceeded,
|
|
1730
1730
|
'-6011': OperationRejected,
|
|
1731
1731
|
'-6012': InsufficientFunds,
|
package/js/src/bingx.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export default class bingx extends Exchange {
|
|
|
10
10
|
fetchCurrencies(params?: {}): Promise<Currencies>;
|
|
11
11
|
fetchSpotMarkets(params: any): Promise<import("./base/types.js").MarketInterface[]>;
|
|
12
12
|
fetchSwapMarkets(params: any): Promise<import("./base/types.js").MarketInterface[]>;
|
|
13
|
+
fetchInverseSwapMarkets(params: any): Promise<import("./base/types.js").MarketInterface[]>;
|
|
13
14
|
parseMarket(market: Dict): Market;
|
|
14
15
|
fetchMarkets(params?: {}): Promise<Market[]>;
|
|
15
16
|
fetchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
|
package/js/src/bingx.js
CHANGED
|
@@ -104,6 +104,7 @@ export default class bingx extends Exchange {
|
|
|
104
104
|
'subAccount': 'https://open-api.{hostname}/openApi',
|
|
105
105
|
'account': 'https://open-api.{hostname}/openApi',
|
|
106
106
|
'copyTrading': 'https://open-api.{hostname}/openApi',
|
|
107
|
+
'cswap': 'https://open-api.{hostname}/openApi',
|
|
107
108
|
},
|
|
108
109
|
'test': {
|
|
109
110
|
'swap': 'https://open-api-vst.{hostname}/openApi', // only swap is really "test" but since the API keys are the same, we want to keep all the functionalities when the user enables the sandboxmode
|
|
@@ -266,6 +267,36 @@ export default class bingx extends Exchange {
|
|
|
266
267
|
},
|
|
267
268
|
},
|
|
268
269
|
},
|
|
270
|
+
'cswap': {
|
|
271
|
+
'v1': {
|
|
272
|
+
'public': {
|
|
273
|
+
'get': {
|
|
274
|
+
'market/contracts': 1,
|
|
275
|
+
'market/premiumIndex': 1,
|
|
276
|
+
'market/openInterest': 1,
|
|
277
|
+
'market/klines': 1,
|
|
278
|
+
'market/depth': 1,
|
|
279
|
+
'market/ticker': 1,
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
'private': {
|
|
283
|
+
'get': {
|
|
284
|
+
'trade/leverage': 2,
|
|
285
|
+
'trade/forceOrders': 2,
|
|
286
|
+
'trade/allFillOrders': 2,
|
|
287
|
+
'user/commissionRate': 2,
|
|
288
|
+
'user/positions': 2,
|
|
289
|
+
'user/balance': 2,
|
|
290
|
+
},
|
|
291
|
+
'post': {
|
|
292
|
+
'trade/order': 2,
|
|
293
|
+
'trade/leverage': 2,
|
|
294
|
+
'trade/allOpenOrders': 2,
|
|
295
|
+
'trade/closeAllPositions': 2,
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
},
|
|
269
300
|
'contract': {
|
|
270
301
|
'v1': {
|
|
271
302
|
'private': {
|
|
@@ -641,6 +672,29 @@ export default class bingx extends Exchange {
|
|
|
641
672
|
const markets = this.safeList(response, 'data', []);
|
|
642
673
|
return this.parseMarkets(markets);
|
|
643
674
|
}
|
|
675
|
+
async fetchInverseSwapMarkets(params) {
|
|
676
|
+
const response = await this.cswapV1PublicGetMarketContracts(params);
|
|
677
|
+
//
|
|
678
|
+
// {
|
|
679
|
+
// "code": 0,
|
|
680
|
+
// "msg": "",
|
|
681
|
+
// "timestamp": 1720074487610,
|
|
682
|
+
// "data": [
|
|
683
|
+
// {
|
|
684
|
+
// "symbol": "BNB-USD",
|
|
685
|
+
// "pricePrecision": 2,
|
|
686
|
+
// "minTickSize": "10",
|
|
687
|
+
// "minTradeValue": "10",
|
|
688
|
+
// "minQty": "1.00000000",
|
|
689
|
+
// "status": 1,
|
|
690
|
+
// "timeOnline": 1713175200000
|
|
691
|
+
// },
|
|
692
|
+
// ]
|
|
693
|
+
// }
|
|
694
|
+
//
|
|
695
|
+
const markets = this.safeList(response, 'data', []);
|
|
696
|
+
return this.parseMarkets(markets);
|
|
697
|
+
}
|
|
644
698
|
parseMarket(market) {
|
|
645
699
|
const id = this.safeString(market, 'symbol');
|
|
646
700
|
const symbolParts = id.split('-');
|
|
@@ -648,7 +702,16 @@ export default class bingx extends Exchange {
|
|
|
648
702
|
const quoteId = symbolParts[1];
|
|
649
703
|
const base = this.safeCurrencyCode(baseId);
|
|
650
704
|
const quote = this.safeCurrencyCode(quoteId);
|
|
651
|
-
|
|
705
|
+
let currency = this.safeString(market, 'currency');
|
|
706
|
+
let checkIsInverse = false;
|
|
707
|
+
let checkIsLinear = true;
|
|
708
|
+
const minTickSize = this.safeNumber(market, 'minTickSize');
|
|
709
|
+
if (minTickSize !== undefined) {
|
|
710
|
+
// inverse swap market
|
|
711
|
+
currency = baseId;
|
|
712
|
+
checkIsInverse = true;
|
|
713
|
+
checkIsLinear = false;
|
|
714
|
+
}
|
|
652
715
|
const settle = this.safeCurrencyCode(currency);
|
|
653
716
|
let pricePrecision = this.safeNumber(market, 'tickSize');
|
|
654
717
|
if (pricePrecision === undefined) {
|
|
@@ -668,8 +731,12 @@ export default class bingx extends Exchange {
|
|
|
668
731
|
const fees = this.safeDict(this.fees, type, {});
|
|
669
732
|
const contractSize = (swap) ? this.parseNumber('1') : undefined;
|
|
670
733
|
const isActive = this.safeString(market, 'status') === '1';
|
|
671
|
-
const isInverse = (spot) ? undefined :
|
|
672
|
-
const isLinear = (spot) ? undefined :
|
|
734
|
+
const isInverse = (spot) ? undefined : checkIsInverse;
|
|
735
|
+
const isLinear = (spot) ? undefined : checkIsLinear;
|
|
736
|
+
let timeOnline = this.safeInteger(market, 'timeOnline');
|
|
737
|
+
if (timeOnline === 0) {
|
|
738
|
+
timeOnline = undefined;
|
|
739
|
+
}
|
|
673
740
|
return this.safeMarketStructure({
|
|
674
741
|
'id': id,
|
|
675
742
|
'symbol': symbol,
|
|
@@ -711,15 +778,15 @@ export default class bingx extends Exchange {
|
|
|
711
778
|
'max': this.safeNumber(market, 'maxQty'),
|
|
712
779
|
},
|
|
713
780
|
'price': {
|
|
714
|
-
'min':
|
|
781
|
+
'min': minTickSize,
|
|
715
782
|
'max': undefined,
|
|
716
783
|
},
|
|
717
784
|
'cost': {
|
|
718
|
-
'min': this.
|
|
785
|
+
'min': this.safeNumberN(market, ['minNotional', 'tradeMinUSDT', 'minTradeValue']),
|
|
719
786
|
'max': this.safeNumber(market, 'maxNotional'),
|
|
720
787
|
},
|
|
721
788
|
},
|
|
722
|
-
'created':
|
|
789
|
+
'created': timeOnline,
|
|
723
790
|
'info': market,
|
|
724
791
|
});
|
|
725
792
|
}
|
|
@@ -730,17 +797,21 @@ export default class bingx extends Exchange {
|
|
|
730
797
|
* @description retrieves data on all markets for bingx
|
|
731
798
|
* @see https://bingx-api.github.io/docs/#/spot/market-api.html#Query%20Symbols
|
|
732
799
|
* @see https://bingx-api.github.io/docs/#/swapV2/market-api.html#Contract%20Information
|
|
800
|
+
* @see https://bingx-api.github.io/docs/#/en-us/cswap/market-api.html#Contract%20Information
|
|
733
801
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
734
802
|
* @returns {object[]} an array of objects representing market data
|
|
735
803
|
*/
|
|
736
804
|
const requests = [this.fetchSwapMarkets(params)];
|
|
737
805
|
const isSandbox = this.safeBool(this.options, 'sandboxMode', false);
|
|
738
806
|
if (!isSandbox) {
|
|
807
|
+
requests.push(this.fetchInverseSwapMarkets(params));
|
|
739
808
|
requests.push(this.fetchSpotMarkets(params)); // sandbox is swap only
|
|
740
809
|
}
|
|
741
810
|
const promises = await Promise.all(requests);
|
|
742
|
-
const
|
|
743
|
-
const
|
|
811
|
+
const linearSwapMarkets = this.safeList(promises, 0, []);
|
|
812
|
+
const inverseSwapMarkets = this.safeList(promises, 1, []);
|
|
813
|
+
const spotMarkets = this.safeList(promises, 2, []);
|
|
814
|
+
const swapMarkets = this.arrayConcat(linearSwapMarkets, inverseSwapMarkets);
|
|
744
815
|
return this.arrayConcat(spotMarkets, swapMarkets);
|
|
745
816
|
}
|
|
746
817
|
async fetchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
@@ -1526,7 +1597,10 @@ export default class bingx extends Exchange {
|
|
|
1526
1597
|
percentage = percentage.replace('%', '');
|
|
1527
1598
|
}
|
|
1528
1599
|
const change = this.safeString(ticker, 'priceChange');
|
|
1529
|
-
|
|
1600
|
+
let ts = this.safeInteger(ticker, 'closeTime');
|
|
1601
|
+
if (ts === 0) {
|
|
1602
|
+
ts = undefined;
|
|
1603
|
+
}
|
|
1530
1604
|
const datetime = this.iso8601(ts);
|
|
1531
1605
|
const bid = this.safeString(ticker, 'bidPrice');
|
|
1532
1606
|
const bidVolume = this.safeString(ticker, 'bidQty');
|
package/js/src/bitflyer.d.ts
CHANGED
|
@@ -18,7 +18,7 @@ export default class bitflyer extends Exchange {
|
|
|
18
18
|
fetchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
|
|
19
19
|
fetchTradingFee(symbol: string, params?: {}): Promise<TradingFeeInterface>;
|
|
20
20
|
createOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
|
|
21
|
-
cancelOrder(id: string, symbol?: Str, params?: {}): Promise<
|
|
21
|
+
cancelOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
|
|
22
22
|
parseOrderStatus(status: Str): string;
|
|
23
23
|
parseOrder(order: Dict, market?: Market): Order;
|
|
24
24
|
fetchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
|
package/js/src/bitflyer.js
CHANGED
|
@@ -596,7 +596,13 @@ export default class bitflyer extends Exchange {
|
|
|
596
596
|
'product_code': this.marketId(symbol),
|
|
597
597
|
'child_order_acceptance_id': id,
|
|
598
598
|
};
|
|
599
|
-
|
|
599
|
+
const response = await this.privatePostCancelchildorder(this.extend(request, params));
|
|
600
|
+
//
|
|
601
|
+
// 200 OK.
|
|
602
|
+
//
|
|
603
|
+
return this.safeOrder({
|
|
604
|
+
'info': response,
|
|
605
|
+
});
|
|
600
606
|
}
|
|
601
607
|
parseOrderStatus(status) {
|
|
602
608
|
const statuses = {
|
package/js/src/bitget.d.ts
CHANGED
|
@@ -64,7 +64,7 @@ export default class bitget extends Exchange {
|
|
|
64
64
|
editOrder(id: string, symbol: string, type: OrderType, side: OrderSide, amount?: Num, price?: Num, params?: {}): Promise<Order>;
|
|
65
65
|
cancelOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
|
|
66
66
|
cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<Order[]>;
|
|
67
|
-
cancelAllOrders(symbol?: Str, params?: {}): Promise<
|
|
67
|
+
cancelAllOrders(symbol?: Str, params?: {}): Promise<Order[]>;
|
|
68
68
|
fetchOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
|
|
69
69
|
fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
|
|
70
70
|
fetchClosedOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
|
package/js/src/bitget.js
CHANGED
|
@@ -5015,6 +5015,22 @@ export default class bitget extends Exchange {
|
|
|
5015
5015
|
else {
|
|
5016
5016
|
response = await this.privateMarginPostMarginV1IsolatedOrderBatchCancelOrder(this.extend(request, params));
|
|
5017
5017
|
}
|
|
5018
|
+
//
|
|
5019
|
+
// {
|
|
5020
|
+
// "code": "00000",
|
|
5021
|
+
// "msg": "success",
|
|
5022
|
+
// "requestTime": 1700717155622,
|
|
5023
|
+
// "data": {
|
|
5024
|
+
// "resultList": [
|
|
5025
|
+
// {
|
|
5026
|
+
// "orderId": "1111453253721796609",
|
|
5027
|
+
// "clientOid": "2ae7fc8a4ff949b6b60d770ca3950e2d"
|
|
5028
|
+
// },
|
|
5029
|
+
// ],
|
|
5030
|
+
// "failure": []
|
|
5031
|
+
// }
|
|
5032
|
+
// }
|
|
5033
|
+
//
|
|
5018
5034
|
}
|
|
5019
5035
|
else {
|
|
5020
5036
|
if (stop) {
|
|
@@ -5026,6 +5042,27 @@ export default class bitget extends Exchange {
|
|
|
5026
5042
|
else {
|
|
5027
5043
|
response = await this.privateSpotPostV2SpotTradeCancelSymbolOrder(this.extend(request, params));
|
|
5028
5044
|
}
|
|
5045
|
+
//
|
|
5046
|
+
// {
|
|
5047
|
+
// "code": "00000",
|
|
5048
|
+
// "msg": "success",
|
|
5049
|
+
// "requestTime": 1700716953996,
|
|
5050
|
+
// "data": {
|
|
5051
|
+
// "symbol": "BTCUSDT"
|
|
5052
|
+
// }
|
|
5053
|
+
// }
|
|
5054
|
+
//
|
|
5055
|
+
const timestamp = this.safeInteger(response, 'requestTime');
|
|
5056
|
+
const responseData = this.safeDict(response, 'data');
|
|
5057
|
+
const marketId = this.safeString(responseData, 'symbol');
|
|
5058
|
+
return [
|
|
5059
|
+
this.safeOrder({
|
|
5060
|
+
'info': response,
|
|
5061
|
+
'symbol': this.safeSymbol(marketId, undefined, undefined, 'spot'),
|
|
5062
|
+
'timestamp': timestamp,
|
|
5063
|
+
'datetime': this.iso8601(timestamp),
|
|
5064
|
+
}),
|
|
5065
|
+
];
|
|
5029
5066
|
}
|
|
5030
5067
|
}
|
|
5031
5068
|
else {
|
|
@@ -5038,54 +5075,26 @@ export default class bitget extends Exchange {
|
|
|
5038
5075
|
else {
|
|
5039
5076
|
response = await this.privateMixPostV2MixOrderBatchCancelOrders(this.extend(request, params));
|
|
5040
5077
|
}
|
|
5078
|
+
// {
|
|
5079
|
+
// "code": "00000",
|
|
5080
|
+
// "msg": "success",
|
|
5081
|
+
// "requestTime": "1680008815965",
|
|
5082
|
+
// "data": {
|
|
5083
|
+
// "successList": [
|
|
5084
|
+
// {
|
|
5085
|
+
// "orderId": "1024598257429823488",
|
|
5086
|
+
// "clientOid": "876493ce-c287-4bfc-9f4a-8b1905881313"
|
|
5087
|
+
// },
|
|
5088
|
+
// ],
|
|
5089
|
+
// "failureList": []
|
|
5090
|
+
// }
|
|
5091
|
+
// }
|
|
5041
5092
|
}
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
|
|
5045
|
-
|
|
5046
|
-
|
|
5047
|
-
// "msg": "success",
|
|
5048
|
-
// "requestTime": 1700716953996,
|
|
5049
|
-
// "data": {
|
|
5050
|
-
// "symbol": "BTCUSDT"
|
|
5051
|
-
// }
|
|
5052
|
-
// }
|
|
5053
|
-
//
|
|
5054
|
-
// swap
|
|
5055
|
-
//
|
|
5056
|
-
// {
|
|
5057
|
-
// "code": "00000",
|
|
5058
|
-
// "msg": "success",
|
|
5059
|
-
// "requestTime": "1680008815965",
|
|
5060
|
-
// "data": {
|
|
5061
|
-
// "successList": [
|
|
5062
|
-
// {
|
|
5063
|
-
// "orderId": "1024598257429823488",
|
|
5064
|
-
// "clientOid": "876493ce-c287-4bfc-9f4a-8b1905881313"
|
|
5065
|
-
// },
|
|
5066
|
-
// ],
|
|
5067
|
-
// "failureList": []
|
|
5068
|
-
// }
|
|
5069
|
-
// }
|
|
5070
|
-
//
|
|
5071
|
-
// spot margin
|
|
5072
|
-
//
|
|
5073
|
-
// {
|
|
5074
|
-
// "code": "00000",
|
|
5075
|
-
// "msg": "success",
|
|
5076
|
-
// "requestTime": 1700717155622,
|
|
5077
|
-
// "data": {
|
|
5078
|
-
// "resultList": [
|
|
5079
|
-
// {
|
|
5080
|
-
// "orderId": "1111453253721796609",
|
|
5081
|
-
// "clientOid": "2ae7fc8a4ff949b6b60d770ca3950e2d"
|
|
5082
|
-
// },
|
|
5083
|
-
// ],
|
|
5084
|
-
// "failure": []
|
|
5085
|
-
// }
|
|
5086
|
-
// }
|
|
5087
|
-
//
|
|
5088
|
-
return response;
|
|
5093
|
+
const data = this.safeDict(response, 'data');
|
|
5094
|
+
const resultList = this.safeList2(data, 'resultList', 'successList');
|
|
5095
|
+
const failureList = this.safeList2(data, 'failure', 'failureList');
|
|
5096
|
+
const responseList = this.arrayConcat(resultList, failureList);
|
|
5097
|
+
return this.parseOrders(responseList);
|
|
5089
5098
|
}
|
|
5090
5099
|
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
5091
5100
|
/**
|
package/js/src/bitopro.d.ts
CHANGED
|
@@ -25,8 +25,9 @@ export default class bitopro extends Exchange {
|
|
|
25
25
|
parseOrder(order: Dict, market?: Market): Order;
|
|
26
26
|
createOrder(symbol: string, type: OrderType, side: OrderSide, amount: number, price?: Num, params?: {}): Promise<Order>;
|
|
27
27
|
cancelOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
parseCancelOrders(data: any): any[];
|
|
29
|
+
cancelOrders(ids: any, symbol?: Str, params?: {}): Promise<any[]>;
|
|
30
|
+
cancelAllOrders(symbol?: Str, params?: {}): Promise<any[]>;
|
|
30
31
|
fetchOrder(id: string, symbol?: Str, params?: {}): Promise<Order>;
|
|
31
32
|
fetchOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
|
|
32
33
|
fetchOpenOrders(symbol?: Str, since?: Int, limit?: Int, params?: {}): Promise<Order[]>;
|
package/js/src/bitopro.js
CHANGED
|
@@ -1088,6 +1088,22 @@ export default class bitopro extends Exchange {
|
|
|
1088
1088
|
//
|
|
1089
1089
|
return this.parseOrder(response, market);
|
|
1090
1090
|
}
|
|
1091
|
+
parseCancelOrders(data) {
|
|
1092
|
+
const dataKeys = Object.keys(data);
|
|
1093
|
+
const orders = [];
|
|
1094
|
+
for (let i = 0; i < dataKeys.length; i++) {
|
|
1095
|
+
const marketId = dataKeys[i];
|
|
1096
|
+
const orderIds = data[marketId];
|
|
1097
|
+
for (let j = 0; j < orderIds.length; j++) {
|
|
1098
|
+
orders.push(this.safeOrder({
|
|
1099
|
+
'info': orderIds[j],
|
|
1100
|
+
'id': orderIds[j],
|
|
1101
|
+
'symbol': this.safeSymbol(marketId),
|
|
1102
|
+
}));
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
return orders;
|
|
1106
|
+
}
|
|
1091
1107
|
async cancelOrders(ids, symbol = undefined, params = {}) {
|
|
1092
1108
|
/**
|
|
1093
1109
|
* @method
|
|
@@ -1118,7 +1134,8 @@ export default class bitopro extends Exchange {
|
|
|
1118
1134
|
// }
|
|
1119
1135
|
// }
|
|
1120
1136
|
//
|
|
1121
|
-
|
|
1137
|
+
const data = this.safeDict(response, 'data');
|
|
1138
|
+
return this.parseCancelOrders(data);
|
|
1122
1139
|
}
|
|
1123
1140
|
async cancelAllOrders(symbol = undefined, params = {}) {
|
|
1124
1141
|
/**
|
|
@@ -1143,7 +1160,7 @@ export default class bitopro extends Exchange {
|
|
|
1143
1160
|
else {
|
|
1144
1161
|
response = await this.privateDeleteOrdersAll(this.extend(request, params));
|
|
1145
1162
|
}
|
|
1146
|
-
const
|
|
1163
|
+
const data = this.safeValue(response, 'data', {});
|
|
1147
1164
|
//
|
|
1148
1165
|
// {
|
|
1149
1166
|
// "data":{
|
|
@@ -1154,7 +1171,7 @@ export default class bitopro extends Exchange {
|
|
|
1154
1171
|
// }
|
|
1155
1172
|
// }
|
|
1156
1173
|
//
|
|
1157
|
-
return
|
|
1174
|
+
return this.parseCancelOrders(data);
|
|
1158
1175
|
}
|
|
1159
1176
|
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
1160
1177
|
/**
|
package/js/src/btcmarkets.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
import Exchange from './abstract/btcmarkets.js';
|
|
9
|
-
import { ArgumentsRequired, ExchangeError, OrderNotFound, InvalidOrder, InsufficientFunds,
|
|
9
|
+
import { ArgumentsRequired, ExchangeError, OrderNotFound, InvalidOrder, InsufficientFunds, BadRequest } from './base/errors.js';
|
|
10
10
|
import { TICK_SIZE } from './base/functions/number.js';
|
|
11
11
|
import { Precise } from './base/Precise.js';
|
|
12
12
|
import { sha512 } from './static_dependencies/noble-hashes/sha512.js';
|
|
@@ -156,16 +156,17 @@ export default class btcmarkets extends Exchange {
|
|
|
156
156
|
},
|
|
157
157
|
'precisionMode': TICK_SIZE,
|
|
158
158
|
'exceptions': {
|
|
159
|
-
'
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
159
|
+
'exact': {
|
|
160
|
+
'InsufficientFund': InsufficientFunds,
|
|
161
|
+
'InvalidPrice': InvalidOrder,
|
|
162
|
+
'InvalidAmount': InvalidOrder,
|
|
163
|
+
'MissingArgument': BadRequest,
|
|
164
|
+
'OrderAlreadyCancelled': InvalidOrder,
|
|
165
|
+
'OrderNotFound': OrderNotFound,
|
|
166
|
+
'OrderStatusIsFinal': InvalidOrder,
|
|
167
|
+
'InvalidPaginationParameter': BadRequest,
|
|
168
|
+
},
|
|
169
|
+
'broad': {},
|
|
169
170
|
},
|
|
170
171
|
'fees': {
|
|
171
172
|
'percentage': true,
|
|
@@ -380,7 +381,8 @@ export default class btcmarkets extends Exchange {
|
|
|
380
381
|
// "minOrderAmount":"0.00007",
|
|
381
382
|
// "maxOrderAmount":"1000000",
|
|
382
383
|
// "amountDecimals":"8",
|
|
383
|
-
// "priceDecimals":"2"
|
|
384
|
+
// "priceDecimals":"2",
|
|
385
|
+
// "status": "Online"
|
|
384
386
|
// }
|
|
385
387
|
// ]
|
|
386
388
|
//
|
|
@@ -397,6 +399,7 @@ export default class btcmarkets extends Exchange {
|
|
|
397
399
|
const pricePrecision = this.parseNumber(this.parsePrecision(this.safeString(market, 'priceDecimals')));
|
|
398
400
|
const minAmount = this.safeNumber(market, 'minOrderAmount');
|
|
399
401
|
const maxAmount = this.safeNumber(market, 'maxOrderAmount');
|
|
402
|
+
const status = this.safeString(market, 'status');
|
|
400
403
|
let minPrice = undefined;
|
|
401
404
|
if (quote === 'AUD') {
|
|
402
405
|
minPrice = pricePrecision;
|
|
@@ -416,7 +419,7 @@ export default class btcmarkets extends Exchange {
|
|
|
416
419
|
'swap': false,
|
|
417
420
|
'future': false,
|
|
418
421
|
'option': false,
|
|
419
|
-
'active':
|
|
422
|
+
'active': (status === 'Online'),
|
|
420
423
|
'contract': false,
|
|
421
424
|
'linear': undefined,
|
|
422
425
|
'inverse': undefined,
|
|
@@ -1283,22 +1286,18 @@ export default class btcmarkets extends Exchange {
|
|
|
1283
1286
|
if (response === undefined) {
|
|
1284
1287
|
return undefined; // fallback to default error handler
|
|
1285
1288
|
}
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1292
|
-
|
|
1293
|
-
}
|
|
1294
|
-
// v3 api errors
|
|
1295
|
-
if (code >= 400) {
|
|
1296
|
-
const errorCode = this.safeString(response, 'code');
|
|
1297
|
-
const message = this.safeString(response, 'message');
|
|
1289
|
+
//
|
|
1290
|
+
// {"code":"UnAuthorized","message":"invalid access token"}
|
|
1291
|
+
// {"code":"MarketNotFound","message":"invalid marketId"}
|
|
1292
|
+
//
|
|
1293
|
+
const errorCode = this.safeString(response, 'code');
|
|
1294
|
+
const message = this.safeString(response, 'message');
|
|
1295
|
+
if (errorCode !== undefined) {
|
|
1298
1296
|
const feedback = this.id + ' ' + body;
|
|
1299
|
-
this.throwExactlyMatchedException(this.exceptions,
|
|
1300
|
-
this.throwExactlyMatchedException(this.exceptions,
|
|
1301
|
-
|
|
1297
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], message, feedback);
|
|
1298
|
+
this.throwExactlyMatchedException(this.exceptions['exact'], errorCode, feedback);
|
|
1299
|
+
this.throwBroadlyMatchedException(this.exceptions['broad'], message, feedback);
|
|
1300
|
+
throw new ExchangeError(feedback); // unknown message
|
|
1302
1301
|
}
|
|
1303
1302
|
return undefined;
|
|
1304
1303
|
}
|