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.
- ccxt/__init__.py +1 -1
- ccxt/abstract/binance.py +1 -0
- ccxt/abstract/binancecoinm.py +1 -0
- ccxt/abstract/binanceus.py +1 -0
- ccxt/abstract/binanceusdm.py +1 -0
- ccxt/abstract/oceanex.py +5 -0
- ccxt/ascendex.py +5 -4
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/ascendex.py +5 -4
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/binance.py +9 -11
- ccxt/async_support/bingx.py +20 -21
- ccxt/async_support/bitfinex2.py +7 -16
- ccxt/async_support/bitget.py +9 -8
- ccxt/async_support/bitmart.py +4 -3
- ccxt/async_support/bitmex.py +7 -6
- ccxt/async_support/blofin.py +7 -16
- ccxt/async_support/bybit.py +18 -16
- ccxt/async_support/coinex.py +19 -5
- ccxt/async_support/delta.py +6 -5
- ccxt/async_support/deribit.py +4 -3
- ccxt/async_support/digifinex.py +18 -4
- ccxt/async_support/gate.py +32 -13
- ccxt/async_support/hashkey.py +6 -6
- ccxt/async_support/hitbtc.py +6 -5
- ccxt/async_support/htx.py +29 -6
- ccxt/async_support/hyperliquid.py +6 -1
- ccxt/async_support/kraken.py +35 -13
- ccxt/async_support/krakenfutures.py +6 -5
- ccxt/async_support/kucoinfutures.py +13 -2
- ccxt/async_support/mexc.py +14 -7
- ccxt/async_support/oceanex.py +80 -4
- ccxt/async_support/okx.py +19 -3
- ccxt/async_support/oxfun.py +7 -7
- ccxt/async_support/phemex.py +4 -3
- ccxt/async_support/poloniexfutures.py +13 -2
- ccxt/async_support/vertex.py +6 -5
- ccxt/async_support/whitebit.py +14 -13
- ccxt/async_support/woo.py +42 -21
- ccxt/async_support/woofipro.py +19 -6
- ccxt/async_support/xt.py +5 -3
- ccxt/base/exchange.py +1 -1
- ccxt/base/types.py +1 -0
- ccxt/binance.py +9 -11
- ccxt/bingx.py +20 -21
- ccxt/bitfinex2.py +7 -16
- ccxt/bitget.py +9 -8
- ccxt/bitmart.py +4 -3
- ccxt/bitmex.py +7 -6
- ccxt/blofin.py +7 -16
- ccxt/bybit.py +18 -16
- ccxt/coinex.py +19 -5
- ccxt/delta.py +6 -5
- ccxt/deribit.py +4 -3
- ccxt/digifinex.py +18 -4
- ccxt/gate.py +32 -13
- ccxt/hashkey.py +6 -6
- ccxt/hitbtc.py +6 -5
- ccxt/htx.py +29 -6
- ccxt/hyperliquid.py +6 -1
- ccxt/kraken.py +35 -13
- ccxt/krakenfutures.py +6 -5
- ccxt/kucoinfutures.py +13 -2
- ccxt/mexc.py +14 -7
- ccxt/oceanex.py +80 -4
- ccxt/okx.py +19 -3
- ccxt/oxfun.py +7 -7
- ccxt/phemex.py +4 -3
- ccxt/poloniexfutures.py +13 -2
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/deribit.py +114 -2
- ccxt/pro/exmo.py +29 -2
- ccxt/pro/gate.py +1 -1
- ccxt/pro/okx.py +1 -1
- ccxt/vertex.py +6 -5
- ccxt/whitebit.py +14 -13
- ccxt/woo.py +42 -21
- ccxt/woofipro.py +19 -6
- ccxt/xt.py +5 -3
- ccxt-4.4.11.dist-info/METADATA +636 -0
- {ccxt-4.4.9.dist-info → ccxt-4.4.11.dist-info}/RECORD +84 -84
- ccxt-4.4.9.dist-info/METADATA +0 -636
- {ccxt-4.4.9.dist-info → ccxt-4.4.11.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.9.dist-info → ccxt-4.4.11.dist-info}/WHEEL +0 -0
- {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':
|
58
|
-
'fetchDepositAddresses':
|
59
|
-
'fetchDepositAddressesByNetwork':
|
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
|
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':
|
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
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':
|
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':
|
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.
|
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.
|
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 = {}
|