ccxt 4.2.84 → 4.2.86
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 +5 -5
- package/dist/ccxt.browser.js +1226 -1104
- package/dist/ccxt.browser.min.js +4 -4
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/ace.js +5 -5
- package/dist/cjs/src/ascendex.js +8 -8
- package/dist/cjs/src/base/Exchange.js +76 -14
- package/dist/cjs/src/bigone.js +12 -12
- package/dist/cjs/src/binance.js +23 -35
- package/dist/cjs/src/bingx.js +47 -28
- package/dist/cjs/src/bit2c.js +1 -1
- package/dist/cjs/src/bitbank.js +27 -31
- package/dist/cjs/src/bitbns.js +5 -5
- package/dist/cjs/src/bitfinex.js +1 -1
- package/dist/cjs/src/bitfinex2.js +1 -1
- package/dist/cjs/src/bitget.js +30 -24
- package/dist/cjs/src/bithumb.js +5 -5
- package/dist/cjs/src/bitmart.js +16 -16
- package/dist/cjs/src/bitopro.js +1 -1
- package/dist/cjs/src/bitrue.js +4 -4
- package/dist/cjs/src/bitso.js +5 -5
- package/dist/cjs/src/bitstamp.js +1 -1
- package/dist/cjs/src/bitteam.js +8 -8
- package/dist/cjs/src/bl3p.js +1 -1
- package/dist/cjs/src/btcturk.js +6 -6
- package/dist/cjs/src/bybit.js +31 -95
- package/dist/cjs/src/coincheck.js +4 -4
- package/dist/cjs/src/coinex.js +408 -262
- package/dist/cjs/src/coinlist.js +7 -7
- package/dist/cjs/src/coinmate.js +4 -4
- package/dist/cjs/src/coinmetro.js +3 -3
- package/dist/cjs/src/coinone.js +5 -5
- package/dist/cjs/src/coinspot.js +2 -2
- package/dist/cjs/src/cryptocom.js +17 -17
- package/dist/cjs/src/currencycom.js +1 -1
- package/dist/cjs/src/delta.js +0 -8
- package/dist/cjs/src/deribit.js +16 -92
- package/dist/cjs/src/digifinex.js +8 -8
- package/dist/cjs/src/exmo.js +8 -8
- package/dist/cjs/src/gate.js +0 -8
- package/dist/cjs/src/hitbtc.js +5 -4
- package/dist/cjs/src/hollaex.js +7 -7
- package/dist/cjs/src/htx.js +7 -7
- package/dist/cjs/src/huobijp.js +3 -3
- package/dist/cjs/src/idex.js +12 -13
- package/dist/cjs/src/independentreserve.js +2 -2
- package/dist/cjs/src/indodax.js +2 -2
- package/dist/cjs/src/kraken.js +8 -8
- package/dist/cjs/src/krakenfutures.js +6 -6
- package/dist/cjs/src/kucoin.js +5 -1
- package/dist/cjs/src/kucoinfutures.js +8 -8
- package/dist/cjs/src/kuna.js +16 -16
- package/dist/cjs/src/latoken.js +2 -2
- package/dist/cjs/src/lbank.js +10 -10
- package/dist/cjs/src/luno.js +4 -4
- package/dist/cjs/src/mercado.js +5 -5
- package/dist/cjs/src/mexc.js +6 -6
- package/dist/cjs/src/ndax.js +1 -1
- package/dist/cjs/src/novadax.js +9 -9
- package/dist/cjs/src/oceanex.js +7 -7
- package/dist/cjs/src/okcoin.js +16 -14
- package/dist/cjs/src/okx.js +23 -31
- package/dist/cjs/src/onetrading.js +4 -4
- package/dist/cjs/src/p2b.js +7 -7
- package/dist/cjs/src/phemex.js +12 -12
- package/dist/cjs/src/poloniexfutures.js +5 -5
- package/dist/cjs/src/pro/binance.js +167 -121
- package/dist/cjs/src/pro/bitget.js +1 -0
- package/dist/cjs/src/pro/kucoin.js +6 -7
- package/dist/cjs/src/pro/okx.js +19 -2
- package/dist/cjs/src/probit.js +11 -11
- package/dist/cjs/src/timex.js +7 -7
- package/dist/cjs/src/tokocrypto.js +9 -9
- package/dist/cjs/src/wavesexchange.js +3 -3
- package/dist/cjs/src/whitebit.js +5 -5
- package/dist/cjs/src/woo.js +1 -1
- package/dist/cjs/src/zaif.js +1 -1
- package/dist/cjs/src/zonda.js +7 -7
- package/examples/js/cli.js +0 -1
- package/examples/ts/cli.ts +0 -1
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/coinex.d.ts +232 -123
- package/js/src/ace.js +5 -5
- package/js/src/ascendex.js +8 -8
- package/js/src/base/Exchange.d.ts +13 -12
- package/js/src/base/Exchange.js +76 -14
- package/js/src/bigone.js +12 -12
- package/js/src/binance.d.ts +0 -1
- package/js/src/binance.js +23 -35
- package/js/src/bingx.js +47 -28
- package/js/src/bit2c.js +1 -1
- package/js/src/bitbank.js +27 -31
- package/js/src/bitbns.js +5 -5
- package/js/src/bitfinex.js +1 -1
- package/js/src/bitfinex2.js +1 -1
- package/js/src/bitget.js +30 -24
- package/js/src/bithumb.js +5 -5
- package/js/src/bitmart.js +16 -16
- package/js/src/bitopro.js +1 -1
- package/js/src/bitrue.js +4 -4
- package/js/src/bitso.js +5 -5
- package/js/src/bitstamp.js +1 -1
- package/js/src/bitteam.js +8 -8
- package/js/src/bl3p.js +1 -1
- package/js/src/btcturk.js +6 -6
- package/js/src/bybit.d.ts +0 -3
- package/js/src/bybit.js +31 -95
- package/js/src/coincheck.js +4 -4
- package/js/src/coinex.d.ts +1 -1
- package/js/src/coinex.js +408 -262
- package/js/src/coinlist.js +7 -7
- package/js/src/coinmate.js +4 -4
- package/js/src/coinmetro.js +3 -3
- package/js/src/coinone.js +5 -5
- package/js/src/coinspot.js +2 -2
- package/js/src/cryptocom.js +17 -17
- package/js/src/currencycom.js +1 -1
- package/js/src/delta.d.ts +0 -1
- package/js/src/delta.js +0 -8
- package/js/src/deribit.d.ts +0 -3
- package/js/src/deribit.js +16 -92
- package/js/src/digifinex.js +8 -8
- package/js/src/exmo.js +8 -8
- package/js/src/gate.d.ts +0 -1
- package/js/src/gate.js +0 -8
- package/js/src/hitbtc.js +5 -4
- package/js/src/hollaex.js +7 -7
- package/js/src/htx.js +7 -7
- package/js/src/huobijp.js +3 -3
- package/js/src/idex.js +12 -13
- package/js/src/independentreserve.js +2 -2
- package/js/src/indodax.js +2 -2
- package/js/src/kraken.js +8 -8
- package/js/src/krakenfutures.js +6 -6
- package/js/src/kucoin.js +5 -1
- package/js/src/kucoinfutures.js +8 -8
- package/js/src/kuna.js +16 -16
- package/js/src/latoken.js +2 -2
- package/js/src/lbank.js +10 -10
- package/js/src/luno.js +4 -4
- package/js/src/mercado.js +5 -5
- package/js/src/mexc.js +6 -6
- package/js/src/ndax.js +1 -1
- package/js/src/novadax.js +9 -9
- package/js/src/oceanex.js +7 -7
- package/js/src/okcoin.js +16 -14
- package/js/src/okx.d.ts +0 -1
- package/js/src/okx.js +23 -31
- package/js/src/onetrading.js +4 -4
- package/js/src/p2b.js +7 -7
- package/js/src/phemex.js +12 -12
- package/js/src/poloniexfutures.js +5 -5
- package/js/src/pro/binance.d.ts +5 -1
- package/js/src/pro/binance.js +168 -122
- package/js/src/pro/bitget.js +1 -0
- package/js/src/pro/kucoin.js +6 -7
- package/js/src/pro/okx.js +19 -2
- package/js/src/probit.js +11 -11
- package/js/src/timex.js +7 -7
- package/js/src/tokocrypto.js +9 -9
- package/js/src/wavesexchange.js +3 -3
- package/js/src/whitebit.js +5 -5
- package/js/src/woo.js +1 -1
- package/js/src/zaif.js +1 -1
- package/js/src/zonda.js +7 -7
- package/package.json +1 -1
- package/skip-tests.json +4 -0
package/js/src/pro/binance.js
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
// ----------------------------------------------------------------------------
|
|
8
8
|
import binanceRest from '../binance.js';
|
|
9
9
|
import { Precise } from '../base/Precise.js';
|
|
10
|
-
import { ExchangeError, ArgumentsRequired, BadRequest } from '../base/errors.js';
|
|
10
|
+
import { ExchangeError, ArgumentsRequired, BadRequest, NotSupported } from '../base/errors.js';
|
|
11
11
|
import { ArrayCache, ArrayCacheByTimestamp, ArrayCacheBySymbolById, ArrayCacheBySymbolBySide } from '../base/ws/Cache.js';
|
|
12
12
|
import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
|
|
13
13
|
import { rsa } from '../base/functions/rsa.js';
|
|
@@ -20,6 +20,7 @@ export default class binance extends binanceRest {
|
|
|
20
20
|
'has': {
|
|
21
21
|
'ws': true,
|
|
22
22
|
'watchBalance': true,
|
|
23
|
+
'watchBidsAsks': true,
|
|
23
24
|
'watchMyTrades': true,
|
|
24
25
|
'watchOHLCV': true,
|
|
25
26
|
'watchOHLCVForSymbols': false,
|
|
@@ -101,10 +102,10 @@ export default class binance extends binanceRest {
|
|
|
101
102
|
'name': 'trade', // 'trade' or 'aggTrade'
|
|
102
103
|
},
|
|
103
104
|
'watchTicker': {
|
|
104
|
-
'name': 'ticker', // ticker
|
|
105
|
+
'name': 'ticker', // ticker or miniTicker or ticker_<window_size>
|
|
105
106
|
},
|
|
106
107
|
'watchTickers': {
|
|
107
|
-
'name': 'ticker', // ticker or miniTicker or
|
|
108
|
+
'name': 'ticker', // ticker or miniTicker or ticker_<window_size>
|
|
108
109
|
},
|
|
109
110
|
'watchOHLCV': {
|
|
110
111
|
'name': 'kline', // or indexPriceKline or markPriceKline (coin-m futures)
|
|
@@ -125,6 +126,15 @@ export default class binance extends binanceRest {
|
|
|
125
126
|
'ws': {
|
|
126
127
|
'cost': 5,
|
|
127
128
|
},
|
|
129
|
+
'tickerChannelsMap': {
|
|
130
|
+
'24hrTicker': 'ticker',
|
|
131
|
+
'24hrMiniTicker': 'miniTicker',
|
|
132
|
+
// rolling window tickers
|
|
133
|
+
'1hTicker': 'ticker_1h',
|
|
134
|
+
'4hTicker': 'ticker_4h',
|
|
135
|
+
'1dTicker': 'ticker_1d',
|
|
136
|
+
'bookTicker': 'bookTicker',
|
|
137
|
+
},
|
|
128
138
|
},
|
|
129
139
|
});
|
|
130
140
|
}
|
|
@@ -938,34 +948,13 @@ export default class binance extends binanceRest {
|
|
|
938
948
|
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
|
|
939
949
|
* @param {string} symbol unified symbol of the market to fetch the ticker for
|
|
940
950
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
941
|
-
* @param {string} [params.name] stream to use can be ticker or
|
|
951
|
+
* @param {string} [params.name] stream to use can be ticker or miniTicker
|
|
942
952
|
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
943
953
|
*/
|
|
944
954
|
await this.loadMarkets();
|
|
945
|
-
|
|
946
|
-
const
|
|
947
|
-
|
|
948
|
-
if (market['contract']) {
|
|
949
|
-
type = market['linear'] ? 'future' : 'delivery';
|
|
950
|
-
}
|
|
951
|
-
const options = this.safeValue(this.options, 'watchTicker', {});
|
|
952
|
-
let name = this.safeString(options, 'name', 'ticker');
|
|
953
|
-
name = this.safeString(params, 'name', name);
|
|
954
|
-
params = this.omit(params, 'name');
|
|
955
|
-
const messageHash = marketId + '@' + name;
|
|
956
|
-
const url = this.urls['api']['ws'][type] + '/' + this.stream(type, messageHash);
|
|
957
|
-
const requestId = this.requestId(url);
|
|
958
|
-
const request = {
|
|
959
|
-
'method': 'SUBSCRIBE',
|
|
960
|
-
'params': [
|
|
961
|
-
messageHash,
|
|
962
|
-
],
|
|
963
|
-
'id': requestId,
|
|
964
|
-
};
|
|
965
|
-
const subscribe = {
|
|
966
|
-
'id': requestId,
|
|
967
|
-
};
|
|
968
|
-
return await this.watch(url, messageHash, this.extend(request, params), messageHash, subscribe);
|
|
955
|
+
symbol = this.symbol(symbol);
|
|
956
|
+
const tickers = await this.watchTickers([symbol], this.extend(params, { 'callerMethodName': 'watchTicker' }));
|
|
957
|
+
return tickers[symbol];
|
|
969
958
|
}
|
|
970
959
|
async watchTickers(symbols = undefined, params = {}) {
|
|
971
960
|
/**
|
|
@@ -976,61 +965,108 @@ export default class binance extends binanceRest {
|
|
|
976
965
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
977
966
|
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
978
967
|
*/
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
let type = undefined;
|
|
984
|
-
if (symbols !== undefined) {
|
|
985
|
-
market = this.market(symbols[0]);
|
|
968
|
+
let channelName = undefined;
|
|
969
|
+
[channelName, params] = this.handleOptionAndParams(params, 'watchTickers', 'name', 'ticker');
|
|
970
|
+
if (channelName === 'bookTicker') {
|
|
971
|
+
throw new BadRequest(this.id + ' deprecation notice - to subscribe for bids-asks, use watch_bids_asks() method instead');
|
|
986
972
|
}
|
|
987
|
-
|
|
973
|
+
const newTickers = await this.watchMultiTickerHelper('watchTickers', channelName, symbols, params);
|
|
974
|
+
if (this.newUpdates) {
|
|
975
|
+
return newTickers;
|
|
976
|
+
}
|
|
977
|
+
return this.filterByArray(this.tickers, 'symbol', symbols);
|
|
978
|
+
}
|
|
979
|
+
async watchBidsAsks(symbols = undefined, params = {}) {
|
|
980
|
+
/**
|
|
981
|
+
* @method
|
|
982
|
+
* @name binance#watchBidsAsks
|
|
983
|
+
* @see https://binance-docs.github.io/apidocs/spot/en/#individual-symbol-book-ticker-streams
|
|
984
|
+
* @see https://binance-docs.github.io/apidocs/futures/en/#all-book-tickers-stream
|
|
985
|
+
* @see https://binance-docs.github.io/apidocs/delivery/en/#all-book-tickers-stream
|
|
986
|
+
* @description watches best bid & ask for symbols
|
|
987
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
988
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
989
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
990
|
+
*/
|
|
991
|
+
const result = await this.watchMultiTickerHelper('watchBidsAsks', 'bookTicker', symbols, params);
|
|
992
|
+
if (this.newUpdates) {
|
|
993
|
+
return result;
|
|
994
|
+
}
|
|
995
|
+
return this.filterByArray(this.tickers, 'symbol', symbols);
|
|
996
|
+
}
|
|
997
|
+
async watchMultiTickerHelper(methodName, channelName, symbols = undefined, params = {}) {
|
|
998
|
+
await this.loadMarkets();
|
|
999
|
+
symbols = this.marketSymbols(symbols, undefined, true, false, true);
|
|
1000
|
+
let firstMarket = undefined;
|
|
1001
|
+
let marketType = undefined;
|
|
1002
|
+
const symbolsDefined = (symbols !== undefined);
|
|
1003
|
+
if (symbolsDefined) {
|
|
1004
|
+
firstMarket = this.market(symbols[0]);
|
|
1005
|
+
}
|
|
1006
|
+
[marketType, params] = this.handleMarketTypeAndParams(methodName, firstMarket, params);
|
|
988
1007
|
let subType = undefined;
|
|
989
|
-
[subType, params] = this.handleSubTypeAndParams(
|
|
990
|
-
|
|
991
|
-
|
|
1008
|
+
[subType, params] = this.handleSubTypeAndParams(methodName, firstMarket, params);
|
|
1009
|
+
let rawMarketType = undefined;
|
|
1010
|
+
if (this.isLinear(marketType, subType)) {
|
|
1011
|
+
rawMarketType = 'future';
|
|
992
1012
|
}
|
|
993
|
-
else if (this.isInverse(
|
|
994
|
-
|
|
1013
|
+
else if (this.isInverse(marketType, subType)) {
|
|
1014
|
+
rawMarketType = 'delivery';
|
|
995
1015
|
}
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
name = this.safeString(params, 'name', name);
|
|
999
|
-
params = this.omit(params, 'name');
|
|
1000
|
-
let wsParams = [];
|
|
1001
|
-
let messageHash = 'tickers';
|
|
1002
|
-
if (symbols !== undefined) {
|
|
1003
|
-
messageHash = 'tickers::' + symbols.join(',');
|
|
1016
|
+
else if (marketType === 'spot') {
|
|
1017
|
+
rawMarketType = marketType;
|
|
1004
1018
|
}
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1019
|
+
else {
|
|
1020
|
+
throw new NotSupported(this.id + ' ' + methodName + '() does not support options markets');
|
|
1021
|
+
}
|
|
1022
|
+
const isBidAsk = (channelName === 'bookTicker');
|
|
1023
|
+
const subscriptionArgs = [];
|
|
1024
|
+
const messageHashes = [];
|
|
1025
|
+
if (symbolsDefined) {
|
|
1026
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
1027
|
+
const symbol = symbols[i];
|
|
1028
|
+
const market = this.market(symbol);
|
|
1029
|
+
subscriptionArgs.push(market['lowercaseId'] + '@' + channelName);
|
|
1030
|
+
messageHashes.push(this.getMessageHash(channelName, market['symbol'], isBidAsk));
|
|
1012
1031
|
}
|
|
1013
1032
|
}
|
|
1014
1033
|
else {
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1034
|
+
if (isBidAsk) {
|
|
1035
|
+
if (marketType === 'spot') {
|
|
1036
|
+
throw new ArgumentsRequired(this.id + ' ' + methodName + '() requires symbols for this channel for spot markets');
|
|
1037
|
+
}
|
|
1038
|
+
subscriptionArgs.push('!' + channelName);
|
|
1039
|
+
}
|
|
1040
|
+
else {
|
|
1041
|
+
subscriptionArgs.push('!' + channelName + '@arr');
|
|
1042
|
+
}
|
|
1043
|
+
messageHashes.push(this.getMessageHash(channelName, undefined, isBidAsk));
|
|
1018
1044
|
}
|
|
1019
|
-
|
|
1045
|
+
let streamHash = channelName;
|
|
1046
|
+
if (symbolsDefined) {
|
|
1047
|
+
streamHash = channelName + '::' + symbols.join(',');
|
|
1048
|
+
}
|
|
1049
|
+
const url = this.urls['api']['ws'][rawMarketType] + '/' + this.stream(rawMarketType, streamHash);
|
|
1020
1050
|
const requestId = this.requestId(url);
|
|
1021
1051
|
const request = {
|
|
1022
1052
|
'method': 'SUBSCRIBE',
|
|
1023
|
-
'params':
|
|
1053
|
+
'params': subscriptionArgs,
|
|
1024
1054
|
'id': requestId,
|
|
1025
1055
|
};
|
|
1026
1056
|
const subscribe = {
|
|
1027
1057
|
'id': requestId,
|
|
1028
1058
|
};
|
|
1029
|
-
const
|
|
1030
|
-
if
|
|
1031
|
-
|
|
1059
|
+
const result = await this.watchMultiple(url, messageHashes, this.deepExtend(request, params), subscriptionArgs, subscribe);
|
|
1060
|
+
// for efficiency, we have two type of returned structure here - if symbols array was provided, then individual
|
|
1061
|
+
// ticker dict comes in, otherwise all-tickers dict comes in
|
|
1062
|
+
if (!symbolsDefined) {
|
|
1063
|
+
return result;
|
|
1064
|
+
}
|
|
1065
|
+
else {
|
|
1066
|
+
const newDict = {};
|
|
1067
|
+
newDict[result['symbol']] = result;
|
|
1068
|
+
return newDict;
|
|
1032
1069
|
}
|
|
1033
|
-
return this.filterByArray(this.tickers, 'symbol', symbols);
|
|
1034
1070
|
}
|
|
1035
1071
|
parseWsTicker(message, marketType) {
|
|
1036
1072
|
//
|
|
@@ -1114,11 +1150,24 @@ export default class binance extends binanceRest {
|
|
|
1114
1150
|
'info': message,
|
|
1115
1151
|
}, market);
|
|
1116
1152
|
}
|
|
1117
|
-
|
|
1153
|
+
handleBidsAsks(client, message) {
|
|
1154
|
+
//
|
|
1155
|
+
// arrives one symbol dict or array of symbol dicts
|
|
1156
|
+
//
|
|
1157
|
+
// {
|
|
1158
|
+
// "u": 7488717758,
|
|
1159
|
+
// "s": "BTCUSDT",
|
|
1160
|
+
// "b": "28621.74000000",
|
|
1161
|
+
// "B": "1.43278800",
|
|
1162
|
+
// "a": "28621.75000000",
|
|
1163
|
+
// "A": "2.52500800"
|
|
1164
|
+
// }
|
|
1165
|
+
//
|
|
1166
|
+
this.handleTickersAndBidsAsks(client, message, 'bidasks');
|
|
1167
|
+
}
|
|
1168
|
+
handleTickers(client, message) {
|
|
1118
1169
|
//
|
|
1119
|
-
//
|
|
1120
|
-
// These are NOT the statistics of the UTC day, but a 24hr rolling window for the previous 24hrs
|
|
1121
|
-
// Update Speed 1000ms
|
|
1170
|
+
// arrives one symbol dict or array of symbol dicts
|
|
1122
1171
|
//
|
|
1123
1172
|
// {
|
|
1124
1173
|
// "e": "24hrTicker", // event type
|
|
@@ -1146,39 +1195,14 @@ export default class binance extends binanceRest {
|
|
|
1146
1195
|
// "n": 163222, // total number of trades
|
|
1147
1196
|
// }
|
|
1148
1197
|
//
|
|
1149
|
-
|
|
1150
|
-
if (event === '24hrTicker') {
|
|
1151
|
-
event = 'ticker';
|
|
1152
|
-
}
|
|
1153
|
-
else if (event === '24hrMiniTicker') {
|
|
1154
|
-
event = 'miniTicker';
|
|
1155
|
-
}
|
|
1156
|
-
const wsMarketId = this.safeStringLower(message, 's');
|
|
1157
|
-
const messageHash = wsMarketId + '@' + event;
|
|
1158
|
-
const isSpot = ((client.url.indexOf('/stream') > -1) || (client.url.indexOf('/testnet.binance') > -1));
|
|
1159
|
-
const marketType = (isSpot) ? 'spot' : 'contract';
|
|
1160
|
-
const result = this.parseWsTicker(message, marketType);
|
|
1161
|
-
const symbol = result['symbol'];
|
|
1162
|
-
this.tickers[symbol] = result;
|
|
1163
|
-
client.resolve(result, messageHash);
|
|
1164
|
-
if (event === 'bookTicker') {
|
|
1165
|
-
// watch bookTickers
|
|
1166
|
-
client.resolve(result, '!' + 'bookTicker@arr');
|
|
1167
|
-
const messageHashes = this.findMessageHashes(client, 'tickers::');
|
|
1168
|
-
for (let i = 0; i < messageHashes.length; i++) {
|
|
1169
|
-
const currentMessageHash = messageHashes[i];
|
|
1170
|
-
const parts = currentMessageHash.split('::');
|
|
1171
|
-
const symbolsString = parts[1];
|
|
1172
|
-
const symbols = symbolsString.split(',');
|
|
1173
|
-
if (this.inArray(symbol, symbols)) {
|
|
1174
|
-
client.resolve(result, currentMessageHash);
|
|
1175
|
-
}
|
|
1176
|
-
}
|
|
1177
|
-
}
|
|
1198
|
+
this.handleTickersAndBidsAsks(client, message, 'tickers');
|
|
1178
1199
|
}
|
|
1179
|
-
|
|
1200
|
+
handleTickersAndBidsAsks(client, message, methodType) {
|
|
1180
1201
|
const isSpot = ((client.url.indexOf('/stream') > -1) || (client.url.indexOf('/testnet.binance') > -1));
|
|
1181
1202
|
const marketType = (isSpot) ? 'spot' : 'contract';
|
|
1203
|
+
const isBidAsk = (methodType === 'bidasks');
|
|
1204
|
+
let channelName = undefined;
|
|
1205
|
+
const resolvedMessageHashes = [];
|
|
1182
1206
|
let rawTickers = [];
|
|
1183
1207
|
const newTickers = {};
|
|
1184
1208
|
if (Array.isArray(message)) {
|
|
@@ -1189,25 +1213,42 @@ export default class binance extends binanceRest {
|
|
|
1189
1213
|
}
|
|
1190
1214
|
for (let i = 0; i < rawTickers.length; i++) {
|
|
1191
1215
|
const ticker = rawTickers[i];
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
const
|
|
1201
|
-
const
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1216
|
+
let event = this.safeString(ticker, 'e');
|
|
1217
|
+
if (isBidAsk) {
|
|
1218
|
+
event = 'bookTicker'; // as noted in `handleMessage`, bookTicker doesn't have identifier, so manually set here
|
|
1219
|
+
}
|
|
1220
|
+
channelName = this.safeString(this.options['tickerChannelsMap'], event, event);
|
|
1221
|
+
if (channelName === undefined) {
|
|
1222
|
+
continue;
|
|
1223
|
+
}
|
|
1224
|
+
const parsedTicker = this.parseWsTicker(ticker, marketType);
|
|
1225
|
+
const symbol = parsedTicker['symbol'];
|
|
1226
|
+
newTickers[symbol] = parsedTicker;
|
|
1227
|
+
if (isBidAsk) {
|
|
1228
|
+
this.bidsasks[symbol] = parsedTicker;
|
|
1229
|
+
}
|
|
1230
|
+
else {
|
|
1231
|
+
this.tickers[symbol] = parsedTicker;
|
|
1208
1232
|
}
|
|
1233
|
+
const messageHash = this.getMessageHash(channelName, symbol, isBidAsk);
|
|
1234
|
+
resolvedMessageHashes.push(messageHash);
|
|
1235
|
+
client.resolve(parsedTicker, messageHash);
|
|
1236
|
+
}
|
|
1237
|
+
// resolve batch endpoint
|
|
1238
|
+
const length = resolvedMessageHashes.length;
|
|
1239
|
+
if (length > 0) {
|
|
1240
|
+
const batchMessageHash = this.getMessageHash(channelName, undefined, isBidAsk);
|
|
1241
|
+
client.resolve(newTickers, batchMessageHash);
|
|
1242
|
+
}
|
|
1243
|
+
}
|
|
1244
|
+
getMessageHash(channelName, symbol, isBidAsk) {
|
|
1245
|
+
const prefix = isBidAsk ? 'bidask' : 'ticker';
|
|
1246
|
+
if (symbol !== undefined) {
|
|
1247
|
+
return prefix + ':' + channelName + '@' + symbol;
|
|
1248
|
+
}
|
|
1249
|
+
else {
|
|
1250
|
+
return prefix + 's' + ':' + channelName;
|
|
1209
1251
|
}
|
|
1210
|
-
client.resolve(newTickers, 'tickers');
|
|
1211
1252
|
}
|
|
1212
1253
|
signParams(params = {}) {
|
|
1213
1254
|
this.checkRequiredCredentials();
|
|
@@ -3012,11 +3053,17 @@ export default class binance extends binanceRest {
|
|
|
3012
3053
|
'kline': this.handleOHLCV,
|
|
3013
3054
|
'markPrice_kline': this.handleOHLCV,
|
|
3014
3055
|
'indexPrice_kline': this.handleOHLCV,
|
|
3056
|
+
'1hTicker@arr': this.handleTickers,
|
|
3057
|
+
'4hTicker@arr': this.handleTickers,
|
|
3058
|
+
'1dTicker@arr': this.handleTickers,
|
|
3015
3059
|
'24hrTicker@arr': this.handleTickers,
|
|
3016
3060
|
'24hrMiniTicker@arr': this.handleTickers,
|
|
3017
|
-
'
|
|
3018
|
-
'
|
|
3019
|
-
'
|
|
3061
|
+
'1hTicker': this.handleTickers,
|
|
3062
|
+
'4hTicker': this.handleTickers,
|
|
3063
|
+
'1dTicker': this.handleTickers,
|
|
3064
|
+
'24hrTicker': this.handleTickers,
|
|
3065
|
+
'24hrMiniTicker': this.handleTickers,
|
|
3066
|
+
'bookTicker': this.handleBidsAsks,
|
|
3020
3067
|
'outboundAccountPosition': this.handleBalance,
|
|
3021
3068
|
'balanceUpdate': this.handleBalance,
|
|
3022
3069
|
'ACCOUNT_UPDATE': this.handleAcountUpdate,
|
|
@@ -3046,9 +3093,8 @@ export default class binance extends binanceRest {
|
|
|
3046
3093
|
// "A": "2.52500800"
|
|
3047
3094
|
// }
|
|
3048
3095
|
//
|
|
3049
|
-
if (event === undefined) {
|
|
3050
|
-
this.
|
|
3051
|
-
this.handleTickers(client, message);
|
|
3096
|
+
if (event === undefined && ('a' in message) && ('b' in message)) {
|
|
3097
|
+
this.handleBidsAsks(client, message);
|
|
3052
3098
|
}
|
|
3053
3099
|
}
|
|
3054
3100
|
else {
|
package/js/src/pro/bitget.js
CHANGED
package/js/src/pro/kucoin.js
CHANGED
|
@@ -890,18 +890,17 @@ export default class kucoin extends kucoinRest {
|
|
|
890
890
|
return this.filterBySymbolSinceLimit(trades, symbol, since, limit, true);
|
|
891
891
|
}
|
|
892
892
|
handleMyTrade(client, message) {
|
|
893
|
-
|
|
894
|
-
if (trades === undefined) {
|
|
893
|
+
if (this.myTrades === undefined) {
|
|
895
894
|
const limit = this.safeInteger(this.options, 'tradesLimit', 1000);
|
|
896
|
-
|
|
895
|
+
this.myTrades = new ArrayCacheBySymbolById(limit);
|
|
897
896
|
}
|
|
898
|
-
const data = this.
|
|
897
|
+
const data = this.safeDict(message, 'data');
|
|
899
898
|
const parsed = this.parseWsTrade(data);
|
|
900
|
-
|
|
899
|
+
this.myTrades.append(parsed);
|
|
901
900
|
const messageHash = 'myTrades';
|
|
902
|
-
client.resolve(
|
|
901
|
+
client.resolve(this.myTrades, messageHash);
|
|
903
902
|
const symbolSpecificMessageHash = messageHash + ':' + parsed['symbol'];
|
|
904
|
-
client.resolve(
|
|
903
|
+
client.resolve(this.myTrades, symbolSpecificMessageHash);
|
|
905
904
|
}
|
|
906
905
|
parseWsTrade(trade, market = undefined) {
|
|
907
906
|
//
|
package/js/src/pro/okx.js
CHANGED
|
@@ -490,14 +490,31 @@ export default class okx extends okxRest {
|
|
|
490
490
|
* @name okx#watchOrderBookForSymbols
|
|
491
491
|
* @description watches information on open orders with bid (buy) and ask (sell) prices, volumes and other data
|
|
492
492
|
* @param {string[]} symbols unified array of symbols
|
|
493
|
-
* @param {int} [limit] the maximum amount of order book entries to return
|
|
493
|
+
* @param {int} [limit] 1,5, 400, 50 (l2-tbt, vip4+) or 40000 (vip5+) the maximum amount of order book entries to return
|
|
494
494
|
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
495
495
|
* @returns {object} A dictionary of [order book structures]{@link https://docs.ccxt.com/#/?id=order-book-structure} indexed by market symbols
|
|
496
496
|
*/
|
|
497
497
|
await this.loadMarkets();
|
|
498
498
|
symbols = this.marketSymbols(symbols);
|
|
499
499
|
const options = this.safeValue(this.options, 'watchOrderBook', {});
|
|
500
|
-
|
|
500
|
+
let depth = this.safeString(options, 'depth', 'books');
|
|
501
|
+
if (limit !== undefined) {
|
|
502
|
+
if (limit === 1) {
|
|
503
|
+
depth = 'bbo-tbt';
|
|
504
|
+
}
|
|
505
|
+
else if (limit > 1 && limit <= 5) {
|
|
506
|
+
depth = 'books5';
|
|
507
|
+
}
|
|
508
|
+
else if (limit === 400) {
|
|
509
|
+
depth = 'books';
|
|
510
|
+
}
|
|
511
|
+
else if (limit === 50) {
|
|
512
|
+
depth = 'books50-l2-tbt'; // Make sure you have VIP4 and above
|
|
513
|
+
}
|
|
514
|
+
else if (limit === 4000) {
|
|
515
|
+
depth = 'books-l2-tbt'; // Make sure you have VIP5 and above
|
|
516
|
+
}
|
|
517
|
+
}
|
|
501
518
|
if ((depth === 'books-l2-tbt') || (depth === 'books50-l2-tbt')) {
|
|
502
519
|
await this.authenticate({ 'access': 'public' });
|
|
503
520
|
}
|
package/js/src/probit.js
CHANGED
|
@@ -624,7 +624,7 @@ export default class probit extends Exchange {
|
|
|
624
624
|
// ]
|
|
625
625
|
// }
|
|
626
626
|
//
|
|
627
|
-
const data = this.
|
|
627
|
+
const data = this.safeList(response, 'data', []);
|
|
628
628
|
return this.parseTickers(data, symbols);
|
|
629
629
|
}
|
|
630
630
|
async fetchTicker(symbol, params = {}) {
|
|
@@ -760,7 +760,7 @@ export default class probit extends Exchange {
|
|
|
760
760
|
// ]
|
|
761
761
|
// }
|
|
762
762
|
//
|
|
763
|
-
const data = this.
|
|
763
|
+
const data = this.safeList(response, 'data', []);
|
|
764
764
|
return this.parseTrades(data, market, since, limit);
|
|
765
765
|
}
|
|
766
766
|
async fetchTrades(symbol, since = undefined, limit = undefined, params = {}) {
|
|
@@ -814,7 +814,7 @@ export default class probit extends Exchange {
|
|
|
814
814
|
// ]
|
|
815
815
|
// }
|
|
816
816
|
//
|
|
817
|
-
const data = this.
|
|
817
|
+
const data = this.safeList(response, 'data', []);
|
|
818
818
|
return this.parseTrades(data, market, since, limit);
|
|
819
819
|
}
|
|
820
820
|
parseTrade(trade, market = undefined) {
|
|
@@ -1002,7 +1002,7 @@ export default class probit extends Exchange {
|
|
|
1002
1002
|
// ]
|
|
1003
1003
|
// }
|
|
1004
1004
|
//
|
|
1005
|
-
const data = this.
|
|
1005
|
+
const data = this.safeList(response, 'data', []);
|
|
1006
1006
|
return this.parseOHLCVs(data, market, timeframe, since, limit);
|
|
1007
1007
|
}
|
|
1008
1008
|
parseOHLCV(ohlcv, market = undefined) {
|
|
@@ -1049,7 +1049,7 @@ export default class probit extends Exchange {
|
|
|
1049
1049
|
request['market_id'] = market['id'];
|
|
1050
1050
|
}
|
|
1051
1051
|
const response = await this.privateGetOpenOrder(this.extend(request, params));
|
|
1052
|
-
const data = this.
|
|
1052
|
+
const data = this.safeList(response, 'data');
|
|
1053
1053
|
return this.parseOrders(data, market, since, limit);
|
|
1054
1054
|
}
|
|
1055
1055
|
async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
@@ -1082,7 +1082,7 @@ export default class probit extends Exchange {
|
|
|
1082
1082
|
request['limit'] = limit;
|
|
1083
1083
|
}
|
|
1084
1084
|
const response = await this.privateGetOrderHistory(this.extend(request, params));
|
|
1085
|
-
const data = this.
|
|
1085
|
+
const data = this.safeList(response, 'data');
|
|
1086
1086
|
return this.parseOrders(data, market, since, limit);
|
|
1087
1087
|
}
|
|
1088
1088
|
async fetchOrder(id, symbol = undefined, params = {}) {
|
|
@@ -1113,7 +1113,7 @@ export default class probit extends Exchange {
|
|
|
1113
1113
|
const query = this.omit(params, ['clientOrderId', 'client_order_id']);
|
|
1114
1114
|
const response = await this.privateGetOrder(this.extend(request, query));
|
|
1115
1115
|
const data = this.safeValue(response, 'data', []);
|
|
1116
|
-
const order = this.
|
|
1116
|
+
const order = this.safeDict(data, 0);
|
|
1117
1117
|
return this.parseOrder(order, market);
|
|
1118
1118
|
}
|
|
1119
1119
|
parseOrderStatus(status) {
|
|
@@ -1312,7 +1312,7 @@ export default class probit extends Exchange {
|
|
|
1312
1312
|
'order_id': id,
|
|
1313
1313
|
};
|
|
1314
1314
|
const response = await this.privatePostCancelOrder(this.extend(request, params));
|
|
1315
|
-
const data = this.
|
|
1315
|
+
const data = this.safeDict(response, 'data');
|
|
1316
1316
|
return this.parseOrder(data);
|
|
1317
1317
|
}
|
|
1318
1318
|
parseDepositAddress(depositAddress, currency = undefined) {
|
|
@@ -1406,7 +1406,7 @@ export default class probit extends Exchange {
|
|
|
1406
1406
|
request['currency_id'] = codes.join(',');
|
|
1407
1407
|
}
|
|
1408
1408
|
const response = await this.privateGetDepositAddress(this.extend(request, params));
|
|
1409
|
-
const data = this.
|
|
1409
|
+
const data = this.safeList(response, 'data', []);
|
|
1410
1410
|
return this.parseDepositAddresses(data, codes);
|
|
1411
1411
|
}
|
|
1412
1412
|
async withdraw(code, amount, address, tag = undefined, params = {}) {
|
|
@@ -1453,7 +1453,7 @@ export default class probit extends Exchange {
|
|
|
1453
1453
|
params = this.omit(params, 'network');
|
|
1454
1454
|
}
|
|
1455
1455
|
const response = await this.privatePostWithdrawal(this.extend(request, params));
|
|
1456
|
-
const data = this.
|
|
1456
|
+
const data = this.safeDict(response, 'data');
|
|
1457
1457
|
return this.parseTransaction(data, currency);
|
|
1458
1458
|
}
|
|
1459
1459
|
async fetchDeposits(code = undefined, since = undefined, limit = undefined, params = {}) {
|
|
@@ -1703,7 +1703,7 @@ export default class probit extends Exchange {
|
|
|
1703
1703
|
// ]
|
|
1704
1704
|
// }
|
|
1705
1705
|
//
|
|
1706
|
-
const data = this.
|
|
1706
|
+
const data = this.safeList(response, 'data');
|
|
1707
1707
|
return this.parseDepositWithdrawFees(data, codes, 'id');
|
|
1708
1708
|
}
|
|
1709
1709
|
parseDepositWithdrawFee(fee, currency = undefined) {
|
package/js/src/timex.js
CHANGED
|
@@ -549,7 +549,7 @@ export default class timex extends Exchange {
|
|
|
549
549
|
// }
|
|
550
550
|
// ]
|
|
551
551
|
//
|
|
552
|
-
const ticker = this.
|
|
552
|
+
const ticker = this.safeDict(response, 0);
|
|
553
553
|
return this.parseTicker(ticker, market);
|
|
554
554
|
}
|
|
555
555
|
async fetchOrderBook(symbol, limit = undefined, params = {}) {
|
|
@@ -810,7 +810,7 @@ export default class timex extends Exchange {
|
|
|
810
810
|
// }
|
|
811
811
|
//
|
|
812
812
|
const orders = this.safeValue(response, 'orders', []);
|
|
813
|
-
const order = this.
|
|
813
|
+
const order = this.safeDict(orders, 0, {});
|
|
814
814
|
return this.parseOrder(order, market);
|
|
815
815
|
}
|
|
816
816
|
async editOrder(id, symbol, type, side, amount = undefined, price = undefined, params = {}) {
|
|
@@ -861,7 +861,7 @@ export default class timex extends Exchange {
|
|
|
861
861
|
}
|
|
862
862
|
const orders = this.safeValue(response, 'changedOrders', []);
|
|
863
863
|
const firstOrder = this.safeValue(orders, 0, {});
|
|
864
|
-
const order = this.
|
|
864
|
+
const order = this.safeDict(firstOrder, 'newOrder', {});
|
|
865
865
|
return this.parseOrder(order, market);
|
|
866
866
|
}
|
|
867
867
|
async cancelOrder(id, symbol = undefined, params = {}) {
|
|
@@ -969,7 +969,7 @@ export default class timex extends Exchange {
|
|
|
969
969
|
// }
|
|
970
970
|
//
|
|
971
971
|
const order = this.safeValue(response, 'order', {});
|
|
972
|
-
const trades = this.
|
|
972
|
+
const trades = this.safeList(response, 'trades', []);
|
|
973
973
|
return this.parseOrder(this.extend(order, { 'trades': trades }));
|
|
974
974
|
}
|
|
975
975
|
async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
@@ -1024,7 +1024,7 @@ export default class timex extends Exchange {
|
|
|
1024
1024
|
// ]
|
|
1025
1025
|
// }
|
|
1026
1026
|
//
|
|
1027
|
-
const orders = this.
|
|
1027
|
+
const orders = this.safeList(response, 'orders', []);
|
|
1028
1028
|
return this.parseOrders(orders, market, since, limit);
|
|
1029
1029
|
}
|
|
1030
1030
|
async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
@@ -1084,7 +1084,7 @@ export default class timex extends Exchange {
|
|
|
1084
1084
|
// ]
|
|
1085
1085
|
// }
|
|
1086
1086
|
//
|
|
1087
|
-
const orders = this.
|
|
1087
|
+
const orders = this.safeList(response, 'orders', []);
|
|
1088
1088
|
return this.parseOrders(orders, market, since, limit);
|
|
1089
1089
|
}
|
|
1090
1090
|
async fetchMyTrades(symbol = undefined, since = undefined, limit = undefined, params = {}) {
|
|
@@ -1147,7 +1147,7 @@ export default class timex extends Exchange {
|
|
|
1147
1147
|
// ]
|
|
1148
1148
|
// }
|
|
1149
1149
|
//
|
|
1150
|
-
const trades = this.
|
|
1150
|
+
const trades = this.safeList(response, 'trades', []);
|
|
1151
1151
|
return this.parseTrades(trades, market, since, limit);
|
|
1152
1152
|
}
|
|
1153
1153
|
parseTradingFee(fee, market = undefined) {
|