ccxt 4.2.38 → 4.2.40
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 -3
- package/dist/ccxt.browser.js +1340 -407
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/ascendex.js +28 -24
- package/dist/cjs/src/base/Exchange.js +28 -16
- package/dist/cjs/src/binance.js +528 -181
- package/dist/cjs/src/bingx.js +250 -23
- package/dist/cjs/src/bitget.js +14 -3
- package/dist/cjs/src/bitso.js +18 -2
- package/dist/cjs/src/bitstamp.js +24 -2
- package/dist/cjs/src/bl3p.js +6 -0
- package/dist/cjs/src/blockchaincom.js +21 -0
- package/dist/cjs/src/btcalpha.js +9 -0
- package/dist/cjs/src/btcbox.js +9 -0
- package/dist/cjs/src/btcmarkets.js +19 -0
- package/dist/cjs/src/bybit.js +3 -1
- package/dist/cjs/src/coinbase.js +21 -8
- package/dist/cjs/src/coinbasepro.js +1 -0
- package/dist/cjs/src/coinlist.js +9 -7
- package/dist/cjs/src/coinmetro.js +2 -1
- package/dist/cjs/src/krakenfutures.js +133 -16
- package/dist/cjs/src/luno.js +1 -1
- package/dist/cjs/src/mexc.js +43 -43
- package/dist/cjs/src/okx.js +11 -17
- package/dist/cjs/src/phemex.js +1 -0
- package/dist/cjs/src/poloniexfutures.js +11 -5
- package/dist/cjs/src/pro/bitmart.js +141 -48
- package/dist/cjs/src/pro/bybit.js +5 -5
- package/dist/cjs/src/pro/mexc.js +1 -1
- package/dist/cjs/src/wavesexchange.js +1 -1
- package/dist/cjs/src/woo.js +1 -1
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/bingx.d.ts +4 -0
- package/js/src/abstract/coinbase.d.ts +1 -0
- package/js/src/abstract/coinbasepro.d.ts +1 -0
- package/js/src/abstract/okx.d.ts +1 -0
- package/js/src/ascendex.d.ts +2 -2
- package/js/src/ascendex.js +28 -24
- package/js/src/base/Exchange.d.ts +12 -8
- package/js/src/base/Exchange.js +28 -16
- package/js/src/base/types.d.ts +2 -0
- package/js/src/bigone.d.ts +2 -2
- package/js/src/binance.d.ts +9 -9
- package/js/src/binance.js +528 -181
- package/js/src/bingx.d.ts +6 -5
- package/js/src/bingx.js +250 -23
- package/js/src/bitfinex.d.ts +3 -3
- package/js/src/bitfinex2.d.ts +2 -2
- package/js/src/bitget.d.ts +5 -5
- package/js/src/bitget.js +14 -3
- package/js/src/bitmart.d.ts +2 -2
- package/js/src/bitmex.d.ts +2 -2
- package/js/src/bitrue.d.ts +2 -2
- package/js/src/bitso.d.ts +1 -1
- package/js/src/bitso.js +18 -2
- package/js/src/bitstamp.d.ts +1 -1
- package/js/src/bitstamp.js +24 -2
- package/js/src/bitvavo.d.ts +1 -1
- package/js/src/bl3p.js +6 -0
- package/js/src/blockchaincom.js +21 -0
- package/js/src/blofin.d.ts +2 -2
- package/js/src/btcalpha.js +9 -0
- package/js/src/btcbox.js +9 -0
- package/js/src/btcmarkets.js +19 -0
- package/js/src/bybit.d.ts +7 -7
- package/js/src/bybit.js +3 -1
- package/js/src/cex.d.ts +1 -1
- package/js/src/coinbase.d.ts +2 -2
- package/js/src/coinbase.js +21 -8
- package/js/src/coinbasepro.js +1 -0
- package/js/src/coinex.d.ts +4 -4
- package/js/src/coinlist.d.ts +2 -2
- package/js/src/coinlist.js +9 -7
- package/js/src/coinmetro.js +2 -1
- package/js/src/coinone.d.ts +1 -1
- package/js/src/delta.d.ts +2 -2
- package/js/src/deribit.d.ts +3 -3
- package/js/src/digifinex.d.ts +3 -3
- package/js/src/exmo.d.ts +2 -2
- package/js/src/gate.d.ts +6 -6
- package/js/src/hitbtc.d.ts +2 -2
- package/js/src/hollaex.d.ts +1 -1
- package/js/src/htx.d.ts +3 -3
- package/js/src/huobijp.d.ts +1 -1
- package/js/src/kraken.d.ts +2 -2
- package/js/src/krakenfutures.d.ts +4 -2
- package/js/src/krakenfutures.js +133 -16
- package/js/src/kucoin.d.ts +5 -5
- package/js/src/kucoinfutures.d.ts +2 -2
- package/js/src/latoken.d.ts +1 -1
- package/js/src/lbank.d.ts +2 -2
- package/js/src/luno.d.ts +1 -1
- package/js/src/luno.js +1 -1
- package/js/src/mexc.d.ts +4 -4
- package/js/src/mexc.js +43 -43
- package/js/src/ndax.d.ts +1 -1
- package/js/src/novadax.d.ts +1 -1
- package/js/src/okcoin.d.ts +2 -2
- package/js/src/okx.d.ts +7 -7
- package/js/src/okx.js +11 -17
- package/js/src/paymium.d.ts +2 -2
- package/js/src/phemex.d.ts +4 -4
- package/js/src/phemex.js +1 -0
- package/js/src/poloniex.d.ts +2 -2
- package/js/src/poloniexfutures.d.ts +2 -2
- package/js/src/poloniexfutures.js +11 -5
- package/js/src/pro/bitmart.d.ts +4 -0
- package/js/src/pro/bitmart.js +141 -48
- package/js/src/pro/bitvavo.d.ts +1 -1
- package/js/src/pro/bybit.d.ts +1 -1
- package/js/src/pro/bybit.js +5 -5
- package/js/src/pro/cex.d.ts +2 -2
- package/js/src/pro/coinbase.d.ts +2 -2
- package/js/src/pro/coinex.d.ts +1 -1
- package/js/src/pro/lbank.d.ts +1 -1
- package/js/src/pro/mexc.js +1 -1
- package/js/src/probit.d.ts +1 -1
- package/js/src/timex.d.ts +1 -1
- package/js/src/upbit.d.ts +1 -1
- package/js/src/wavesexchange.js +1 -1
- package/js/src/whitebit.d.ts +2 -2
- package/js/src/woo.d.ts +3 -3
- package/js/src/woo.js +1 -1
- package/js/src/zonda.d.ts +3 -3
- package/package.json +2 -2
|
@@ -24,8 +24,10 @@ class bitmart extends bitmart$1 {
|
|
|
24
24
|
'watchTicker': true,
|
|
25
25
|
'watchTickers': true,
|
|
26
26
|
'watchOrderBook': true,
|
|
27
|
+
'watchOrderBookForSymbols': true,
|
|
27
28
|
'watchOrders': true,
|
|
28
29
|
'watchTrades': true,
|
|
30
|
+
'watchTradesForSymbols': true,
|
|
29
31
|
'watchOHLCV': true,
|
|
30
32
|
'watchPosition': 'emulated',
|
|
31
33
|
'watchPositions': true,
|
|
@@ -50,8 +52,15 @@ class bitmart extends bitmart$1 {
|
|
|
50
52
|
'fetchBalanceSnapshot': true,
|
|
51
53
|
'awaitBalanceSnapshot': false, // whether to wait for the balance snapshot before providing updates
|
|
52
54
|
},
|
|
55
|
+
//
|
|
56
|
+
// orderbook channels can have:
|
|
57
|
+
// - 'depth5', 'depth20', 'depth50' // these endpoints emit full Orderbooks once in every 500ms
|
|
58
|
+
// - 'depth/increase100' // this endpoint is preferred, because it emits once in 100ms. however, when this value is chosen, it only affects spot-market, but contracts markets automatically `depth50` will be being used
|
|
53
59
|
'watchOrderBook': {
|
|
54
|
-
'depth': 'depth/increase100',
|
|
60
|
+
'depth': 'depth/increase100',
|
|
61
|
+
},
|
|
62
|
+
'watchOrderBookForSymbols': {
|
|
63
|
+
'depth': 'depth/increase100',
|
|
55
64
|
},
|
|
56
65
|
'ws': {
|
|
57
66
|
'inflate': true,
|
|
@@ -98,6 +107,24 @@ class bitmart extends bitmart$1 {
|
|
|
98
107
|
}
|
|
99
108
|
return await this.watch(url, messageHash, this.deepExtend(request, params), messageHash);
|
|
100
109
|
}
|
|
110
|
+
async subscribeMultiple(channel, type, symbols, params = {}) {
|
|
111
|
+
const url = this.implodeHostname(this.urls['api']['ws'][type]['public']);
|
|
112
|
+
const channelType = (type === 'spot') ? 'spot' : 'futures';
|
|
113
|
+
const actionType = (type === 'spot') ? 'op' : 'action';
|
|
114
|
+
const rawSubscriptions = [];
|
|
115
|
+
const messageHashes = [];
|
|
116
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
117
|
+
const market = this.market(symbols[i]);
|
|
118
|
+
const message = channelType + '/' + channel + ':' + market['id'];
|
|
119
|
+
rawSubscriptions.push(message);
|
|
120
|
+
messageHashes.push(channel + ':' + market['symbol']);
|
|
121
|
+
}
|
|
122
|
+
const request = {
|
|
123
|
+
'args': rawSubscriptions,
|
|
124
|
+
};
|
|
125
|
+
request[actionType] = 'subscribe';
|
|
126
|
+
return await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), rawSubscriptions);
|
|
127
|
+
}
|
|
101
128
|
async watchBalance(params = {}) {
|
|
102
129
|
/**
|
|
103
130
|
* @method
|
|
@@ -245,17 +272,43 @@ class bitmart extends bitmart$1 {
|
|
|
245
272
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
246
273
|
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
247
274
|
*/
|
|
275
|
+
return await this.watchTradesForSymbols([symbol], since, limit, params);
|
|
276
|
+
}
|
|
277
|
+
async watchTradesForSymbols(symbols, since = undefined, limit = undefined, params = {}) {
|
|
278
|
+
/**
|
|
279
|
+
* @method
|
|
280
|
+
* @name bitmart#watchTradesForSymbols
|
|
281
|
+
* @see https://developer-pro.bitmart.com/en/spot/#public-trade-channel
|
|
282
|
+
* @description get the list of most recent trades for a list of symbols
|
|
283
|
+
* @param {string[]} symbols unified symbol of the market to fetch trades for
|
|
284
|
+
* @param {int} [since] timestamp in ms of the earliest trade to fetch
|
|
285
|
+
* @param {int} [limit] the maximum amount of trades to fetch
|
|
286
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
287
|
+
* @returns {object[]} a list of [trade structures]{@link https://docs.ccxt.com/#/?id=public-trades}
|
|
288
|
+
*/
|
|
248
289
|
await this.loadMarkets();
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
const trades = await this.subscribe('trade', symbol, type, params);
|
|
290
|
+
let marketType = undefined;
|
|
291
|
+
[symbols, marketType, params] = this.getParamsForMultipleSub('watchTradesForSymbols', symbols, limit, params);
|
|
292
|
+
const channelName = 'trade';
|
|
293
|
+
const trades = await this.subscribeMultiple(channelName, marketType, symbols, params);
|
|
254
294
|
if (this.newUpdates) {
|
|
255
|
-
|
|
295
|
+
const first = this.safeDict(trades, 0);
|
|
296
|
+
const tradeSymbol = this.safeString(first, 'symbol');
|
|
297
|
+
limit = trades.getLimit(tradeSymbol, limit);
|
|
256
298
|
}
|
|
257
299
|
return this.filterBySinceLimit(trades, since, limit, 'timestamp', true);
|
|
258
300
|
}
|
|
301
|
+
getParamsForMultipleSub(methodName, symbols, limit = undefined, params = {}) {
|
|
302
|
+
symbols = this.marketSymbols(symbols, undefined, false, true);
|
|
303
|
+
const length = symbols.length;
|
|
304
|
+
if (length > 20) {
|
|
305
|
+
throw new errors.NotSupported(this.id + ' ' + methodName + '() accepts a maximum of 20 symbols in one request');
|
|
306
|
+
}
|
|
307
|
+
const market = this.market(symbols[0]);
|
|
308
|
+
let marketType = undefined;
|
|
309
|
+
[marketType, params] = this.handleMarketTypeAndParams(methodName, market, params);
|
|
310
|
+
return [symbols, marketType, params];
|
|
311
|
+
}
|
|
259
312
|
async watchTicker(symbol, params = {}) {
|
|
260
313
|
/**
|
|
261
314
|
* @method
|
|
@@ -793,16 +846,15 @@ class bitmart extends bitmart$1 {
|
|
|
793
846
|
// ]
|
|
794
847
|
// }
|
|
795
848
|
//
|
|
796
|
-
const channel = this.safeString2(message, 'table', 'group');
|
|
797
|
-
const isSpot = (channel.indexOf('spot') >= 0);
|
|
798
849
|
const data = this.safeValue(message, 'data');
|
|
799
850
|
if (data === undefined) {
|
|
800
851
|
return;
|
|
801
852
|
}
|
|
802
853
|
let stored = undefined;
|
|
854
|
+
let symbol = undefined;
|
|
803
855
|
for (let i = 0; i < data.length; i++) {
|
|
804
856
|
const trade = this.parseWsTrade(data[i]);
|
|
805
|
-
|
|
857
|
+
symbol = trade['symbol'];
|
|
806
858
|
const tradesLimit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
807
859
|
stored = this.safeValue(this.trades, symbol);
|
|
808
860
|
if (stored === undefined) {
|
|
@@ -811,10 +863,7 @@ class bitmart extends bitmart$1 {
|
|
|
811
863
|
}
|
|
812
864
|
stored.append(trade);
|
|
813
865
|
}
|
|
814
|
-
|
|
815
|
-
if (isSpot) {
|
|
816
|
-
messageHash += ':' + this.safeString(data[0], 'symbol');
|
|
817
|
-
}
|
|
866
|
+
const messageHash = 'trade:' + symbol;
|
|
818
867
|
client.resolve(stored, messageHash);
|
|
819
868
|
}
|
|
820
869
|
parseWsTrade(trade, market = undefined) {
|
|
@@ -1156,8 +1205,8 @@ class bitmart extends bitmart$1 {
|
|
|
1156
1205
|
// "symbol": "BTC_USDT"
|
|
1157
1206
|
// }
|
|
1158
1207
|
//
|
|
1159
|
-
const asks = this.
|
|
1160
|
-
const bids = this.
|
|
1208
|
+
const asks = this.safeList(message, 'asks', []);
|
|
1209
|
+
const bids = this.safeList(message, 'bids', []);
|
|
1161
1210
|
this.handleDeltas(orderbook['asks'], asks);
|
|
1162
1211
|
this.handleDeltas(orderbook['bids'], bids);
|
|
1163
1212
|
const timestamp = this.safeInteger(message, 'ms_t');
|
|
@@ -1171,6 +1220,7 @@ class bitmart extends bitmart$1 {
|
|
|
1171
1220
|
handleOrderBook(client, message) {
|
|
1172
1221
|
//
|
|
1173
1222
|
// spot depth-all
|
|
1223
|
+
//
|
|
1174
1224
|
// {
|
|
1175
1225
|
// "data": [
|
|
1176
1226
|
// {
|
|
@@ -1190,33 +1240,31 @@ class bitmart extends bitmart$1 {
|
|
|
1190
1240
|
// ],
|
|
1191
1241
|
// "table": "spot/depth5"
|
|
1192
1242
|
// }
|
|
1243
|
+
//
|
|
1193
1244
|
// spot increse depth snapshot
|
|
1245
|
+
//
|
|
1194
1246
|
// {
|
|
1195
1247
|
// "data":[
|
|
1196
1248
|
// {
|
|
1197
|
-
//
|
|
1198
|
-
//
|
|
1199
|
-
//
|
|
1200
|
-
// "0.02039"
|
|
1201
|
-
// ],
|
|
1202
|
-
// ...
|
|
1203
|
-
// ],
|
|
1204
|
-
// "bids":[
|
|
1205
|
-
// [
|
|
1206
|
-
// "43652.51",
|
|
1207
|
-
// "0.00500"
|
|
1249
|
+
// "asks":[
|
|
1250
|
+
// [ "43652.52", "0.02039" ],
|
|
1251
|
+
// ...
|
|
1208
1252
|
// ],
|
|
1209
|
-
//
|
|
1210
|
-
//
|
|
1211
|
-
//
|
|
1212
|
-
//
|
|
1213
|
-
//
|
|
1214
|
-
//
|
|
1253
|
+
// "bids":[
|
|
1254
|
+
// [ "43652.51", "0.00500" ],
|
|
1255
|
+
// ...
|
|
1256
|
+
// ],
|
|
1257
|
+
// "ms_t":1703376836487,
|
|
1258
|
+
// "symbol":"BTC_USDT",
|
|
1259
|
+
// "type":"snapshot", // or update
|
|
1260
|
+
// "version":2141731
|
|
1215
1261
|
// }
|
|
1216
1262
|
// ],
|
|
1217
1263
|
// "table":"spot/depth/increase100"
|
|
1218
1264
|
// }
|
|
1265
|
+
//
|
|
1219
1266
|
// swap
|
|
1267
|
+
//
|
|
1220
1268
|
// {
|
|
1221
1269
|
// "group":"futures/depth50:BTCUSDT",
|
|
1222
1270
|
// "data":{
|
|
@@ -1237,50 +1285,69 @@ class bitmart extends bitmart$1 {
|
|
|
1237
1285
|
// }
|
|
1238
1286
|
// }
|
|
1239
1287
|
//
|
|
1240
|
-
const
|
|
1241
|
-
|
|
1288
|
+
const isSpot = ('table' in message);
|
|
1289
|
+
let datas = [];
|
|
1290
|
+
if (isSpot) {
|
|
1291
|
+
datas = this.safeList(message, 'data', datas);
|
|
1292
|
+
}
|
|
1293
|
+
else {
|
|
1294
|
+
const orderBookEntry = this.safeDict(message, 'data');
|
|
1295
|
+
if (orderBookEntry !== undefined) {
|
|
1296
|
+
datas.push(orderBookEntry);
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
const length = datas.length;
|
|
1300
|
+
if (length <= 0) {
|
|
1242
1301
|
return;
|
|
1243
1302
|
}
|
|
1244
|
-
const
|
|
1245
|
-
const isSpot = (depths === undefined);
|
|
1246
|
-
const table = this.safeString2(message, 'table', 'group');
|
|
1303
|
+
const channelName = this.safeString2(message, 'table', 'group');
|
|
1247
1304
|
// find limit subscribed to
|
|
1248
1305
|
const limitsToCheck = ['100', '50', '20', '10', '5'];
|
|
1249
1306
|
let limit = 0;
|
|
1250
1307
|
for (let i = 0; i < limitsToCheck.length; i++) {
|
|
1251
1308
|
const limitString = limitsToCheck[i];
|
|
1252
|
-
if (
|
|
1309
|
+
if (channelName.indexOf(limitString) >= 0) {
|
|
1253
1310
|
limit = this.parseToInt(limitString);
|
|
1254
1311
|
break;
|
|
1255
1312
|
}
|
|
1256
1313
|
}
|
|
1257
1314
|
if (isSpot) {
|
|
1258
|
-
|
|
1259
|
-
|
|
1315
|
+
const channel = channelName.replace('spot/', '');
|
|
1316
|
+
for (let i = 0; i < datas.length; i++) {
|
|
1317
|
+
const update = datas[i];
|
|
1260
1318
|
const marketId = this.safeString(update, 'symbol');
|
|
1261
1319
|
const symbol = this.safeSymbol(marketId);
|
|
1262
|
-
let orderbook = this.
|
|
1320
|
+
let orderbook = this.safeDict(this.orderbooks, symbol);
|
|
1263
1321
|
if (orderbook === undefined) {
|
|
1264
1322
|
orderbook = this.orderBook({}, limit);
|
|
1265
1323
|
orderbook['symbol'] = symbol;
|
|
1266
1324
|
this.orderbooks[symbol] = orderbook;
|
|
1267
1325
|
}
|
|
1268
1326
|
const type = this.safeValue(update, 'type');
|
|
1269
|
-
if ((type === 'snapshot') || (!(
|
|
1327
|
+
if ((type === 'snapshot') || (!(channelName.indexOf('increase') >= 0))) {
|
|
1270
1328
|
orderbook.reset({});
|
|
1271
1329
|
}
|
|
1272
1330
|
this.handleOrderBookMessage(client, update, orderbook);
|
|
1273
1331
|
const timestamp = this.safeInteger(update, 'ms_t');
|
|
1274
|
-
orderbook['timestamp']
|
|
1275
|
-
|
|
1276
|
-
|
|
1332
|
+
if (orderbook['timestamp'] === undefined) {
|
|
1333
|
+
orderbook['timestamp'] = timestamp;
|
|
1334
|
+
orderbook['datetime'] = this.iso8601(timestamp);
|
|
1335
|
+
}
|
|
1336
|
+
const messageHash = channelName + ':' + marketId;
|
|
1277
1337
|
client.resolve(orderbook, messageHash);
|
|
1338
|
+
// resolve ForSymbols
|
|
1339
|
+
const messageHashForMulti = channel + ':' + symbol;
|
|
1340
|
+
client.resolve(orderbook, messageHashForMulti);
|
|
1278
1341
|
}
|
|
1279
1342
|
}
|
|
1280
1343
|
else {
|
|
1344
|
+
const tableParts = channelName.split(':');
|
|
1345
|
+
const channel = tableParts[0].replace('futures/', '');
|
|
1346
|
+
const data = datas[0]; // contract markets always contain only one member
|
|
1347
|
+
const depths = data['depths'];
|
|
1281
1348
|
const marketId = this.safeString(data, 'symbol');
|
|
1282
1349
|
const symbol = this.safeSymbol(marketId);
|
|
1283
|
-
let orderbook = this.
|
|
1350
|
+
let orderbook = this.safeDict(this.orderbooks, symbol);
|
|
1284
1351
|
if (orderbook === undefined) {
|
|
1285
1352
|
orderbook = this.orderBook({}, limit);
|
|
1286
1353
|
orderbook['symbol'] = symbol;
|
|
@@ -1309,10 +1376,36 @@ class bitmart extends bitmart$1 {
|
|
|
1309
1376
|
const timestamp = this.safeInteger(data, 'ms_t');
|
|
1310
1377
|
orderbook['timestamp'] = timestamp;
|
|
1311
1378
|
orderbook['datetime'] = this.iso8601(timestamp);
|
|
1312
|
-
const messageHash =
|
|
1379
|
+
const messageHash = channelName;
|
|
1313
1380
|
client.resolve(orderbook, messageHash);
|
|
1381
|
+
// resolve ForSymbols
|
|
1382
|
+
const messageHashForMulti = channel + ':' + symbol;
|
|
1383
|
+
client.resolve(orderbook, messageHashForMulti);
|
|
1314
1384
|
}
|
|
1315
1385
|
}
|
|
1386
|
+
async watchOrderBookForSymbols(symbols, limit = undefined, params = {}) {
|
|
1387
|
+
/**
|
|
1388
|
+
* @method
|
|
1389
|
+
* @name bitmart#watchOrderBookForSymbols
|
|
1390
|
+
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
1391
|
+
* @see https://developer-pro.bitmart.com/en/spot/#public-depth-increase-channel
|
|
1392
|
+
* @param {string[]} symbols unified array of symbols
|
|
1393
|
+
* @param {int} [limit] the maximum amount of order book entries to return
|
|
1394
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
1395
|
+
* @param {string} [params.depth] the type of order book to subscribe to, default is 'depth/increase100', also accepts 'depth5' or 'depth20' or depth50
|
|
1396
|
+
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
1397
|
+
*/
|
|
1398
|
+
await this.loadMarkets();
|
|
1399
|
+
let type = undefined;
|
|
1400
|
+
[symbols, type, params] = this.getParamsForMultipleSub('watchOrderBookForSymbols', symbols, limit, params);
|
|
1401
|
+
let channel = undefined;
|
|
1402
|
+
[channel, params] = this.handleOptionAndParams(params, 'watchOrderBookForSymbols', 'depth', 'depth/increase100');
|
|
1403
|
+
if (type === 'swap' && channel === 'depth/increase100') {
|
|
1404
|
+
channel = 'depth50';
|
|
1405
|
+
}
|
|
1406
|
+
const orderbook = await this.subscribeMultiple(channel, type, symbols, params);
|
|
1407
|
+
return orderbook.limit();
|
|
1408
|
+
}
|
|
1316
1409
|
async authenticate(type, params = {}) {
|
|
1317
1410
|
this.checkRequiredCredentials();
|
|
1318
1411
|
const url = this.implodeHostname(this.urls['api']['ws'][type]['private']);
|
|
@@ -184,7 +184,7 @@ class bybit extends bybit$1 {
|
|
|
184
184
|
const market = this.market(symbol);
|
|
185
185
|
symbol = market['symbol'];
|
|
186
186
|
const messageHash = 'ticker:' + symbol;
|
|
187
|
-
const url = this.getUrlByMarketType(symbol, false, params);
|
|
187
|
+
const url = this.getUrlByMarketType(symbol, false, 'watchTicker', params);
|
|
188
188
|
params = this.cleanParams(params);
|
|
189
189
|
const options = this.safeValue(this.options, 'watchTicker', {});
|
|
190
190
|
let topic = this.safeString(options, 'name', 'tickers');
|
|
@@ -209,7 +209,7 @@ class bybit extends bybit$1 {
|
|
|
209
209
|
await this.loadMarkets();
|
|
210
210
|
symbols = this.marketSymbols(symbols, undefined, false);
|
|
211
211
|
const messageHashes = [];
|
|
212
|
-
const url = this.getUrlByMarketType(symbols[0], false, params);
|
|
212
|
+
const url = this.getUrlByMarketType(symbols[0], false, 'watchTickers', params);
|
|
213
213
|
params = this.cleanParams(params);
|
|
214
214
|
const options = this.safeValue(this.options, 'watchTickers', {});
|
|
215
215
|
const topic = this.safeString(options, 'name', 'tickers');
|
|
@@ -376,7 +376,7 @@ class bybit extends bybit$1 {
|
|
|
376
376
|
await this.loadMarkets();
|
|
377
377
|
const market = this.market(symbol);
|
|
378
378
|
symbol = market['symbol'];
|
|
379
|
-
const url = this.getUrlByMarketType(symbol, false, params);
|
|
379
|
+
const url = this.getUrlByMarketType(symbol, false, 'watchOHLCV', params);
|
|
380
380
|
params = this.cleanParams(params);
|
|
381
381
|
let ohlcv = undefined;
|
|
382
382
|
const timeframeId = this.safeString(this.timeframes, timeframe, timeframe);
|
|
@@ -494,7 +494,7 @@ class bybit extends bybit$1 {
|
|
|
494
494
|
throw new errors.ArgumentsRequired(this.id + ' watchOrderBookForSymbols() requires a non-empty array of symbols');
|
|
495
495
|
}
|
|
496
496
|
symbols = this.marketSymbols(symbols);
|
|
497
|
-
const url = this.getUrlByMarketType(symbols[0], false, params);
|
|
497
|
+
const url = this.getUrlByMarketType(symbols[0], false, 'watchOrderBook', params);
|
|
498
498
|
params = this.cleanParams(params);
|
|
499
499
|
const market = this.market(symbols[0]);
|
|
500
500
|
if (limit === undefined) {
|
|
@@ -626,7 +626,7 @@ class bybit extends bybit$1 {
|
|
|
626
626
|
throw new errors.ArgumentsRequired(this.id + ' watchTradesForSymbols() requires a non-empty array of symbols');
|
|
627
627
|
}
|
|
628
628
|
params = this.cleanParams(params);
|
|
629
|
-
const url = this.getUrlByMarketType(symbols[0], false, params);
|
|
629
|
+
const url = this.getUrlByMarketType(symbols[0], false, 'watchTrades', params);
|
|
630
630
|
const topics = [];
|
|
631
631
|
const messageHashes = [];
|
|
632
632
|
for (let i = 0; i < symbols.length; i++) {
|
package/dist/cjs/src/pro/mexc.js
CHANGED
|
@@ -469,7 +469,7 @@ class mexc extends mexc$1 {
|
|
|
469
469
|
}
|
|
470
470
|
try {
|
|
471
471
|
this.handleDelta(storedOrderBook, data);
|
|
472
|
-
const timestamp = this.
|
|
472
|
+
const timestamp = this.safeInteger2(message, 't', 'ts');
|
|
473
473
|
storedOrderBook['timestamp'] = timestamp;
|
|
474
474
|
storedOrderBook['datetime'] = this.iso8601(timestamp);
|
|
475
475
|
}
|
|
@@ -311,7 +311,7 @@ class wavesexchange extends wavesexchange$1 {
|
|
|
311
311
|
},
|
|
312
312
|
},
|
|
313
313
|
'currencies': {
|
|
314
|
-
'WX': this.safeCurrencyStructure({ 'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': undefined, 'code': 'WX', 'precision': this.
|
|
314
|
+
'WX': this.safeCurrencyStructure({ 'id': 'EMAMLxDnv3xiz8RXg8Btj33jcEw3wLczL3JKYYmuubpc', 'numericId': undefined, 'code': 'WX', 'precision': this.parseToInt('8') }),
|
|
315
315
|
},
|
|
316
316
|
'precisionMode': number.DECIMAL_PLACES,
|
|
317
317
|
'options': {
|
package/dist/cjs/src/woo.js
CHANGED
|
@@ -1065,7 +1065,7 @@ class woo extends woo$1 {
|
|
|
1065
1065
|
if (stopPrice !== undefined) {
|
|
1066
1066
|
request['triggerPrice'] = this.priceToPrecision(symbol, stopPrice);
|
|
1067
1067
|
}
|
|
1068
|
-
const trailingTriggerPrice = this.safeString2(params, 'trailingTriggerPrice', 'activatedPrice', price);
|
|
1068
|
+
const trailingTriggerPrice = this.safeString2(params, 'trailingTriggerPrice', 'activatedPrice', this.numberToString(price));
|
|
1069
1069
|
const trailingAmount = this.safeString2(params, 'trailingAmount', 'callbackValue');
|
|
1070
1070
|
const trailingPercent = this.safeString2(params, 'trailingPercent', 'callbackRate');
|
|
1071
1071
|
const isTrailingAmountOrder = trailingAmount !== undefined;
|
package/js/ccxt.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import * as functions from './src/base/functions.js';
|
|
|
4
4
|
import * as errors from './src/base/errors.js';
|
|
5
5
|
import type { Market, Trade, Fee, Ticker, OrderBook, Order, Transaction, Tickers, Currency, Balance, DepositAddress, WithdrawalResponse, DepositAddressResponse, OHLCV, Balances, PartialBalances, Dictionary, MinMax, Position, FundingRateHistory, Liquidation, FundingHistory, MarginMode, Greeks } from './src/base/types.js';
|
|
6
6
|
import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
|
|
7
|
-
declare const version = "4.2.
|
|
7
|
+
declare const version = "4.2.39";
|
|
8
8
|
import ace from './src/ace.js';
|
|
9
9
|
import alpaca from './src/alpaca.js';
|
|
10
10
|
import ascendex from './src/ascendex.js';
|
package/js/ccxt.js
CHANGED
|
@@ -38,7 +38,7 @@ import * as errors from './src/base/errors.js';
|
|
|
38
38
|
import { BaseError, ExchangeError, PermissionDenied, AccountNotEnabled, AccountSuspended, ArgumentsRequired, BadRequest, BadSymbol, MarginModeAlreadySet, BadResponse, NullResponse, InsufficientFunds, InvalidAddress, InvalidOrder, OrderNotFound, OrderNotCached, CancelPending, OrderImmediatelyFillable, OrderNotFillable, DuplicateOrderId, NotSupported, NetworkError, DDoSProtection, RateLimitExceeded, ExchangeNotAvailable, OnMaintenance, InvalidNonce, RequestTimeout, AuthenticationError, AddressPending, NoChange } from './src/base/errors.js';
|
|
39
39
|
//-----------------------------------------------------------------------------
|
|
40
40
|
// this is updated by vss.js when building
|
|
41
|
-
const version = '4.2.
|
|
41
|
+
const version = '4.2.40';
|
|
42
42
|
Exchange.ccxtVersion = version;
|
|
43
43
|
//-----------------------------------------------------------------------------
|
|
44
44
|
import ace from './src/ace.js';
|
|
@@ -15,6 +15,7 @@ interface Exchange {
|
|
|
15
15
|
spotV1PrivatePostTradeOrder(params?: {}): Promise<implicitReturnType>;
|
|
16
16
|
spotV1PrivatePostTradeCancel(params?: {}): Promise<implicitReturnType>;
|
|
17
17
|
spotV1PrivatePostTradeBatchOrders(params?: {}): Promise<implicitReturnType>;
|
|
18
|
+
spotV1PrivatePostTradeOrderCancelReplace(params?: {}): Promise<implicitReturnType>;
|
|
18
19
|
spotV1PrivatePostTradeCancelOrders(params?: {}): Promise<implicitReturnType>;
|
|
19
20
|
spotV1PrivatePostTradeCancelOpenOrders(params?: {}): Promise<implicitReturnType>;
|
|
20
21
|
spotV3PrivateGetGetAssetTransfer(params?: {}): Promise<implicitReturnType>;
|
|
@@ -22,8 +23,11 @@ interface Exchange {
|
|
|
22
23
|
spotV3PrivateGetCapitalDepositHisrec(params?: {}): Promise<implicitReturnType>;
|
|
23
24
|
spotV3PrivateGetCapitalWithdrawHistory(params?: {}): Promise<implicitReturnType>;
|
|
24
25
|
spotV3PrivatePostPostAssetTransfer(params?: {}): Promise<implicitReturnType>;
|
|
26
|
+
swapV1PublicGetTickerPrice(params?: {}): Promise<implicitReturnType>;
|
|
25
27
|
swapV1PrivateGetPositionSideDual(params?: {}): Promise<implicitReturnType>;
|
|
26
28
|
swapV1PrivateGetMarketMarkPriceKlines(params?: {}): Promise<implicitReturnType>;
|
|
29
|
+
swapV1PrivateGetTradeBatchCancelReplace(params?: {}): Promise<implicitReturnType>;
|
|
30
|
+
swapV1PrivatePostTradeCancelReplace(params?: {}): Promise<implicitReturnType>;
|
|
27
31
|
swapV1PrivatePostPositionSideDual(params?: {}): Promise<implicitReturnType>;
|
|
28
32
|
swapV2PublicGetServerTime(params?: {}): Promise<implicitReturnType>;
|
|
29
33
|
swapV2PublicGetQuoteContracts(params?: {}): Promise<implicitReturnType>;
|
|
@@ -72,6 +72,7 @@ interface Exchange {
|
|
|
72
72
|
v3PrivatePostBrokerageOrdersBatchCancel(params?: {}): Promise<implicitReturnType>;
|
|
73
73
|
v3PrivatePostBrokerageOrdersEdit(params?: {}): Promise<implicitReturnType>;
|
|
74
74
|
v3PrivatePostBrokerageOrdersEditPreview(params?: {}): Promise<implicitReturnType>;
|
|
75
|
+
v3PrivatePostBrokerageOrdersPreview(params?: {}): Promise<implicitReturnType>;
|
|
75
76
|
v3PrivatePostBrokeragePortfolios(params?: {}): Promise<implicitReturnType>;
|
|
76
77
|
v3PrivatePostBrokeragePortfoliosMoveFunds(params?: {}): Promise<implicitReturnType>;
|
|
77
78
|
v3PrivatePostBrokerageConvertQuote(params?: {}): Promise<implicitReturnType>;
|
|
@@ -46,6 +46,7 @@ interface Exchange {
|
|
|
46
46
|
privateGetUsersSelfTrailingVolume(params?: {}): Promise<implicitReturnType>;
|
|
47
47
|
privateGetWithdrawalsFeeEstimate(params?: {}): Promise<implicitReturnType>;
|
|
48
48
|
privateGetConversionsConversionId(params?: {}): Promise<implicitReturnType>;
|
|
49
|
+
privateGetConversionsFees(params?: {}): Promise<implicitReturnType>;
|
|
49
50
|
privatePostConversions(params?: {}): Promise<implicitReturnType>;
|
|
50
51
|
privatePostDepositsCoinbaseAccount(params?: {}): Promise<implicitReturnType>;
|
|
51
52
|
privatePostDepositsPaymentMethod(params?: {}): Promise<implicitReturnType>;
|
package/js/src/abstract/okx.d.ts
CHANGED
|
@@ -98,6 +98,7 @@ interface Exchange {
|
|
|
98
98
|
privateGetTradeEasyConvertHistory(params?: {}): Promise<implicitReturnType>;
|
|
99
99
|
privateGetTradeOneClickRepayCurrencyList(params?: {}): Promise<implicitReturnType>;
|
|
100
100
|
privateGetTradeOneClickRepayHistory(params?: {}): Promise<implicitReturnType>;
|
|
101
|
+
privateGetTradeAccountRateLimit(params?: {}): Promise<implicitReturnType>;
|
|
101
102
|
privateGetAssetCurrencies(params?: {}): Promise<implicitReturnType>;
|
|
102
103
|
privateGetAssetBalances(params?: {}): Promise<implicitReturnType>;
|
|
103
104
|
privateGetAssetNonTradableAssets(params?: {}): Promise<implicitReturnType>;
|
package/js/src/ascendex.d.ts
CHANGED
|
@@ -87,7 +87,7 @@ export default class ascendex extends Exchange {
|
|
|
87
87
|
reduceMargin(symbol: string, amount: any, params?: {}): Promise<any>;
|
|
88
88
|
addMargin(symbol: string, amount: any, params?: {}): Promise<any>;
|
|
89
89
|
setLeverage(leverage: Int, symbol?: Str, params?: {}): Promise<any>;
|
|
90
|
-
setMarginMode(marginMode:
|
|
90
|
+
setMarginMode(marginMode: string, symbol?: Str, params?: {}): Promise<any>;
|
|
91
91
|
fetchLeverageTiers(symbols?: Strings, params?: {}): Promise<{}>;
|
|
92
92
|
parseMarketLeverageTiers(info: any, market?: Market): any[];
|
|
93
93
|
parseDepositWithdrawFee(fee: any, currency?: Currency): {
|
|
@@ -103,7 +103,7 @@ export default class ascendex extends Exchange {
|
|
|
103
103
|
networks: {};
|
|
104
104
|
};
|
|
105
105
|
fetchDepositWithdrawFees(codes?: Strings, params?: {}): Promise<any>;
|
|
106
|
-
transfer(code: string, amount: number, fromAccount:
|
|
106
|
+
transfer(code: string, amount: number, fromAccount: string, toAccount: string, params?: {}): Promise<TransferEntry>;
|
|
107
107
|
parseTransfer(transfer: any, currency?: Currency): {
|
|
108
108
|
info: any;
|
|
109
109
|
id: any;
|
package/js/src/ascendex.js
CHANGED
|
@@ -277,11 +277,14 @@ export default class ascendex extends Exchange {
|
|
|
277
277
|
'fillResponseFromRequest': true,
|
|
278
278
|
},
|
|
279
279
|
'networks': {
|
|
280
|
-
'BSC': 'BEP20 (BSC)',
|
|
280
|
+
'BSC': 'BEP20 ' + '(BSC)',
|
|
281
281
|
'ARB': 'arbitrum',
|
|
282
282
|
'SOL': 'Solana',
|
|
283
283
|
'AVAX': 'avalanche C chain',
|
|
284
284
|
'OMNI': 'Omni',
|
|
285
|
+
'TRC': 'TRC20',
|
|
286
|
+
'TRX': 'TRC20',
|
|
287
|
+
'ERC': 'ERC20',
|
|
285
288
|
},
|
|
286
289
|
'networksById': {
|
|
287
290
|
'BEP20 (BSC)': 'BSC',
|
|
@@ -289,6 +292,16 @@ export default class ascendex extends Exchange {
|
|
|
289
292
|
'Solana': 'SOL',
|
|
290
293
|
'avalanche C chain': 'AVAX',
|
|
291
294
|
'Omni': 'OMNI',
|
|
295
|
+
'TRC20': 'TRC20',
|
|
296
|
+
'ERC20': 'ERC20',
|
|
297
|
+
'GO20': 'GO20',
|
|
298
|
+
'BEP2': 'BEP2',
|
|
299
|
+
'Bitcoin': 'BTC',
|
|
300
|
+
'Bitcoin ABC': 'BCH',
|
|
301
|
+
'Litecoin': 'LTC',
|
|
302
|
+
'Matic Network': 'MATIC',
|
|
303
|
+
'xDai': 'STAKE',
|
|
304
|
+
'Akash': 'AKT',
|
|
292
305
|
},
|
|
293
306
|
},
|
|
294
307
|
'exceptions': {
|
|
@@ -2378,8 +2391,8 @@ export default class ascendex extends Exchange {
|
|
|
2378
2391
|
const tag = this.safeString(depositAddress, tagId);
|
|
2379
2392
|
this.checkAddress(address);
|
|
2380
2393
|
const code = (currency === undefined) ? undefined : currency['code'];
|
|
2381
|
-
const chainName = this.safeString(depositAddress, '
|
|
2382
|
-
const network = this.
|
|
2394
|
+
const chainName = this.safeString(depositAddress, 'blockchain');
|
|
2395
|
+
const network = this.networkIdToCode(chainName, code);
|
|
2383
2396
|
return {
|
|
2384
2397
|
'currency': code,
|
|
2385
2398
|
'address': address,
|
|
@@ -2389,20 +2402,7 @@ export default class ascendex extends Exchange {
|
|
|
2389
2402
|
};
|
|
2390
2403
|
}
|
|
2391
2404
|
safeNetwork(networkId) {
|
|
2392
|
-
const networksById =
|
|
2393
|
-
'TRC20': 'TRC20',
|
|
2394
|
-
'ERC20': 'ERC20',
|
|
2395
|
-
'GO20': 'GO20',
|
|
2396
|
-
'BEP2': 'BEP2',
|
|
2397
|
-
'BEP20 (BSC)': 'BEP20',
|
|
2398
|
-
'Bitcoin': 'BTC',
|
|
2399
|
-
'Bitcoin ABC': 'BCH',
|
|
2400
|
-
'Litecoin': 'LTC',
|
|
2401
|
-
'Matic Network': 'MATIC',
|
|
2402
|
-
'Solana': 'SOL',
|
|
2403
|
-
'xDai': 'STAKE',
|
|
2404
|
-
'Akash': 'AKT',
|
|
2405
|
-
};
|
|
2405
|
+
const networksById = this.safeDict(this.options, 'networksById');
|
|
2406
2406
|
return this.safeString(networksById, networkId, networkId);
|
|
2407
2407
|
}
|
|
2408
2408
|
async fetchDepositAddress(code, params = {}) {
|
|
@@ -2410,16 +2410,20 @@ export default class ascendex extends Exchange {
|
|
|
2410
2410
|
* @method
|
|
2411
2411
|
* @name ascendex#fetchDepositAddress
|
|
2412
2412
|
* @description fetch the deposit address for a currency associated with this account
|
|
2413
|
+
* @see https://ascendex.github.io/ascendex-pro-api/#query-deposit-addresses
|
|
2413
2414
|
* @param {string} code unified currency code
|
|
2414
2415
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
2416
|
+
* @param {string} [params.network] unified network code for deposit chain
|
|
2415
2417
|
* @returns {object} an [address structure]{@link https://docs.ccxt.com/#/?id=address-structure}
|
|
2416
2418
|
*/
|
|
2417
2419
|
await this.loadMarkets();
|
|
2418
2420
|
const currency = this.currency(code);
|
|
2419
|
-
const
|
|
2420
|
-
|
|
2421
|
+
const networkCode = this.safeString2(params, 'network', 'chainName');
|
|
2422
|
+
const networkId = this.networkCodeToId(networkCode);
|
|
2423
|
+
params = this.omit(params, ['chainName']);
|
|
2421
2424
|
const request = {
|
|
2422
2425
|
'asset': currency['id'],
|
|
2426
|
+
'blockchain': networkId,
|
|
2423
2427
|
};
|
|
2424
2428
|
const response = await this.v1PrivateGetWalletDepositAddress(this.extend(request, params));
|
|
2425
2429
|
//
|
|
@@ -2455,22 +2459,22 @@ export default class ascendex extends Exchange {
|
|
|
2455
2459
|
// }
|
|
2456
2460
|
// }
|
|
2457
2461
|
//
|
|
2458
|
-
const data = this.
|
|
2459
|
-
const addresses = this.
|
|
2462
|
+
const data = this.safeDict(response, 'data', {});
|
|
2463
|
+
const addresses = this.safeList(data, 'address', []);
|
|
2460
2464
|
const numAddresses = addresses.length;
|
|
2461
2465
|
let address = undefined;
|
|
2462
2466
|
if (numAddresses > 1) {
|
|
2463
2467
|
const addressesByChainName = this.indexBy(addresses, 'chainName');
|
|
2464
|
-
if (
|
|
2468
|
+
if (networkId === undefined) {
|
|
2465
2469
|
const chainNames = Object.keys(addressesByChainName);
|
|
2466
2470
|
const chains = chainNames.join(', ');
|
|
2467
2471
|
throw new ArgumentsRequired(this.id + ' fetchDepositAddress() returned more than one address, a chainName parameter is required, one of ' + chains);
|
|
2468
2472
|
}
|
|
2469
|
-
address = this.
|
|
2473
|
+
address = this.safeDict(addressesByChainName, networkId, {});
|
|
2470
2474
|
}
|
|
2471
2475
|
else {
|
|
2472
2476
|
// first address
|
|
2473
|
-
address = this.
|
|
2477
|
+
address = this.safeDict(addresses, 0, {});
|
|
2474
2478
|
}
|
|
2475
2479
|
const result = this.parseDepositAddress(address, currency);
|
|
2476
2480
|
return this.extend(result, {
|