ccxt 4.4.2 → 4.4.4
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 +4 -4
- package/dist/ccxt.browser.min.js +3 -3
- package/dist/cjs/ccxt.js +1 -1
- package/dist/cjs/src/base/Exchange.js +2 -2
- package/dist/cjs/src/base/functions/misc.js +11 -0
- package/dist/cjs/src/base/functions.js +1 -0
- package/dist/cjs/src/base/ws/WsClient.js +2 -1
- package/dist/cjs/src/binance.js +49 -22
- package/dist/cjs/src/bingx.js +1 -0
- package/dist/cjs/src/bitfinex2.js +7 -6
- package/dist/cjs/src/bitget.js +10 -6
- package/dist/cjs/src/bitmart.js +3 -1
- package/dist/cjs/src/bitmex.js +11 -10
- package/dist/cjs/src/bitso.js +5 -4
- package/dist/cjs/src/bitstamp.js +33 -45
- package/dist/cjs/src/blofin.js +21 -23
- package/dist/cjs/src/bybit.js +22 -20
- package/dist/cjs/src/coinbase.js +28 -7
- package/dist/cjs/src/coinbaseexchange.js +11 -11
- package/dist/cjs/src/coinlist.js +6 -5
- package/dist/cjs/src/coinmetro.js +3 -3
- package/dist/cjs/src/cryptocom.js +9 -6
- package/dist/cjs/src/currencycom.js +6 -6
- package/dist/cjs/src/delta.js +5 -5
- package/dist/cjs/src/digifinex.js +8 -6
- package/dist/cjs/src/gate.js +6 -5
- package/dist/cjs/src/hashkey.js +9 -7
- package/dist/cjs/src/htx.js +13 -16
- package/dist/cjs/src/hyperliquid.js +67 -114
- package/dist/cjs/src/kraken.js +8 -6
- package/dist/cjs/src/kucoin.js +9 -8
- package/dist/cjs/src/luno.js +10 -9
- package/dist/cjs/src/mexc.js +54 -2
- package/dist/cjs/src/ndax.js +6 -5
- package/dist/cjs/src/okcoin.js +18 -27
- package/dist/cjs/src/okx.js +18 -26
- package/dist/cjs/src/p2b.js +2 -2
- package/dist/cjs/src/pro/bybit.js +56 -0
- package/dist/cjs/src/pro/cryptocom.js +191 -21
- package/dist/cjs/src/pro/mexc.js +165 -3
- package/dist/cjs/src/pro/okx.js +6 -3
- package/dist/cjs/src/pro/oxfun.js +75 -0
- package/dist/cjs/src/pro/phemex.js +45 -1
- package/dist/cjs/src/pro/woofipro.js +67 -0
- package/dist/cjs/src/woo.js +7 -6
- package/dist/cjs/src/woofipro.js +8 -6
- package/dist/cjs/src/xt.js +10 -4
- package/dist/cjs/src/zonda.js +6 -5
- package/js/ccxt.d.ts +1 -1
- package/js/ccxt.js +1 -1
- package/js/src/abstract/bitmart.d.ts +1 -0
- package/js/src/base/Exchange.d.ts +2 -2
- package/js/src/base/Exchange.js +2 -2
- package/js/src/base/functions/misc.d.ts +2 -1
- package/js/src/base/functions/misc.js +11 -1
- package/js/src/base/types.d.ts +1 -1
- package/js/src/base/ws/WsClient.js +2 -2
- package/js/src/binance.d.ts +4 -20
- package/js/src/binance.js +49 -22
- package/js/src/bingx.js +1 -0
- package/js/src/bitfinex2.d.ts +3 -19
- package/js/src/bitfinex2.js +7 -6
- package/js/src/bitget.d.ts +3 -19
- package/js/src/bitget.js +10 -6
- package/js/src/bitmart.js +3 -1
- package/js/src/bitmex.d.ts +3 -22
- package/js/src/bitmex.js +11 -10
- package/js/src/bitso.d.ts +3 -19
- package/js/src/bitso.js +5 -4
- package/js/src/bitstamp.d.ts +3 -35
- package/js/src/bitstamp.js +33 -45
- package/js/src/blofin.d.ts +3 -15
- package/js/src/blofin.js +21 -23
- package/js/src/bybit.d.ts +3 -19
- package/js/src/bybit.js +23 -21
- package/js/src/coinbase.d.ts +3 -19
- package/js/src/coinbase.js +28 -7
- package/js/src/coinbaseexchange.d.ts +3 -19
- package/js/src/coinbaseexchange.js +11 -11
- package/js/src/coinlist.d.ts +3 -19
- package/js/src/coinlist.js +6 -5
- package/js/src/coinmetro.d.ts +3 -19
- package/js/src/coinmetro.js +3 -3
- package/js/src/cryptocom.d.ts +3 -22
- package/js/src/cryptocom.js +9 -6
- package/js/src/currencycom.d.ts +3 -3
- package/js/src/currencycom.js +6 -6
- package/js/src/delta.d.ts +3 -19
- package/js/src/delta.js +5 -5
- package/js/src/digifinex.d.ts +3 -19
- package/js/src/digifinex.js +8 -6
- package/js/src/gate.d.ts +3 -19
- package/js/src/gate.js +6 -5
- package/js/src/hashkey.d.ts +3 -20
- package/js/src/hashkey.js +9 -7
- package/js/src/htx.d.ts +3 -19
- package/js/src/htx.js +13 -16
- package/js/src/hyperliquid.d.ts +3 -19
- package/js/src/hyperliquid.js +68 -115
- package/js/src/kraken.d.ts +5 -24
- package/js/src/kraken.js +8 -6
- package/js/src/kucoin.d.ts +3 -19
- package/js/src/kucoin.js +9 -8
- package/js/src/luno.d.ts +4 -20
- package/js/src/luno.js +10 -9
- package/js/src/mexc.js +54 -2
- package/js/src/ndax.d.ts +3 -19
- package/js/src/ndax.js +6 -5
- package/js/src/okcoin.d.ts +3 -19
- package/js/src/okcoin.js +18 -27
- package/js/src/okx.d.ts +3 -19
- package/js/src/okx.js +18 -26
- package/js/src/p2b.js +2 -2
- package/js/src/pro/bybit.d.ts +2 -0
- package/js/src/pro/bybit.js +56 -0
- package/js/src/pro/cryptocom.d.ts +7 -1
- package/js/src/pro/cryptocom.js +191 -21
- package/js/src/pro/mexc.d.ts +6 -1
- package/js/src/pro/mexc.js +166 -4
- package/js/src/pro/okx.js +6 -3
- package/js/src/pro/oxfun.d.ts +3 -0
- package/js/src/pro/oxfun.js +75 -0
- package/js/src/pro/phemex.d.ts +2 -1
- package/js/src/pro/phemex.js +45 -1
- package/js/src/pro/woofipro.d.ts +3 -0
- package/js/src/pro/woofipro.js +67 -0
- package/js/src/static_dependencies/jsencrypt/lib/jsbn/jsbn.d.ts +1 -1
- package/js/src/static_dependencies/starknet/utils/calldata/parser/index.d.ts +1 -1
- package/js/src/woo.d.ts +3 -19
- package/js/src/woo.js +7 -6
- package/js/src/woofipro.d.ts +3 -19
- package/js/src/woofipro.js +8 -6
- package/js/src/xt.d.ts +3 -22
- package/js/src/xt.js +10 -4
- package/js/src/zonda.d.ts +3 -19
- package/js/src/zonda.js +6 -5
- package/package.json +1 -1
package/js/src/pro/cryptocom.js
CHANGED
|
@@ -17,7 +17,8 @@ export default class cryptocom extends cryptocomRest {
|
|
|
17
17
|
'ws': true,
|
|
18
18
|
'watchBalance': true,
|
|
19
19
|
'watchTicker': true,
|
|
20
|
-
'watchTickers':
|
|
20
|
+
'watchTickers': true,
|
|
21
|
+
'watchBidsAsks': true,
|
|
21
22
|
'watchMyTrades': true,
|
|
22
23
|
'watchTrades': true,
|
|
23
24
|
'watchTradesForSymbols': true,
|
|
@@ -480,41 +481,210 @@ export default class cryptocom extends cryptocomRest {
|
|
|
480
481
|
const messageHash = 'unsubscribe:ticker:' + market['symbol'];
|
|
481
482
|
return await this.unWatchPublicMultiple('ticker', [market['symbol']], [messageHash], [subMessageHash], [subMessageHash], params);
|
|
482
483
|
}
|
|
484
|
+
async watchTickers(symbols = undefined, params = {}) {
|
|
485
|
+
/**
|
|
486
|
+
* @method
|
|
487
|
+
* @name cryptocom#watchTickers
|
|
488
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
|
489
|
+
* @see https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
|
|
490
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
491
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
492
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
493
|
+
*/
|
|
494
|
+
await this.loadMarkets();
|
|
495
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
496
|
+
const messageHashes = [];
|
|
497
|
+
const marketIds = this.marketIds(symbols);
|
|
498
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
499
|
+
const marketId = marketIds[i];
|
|
500
|
+
messageHashes.push('ticker.' + marketId);
|
|
501
|
+
}
|
|
502
|
+
const url = this.urls['api']['ws']['public'];
|
|
503
|
+
const id = this.nonce();
|
|
504
|
+
const request = {
|
|
505
|
+
'method': 'subscribe',
|
|
506
|
+
'params': {
|
|
507
|
+
'channels': messageHashes,
|
|
508
|
+
},
|
|
509
|
+
'nonce': id,
|
|
510
|
+
};
|
|
511
|
+
const ticker = await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes);
|
|
512
|
+
if (this.newUpdates) {
|
|
513
|
+
const result = {};
|
|
514
|
+
result[ticker['symbol']] = ticker;
|
|
515
|
+
return result;
|
|
516
|
+
}
|
|
517
|
+
return this.filterByArray(this.tickers, 'symbol', symbols);
|
|
518
|
+
}
|
|
519
|
+
async unWatchTickers(symbols = undefined, params = {}) {
|
|
520
|
+
/**
|
|
521
|
+
* @method
|
|
522
|
+
* @name cryptocom#unWatchTickers
|
|
523
|
+
* @description unWatches a price ticker
|
|
524
|
+
* @see https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
|
|
525
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
526
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
527
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
528
|
+
*/
|
|
529
|
+
await this.loadMarkets();
|
|
530
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
531
|
+
const messageHashes = [];
|
|
532
|
+
const subMessageHashes = [];
|
|
533
|
+
const marketIds = this.marketIds(symbols);
|
|
534
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
535
|
+
const marketId = marketIds[i];
|
|
536
|
+
const symbol = symbols[i];
|
|
537
|
+
subMessageHashes.push('ticker.' + marketId);
|
|
538
|
+
messageHashes.push('unsubscribe:ticker:' + symbol);
|
|
539
|
+
}
|
|
540
|
+
return await this.unWatchPublicMultiple('ticker', symbols, messageHashes, subMessageHashes, subMessageHashes, params);
|
|
541
|
+
}
|
|
483
542
|
handleTicker(client, message) {
|
|
484
543
|
//
|
|
485
|
-
//
|
|
486
|
-
//
|
|
487
|
-
//
|
|
488
|
-
//
|
|
489
|
-
//
|
|
490
|
-
//
|
|
491
|
-
//
|
|
492
|
-
//
|
|
493
|
-
//
|
|
494
|
-
//
|
|
495
|
-
//
|
|
496
|
-
//
|
|
497
|
-
//
|
|
498
|
-
//
|
|
499
|
-
//
|
|
500
|
-
//
|
|
501
|
-
//
|
|
502
|
-
//
|
|
544
|
+
// {
|
|
545
|
+
// "instrument_name": "ETHUSD-PERP",
|
|
546
|
+
// "subscription": "ticker.ETHUSD-PERP",
|
|
547
|
+
// "channel": "ticker",
|
|
548
|
+
// "data": [
|
|
549
|
+
// {
|
|
550
|
+
// "h": "2400.20",
|
|
551
|
+
// "l": "2277.10",
|
|
552
|
+
// "a": "2335.25",
|
|
553
|
+
// "c": "-0.0022",
|
|
554
|
+
// "b": "2335.10",
|
|
555
|
+
// "bs": "5.4000",
|
|
556
|
+
// "k": "2335.16",
|
|
557
|
+
// "ks": "1.9970",
|
|
558
|
+
// "i": "ETHUSD-PERP",
|
|
559
|
+
// "v": "1305697.6462",
|
|
560
|
+
// "vv": "3058704939.17",
|
|
561
|
+
// "oi": "161646.3614",
|
|
562
|
+
// "t": 1726069647560
|
|
563
|
+
// }
|
|
564
|
+
// ]
|
|
503
565
|
// }
|
|
504
|
-
// }
|
|
505
566
|
//
|
|
567
|
+
this.handleBidAsk(client, message);
|
|
506
568
|
const messageHash = this.safeString(message, 'subscription');
|
|
507
569
|
const marketId = this.safeString(message, 'instrument_name');
|
|
508
570
|
const market = this.safeMarket(marketId);
|
|
509
571
|
const data = this.safeValue(message, 'data', []);
|
|
510
572
|
for (let i = 0; i < data.length; i++) {
|
|
511
573
|
const ticker = data[i];
|
|
512
|
-
const parsed = this.
|
|
574
|
+
const parsed = this.parseWsTicker(ticker, market);
|
|
513
575
|
const symbol = parsed['symbol'];
|
|
514
576
|
this.tickers[symbol] = parsed;
|
|
515
577
|
client.resolve(parsed, messageHash);
|
|
516
578
|
}
|
|
517
579
|
}
|
|
580
|
+
parseWsTicker(ticker, market = undefined) {
|
|
581
|
+
//
|
|
582
|
+
// {
|
|
583
|
+
// "h": "2400.20",
|
|
584
|
+
// "l": "2277.10",
|
|
585
|
+
// "a": "2335.25",
|
|
586
|
+
// "c": "-0.0022",
|
|
587
|
+
// "b": "2335.10",
|
|
588
|
+
// "bs": "5.4000",
|
|
589
|
+
// "k": "2335.16",
|
|
590
|
+
// "ks": "1.9970",
|
|
591
|
+
// "i": "ETHUSD-PERP",
|
|
592
|
+
// "v": "1305697.6462",
|
|
593
|
+
// "vv": "3058704939.17",
|
|
594
|
+
// "oi": "161646.3614",
|
|
595
|
+
// "t": 1726069647560
|
|
596
|
+
// }
|
|
597
|
+
//
|
|
598
|
+
const timestamp = this.safeInteger(ticker, 't');
|
|
599
|
+
const marketId = this.safeString(ticker, 'i');
|
|
600
|
+
market = this.safeMarket(marketId, market, '_');
|
|
601
|
+
const quote = this.safeString(market, 'quote');
|
|
602
|
+
const last = this.safeString(ticker, 'a');
|
|
603
|
+
return this.safeTicker({
|
|
604
|
+
'symbol': market['symbol'],
|
|
605
|
+
'timestamp': timestamp,
|
|
606
|
+
'datetime': this.iso8601(timestamp),
|
|
607
|
+
'high': this.safeNumber(ticker, 'h'),
|
|
608
|
+
'low': this.safeNumber(ticker, 'l'),
|
|
609
|
+
'bid': this.safeNumber(ticker, 'b'),
|
|
610
|
+
'bidVolume': this.safeNumber(ticker, 'bs'),
|
|
611
|
+
'ask': this.safeNumber(ticker, 'k'),
|
|
612
|
+
'askVolume': this.safeNumber(ticker, 'ks'),
|
|
613
|
+
'vwap': undefined,
|
|
614
|
+
'open': undefined,
|
|
615
|
+
'close': last,
|
|
616
|
+
'last': last,
|
|
617
|
+
'previousClose': undefined,
|
|
618
|
+
'change': undefined,
|
|
619
|
+
'percentage': this.safeString(ticker, 'c'),
|
|
620
|
+
'average': undefined,
|
|
621
|
+
'baseVolume': this.safeString(ticker, 'v'),
|
|
622
|
+
'quoteVolume': (quote === 'USD') ? this.safeString(ticker, 'vv') : undefined,
|
|
623
|
+
'info': ticker,
|
|
624
|
+
}, market);
|
|
625
|
+
}
|
|
626
|
+
async watchBidsAsks(symbols = undefined, params = {}) {
|
|
627
|
+
/**
|
|
628
|
+
* @method
|
|
629
|
+
* @name cryptocom#watchBidsAsks
|
|
630
|
+
* @see https://exchange-docs.crypto.com/exchange/v1/rest-ws/index.html#ticker-instrument_name
|
|
631
|
+
* @description watches best bid & ask for symbols
|
|
632
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
633
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
634
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
635
|
+
*/
|
|
636
|
+
await this.loadMarkets();
|
|
637
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
638
|
+
const messageHashes = [];
|
|
639
|
+
const topics = [];
|
|
640
|
+
const marketIds = this.marketIds(symbols);
|
|
641
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
642
|
+
const marketId = marketIds[i];
|
|
643
|
+
messageHashes.push('bidask.' + symbols[i]);
|
|
644
|
+
topics.push('ticker.' + marketId);
|
|
645
|
+
}
|
|
646
|
+
const url = this.urls['api']['ws']['public'];
|
|
647
|
+
const id = this.nonce();
|
|
648
|
+
const request = {
|
|
649
|
+
'method': 'subscribe',
|
|
650
|
+
'params': {
|
|
651
|
+
'channels': topics,
|
|
652
|
+
},
|
|
653
|
+
'nonce': id,
|
|
654
|
+
};
|
|
655
|
+
const newTickers = await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes);
|
|
656
|
+
if (this.newUpdates) {
|
|
657
|
+
const tickers = {};
|
|
658
|
+
tickers[newTickers['symbol']] = newTickers;
|
|
659
|
+
return tickers;
|
|
660
|
+
}
|
|
661
|
+
return this.filterByArray(this.bidsasks, 'symbol', symbols);
|
|
662
|
+
}
|
|
663
|
+
handleBidAsk(client, message) {
|
|
664
|
+
const data = this.safeList(message, 'data', []);
|
|
665
|
+
const ticker = this.safeDict(data, 0, {});
|
|
666
|
+
const parsedTicker = this.parseWsBidAsk(ticker);
|
|
667
|
+
const symbol = parsedTicker['symbol'];
|
|
668
|
+
this.bidsasks[symbol] = parsedTicker;
|
|
669
|
+
const messageHash = 'bidask.' + symbol;
|
|
670
|
+
client.resolve(parsedTicker, messageHash);
|
|
671
|
+
}
|
|
672
|
+
parseWsBidAsk(ticker, market = undefined) {
|
|
673
|
+
const marketId = this.safeString(ticker, 'i');
|
|
674
|
+
market = this.safeMarket(marketId, market);
|
|
675
|
+
const symbol = this.safeString(market, 'symbol');
|
|
676
|
+
const timestamp = this.safeInteger(ticker, 't');
|
|
677
|
+
return this.safeTicker({
|
|
678
|
+
'symbol': symbol,
|
|
679
|
+
'timestamp': timestamp,
|
|
680
|
+
'datetime': this.iso8601(timestamp),
|
|
681
|
+
'ask': this.safeString(ticker, 'k'),
|
|
682
|
+
'askVolume': this.safeString(ticker, 'ks'),
|
|
683
|
+
'bid': this.safeString(ticker, 'b'),
|
|
684
|
+
'bidVolume': this.safeString(ticker, 'bs'),
|
|
685
|
+
'info': ticker,
|
|
686
|
+
}, market);
|
|
687
|
+
}
|
|
518
688
|
async watchOHLCV(symbol, timeframe = '1m', since = undefined, limit = undefined, params = {}) {
|
|
519
689
|
/**
|
|
520
690
|
* @method
|
package/js/src/pro/mexc.d.ts
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
import mexcRest from '../mexc.js';
|
|
2
|
-
import type { Int, OHLCV, Str, OrderBook, Order, Trade, Ticker, Balances } from '../base/types.js';
|
|
2
|
+
import type { Int, OHLCV, Str, OrderBook, Order, Trade, Ticker, Balances, Tickers, Strings } from '../base/types.js';
|
|
3
3
|
import Client from '../base/ws/Client.js';
|
|
4
4
|
export default class mexc extends mexcRest {
|
|
5
5
|
describe(): any;
|
|
6
6
|
watchTicker(symbol: string, params?: {}): Promise<Ticker>;
|
|
7
7
|
handleTicker(client: Client, message: any): void;
|
|
8
|
+
watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
|
|
9
|
+
handleTickers(client: Client, message: any): void;
|
|
8
10
|
parseWsTicker(ticker: any, market?: any): Ticker;
|
|
11
|
+
watchBidsAsks(symbols?: Strings, params?: {}): Promise<Tickers>;
|
|
12
|
+
handleBidAsk(client: Client, message: any): void;
|
|
13
|
+
parseWsBidAsk(ticker: any, market?: any): Ticker;
|
|
9
14
|
watchSpotPublic(channel: any, messageHash: any, params?: {}): Promise<any>;
|
|
10
15
|
watchSpotPrivate(channel: any, messageHash: any, params?: {}): Promise<any>;
|
|
11
16
|
watchSwapPublic(channel: any, messageHash: any, requestParams: any, params?: {}): Promise<any>;
|
package/js/src/pro/mexc.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
// ---------------------------------------------------------------------------
|
|
8
8
|
import mexcRest from '../mexc.js';
|
|
9
|
-
import { AuthenticationError } from '../base/errors.js';
|
|
9
|
+
import { ArgumentsRequired, AuthenticationError, NotSupported } from '../base/errors.js';
|
|
10
10
|
import { ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp } from '../base/ws/Cache.js';
|
|
11
11
|
import { sha256 } from '../static_dependencies/noble-hashes/sha256.js';
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
@@ -30,7 +30,8 @@ export default class mexc extends mexcRest {
|
|
|
30
30
|
'watchOrderBook': true,
|
|
31
31
|
'watchOrders': true,
|
|
32
32
|
'watchTicker': true,
|
|
33
|
-
'watchTickers':
|
|
33
|
+
'watchTickers': true,
|
|
34
|
+
'watchBidsAsks': true,
|
|
34
35
|
'watchTrades': true,
|
|
35
36
|
'watchTradesForSymbols': false,
|
|
36
37
|
},
|
|
@@ -110,6 +111,7 @@ export default class mexc extends mexcRest {
|
|
|
110
111
|
// "t": 1678643605721
|
|
111
112
|
// }
|
|
112
113
|
//
|
|
114
|
+
this.handleBidAsk(client, message);
|
|
113
115
|
const rawTicker = this.safeValue2(message, 'd', 'data');
|
|
114
116
|
const marketId = this.safeString2(message, 's', 'symbol');
|
|
115
117
|
const timestamp = this.safeInteger(message, 't');
|
|
@@ -128,6 +130,84 @@ export default class mexc extends mexcRest {
|
|
|
128
130
|
const messageHash = 'ticker:' + symbol;
|
|
129
131
|
client.resolve(ticker, messageHash);
|
|
130
132
|
}
|
|
133
|
+
async watchTickers(symbols = undefined, params = {}) {
|
|
134
|
+
/**
|
|
135
|
+
* @method
|
|
136
|
+
* @name mexc#watchTickers
|
|
137
|
+
* @description watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
|
138
|
+
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
|
|
139
|
+
* @see https://mexcdevelop.github.io/apidocs/contract_v1_en/#public-channels
|
|
140
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
141
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
142
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
143
|
+
*/
|
|
144
|
+
await this.loadMarkets();
|
|
145
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
146
|
+
const messageHashes = [];
|
|
147
|
+
const marketIds = this.marketIds(symbols);
|
|
148
|
+
const firstMarket = this.market(symbols[0]);
|
|
149
|
+
const isSpot = firstMarket['spot'];
|
|
150
|
+
const url = (isSpot) ? this.urls['api']['ws']['spot'] : this.urls['api']['ws']['swap'];
|
|
151
|
+
const request = {};
|
|
152
|
+
if (isSpot) {
|
|
153
|
+
const topics = [];
|
|
154
|
+
for (let i = 0; i < marketIds.length; i++) {
|
|
155
|
+
const marketId = marketIds[i];
|
|
156
|
+
messageHashes.push('ticker:' + symbols[i]);
|
|
157
|
+
topics.push('spot@public.bookTicker.v3.api@' + marketId);
|
|
158
|
+
}
|
|
159
|
+
request['method'] = 'SUBSCRIPTION';
|
|
160
|
+
request['params'] = topics;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
request['method'] = 'sub.tickers';
|
|
164
|
+
request['params'] = {};
|
|
165
|
+
messageHashes.push('ticker');
|
|
166
|
+
}
|
|
167
|
+
const ticker = await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes);
|
|
168
|
+
if (isSpot && this.newUpdates) {
|
|
169
|
+
const result = {};
|
|
170
|
+
result[ticker['symbol']] = ticker;
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
return this.filterByArray(this.tickers, 'symbol', symbols);
|
|
174
|
+
}
|
|
175
|
+
handleTickers(client, message) {
|
|
176
|
+
//
|
|
177
|
+
// {
|
|
178
|
+
// "channel": "push.tickers",
|
|
179
|
+
// "data": [
|
|
180
|
+
// {
|
|
181
|
+
// "symbol": "ETH_USDT",
|
|
182
|
+
// "lastPrice": 2324.5,
|
|
183
|
+
// "riseFallRate": 0.0356,
|
|
184
|
+
// "fairPrice": 2324.32,
|
|
185
|
+
// "indexPrice": 2325.44,
|
|
186
|
+
// "volume24": 25868309,
|
|
187
|
+
// "amount24": 591752573.9792,
|
|
188
|
+
// "maxBidPrice": 2557.98,
|
|
189
|
+
// "minAskPrice": 2092.89,
|
|
190
|
+
// "lower24Price": 2239.39,
|
|
191
|
+
// "high24Price": 2332.59,
|
|
192
|
+
// "timestamp": 1725872514111
|
|
193
|
+
// }
|
|
194
|
+
// ],
|
|
195
|
+
// "ts": 1725872514111
|
|
196
|
+
// }
|
|
197
|
+
//
|
|
198
|
+
const data = this.safeList(message, 'data');
|
|
199
|
+
const topic = 'ticker';
|
|
200
|
+
const result = [];
|
|
201
|
+
for (let i = 0; i < data.length; i++) {
|
|
202
|
+
const ticker = this.parseTicker(data[i]);
|
|
203
|
+
const symbol = ticker['symbol'];
|
|
204
|
+
this.tickers[symbol] = ticker;
|
|
205
|
+
result.push(ticker);
|
|
206
|
+
const messageHash = topic + ':' + symbol;
|
|
207
|
+
client.resolve(ticker, messageHash);
|
|
208
|
+
}
|
|
209
|
+
client.resolve(result, topic);
|
|
210
|
+
}
|
|
131
211
|
parseWsTicker(ticker, market = undefined) {
|
|
132
212
|
//
|
|
133
213
|
// spot
|
|
@@ -160,6 +240,87 @@ export default class mexc extends mexcRest {
|
|
|
160
240
|
'info': ticker,
|
|
161
241
|
}, market);
|
|
162
242
|
}
|
|
243
|
+
async watchBidsAsks(symbols = undefined, params = {}) {
|
|
244
|
+
/**
|
|
245
|
+
* @method
|
|
246
|
+
* @name mexc#watchBidsAsks
|
|
247
|
+
* @see https://mexcdevelop.github.io/apidocs/spot_v3_en/#individual-symbol-book-ticker-streams
|
|
248
|
+
* @description watches best bid & ask for symbols
|
|
249
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
250
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
251
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
252
|
+
*/
|
|
253
|
+
await this.loadMarkets();
|
|
254
|
+
symbols = this.marketSymbols(symbols, undefined, true, false, true);
|
|
255
|
+
let marketType = undefined;
|
|
256
|
+
if (symbols === undefined) {
|
|
257
|
+
throw new ArgumentsRequired(this.id + 'watchBidsAsks required symbols argument');
|
|
258
|
+
}
|
|
259
|
+
const markets = this.marketsForSymbols(symbols);
|
|
260
|
+
[marketType, params] = this.handleMarketTypeAndParams('watchBidsAsks', markets[0], params);
|
|
261
|
+
const isSpot = marketType === 'spot';
|
|
262
|
+
if (!isSpot) {
|
|
263
|
+
throw new NotSupported(this.id + 'watchBidsAsks only support spot market');
|
|
264
|
+
}
|
|
265
|
+
const messageHashes = [];
|
|
266
|
+
const topics = [];
|
|
267
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
268
|
+
if (isSpot) {
|
|
269
|
+
const market = this.market(symbols[i]);
|
|
270
|
+
topics.push('spot@public.bookTicker.v3.api@' + market['id']);
|
|
271
|
+
}
|
|
272
|
+
messageHashes.push('bidask:' + symbols[i]);
|
|
273
|
+
}
|
|
274
|
+
const url = this.urls['api']['ws']['spot'];
|
|
275
|
+
const request = {
|
|
276
|
+
'method': 'SUBSCRIPTION',
|
|
277
|
+
'params': topics,
|
|
278
|
+
};
|
|
279
|
+
const ticker = await this.watchMultiple(url, messageHashes, this.extend(request, params), messageHashes);
|
|
280
|
+
if (this.newUpdates) {
|
|
281
|
+
const tickers = {};
|
|
282
|
+
tickers[ticker['symbol']] = ticker;
|
|
283
|
+
return tickers;
|
|
284
|
+
}
|
|
285
|
+
return this.filterByArray(this.bidsasks, 'symbol', symbols);
|
|
286
|
+
}
|
|
287
|
+
handleBidAsk(client, message) {
|
|
288
|
+
//
|
|
289
|
+
// {
|
|
290
|
+
// "c": "spot@public.bookTicker.v3.api@BTCUSDT",
|
|
291
|
+
// "d": {
|
|
292
|
+
// "A": "4.70432",
|
|
293
|
+
// "B": "6.714863",
|
|
294
|
+
// "a": "20744.54",
|
|
295
|
+
// "b": "20744.17"
|
|
296
|
+
// },
|
|
297
|
+
// "s": "BTCUSDT",
|
|
298
|
+
// "t": 1678643605721
|
|
299
|
+
// }
|
|
300
|
+
//
|
|
301
|
+
const parsedTicker = this.parseWsBidAsk(message);
|
|
302
|
+
const symbol = parsedTicker['symbol'];
|
|
303
|
+
this.bidsasks[symbol] = parsedTicker;
|
|
304
|
+
const messageHash = 'bidask:' + symbol;
|
|
305
|
+
client.resolve(parsedTicker, messageHash);
|
|
306
|
+
}
|
|
307
|
+
parseWsBidAsk(ticker, market = undefined) {
|
|
308
|
+
const data = this.safeDict(ticker, 'd');
|
|
309
|
+
const marketId = this.safeString(ticker, 's');
|
|
310
|
+
market = this.safeMarket(marketId, market);
|
|
311
|
+
const symbol = this.safeString(market, 'symbol');
|
|
312
|
+
const timestamp = this.safeInteger(ticker, 't');
|
|
313
|
+
return this.safeTicker({
|
|
314
|
+
'symbol': symbol,
|
|
315
|
+
'timestamp': timestamp,
|
|
316
|
+
'datetime': this.iso8601(timestamp),
|
|
317
|
+
'ask': this.safeNumber(data, 'a'),
|
|
318
|
+
'askVolume': this.safeNumber(data, 'A'),
|
|
319
|
+
'bid': this.safeNumber(data, 'b'),
|
|
320
|
+
'bidVolume': this.safeNumber(data, 'B'),
|
|
321
|
+
'info': ticker,
|
|
322
|
+
}, market);
|
|
323
|
+
}
|
|
163
324
|
async watchSpotPublic(channel, messageHash, params = {}) {
|
|
164
325
|
const url = this.urls['api']['ws']['spot'];
|
|
165
326
|
const request = {
|
|
@@ -1135,8 +1296,8 @@ export default class mexc extends mexcRest {
|
|
|
1135
1296
|
// "code": 0,
|
|
1136
1297
|
// "msg": "spot@public.increase.depth.v3.api@BTCUSDT"
|
|
1137
1298
|
// }
|
|
1138
|
-
//
|
|
1139
|
-
const msg = this.safeString(message, 'msg');
|
|
1299
|
+
// Set the default to an empty string if the message is empty during the test.
|
|
1300
|
+
const msg = this.safeString(message, 'msg', '');
|
|
1140
1301
|
if (msg === 'PONG') {
|
|
1141
1302
|
this.handlePong(client, message);
|
|
1142
1303
|
}
|
|
@@ -1180,6 +1341,7 @@ export default class mexc extends mexcRest {
|
|
|
1180
1341
|
'push.kline': this.handleOHLCV,
|
|
1181
1342
|
'public.bookTicker.v3.api': this.handleTicker,
|
|
1182
1343
|
'push.ticker': this.handleTicker,
|
|
1344
|
+
'push.tickers': this.handleTickers,
|
|
1183
1345
|
'public.increase.depth.v3.api': this.handleOrderBook,
|
|
1184
1346
|
'push.depth': this.handleOrderBook,
|
|
1185
1347
|
'private.orders.v3.api': this.handleOrder,
|
package/js/src/pro/okx.js
CHANGED
|
@@ -1445,8 +1445,11 @@ export default class okx extends okxRest {
|
|
|
1445
1445
|
},
|
|
1446
1446
|
],
|
|
1447
1447
|
};
|
|
1448
|
-
|
|
1449
|
-
|
|
1448
|
+
// Only add params['access'] to prevent sending custom parameters, such as extraParams.
|
|
1449
|
+
if ('access' in params) {
|
|
1450
|
+
request['access'] = params['access'];
|
|
1451
|
+
}
|
|
1452
|
+
this.watch(url, messageHash, request, messageHash);
|
|
1450
1453
|
}
|
|
1451
1454
|
return await future;
|
|
1452
1455
|
}
|
|
@@ -1616,7 +1619,7 @@ export default class okx extends okxRest {
|
|
|
1616
1619
|
'channel': 'positions',
|
|
1617
1620
|
'instType': 'ANY',
|
|
1618
1621
|
};
|
|
1619
|
-
const args = [arg];
|
|
1622
|
+
const args = [this.extend(arg, params)];
|
|
1620
1623
|
const nonSymbolRequest = {
|
|
1621
1624
|
'op': 'subscribe',
|
|
1622
1625
|
'args': args,
|
package/js/src/pro/oxfun.d.ts
CHANGED
|
@@ -18,6 +18,9 @@ export default class oxfun extends oxfunRest {
|
|
|
18
18
|
watchTicker(symbol: string, params?: {}): Promise<Ticker>;
|
|
19
19
|
watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
|
|
20
20
|
handleTicker(client: Client, message: any): void;
|
|
21
|
+
watchBidsAsks(symbols?: Strings, params?: {}): Promise<Tickers>;
|
|
22
|
+
handleBidAsk(client: Client, message: any): void;
|
|
23
|
+
parseWsBidAsk(ticker: any, market?: any): Ticker;
|
|
21
24
|
watchBalance(params?: {}): Promise<Balances>;
|
|
22
25
|
handleBalance(client: any, message: any): void;
|
|
23
26
|
watchPositions(symbols?: Strings, since?: Int, limit?: Int, params?: {}): Promise<Position[]>;
|
package/js/src/pro/oxfun.js
CHANGED
|
@@ -25,6 +25,7 @@ export default class oxfun extends oxfunRest {
|
|
|
25
25
|
'watchMyTrades': false,
|
|
26
26
|
'watchTicker': true,
|
|
27
27
|
'watchTickers': true,
|
|
28
|
+
'watchBidsAsks': true,
|
|
28
29
|
'watchBalance': true,
|
|
29
30
|
'createOrderWs': true,
|
|
30
31
|
'editOrderWs': true,
|
|
@@ -499,6 +500,77 @@ export default class oxfun extends oxfunRest {
|
|
|
499
500
|
client.resolve(ticker, messageHash);
|
|
500
501
|
}
|
|
501
502
|
}
|
|
503
|
+
async watchBidsAsks(symbols = undefined, params = {}) {
|
|
504
|
+
/**
|
|
505
|
+
* @method
|
|
506
|
+
* @name oxfun#watchBidsAsks
|
|
507
|
+
* @see https://docs.ox.fun/?json#best-bid-ask
|
|
508
|
+
* @description watches best bid & ask for symbols
|
|
509
|
+
* @param {string[]} symbols unified symbol of the market to fetch the ticker for
|
|
510
|
+
* @param {object} [params] extra parameters specific to the exchange API endpoint
|
|
511
|
+
* @returns {object} a [ticker structure]{@link https://docs.ccxt.com/#/?id=ticker-structure}
|
|
512
|
+
*/
|
|
513
|
+
await this.loadMarkets();
|
|
514
|
+
symbols = this.marketSymbols(symbols, undefined, false);
|
|
515
|
+
const messageHashes = [];
|
|
516
|
+
const args = [];
|
|
517
|
+
for (let i = 0; i < symbols.length; i++) {
|
|
518
|
+
const market = this.market(symbols[i]);
|
|
519
|
+
args.push('bestBidAsk:' + market['id']);
|
|
520
|
+
messageHashes.push('bidask:' + market['symbol']);
|
|
521
|
+
}
|
|
522
|
+
const newTickers = await this.subscribeMultiple(messageHashes, args, params);
|
|
523
|
+
if (this.newUpdates) {
|
|
524
|
+
const tickers = {};
|
|
525
|
+
tickers[newTickers['symbol']] = newTickers;
|
|
526
|
+
return tickers;
|
|
527
|
+
}
|
|
528
|
+
return this.filterByArray(this.bidsasks, 'symbol', symbols);
|
|
529
|
+
}
|
|
530
|
+
handleBidAsk(client, message) {
|
|
531
|
+
//
|
|
532
|
+
// {
|
|
533
|
+
// "table": "bestBidAsk",
|
|
534
|
+
// "data": {
|
|
535
|
+
// "ask": [
|
|
536
|
+
// 19045.0,
|
|
537
|
+
// 1.0
|
|
538
|
+
// ],
|
|
539
|
+
// "checksum": 3790706311,
|
|
540
|
+
// "marketCode": "BTC-USD-SWAP-LIN",
|
|
541
|
+
// "bid": [
|
|
542
|
+
// 19015.0,
|
|
543
|
+
// 1.0
|
|
544
|
+
// ],
|
|
545
|
+
// "timestamp": "1665456882928"
|
|
546
|
+
// }
|
|
547
|
+
// }
|
|
548
|
+
//
|
|
549
|
+
const data = this.safeDict(message, 'data', {});
|
|
550
|
+
const parsedTicker = this.parseWsBidAsk(data);
|
|
551
|
+
const symbol = parsedTicker['symbol'];
|
|
552
|
+
this.bidsasks[symbol] = parsedTicker;
|
|
553
|
+
const messageHash = 'bidask:' + symbol;
|
|
554
|
+
client.resolve(parsedTicker, messageHash);
|
|
555
|
+
}
|
|
556
|
+
parseWsBidAsk(ticker, market = undefined) {
|
|
557
|
+
const marketId = this.safeString(ticker, 'marketCode');
|
|
558
|
+
market = this.safeMarket(marketId, market);
|
|
559
|
+
const symbol = this.safeString(market, 'symbol');
|
|
560
|
+
const timestamp = this.safeInteger(ticker, 'timestamp');
|
|
561
|
+
const ask = this.safeList(ticker, 'ask', []);
|
|
562
|
+
const bid = this.safeList(ticker, 'bid', []);
|
|
563
|
+
return this.safeTicker({
|
|
564
|
+
'symbol': symbol,
|
|
565
|
+
'timestamp': timestamp,
|
|
566
|
+
'datetime': this.iso8601(timestamp),
|
|
567
|
+
'ask': this.safeNumber(ask, 0),
|
|
568
|
+
'askVolume': this.safeNumber(ask, 1),
|
|
569
|
+
'bid': this.safeNumber(bid, 0),
|
|
570
|
+
'bidVolume': this.safeNumber(bid, 1),
|
|
571
|
+
'info': ticker,
|
|
572
|
+
}, market);
|
|
573
|
+
}
|
|
502
574
|
async watchBalance(params = {}) {
|
|
503
575
|
/**
|
|
504
576
|
* @method
|
|
@@ -1022,6 +1094,9 @@ export default class oxfun extends oxfunRest {
|
|
|
1022
1094
|
if (table.indexOf('order') > -1) {
|
|
1023
1095
|
this.handleOrders(client, message);
|
|
1024
1096
|
}
|
|
1097
|
+
if (table === 'bestBidAsk') {
|
|
1098
|
+
this.handleBidAsk(client, message);
|
|
1099
|
+
}
|
|
1025
1100
|
}
|
|
1026
1101
|
else {
|
|
1027
1102
|
if (event === 'login') {
|
package/js/src/pro/phemex.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import phemexRest from '../phemex.js';
|
|
2
|
-
import type { Int, Str, OrderBook, Order, Trade, Ticker, OHLCV, Balances, Dict } from '../base/types.js';
|
|
2
|
+
import type { Int, Str, OrderBook, Order, Trade, Ticker, OHLCV, Balances, Dict, Strings, Tickers } from '../base/types.js';
|
|
3
3
|
import Client from '../base/ws/Client.js';
|
|
4
4
|
export default class phemex extends phemexRest {
|
|
5
5
|
describe(): any;
|
|
@@ -16,6 +16,7 @@ export default class phemex extends phemexRest {
|
|
|
16
16
|
handleTrades(client: Client, message: any): void;
|
|
17
17
|
handleOHLCV(client: Client, message: any): void;
|
|
18
18
|
watchTicker(symbol: string, params?: {}): Promise<Ticker>;
|
|
19
|
+
watchTickers(symbols?: Strings, params?: {}): Promise<Tickers>;
|
|
19
20
|
watchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<Trade[]>;
|
|
20
21
|
watchOrderBook(symbol: string, limit?: Int, params?: {}): Promise<OrderBook>;
|
|
21
22
|
watchOHLCV(symbol: string, timeframe?: string, since?: Int, limit?: Int, params?: {}): Promise<OHLCV[]>;
|