ccxt 4.4.9__py2.py3-none-any.whl → 4.4.11__py2.py3-none-any.whl

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.
Files changed (85) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/binance.py +1 -0
  3. ccxt/abstract/binancecoinm.py +1 -0
  4. ccxt/abstract/binanceus.py +1 -0
  5. ccxt/abstract/binanceusdm.py +1 -0
  6. ccxt/abstract/oceanex.py +5 -0
  7. ccxt/ascendex.py +5 -4
  8. ccxt/async_support/__init__.py +1 -1
  9. ccxt/async_support/ascendex.py +5 -4
  10. ccxt/async_support/base/exchange.py +1 -1
  11. ccxt/async_support/binance.py +9 -11
  12. ccxt/async_support/bingx.py +20 -21
  13. ccxt/async_support/bitfinex2.py +7 -16
  14. ccxt/async_support/bitget.py +9 -8
  15. ccxt/async_support/bitmart.py +4 -3
  16. ccxt/async_support/bitmex.py +7 -6
  17. ccxt/async_support/blofin.py +7 -16
  18. ccxt/async_support/bybit.py +18 -16
  19. ccxt/async_support/coinex.py +19 -5
  20. ccxt/async_support/delta.py +6 -5
  21. ccxt/async_support/deribit.py +4 -3
  22. ccxt/async_support/digifinex.py +18 -4
  23. ccxt/async_support/gate.py +32 -13
  24. ccxt/async_support/hashkey.py +6 -6
  25. ccxt/async_support/hitbtc.py +6 -5
  26. ccxt/async_support/htx.py +29 -6
  27. ccxt/async_support/hyperliquid.py +6 -1
  28. ccxt/async_support/kraken.py +35 -13
  29. ccxt/async_support/krakenfutures.py +6 -5
  30. ccxt/async_support/kucoinfutures.py +13 -2
  31. ccxt/async_support/mexc.py +14 -7
  32. ccxt/async_support/oceanex.py +80 -4
  33. ccxt/async_support/okx.py +19 -3
  34. ccxt/async_support/oxfun.py +7 -7
  35. ccxt/async_support/phemex.py +4 -3
  36. ccxt/async_support/poloniexfutures.py +13 -2
  37. ccxt/async_support/vertex.py +6 -5
  38. ccxt/async_support/whitebit.py +14 -13
  39. ccxt/async_support/woo.py +42 -21
  40. ccxt/async_support/woofipro.py +19 -6
  41. ccxt/async_support/xt.py +5 -3
  42. ccxt/base/exchange.py +1 -1
  43. ccxt/base/types.py +1 -0
  44. ccxt/binance.py +9 -11
  45. ccxt/bingx.py +20 -21
  46. ccxt/bitfinex2.py +7 -16
  47. ccxt/bitget.py +9 -8
  48. ccxt/bitmart.py +4 -3
  49. ccxt/bitmex.py +7 -6
  50. ccxt/blofin.py +7 -16
  51. ccxt/bybit.py +18 -16
  52. ccxt/coinex.py +19 -5
  53. ccxt/delta.py +6 -5
  54. ccxt/deribit.py +4 -3
  55. ccxt/digifinex.py +18 -4
  56. ccxt/gate.py +32 -13
  57. ccxt/hashkey.py +6 -6
  58. ccxt/hitbtc.py +6 -5
  59. ccxt/htx.py +29 -6
  60. ccxt/hyperliquid.py +6 -1
  61. ccxt/kraken.py +35 -13
  62. ccxt/krakenfutures.py +6 -5
  63. ccxt/kucoinfutures.py +13 -2
  64. ccxt/mexc.py +14 -7
  65. ccxt/oceanex.py +80 -4
  66. ccxt/okx.py +19 -3
  67. ccxt/oxfun.py +7 -7
  68. ccxt/phemex.py +4 -3
  69. ccxt/poloniexfutures.py +13 -2
  70. ccxt/pro/__init__.py +1 -1
  71. ccxt/pro/deribit.py +114 -2
  72. ccxt/pro/exmo.py +29 -2
  73. ccxt/pro/gate.py +1 -1
  74. ccxt/pro/okx.py +1 -1
  75. ccxt/vertex.py +6 -5
  76. ccxt/whitebit.py +14 -13
  77. ccxt/woo.py +42 -21
  78. ccxt/woofipro.py +19 -6
  79. ccxt/xt.py +5 -3
  80. ccxt-4.4.11.dist-info/METADATA +636 -0
  81. {ccxt-4.4.9.dist-info → ccxt-4.4.11.dist-info}/RECORD +84 -84
  82. ccxt-4.4.9.dist-info/METADATA +0 -636
  83. {ccxt-4.4.9.dist-info → ccxt-4.4.11.dist-info}/LICENSE.txt +0 -0
  84. {ccxt-4.4.9.dist-info → ccxt-4.4.11.dist-info}/WHEEL +0 -0
  85. {ccxt-4.4.9.dist-info → ccxt-4.4.11.dist-info}/top_level.txt +0 -0
ccxt/oceanex.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.oceanex import ImplicitAPI
8
- from ccxt.base.types import Balances, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees
8
+ from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import AuthenticationError
@@ -54,9 +54,9 @@ class oceanex(Exchange, ImplicitAPI):
54
54
  'fetchClosedOrders': True,
55
55
  'fetchCrossBorrowRate': False,
56
56
  'fetchCrossBorrowRates': False,
57
- 'fetchDepositAddress': False,
58
- 'fetchDepositAddresses': False,
59
- 'fetchDepositAddressesByNetwork': False,
57
+ 'fetchDepositAddress': 'emulated',
58
+ 'fetchDepositAddresses': None,
59
+ 'fetchDepositAddressesByNetwork': True,
60
60
  'fetchIsolatedBorrowRate': False,
61
61
  'fetchIsolatedBorrowRates': False,
62
62
  'fetchMarkets': True,
@@ -117,6 +117,11 @@ class oceanex(Exchange, ImplicitAPI):
117
117
  'order/delete',
118
118
  'order/delete/multi',
119
119
  'orders/clear',
120
+ '/withdraws/special/new',
121
+ '/deposit_address',
122
+ '/deposit_addresses',
123
+ '/deposit_history',
124
+ '/withdraw_history',
120
125
  ],
121
126
  },
122
127
  },
@@ -858,6 +863,77 @@ class oceanex(Exchange, ImplicitAPI):
858
863
  data = self.safe_list(response, 'data')
859
864
  return self.parse_orders(data)
860
865
 
866
+ def fetch_deposit_addresses_by_network(self, code: str, params={}):
867
+ """
868
+ fetch the deposit addresses for a currency associated with self account
869
+ :see: https://api.oceanex.pro/doc/v1/#deposit-addresses-post
870
+ :param str code: unified currency code
871
+ :param dict [params]: extra parameters specific to the exchange API endpoint
872
+ :returns dict: a dictionary `address structures <https://docs.ccxt.com/#/?id=address-structure>`, indexed by the network
873
+ """
874
+ self.load_markets()
875
+ currency = self.currency(code)
876
+ request: dict = {
877
+ 'currency': currency['id'],
878
+ }
879
+ response = self.privatePostDepositAddresses(self.extend(request, params))
880
+ #
881
+ # {
882
+ # code: '0',
883
+ # message: 'Operation successful',
884
+ # data: {
885
+ # data: {
886
+ # currency_id: 'usdt',
887
+ # display_name: 'USDT',
888
+ # num_of_resources: '3',
889
+ # resources: [
890
+ # {
891
+ # chain_name: 'TRC20',
892
+ # currency_id: 'usdt',
893
+ # address: 'TPcS7VgKMFmpRrWY82GbJzDeMnemWxEbpg',
894
+ # memo: '',
895
+ # deposit_status: 'enabled'
896
+ # },
897
+ # ...
898
+ # ]
899
+ # }
900
+ # }
901
+ # }
902
+ #
903
+ data = self.safe_dict(response, 'data', {})
904
+ data2 = self.safe_dict(data, 'data', {})
905
+ resources = self.safe_list(data2, 'resources', [])
906
+ result = {}
907
+ for i in range(0, len(resources)):
908
+ resource = resources[i]
909
+ enabled = self.safe_string(resource, 'deposit_status')
910
+ if enabled == 'enabled':
911
+ parsedAddress = self.parse_deposit_address(resource, currency)
912
+ result[parsedAddress['currency']] = parsedAddress
913
+ return result
914
+
915
+ def parse_deposit_address(self, depositAddress, currency: Currency = None):
916
+ #
917
+ # {
918
+ # chain_name: 'TRC20',
919
+ # currency_id: 'usdt',
920
+ # address: 'TPcS7VgKMFmpRrWY82GbJzDeMnemWxEbpg',
921
+ # memo: '',
922
+ # deposit_status: 'enabled'
923
+ # }
924
+ #
925
+ address = self.safe_string(depositAddress, 'address')
926
+ self.check_address(address)
927
+ currencyId = self.safe_string(depositAddress, 'currency_id')
928
+ networkId = self.safe_string(depositAddress, 'chain_name')
929
+ return {
930
+ 'info': depositAddress,
931
+ 'currency': self.safe_currency_code(currencyId, currency),
932
+ 'address': address,
933
+ 'tag': self.safe_string(depositAddress, 'memo'),
934
+ 'network': self.network_id_to_code(networkId),
935
+ }
936
+
861
937
  def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
862
938
  url = self.urls['api']['rest'] + '/' + self.version + '/' + self.implode_params(path, params)
863
939
  query = self.omit(params, self.extract_params(path))
ccxt/okx.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.okx import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Account, Balances, Conversion, CrossBorrowRate, CrossBorrowRates, Currencies, Currency, Greeks, Int, LedgerEntry, Leverage, LeverageTier, MarginModification, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, Transaction, TransferEntry
9
+ from ccxt.base.types import Account, Balances, Conversion, CrossBorrowRate, CrossBorrowRates, Currencies, Currency, Greeks, Int, LedgerEntry, Leverage, LeverageTier, MarginModification, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, FundingRate, Trade, TradingFeeInterface, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from typing import Any
12
12
  from ccxt.base.errors import ExchangeError
@@ -17,6 +17,7 @@ from ccxt.base.errors import AccountSuspended
17
17
  from ccxt.base.errors import ArgumentsRequired
18
18
  from ccxt.base.errors import BadRequest
19
19
  from ccxt.base.errors import BadSymbol
20
+ from ccxt.base.errors import ManualInteractionNeeded
20
21
  from ccxt.base.errors import InsufficientFunds
21
22
  from ccxt.base.errors import InvalidAddress
22
23
  from ccxt.base.errors import InvalidOrder
@@ -599,6 +600,7 @@ class okx(Exchange, ImplicitAPI):
599
600
  # General Class
600
601
  '1': ExchangeError, # Operation failed
601
602
  '2': ExchangeError, # Bulk operation partially succeeded
603
+ '4088': ManualInteractionNeeded, # {"code":"4088","data":[],"msg":"You can’t trade or deposit until you’ve verified your identity again. Head to Identity Verification to complete it."}
602
604
  '50000': BadRequest, # Body can not be empty
603
605
  '50001': OnMaintenance, # Matching engine upgrading. Please try again later
604
606
  '50002': BadRequest, # Json data format error
@@ -5622,7 +5624,7 @@ class okx(Exchange, ImplicitAPI):
5622
5624
  headers['OK-ACCESS-SIGN'] = signature
5623
5625
  return {'url': url, 'method': method, 'body': body, 'headers': headers}
5624
5626
 
5625
- def parse_funding_rate(self, contract, market: Market = None):
5627
+ def parse_funding_rate(self, contract, market: Market = None) -> FundingRate:
5626
5628
  #
5627
5629
  # {
5628
5630
  # "fundingRate": "0.00027815",
@@ -5656,6 +5658,9 @@ class okx(Exchange, ImplicitAPI):
5656
5658
  symbol = self.safe_symbol(marketId, market)
5657
5659
  nextFundingRate = self.safe_number(contract, 'nextFundingRate')
5658
5660
  fundingTime = self.safe_integer(contract, 'fundingTime')
5661
+ fundingTimeString = self.safe_string(contract, 'fundingTime')
5662
+ nextFundingTimeString = self.safe_string(contract, 'nextFundingRate')
5663
+ millisecondsInterval = Precise.string_sub(nextFundingTimeString, fundingTimeString)
5659
5664
  # https://www.okx.com/support/hc/en-us/articles/360053909272-Ⅸ-Introduction-to-perpetual-swap-funding-fee
5660
5665
  # > The current interest is 0.
5661
5666
  return {
@@ -5676,9 +5681,20 @@ class okx(Exchange, ImplicitAPI):
5676
5681
  'previousFundingRate': None,
5677
5682
  'previousFundingTimestamp': None,
5678
5683
  'previousFundingDatetime': None,
5684
+ 'interval': self.parse_funding_interval(millisecondsInterval),
5679
5685
  }
5680
5686
 
5681
- def fetch_funding_rate(self, symbol: str, params={}):
5687
+ def parse_funding_interval(self, interval):
5688
+ intervals: dict = {
5689
+ '3600000': '1h',
5690
+ '14400000': '4h',
5691
+ '28800000': '8h',
5692
+ '57600000': '16h',
5693
+ '86400000': '24h',
5694
+ }
5695
+ return self.safe_string(intervals, interval, interval)
5696
+
5697
+ def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
5682
5698
  """
5683
5699
  fetch the current funding rate
5684
5700
  :see: https://www.okx.com/docs-v5/en/#public-data-rest-api-get-funding-rate
ccxt/oxfun.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.oxfun import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Account, Balances, Bool, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
9
+ from ccxt.base.types import Account, Balances, Bool, Currencies, Currency, Int, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, FundingRates, Trade, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -83,7 +83,7 @@ class oxfun(Exchange, ImplicitAPI):
83
83
  'fetchDepositWithdrawFee': False,
84
84
  'fetchDepositWithdrawFees': False,
85
85
  'fetchFundingHistory': True,
86
- 'fetchFundingRate': False,
86
+ 'fetchFundingRate': 'emulated',
87
87
  'fetchFundingRateHistory': True,
88
88
  'fetchFundingRates': True,
89
89
  'fetchIndexOHLCV': False,
@@ -987,10 +987,10 @@ class oxfun(Exchange, ImplicitAPI):
987
987
  timestamp = self.safe_integer(data, 'lastUpdatedAt')
988
988
  return self.parse_order_book(data, market['symbol'], timestamp)
989
989
 
990
- def fetch_funding_rates(self, symbols: Strings = None, params={}):
990
+ def fetch_funding_rates(self, symbols: Strings = None, params={}) -> FundingRates:
991
991
  """
992
+ fetch the current funding rates for multiple markets
992
993
  :see: https://docs.ox.fun/?json#get-v3-funding-estimates
993
- fetch the current funding rates
994
994
  :param str[] symbols: unified market symbols
995
995
  :param dict [params]: extra parameters specific to the exchange API endpoint
996
996
  :returns Order[]: an array of `funding rate structures <https://docs.ccxt.com/#/?id=funding-rate-structure>`
@@ -1020,14 +1020,13 @@ class oxfun(Exchange, ImplicitAPI):
1020
1020
  result = self.parse_funding_rates(data)
1021
1021
  return self.filter_by_array(result, 'symbol', symbols)
1022
1022
 
1023
- def parse_funding_rate(self, fundingRate, market: Market = None):
1023
+ def parse_funding_rate(self, fundingRate, market: Market = None) -> FundingRate:
1024
1024
  #
1025
1025
  # {
1026
1026
  # "marketCode": "OX-USD-SWAP-LIN",
1027
1027
  # "fundingAt": "1715515200000",
1028
1028
  # "estFundingRate": "0.000200000"
1029
- # },
1030
- #
1029
+ # }
1031
1030
  #
1032
1031
  symbol = self.safe_string(fundingRate, 'marketCode')
1033
1032
  market = self.market(symbol)
@@ -1050,6 +1049,7 @@ class oxfun(Exchange, ImplicitAPI):
1050
1049
  'previousFundingRate': None,
1051
1050
  'previousFundingTimestamp': None,
1052
1051
  'previousFundingDatetime': None,
1052
+ 'interval': None,
1053
1053
  }
1054
1054
 
1055
1055
  def fetch_funding_rate_history(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
ccxt/phemex.py CHANGED
@@ -7,7 +7,7 @@ from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.phemex import ImplicitAPI
8
8
  import hashlib
9
9
  import numbers
10
- from ccxt.base.types import Balances, Currencies, Currency, Int, LeverageTier, LeverageTiers, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction, TransferEntry
10
+ from ccxt.base.types import Balances, Currencies, Currency, Int, LeverageTier, LeverageTiers, MarginModification, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, Trade, Transaction, TransferEntry
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
13
13
  from ccxt.base.errors import AuthenticationError
@@ -3741,7 +3741,7 @@ class phemex(Exchange, ImplicitAPI):
3741
3741
  value = Precise.string_mul(value, tickPrecision)
3742
3742
  return value
3743
3743
 
3744
- def fetch_funding_rate(self, symbol: str, params={}):
3744
+ def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
3745
3745
  """
3746
3746
  fetch the current funding rate
3747
3747
  :param str symbol: unified market symbol
@@ -3786,7 +3786,7 @@ class phemex(Exchange, ImplicitAPI):
3786
3786
  result = self.safe_value(response, 'result', {})
3787
3787
  return self.parse_funding_rate(result, market)
3788
3788
 
3789
- def parse_funding_rate(self, contract, market: Market = None):
3789
+ def parse_funding_rate(self, contract, market: Market = None) -> FundingRate:
3790
3790
  #
3791
3791
  # {
3792
3792
  # "askEp": 2332500,
@@ -3845,6 +3845,7 @@ class phemex(Exchange, ImplicitAPI):
3845
3845
  'previousFundingRate': None,
3846
3846
  'previousFundingTimestamp': None,
3847
3847
  'previousFundingDatetime': None,
3848
+ 'interval': None,
3848
3849
  }
3849
3850
 
3850
3851
  def set_margin(self, symbol: str, amount: float, params={}) -> MarginModification:
ccxt/poloniexfutures.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.poloniexfutures import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
9
+ from ccxt.base.types import Balances, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, Trade
10
10
  from typing import List
11
11
  from ccxt.base.errors import AuthenticationError
12
12
  from ccxt.base.errors import AccountSuspended
@@ -1527,7 +1527,7 @@ class poloniexfutures(Exchange, ImplicitAPI):
1527
1527
  'trades': None,
1528
1528
  }, market)
1529
1529
 
1530
- def fetch_funding_rate(self, symbol: str, params={}):
1530
+ def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
1531
1531
  """
1532
1532
  fetch the current funding rate
1533
1533
  :see: https://api-docs.poloniex.com/futures/api/futures-index#get-premium-index
@@ -1571,8 +1571,19 @@ class poloniexfutures(Exchange, ImplicitAPI):
1571
1571
  'previousFundingRate': self.safe_number(data, 'value'),
1572
1572
  'previousFundingTimestamp': fundingTimestamp,
1573
1573
  'previousFundingDatetime': self.iso8601(fundingTimestamp),
1574
+ 'interval': self.parse_funding_interval(self.safe_string(data, 'interval')),
1574
1575
  }
1575
1576
 
1577
+ def parse_funding_interval(self, interval):
1578
+ intervals: dict = {
1579
+ '3600000': '1h',
1580
+ '14400000': '4h',
1581
+ '28800000': '8h',
1582
+ '57600000': '16h',
1583
+ '86400000': '24h',
1584
+ }
1585
+ return self.safe_string(intervals, interval, interval)
1586
+
1576
1587
  def fetch_my_trades(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}):
1577
1588
  """
1578
1589
  fetch all trades made by the user
ccxt/pro/__init__.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # ----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.9'
7
+ __version__ = '4.4.11'
8
8
 
9
9
  # ----------------------------------------------------------------------------
10
10
 
ccxt/pro/deribit.py CHANGED
@@ -6,7 +6,7 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById, ArrayCacheByTimestamp
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Ticker, Trade
9
+ from ccxt.base.types import Balances, Int, Order, OrderBook, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import ExchangeError
@@ -22,7 +22,8 @@ class deribit(ccxt.async_support.deribit):
22
22
  'ws': True,
23
23
  'watchBalance': True,
24
24
  'watchTicker': True,
25
- 'watchTickers': False,
25
+ 'watchTickers': True,
26
+ 'watchBidsAsks': True,
26
27
  'watchTrades': True,
27
28
  'watchTradesForSymbols': True,
28
29
  'watchMyTrades': True,
@@ -189,6 +190,43 @@ class deribit(ccxt.async_support.deribit):
189
190
  request = self.deep_extend(message, params)
190
191
  return await self.watch(url, channel, request, channel, request)
191
192
 
193
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
194
+ """
195
+ :see: https://docs.deribit.com/#ticker-instrument_name-interval
196
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
197
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
198
+ :param dict [params]: extra parameters specific to the exchange API endpoint
199
+ :param str [params.interval]: specify aggregation and frequency of notifications. Possible values: 100ms, raw
200
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
201
+ """
202
+ await self.load_markets()
203
+ symbols = self.market_symbols(symbols, None, False)
204
+ url = self.urls['api']['ws']
205
+ interval = self.safe_string(params, 'interval', '100ms')
206
+ params = self.omit(params, 'interval')
207
+ await self.load_markets()
208
+ if interval == 'raw':
209
+ await self.authenticate()
210
+ channels = []
211
+ for i in range(0, len(symbols)):
212
+ market = self.market(symbols[i])
213
+ channels.append('ticker.' + market['id'] + '.' + interval)
214
+ message: dict = {
215
+ 'jsonrpc': '2.0',
216
+ 'method': 'public/subscribe',
217
+ 'params': {
218
+ 'channels': channels,
219
+ },
220
+ 'id': self.request_id(),
221
+ }
222
+ request = self.deep_extend(message, params)
223
+ newTickers = await self.watch_multiple(url, channels, request, channels, request)
224
+ if self.newUpdates:
225
+ tickers: dict = {}
226
+ tickers[newTickers['symbol']] = newTickers
227
+ return tickers
228
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
229
+
192
230
  def handle_ticker(self, client: Client, message):
193
231
  #
194
232
  # {
@@ -228,6 +266,79 @@ class deribit(ccxt.async_support.deribit):
228
266
  self.tickers[symbol] = ticker
229
267
  client.resolve(ticker, messageHash)
230
268
 
269
+ async def watch_bids_asks(self, symbols: Strings = None, params={}) -> Tickers:
270
+ """
271
+ :see: https://docs.deribit.com/#quote-instrument_name
272
+ watches best bid & ask for symbols
273
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
274
+ :param dict [params]: extra parameters specific to the exchange API endpoint
275
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
276
+ """
277
+ await self.load_markets()
278
+ symbols = self.market_symbols(symbols, None, False)
279
+ url = self.urls['api']['ws']
280
+ channels = []
281
+ for i in range(0, len(symbols)):
282
+ market = self.market(symbols[i])
283
+ channels.append('quote.' + market['id'])
284
+ message: dict = {
285
+ 'jsonrpc': '2.0',
286
+ 'method': 'public/subscribe',
287
+ 'params': {
288
+ 'channels': channels,
289
+ },
290
+ 'id': self.request_id(),
291
+ }
292
+ request = self.deep_extend(message, params)
293
+ newTickers = await self.watch_multiple(url, channels, request, channels, request)
294
+ if self.newUpdates:
295
+ tickers: dict = {}
296
+ tickers[newTickers['symbol']] = newTickers
297
+ return tickers
298
+ return self.filter_by_array(self.bidsasks, 'symbol', symbols)
299
+
300
+ def handle_bid_ask(self, client: Client, message):
301
+ #
302
+ # {
303
+ # "jsonrpc": "2.0",
304
+ # "method": "subscription",
305
+ # "params": {
306
+ # "channel": "quote.BTC_USDT",
307
+ # "data": {
308
+ # "best_bid_amount": 0.026,
309
+ # "best_ask_amount": 0.026,
310
+ # "best_bid_price": 63908,
311
+ # "best_ask_price": 63940,
312
+ # "instrument_name": "BTC_USDT",
313
+ # "timestamp": 1727765131750
314
+ # }
315
+ # }
316
+ # }
317
+ #
318
+ params = self.safe_dict(message, 'params', {})
319
+ data = self.safe_dict(params, 'data', {})
320
+ ticker = self.parse_ws_bid_ask(data)
321
+ symbol = ticker['symbol']
322
+ self.bidsasks[symbol] = ticker
323
+ messageHash = self.safe_string(params, 'channel')
324
+ client.resolve(ticker, messageHash)
325
+
326
+ def parse_ws_bid_ask(self, ticker, market=None):
327
+ marketId = self.safe_string(ticker, 'instrument_name')
328
+ market = self.safe_market(marketId, market)
329
+ symbol = self.safe_string(market, 'symbol')
330
+ timestamp = self.safe_integer(ticker, 'timestamp')
331
+ return self.safe_ticker({
332
+ 'symbol': symbol,
333
+ 'timestamp': timestamp,
334
+ 'datetime': self.iso8601(timestamp),
335
+ 'ask': self.safe_string(ticker, 'best_ask_price'),
336
+ 'askVolume': self.safe_string(ticker, 'best_ask_amount'),
337
+ 'bid': self.safe_string(ticker, 'best_bid_price'),
338
+ 'bidVolume': self.safe_string(ticker, 'best_bid_amount'),
339
+ 'info': ticker,
340
+ }, market)
341
+
231
342
  async def watch_trades(self, symbol: str, since: Int = None, limit: Int = None, params={}) -> List[Trade]:
232
343
  """
233
344
  get the list of most recent trades for a particular symbol
@@ -825,6 +936,7 @@ class deribit(ccxt.async_support.deribit):
825
936
  }
826
937
  handlers: dict = {
827
938
  'ticker': self.handle_ticker,
939
+ 'quote': self.handle_bid_ask,
828
940
  'book': self.handle_order_book,
829
941
  'trades': self.handle_trades,
830
942
  'chart': self.handle_ohlcv,
ccxt/pro/exmo.py CHANGED
@@ -6,7 +6,7 @@
6
6
  import ccxt.async_support
7
7
  from ccxt.async_support.base.ws.cache import ArrayCache, ArrayCacheBySymbolById
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Int, OrderBook, Str, Ticker, Trade
9
+ from ccxt.base.types import Balances, Int, OrderBook, Str, Strings, Ticker, Tickers, Trade
10
10
  from ccxt.async_support.base.ws.client import Client
11
11
  from typing import List
12
12
  from ccxt.base.errors import NotSupported
@@ -20,7 +20,7 @@ class exmo(ccxt.async_support.exmo):
20
20
  'ws': True,
21
21
  'watchBalance': True,
22
22
  'watchTicker': True,
23
- 'watchTickers': False,
23
+ 'watchTickers': True,
24
24
  'watchTrades': True,
25
25
  'watchMyTrades': True,
26
26
  'watchOrders': False, # TODO
@@ -199,6 +199,7 @@ class exmo(ccxt.async_support.exmo):
199
199
  async def watch_ticker(self, symbol: str, params={}) -> Ticker:
200
200
  """
201
201
  watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific market
202
+ :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#fd8f47bc-8517-43c0-bb60-1d61a86d4471
202
203
  :param str symbol: unified symbol of the market to fetch the ticker for
203
204
  :param dict [params]: extra parameters specific to the exchange API endpoint
204
205
  :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
@@ -218,6 +219,32 @@ class exmo(ccxt.async_support.exmo):
218
219
  request = self.deep_extend(message, params)
219
220
  return await self.watch(url, messageHash, request, messageHash, request)
220
221
 
222
+ async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
223
+ """
224
+ watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
225
+ :see: https://documenter.getpostman.com/view/10287440/SzYXWKPi#fd8f47bc-8517-43c0-bb60-1d61a86d4471
226
+ :param str[] [symbols]: unified symbol of the market to fetch the ticker for
227
+ :param dict [params]: extra parameters specific to the exchange API endpoint
228
+ :returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
229
+ """
230
+ await self.load_markets()
231
+ symbols = self.market_symbols(symbols, None, False)
232
+ messageHashes = []
233
+ args = []
234
+ for i in range(0, len(symbols)):
235
+ market = self.market(symbols[i])
236
+ messageHashes.append('ticker:' + market['symbol'])
237
+ args.append('spot/ticker:' + market['id'])
238
+ url = self.urls['api']['ws']['public']
239
+ message: dict = {
240
+ 'method': 'subscribe',
241
+ 'topics': args,
242
+ 'id': self.request_id(),
243
+ }
244
+ request = self.deep_extend(message, params)
245
+ await self.watch_multiple(url, messageHashes, request, messageHashes, request)
246
+ return self.filter_by_array(self.tickers, 'symbol', symbols)
247
+
221
248
  def handle_ticker(self, client: Client, message):
222
249
  #
223
250
  # spot
ccxt/pro/gate.py CHANGED
@@ -332,7 +332,7 @@ class gate(ccxt.async_support.gate):
332
332
  symbol = market['symbol']
333
333
  if market['swap'] is not True:
334
334
  raise NotSupported(self.id + ' fetchOrdersByStatusWs is only supported by swap markets. Use rest API for other markets')
335
- request, requestParams = self.fetchOrdersByStatusRequest(status, symbol, since, limit, params)
335
+ request, requestParams = self.prepareOrdersByStatusRequest(status, symbol, since, limit, params)
336
336
  newRequest = self.omit(request, ['settle'])
337
337
  messageType = self.get_type_by_market(market)
338
338
  channel = messageType + '.order_list'
ccxt/pro/okx.py CHANGED
@@ -1813,7 +1813,7 @@ class okx(ccxt.async_support.okx):
1813
1813
  tradeSymbols = list(symbols.keys())
1814
1814
  for i in range(0, len(tradeSymbols)):
1815
1815
  symbolMessageHash = messageHash + '::' + tradeSymbols[i]
1816
- client.resolve(self.orders, symbolMessageHash)
1816
+ client.resolve(self.myTrades, symbolMessageHash)
1817
1817
 
1818
1818
  def request_id(self):
1819
1819
  ts = str(self.milliseconds())
ccxt/vertex.py CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.vertex import ImplicitAPI
8
- from ccxt.base.types import Balances, Currencies, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees
8
+ from ccxt.base.types import Balances, Currencies, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, FundingRate, FundingRates, Trade, TradingFees
9
9
  from typing import List
10
10
  from ccxt.base.errors import ExchangeError
11
11
  from ccxt.base.errors import AuthenticationError
@@ -1154,7 +1154,7 @@ class vertex(Exchange, ImplicitAPI):
1154
1154
  rows = self.safe_list(response, 'candlesticks', [])
1155
1155
  return self.parse_ohlcvs(rows, market, timeframe, since, limit)
1156
1156
 
1157
- def parse_funding_rate(self, ticker, market: Market = None):
1157
+ def parse_funding_rate(self, ticker, market: Market = None) -> FundingRate:
1158
1158
  #
1159
1159
  # {
1160
1160
  # "product_id": 4,
@@ -1208,9 +1208,10 @@ class vertex(Exchange, ImplicitAPI):
1208
1208
  'previousFundingRate': None,
1209
1209
  'previousFundingTimestamp': None,
1210
1210
  'previousFundingDatetime': None,
1211
+ 'interval': None,
1211
1212
  }
1212
1213
 
1213
- def fetch_funding_rate(self, symbol: str, params={}):
1214
+ def fetch_funding_rate(self, symbol: str, params={}) -> FundingRate:
1214
1215
  """
1215
1216
  fetch the current funding rate
1216
1217
  :see: https://docs.vertexprotocol.com/developer-resources/api/archive-indexer/funding-rate
@@ -1235,13 +1236,13 @@ class vertex(Exchange, ImplicitAPI):
1235
1236
  #
1236
1237
  return self.parse_funding_rate(response, market)
1237
1238
 
1238
- def fetch_funding_rates(self, symbols: Strings = None, params={}):
1239
+ def fetch_funding_rates(self, symbols: Strings = None, params={}) -> FundingRates:
1239
1240
  """
1240
1241
  fetches funding rates for multiple markets
1241
1242
  :see: https://docs.vertexprotocol.com/developer-resources/api/v2/contracts
1242
1243
  :param str[] symbols: unified symbols of the markets to fetch the funding rates for, all market funding rates are returned if not assigned
1243
1244
  :param dict [params]: extra parameters specific to the exchange API endpoint
1244
- :returns dict: an array of `funding rate structures <https://docs.ccxt.com/#/?id=funding-rate-structure>`
1245
+ :returns dict[]: an array of `funding rate structures <https://docs.ccxt.com/#/?id=funding-rate-structure>`
1245
1246
  """
1246
1247
  self.load_markets()
1247
1248
  request = {}