ccxt 4.3.51__py2.py3-none-any.whl → 4.3.53__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.
Potentially problematic release.
This version of ccxt might be problematic. Click here for more details.
- ccxt/__init__.py +3 -1
- ccxt/abstract/okx.py +1 -0
- ccxt/abstract/vertex.py +19 -0
- ccxt/async_support/__init__.py +3 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/base/ws/cache.py +2 -2
- ccxt/async_support/binance.py +3 -3
- ccxt/async_support/bitget.py +1 -1
- ccxt/async_support/bitmart.py +1 -1
- ccxt/async_support/bybit.py +5 -0
- ccxt/async_support/coinex.py +1 -1
- ccxt/async_support/htx.py +1 -1
- ccxt/async_support/hyperliquid.py +27 -25
- ccxt/async_support/krakenfutures.py +1 -0
- ccxt/async_support/okx.py +1 -0
- ccxt/async_support/probit.py +9 -5
- ccxt/async_support/vertex.py +2811 -0
- ccxt/base/exchange.py +2 -2
- ccxt/base/precise.py +10 -0
- ccxt/binance.py +3 -3
- ccxt/bitget.py +1 -1
- ccxt/bitmart.py +1 -1
- ccxt/bybit.py +5 -0
- ccxt/coinex.py +1 -1
- ccxt/htx.py +1 -1
- ccxt/hyperliquid.py +27 -25
- ccxt/krakenfutures.py +1 -0
- ccxt/okx.py +1 -0
- ccxt/pro/__init__.py +3 -1
- ccxt/pro/okx.py +1 -1
- ccxt/pro/probit.py +6 -4
- ccxt/pro/vertex.py +916 -0
- ccxt/probit.py +9 -5
- ccxt/test/test_async.py +37 -3
- ccxt/test/test_sync.py +37 -3
- ccxt/vertex.py +2811 -0
- ccxt-4.3.53.dist-info/LICENSE.txt +21 -0
- {ccxt-4.3.51.dist-info → ccxt-4.3.53.dist-info}/METADATA +19 -17
- {ccxt-4.3.51.dist-info → ccxt-4.3.53.dist-info}/RECORD +41 -36
- {ccxt-4.3.51.dist-info → ccxt-4.3.53.dist-info}/WHEEL +1 -1
- {ccxt-4.3.51.dist-info → ccxt-4.3.53.dist-info}/top_level.txt +0 -0
ccxt/__init__.py
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
|
23
23
|
# ----------------------------------------------------------------------------
|
24
24
|
|
25
|
-
__version__ = '4.3.
|
25
|
+
__version__ = '4.3.53'
|
26
26
|
|
27
27
|
# ----------------------------------------------------------------------------
|
28
28
|
|
@@ -178,6 +178,7 @@ from ccxt.timex import timex # noqa: F4
|
|
178
178
|
from ccxt.tokocrypto import tokocrypto # noqa: F401
|
179
179
|
from ccxt.tradeogre import tradeogre # noqa: F401
|
180
180
|
from ccxt.upbit import upbit # noqa: F401
|
181
|
+
from ccxt.vertex import vertex # noqa: F401
|
181
182
|
from ccxt.wavesexchange import wavesexchange # noqa: F401
|
182
183
|
from ccxt.wazirx import wazirx # noqa: F401
|
183
184
|
from ccxt.whitebit import whitebit # noqa: F401
|
@@ -287,6 +288,7 @@ exchanges = [
|
|
287
288
|
'tokocrypto',
|
288
289
|
'tradeogre',
|
289
290
|
'upbit',
|
291
|
+
'vertex',
|
290
292
|
'wavesexchange',
|
291
293
|
'wazirx',
|
292
294
|
'whitebit',
|
ccxt/abstract/okx.py
CHANGED
@@ -223,6 +223,7 @@ class ImplicitAPI:
|
|
223
223
|
private_post_sprd_cancel_order = privatePostSprdCancelOrder = Entry('sprd/cancel-order', 'private', 'POST', {'cost': 1})
|
224
224
|
private_post_sprd_mass_cancel = privatePostSprdMassCancel = Entry('sprd/mass-cancel', 'private', 'POST', {'cost': 1})
|
225
225
|
private_post_sprd_amend_order = privatePostSprdAmendOrder = Entry('sprd/amend-order', 'private', 'POST', {'cost': 1})
|
226
|
+
private_post_sprd_cancel_all_after = privatePostSprdCancelAllAfter = Entry('sprd/cancel-all-after', 'private', 'POST', {'cost': 10})
|
226
227
|
private_post_trade_order = privatePostTradeOrder = Entry('trade/order', 'private', 'POST', {'cost': 0.3333333333333333})
|
227
228
|
private_post_trade_batch_orders = privatePostTradeBatchOrders = Entry('trade/batch-orders', 'private', 'POST', {'cost': 0.06666666666666667})
|
228
229
|
private_post_trade_cancel_order = privatePostTradeCancelOrder = Entry('trade/cancel-order', 'private', 'POST', {'cost': 0.3333333333333333})
|
ccxt/abstract/vertex.py
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
from ccxt.base.types import Entry
|
2
|
+
|
3
|
+
|
4
|
+
class ImplicitAPI:
|
5
|
+
v1_archive_post = v1ArchivePost = Entry('', ['v1', 'archive'], 'POST', {'cost': 1})
|
6
|
+
v1_gateway_get_query = v1GatewayGetQuery = Entry('query', ['v1', 'gateway'], 'GET', {'cost': 1})
|
7
|
+
v1_gateway_get_symbols = v1GatewayGetSymbols = Entry('symbols', ['v1', 'gateway'], 'GET', {'cost': 1})
|
8
|
+
v1_gateway_get_time = v1GatewayGetTime = Entry('time', ['v1', 'gateway'], 'GET', {'cost': 1})
|
9
|
+
v1_gateway_post_query = v1GatewayPostQuery = Entry('query', ['v1', 'gateway'], 'POST', {'cost': 1})
|
10
|
+
v1_gateway_post_execute = v1GatewayPostExecute = Entry('execute', ['v1', 'gateway'], 'POST', {'cost': 1})
|
11
|
+
v1_trigger_post_execute = v1TriggerPostExecute = Entry('execute', ['v1', 'trigger'], 'POST', {'cost': 1})
|
12
|
+
v1_trigger_post_query = v1TriggerPostQuery = Entry('query', ['v1', 'trigger'], 'POST', {'cost': 1})
|
13
|
+
v2_archive_get_tickers = v2ArchiveGetTickers = Entry('tickers', ['v2', 'archive'], 'GET', {'cost': 1})
|
14
|
+
v2_archive_get_contracts = v2ArchiveGetContracts = Entry('contracts', ['v2', 'archive'], 'GET', {'cost': 1})
|
15
|
+
v2_archive_get_trades = v2ArchiveGetTrades = Entry('trades', ['v2', 'archive'], 'GET', {'cost': 1})
|
16
|
+
v2_archive_get_vrtx = v2ArchiveGetVrtx = Entry('vrtx', ['v2', 'archive'], 'GET', {'cost': 1})
|
17
|
+
v2_gateway_get_assets = v2GatewayGetAssets = Entry('assets', ['v2', 'gateway'], 'GET', {'cost': 0.6667})
|
18
|
+
v2_gateway_get_pairs = v2GatewayGetPairs = Entry('pairs', ['v2', 'gateway'], 'GET', {'cost': 1})
|
19
|
+
v2_gateway_get_orderbook = v2GatewayGetOrderbook = Entry('orderbook', ['v2', 'gateway'], 'GET', {'cost': 1})
|
ccxt/async_support/__init__.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
|
7
|
-
__version__ = '4.3.
|
7
|
+
__version__ = '4.3.53'
|
8
8
|
|
9
9
|
# -----------------------------------------------------------------------------
|
10
10
|
|
@@ -158,6 +158,7 @@ from ccxt.async_support.timex import timex
|
|
158
158
|
from ccxt.async_support.tokocrypto import tokocrypto # noqa: F401
|
159
159
|
from ccxt.async_support.tradeogre import tradeogre # noqa: F401
|
160
160
|
from ccxt.async_support.upbit import upbit # noqa: F401
|
161
|
+
from ccxt.async_support.vertex import vertex # noqa: F401
|
161
162
|
from ccxt.async_support.wavesexchange import wavesexchange # noqa: F401
|
162
163
|
from ccxt.async_support.wazirx import wazirx # noqa: F401
|
163
164
|
from ccxt.async_support.whitebit import whitebit # noqa: F401
|
@@ -267,6 +268,7 @@ exchanges = [
|
|
267
268
|
'tokocrypto',
|
268
269
|
'tradeogre',
|
269
270
|
'upbit',
|
271
|
+
'vertex',
|
270
272
|
'wavesexchange',
|
271
273
|
'wazirx',
|
272
274
|
'whitebit',
|
@@ -184,7 +184,7 @@ class ArrayCacheBySymbolBySide(ArrayCache):
|
|
184
184
|
if reference != item:
|
185
185
|
reference.update(item)
|
186
186
|
item = reference
|
187
|
-
index = self._index.index(item['side'])
|
187
|
+
index = self._index.index(item['symbol'] + item['side'])
|
188
188
|
del self._deque[index]
|
189
189
|
del self._index[index]
|
190
190
|
else:
|
@@ -194,7 +194,7 @@ class ArrayCacheBySymbolBySide(ArrayCache):
|
|
194
194
|
self._index.popleft()
|
195
195
|
del self.hashmap[delete_item['symbol']][delete_item['side']]
|
196
196
|
self._deque.append(item)
|
197
|
-
self._index.append(item['side'])
|
197
|
+
self._index.append(item['symbol'] + item['side'])
|
198
198
|
if self._clear_all_updates:
|
199
199
|
self._clear_all_updates = False
|
200
200
|
self._clear_updates_by_symbol.clear()
|
ccxt/async_support/binance.py
CHANGED
@@ -10283,9 +10283,9 @@ class binance(Exchange, ImplicitAPI):
|
|
10283
10283
|
orderidlistLength = len(orderidlist)
|
10284
10284
|
origclientorderidlistLength = len(origclientorderidlist)
|
10285
10285
|
if orderidlistLength > 0:
|
10286
|
-
query = query + '&' + 'orderidlist
|
10286
|
+
query = query + '&' + 'orderidlist=%5B' + '%2C'.join(orderidlist) + '%5D'
|
10287
10287
|
if origclientorderidlistLength > 0:
|
10288
|
-
query = query + '&' + 'origclientorderidlist
|
10288
|
+
query = query + '&' + 'origclientorderidlist=%5B' + '%2C'.join(origclientorderidlist) + '%5D'
|
10289
10289
|
else:
|
10290
10290
|
query = self.rawencode(extendedParams)
|
10291
10291
|
else:
|
@@ -10682,7 +10682,7 @@ class binance(Exchange, ImplicitAPI):
|
|
10682
10682
|
'info': info,
|
10683
10683
|
}
|
10684
10684
|
|
10685
|
-
def parse_isolated_borrow_rate(self, info, market: Market = None):
|
10685
|
+
def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
|
10686
10686
|
#
|
10687
10687
|
# {
|
10688
10688
|
# "vipLevel": 0,
|
ccxt/async_support/bitget.py
CHANGED
@@ -7451,7 +7451,7 @@ class bitget(Exchange, ImplicitAPI):
|
|
7451
7451
|
first['timestamp'] = timestamp
|
7452
7452
|
return self.parse_isolated_borrow_rate(first, market)
|
7453
7453
|
|
7454
|
-
def parse_isolated_borrow_rate(self, info, market: Market = None) -> IsolatedBorrowRate:
|
7454
|
+
def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
|
7455
7455
|
#
|
7456
7456
|
# {
|
7457
7457
|
# "symbol": "BTCUSDT",
|
ccxt/async_support/bitmart.py
CHANGED
@@ -3601,7 +3601,7 @@ class bitmart(Exchange, ImplicitAPI):
|
|
3601
3601
|
borrowRate = self.safe_value(symbols, 0)
|
3602
3602
|
return self.parse_isolated_borrow_rate(borrowRate, market)
|
3603
3603
|
|
3604
|
-
def parse_isolated_borrow_rate(self, info, market: Market = None) -> IsolatedBorrowRate:
|
3604
|
+
def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
|
3605
3605
|
#
|
3606
3606
|
# {
|
3607
3607
|
# "symbol": "BTC_USDT",
|
ccxt/async_support/bybit.py
CHANGED
@@ -4839,9 +4839,14 @@ class bybit(Exchange, ImplicitAPI):
|
|
4839
4839
|
:param str [params.baseCoin]: Base coin. Supports linear, inverse & option
|
4840
4840
|
:param str [params.settleCoin]: Settle coin. Supports linear, inverse & option
|
4841
4841
|
:param str [params.orderFilter]: 'Order' or 'StopOrder' or 'tpslOrder'
|
4842
|
+
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [availble parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
|
4842
4843
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
4843
4844
|
"""
|
4844
4845
|
await self.load_markets()
|
4846
|
+
paginate = False
|
4847
|
+
paginate, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'paginate')
|
4848
|
+
if paginate:
|
4849
|
+
return await self.fetch_paginated_call_cursor('fetchOpenOrders', symbol, since, limit, params, 'nextPageCursor', 'cursor', None, 50)
|
4845
4850
|
enableUnifiedMargin, enableUnifiedAccount = await self.is_unified_enabled()
|
4846
4851
|
isUnifiedAccount = (enableUnifiedMargin or enableUnifiedAccount)
|
4847
4852
|
request: dict = {}
|
ccxt/async_support/coinex.py
CHANGED
@@ -4838,7 +4838,7 @@ class coinex(Exchange, ImplicitAPI):
|
|
4838
4838
|
data = self.safe_list(response, 'data', [])
|
4839
4839
|
return self.parse_transactions(data, currency, since, limit)
|
4840
4840
|
|
4841
|
-
def parse_isolated_borrow_rate(self, info, market: Market = None) -> IsolatedBorrowRate:
|
4841
|
+
def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
|
4842
4842
|
#
|
4843
4843
|
# {
|
4844
4844
|
# "market": "BTCUSDT",
|
ccxt/async_support/htx.py
CHANGED
@@ -6181,7 +6181,7 @@ class htx(Exchange, ImplicitAPI):
|
|
6181
6181
|
data = self.safe_value(response, 'data', [])
|
6182
6182
|
return self.parse_isolated_borrow_rates(data)
|
6183
6183
|
|
6184
|
-
def parse_isolated_borrow_rate(self, info, market: Market = None) -> IsolatedBorrowRate:
|
6184
|
+
def parse_isolated_borrow_rate(self, info: dict, market: Market = None) -> IsolatedBorrowRate:
|
6185
6185
|
#
|
6186
6186
|
# {
|
6187
6187
|
# "symbol": "1inchusdt",
|
@@ -445,23 +445,26 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
445
445
|
for i in range(0, len(meta)):
|
446
446
|
market = self.safe_dict(meta, i, {})
|
447
447
|
marketName = self.safe_string(market, 'name')
|
448
|
-
if marketName.find('/') < 0:
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
|
454
|
-
|
455
|
-
quote = self.safe_currency_code(quoteId)
|
456
|
-
symbol = base + '/' + quote
|
448
|
+
# if marketName.find('/') < 0:
|
449
|
+
# # there are some weird spot markets in testnet, eg @2
|
450
|
+
# continue
|
451
|
+
# }
|
452
|
+
# marketParts = marketName.split('/')
|
453
|
+
# baseName = self.safe_string(marketParts, 0)
|
454
|
+
# quoteId = self.safe_string(marketParts, 1)
|
457
455
|
fees = self.safe_dict(self.fees, 'spot', {})
|
458
456
|
taker = self.safe_number(fees, 'taker')
|
459
457
|
maker = self.safe_number(fees, 'maker')
|
460
458
|
tokensPos = self.safe_list(market, 'tokens', [])
|
461
459
|
baseTokenPos = self.safe_integer(tokensPos, 0)
|
462
|
-
|
460
|
+
quoteTokenPos = self.safe_integer(tokensPos, 1)
|
463
461
|
baseTokenInfo = self.safe_dict(tokens, baseTokenPos, {})
|
464
|
-
|
462
|
+
quoteTokenInfo = self.safe_dict(tokens, quoteTokenPos, {})
|
463
|
+
baseName = self.safe_string(baseTokenInfo, 'name')
|
464
|
+
quoteId = self.safe_string(quoteTokenInfo, 'name')
|
465
|
+
base = self.safe_currency_code(baseName)
|
466
|
+
quote = self.safe_currency_code(quoteId)
|
467
|
+
symbol = base + '/' + quote
|
465
468
|
innerBaseTokenInfo = self.safe_dict(baseTokenInfo, 'spec', baseTokenInfo)
|
466
469
|
# innerQuoteTokenInfo = self.safe_dict(quoteTokenInfo, 'spec', quoteTokenInfo)
|
467
470
|
amountPrecision = self.parse_number(self.parse_precision(self.safe_string(innerBaseTokenInfo, 'szDecimals')))
|
@@ -1115,7 +1118,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1115
1118
|
}
|
1116
1119
|
if clientOrderId is not None:
|
1117
1120
|
orderObj['c'] = clientOrderId
|
1118
|
-
orderReq.append(
|
1121
|
+
orderReq.append(orderObj)
|
1119
1122
|
vaultAddress = self.format_vault_address(self.safe_string(params, 'vaultAddress'))
|
1120
1123
|
orderAction: dict = {
|
1121
1124
|
'type': 'order',
|
@@ -1135,7 +1138,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1135
1138
|
if vaultAddress is not None:
|
1136
1139
|
params = self.omit(params, 'vaultAddress')
|
1137
1140
|
request['vaultAddress'] = vaultAddress
|
1138
|
-
response = await self.privatePostExchange(
|
1141
|
+
response = await self.privatePostExchange(request)
|
1139
1142
|
#
|
1140
1143
|
# {
|
1141
1144
|
# "status": "ok",
|
@@ -1227,7 +1230,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1227
1230
|
if vaultAddress is not None:
|
1228
1231
|
params = self.omit(params, 'vaultAddress')
|
1229
1232
|
request['vaultAddress'] = vaultAddress
|
1230
|
-
response = await self.privatePostExchange(
|
1233
|
+
response = await self.privatePostExchange(request)
|
1231
1234
|
#
|
1232
1235
|
# {
|
1233
1236
|
# "status":"ok",
|
@@ -1303,7 +1306,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1303
1306
|
if vaultAddress is not None:
|
1304
1307
|
params = self.omit(params, 'vaultAddress')
|
1305
1308
|
request['vaultAddress'] = vaultAddress
|
1306
|
-
response = await self.privatePostExchange(
|
1309
|
+
response = await self.privatePostExchange(request)
|
1307
1310
|
#
|
1308
1311
|
# {
|
1309
1312
|
# "status":"ok",
|
@@ -1346,7 +1349,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1346
1349
|
if vaultAddress is not None:
|
1347
1350
|
params = self.omit(params, 'vaultAddress')
|
1348
1351
|
request['vaultAddress'] = vaultAddress
|
1349
|
-
response = await self.privatePostExchange(
|
1352
|
+
response = await self.privatePostExchange(request)
|
1350
1353
|
#
|
1351
1354
|
# {
|
1352
1355
|
# "status":"err",
|
@@ -1455,7 +1458,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1455
1458
|
if vaultAddress is not None:
|
1456
1459
|
params = self.omit(params, 'vaultAddress')
|
1457
1460
|
request['vaultAddress'] = vaultAddress
|
1458
|
-
response = await self.privatePostExchange(
|
1461
|
+
response = await self.privatePostExchange(request)
|
1459
1462
|
#
|
1460
1463
|
# {
|
1461
1464
|
# "status": "ok",
|
@@ -2097,10 +2100,9 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
2097
2100
|
params = self.omit(params, 'vaultAddress')
|
2098
2101
|
if vaultAddress.startswith('0x'):
|
2099
2102
|
vaultAddress = vaultAddress.replace('0x', '')
|
2100
|
-
|
2101
|
-
signature = self.sign_l1_action(extendedAction, nonce, vaultAddress)
|
2103
|
+
signature = self.sign_l1_action(updateAction, nonce, vaultAddress)
|
2102
2104
|
request: dict = {
|
2103
|
-
'action':
|
2105
|
+
'action': updateAction,
|
2104
2106
|
'nonce': nonce,
|
2105
2107
|
'signature': signature,
|
2106
2108
|
# 'vaultAddress': vaultAddress,
|
@@ -2153,7 +2155,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
2153
2155
|
if vaultAddress is not None:
|
2154
2156
|
params = self.omit(params, 'vaultAddress')
|
2155
2157
|
request['vaultAddress'] = vaultAddress
|
2156
|
-
response = await self.privatePostExchange(
|
2158
|
+
response = await self.privatePostExchange(request)
|
2157
2159
|
#
|
2158
2160
|
# {
|
2159
2161
|
# 'response': {
|
@@ -2211,7 +2213,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
2211
2213
|
if vaultAddress is not None:
|
2212
2214
|
params = self.omit(params, 'vaultAddress')
|
2213
2215
|
request['vaultAddress'] = vaultAddress
|
2214
|
-
response = await self.privatePostExchange(
|
2216
|
+
response = await self.privatePostExchange(request)
|
2215
2217
|
#
|
2216
2218
|
# {
|
2217
2219
|
# 'response': {
|
@@ -2275,7 +2277,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
2275
2277
|
}
|
2276
2278
|
signature = self.sign_l1_action(action, nonce, vaultAddress)
|
2277
2279
|
innerRequest: dict = {
|
2278
|
-
'action':
|
2280
|
+
'action': action,
|
2279
2281
|
'nonce': nonce,
|
2280
2282
|
'signature': signature,
|
2281
2283
|
}
|
@@ -2308,7 +2310,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
2308
2310
|
'nonce': nonce,
|
2309
2311
|
'signature': sig,
|
2310
2312
|
}
|
2311
|
-
response = await self.privatePostExchange(
|
2313
|
+
response = await self.privatePostExchange(request)
|
2312
2314
|
return response
|
2313
2315
|
|
2314
2316
|
async def withdraw(self, code: str, amount: float, address: str, tag=None, params={}) -> Transaction:
|
@@ -2350,7 +2352,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
2350
2352
|
'nonce': nonce,
|
2351
2353
|
'signature': sig,
|
2352
2354
|
}
|
2353
|
-
response = await self.privatePostExchange(
|
2355
|
+
response = await self.privatePostExchange(request)
|
2354
2356
|
return self.parse_transaction(response)
|
2355
2357
|
|
2356
2358
|
def parse_transaction(self, transaction: dict, currency: Currency = None) -> Transaction:
|
@@ -96,6 +96,7 @@ class krakenfutures(Exchange, ImplicitAPI):
|
|
96
96
|
'public': 'https://demo-futures.kraken.com/derivatives/api/',
|
97
97
|
'private': 'https://demo-futures.kraken.com/derivatives/api/',
|
98
98
|
'charts': 'https://demo-futures.kraken.com/api/charts/',
|
99
|
+
'history': 'https://demo-futures.kraken.com/api/history/',
|
99
100
|
'www': 'https://demo-futures.kraken.com',
|
100
101
|
},
|
101
102
|
'logo': 'https://user-images.githubusercontent.com/24300605/81436764-b22fd580-9172-11ea-9703-742783e6376d.jpg',
|
ccxt/async_support/okx.py
CHANGED
ccxt/async_support/probit.py
CHANGED
@@ -13,6 +13,7 @@ from ccxt.base.errors import AuthenticationError
|
|
13
13
|
from ccxt.base.errors import ArgumentsRequired
|
14
14
|
from ccxt.base.errors import BadRequest
|
15
15
|
from ccxt.base.errors import BadSymbol
|
16
|
+
from ccxt.base.errors import MarketClosed
|
16
17
|
from ccxt.base.errors import BadResponse
|
17
18
|
from ccxt.base.errors import InsufficientFunds
|
18
19
|
from ccxt.base.errors import InvalidAddress
|
@@ -194,7 +195,7 @@ class probit(Exchange, ImplicitAPI):
|
|
194
195
|
'RATE_LIMIT_EXCEEDED': RateLimitExceeded, # You are sending requests too frequently. Please try it later.
|
195
196
|
'MARKET_UNAVAILABLE': ExchangeNotAvailable, # Market is closed today
|
196
197
|
'INVALID_MARKET': BadSymbol, # Requested market is not exist
|
197
|
-
'MARKET_CLOSED':
|
198
|
+
'MARKET_CLOSED': MarketClosed, # {"errorCode":"MARKET_CLOSED"}
|
198
199
|
'MARKET_NOT_FOUND': BadSymbol, # {"errorCode":"MARKET_NOT_FOUND","message":"8e2b8496-0a1e-5beb-b990-a205b902eabe","details":{}}
|
199
200
|
'INVALID_CURRENCY': BadRequest, # Requested currency is not exist on ProBit system
|
200
201
|
'TOO_MANY_OPEN_ORDERS': DDoSProtection, # Too many open orders
|
@@ -1725,10 +1726,13 @@ class probit(Exchange, ImplicitAPI):
|
|
1725
1726
|
return None # fallback to default error handler
|
1726
1727
|
if 'errorCode' in response:
|
1727
1728
|
errorCode = self.safe_string(response, 'errorCode')
|
1728
|
-
message = self.safe_string(response, 'message')
|
1729
1729
|
if errorCode is not None:
|
1730
|
-
|
1731
|
-
self.
|
1732
|
-
self.
|
1730
|
+
errMessage = self.safe_string(response, 'message', '')
|
1731
|
+
details = self.safe_value(response, 'details')
|
1732
|
+
feedback = self.id + ' ' + errorCode + ' ' + errMessage + ' ' + self.json(details)
|
1733
|
+
if 'exact' in self.exceptions:
|
1734
|
+
self.throw_exactly_matched_exception(self.exceptions['exact'], errorCode, feedback)
|
1735
|
+
if 'broad' in self.exceptions:
|
1736
|
+
self.throw_broadly_matched_exception(self.exceptions['broad'], errMessage, feedback)
|
1733
1737
|
raise ExchangeError(feedback)
|
1734
1738
|
return None
|