ccxt 4.3.93__py2.py3-none-any.whl → 4.3.95__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/okx.py +2 -0
- ccxt/ascendex.py +8 -6
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/ascendex.py +9 -6
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/bingx.py +4 -1
- ccxt/async_support/bitfinex.py +4 -2
- ccxt/async_support/bitfinex2.py +7 -5
- ccxt/async_support/btcturk.py +3 -3
- ccxt/async_support/gate.py +3 -2
- ccxt/async_support/gemini.py +3 -2
- ccxt/async_support/hyperliquid.py +68 -11
- ccxt/async_support/independentreserve.py +5 -3
- ccxt/async_support/indodax.py +2 -0
- ccxt/async_support/mexc.py +72 -154
- ccxt/async_support/okx.py +2 -0
- ccxt/base/exchange.py +4 -4
- ccxt/bingx.py +4 -1
- ccxt/bitfinex.py +3 -2
- ccxt/bitfinex2.py +6 -5
- ccxt/btcturk.py +3 -3
- ccxt/gate.py +3 -2
- ccxt/gemini.py +3 -2
- ccxt/hyperliquid.py +68 -11
- ccxt/independentreserve.py +4 -3
- ccxt/indodax.py +2 -0
- ccxt/mexc.py +72 -154
- ccxt/okx.py +2 -0
- ccxt/pro/__init__.py +1 -1
- ccxt/test/tests_async.py +3 -0
- ccxt/test/tests_sync.py +3 -0
- {ccxt-4.3.93.dist-info → ccxt-4.3.95.dist-info}/METADATA +4 -4
- {ccxt-4.3.93.dist-info → ccxt-4.3.95.dist-info}/RECORD +37 -37
- {ccxt-4.3.93.dist-info → ccxt-4.3.95.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.3.93.dist-info → ccxt-4.3.95.dist-info}/WHEEL +0 -0
- {ccxt-4.3.93.dist-info → ccxt-4.3.95.dist-info}/top_level.txt +0 -0
ccxt/__init__.py
CHANGED
ccxt/abstract/okx.py
CHANGED
@@ -127,6 +127,7 @@ class ImplicitAPI:
|
|
127
127
|
private_get_account_account_position_risk = privateGetAccountAccountPositionRisk = Entry('account/account-position-risk', 'private', 'GET', {'cost': 2})
|
128
128
|
private_get_account_bills = privateGetAccountBills = Entry('account/bills', 'private', 'GET', {'cost': 1.6666666666666667})
|
129
129
|
private_get_account_bills_archive = privateGetAccountBillsArchive = Entry('account/bills-archive', 'private', 'GET', {'cost': 1.6666666666666667})
|
130
|
+
private_get_account_bills_history_archive = privateGetAccountBillsHistoryArchive = Entry('account/bills-history-archive', 'private', 'GET', {'cost': 2})
|
130
131
|
private_get_account_config = privateGetAccountConfig = Entry('account/config', 'private', 'GET', {'cost': 4})
|
131
132
|
private_get_account_max_size = privateGetAccountMaxSize = Entry('account/max-size', 'private', 'GET', {'cost': 1})
|
132
133
|
private_get_account_max_avail_size = privateGetAccountMaxAvailSize = Entry('account/max-avail-size', 'private', 'GET', {'cost': 1})
|
@@ -267,6 +268,7 @@ class ImplicitAPI:
|
|
267
268
|
private_post_account_fixed_loan_amend_borrowing_order = privatePostAccountFixedLoanAmendBorrowingOrder = Entry('account/fixed-loan/amend-borrowing-order', 'private', 'POST', {'cost': 5})
|
268
269
|
private_post_account_fixed_loan_manual_reborrow = privatePostAccountFixedLoanManualReborrow = Entry('account/fixed-loan/manual-reborrow', 'private', 'POST', {'cost': 5})
|
269
270
|
private_post_account_fixed_loan_repay_borrowing_order = privatePostAccountFixedLoanRepayBorrowingOrder = Entry('account/fixed-loan/repay-borrowing-order', 'private', 'POST', {'cost': 5})
|
271
|
+
private_post_account_bills_history_archive = privatePostAccountBillsHistoryArchive = Entry('account/bills-history-archive', 'private', 'POST', {'cost': 72000})
|
270
272
|
private_post_users_subaccount_modify_apikey = privatePostUsersSubaccountModifyApikey = Entry('users/subaccount/modify-apikey', 'private', 'POST', {'cost': 10})
|
271
273
|
private_post_asset_subaccount_transfer = privatePostAssetSubaccountTransfer = Entry('asset/subaccount/transfer', 'private', 'POST', {'cost': 10})
|
272
274
|
private_post_users_subaccount_set_transfer_out = privatePostUsersSubaccountSetTransferOut = Entry('users/subaccount/set-transfer-out', 'private', 'POST', {'cost': 10})
|
ccxt/ascendex.py
CHANGED
@@ -394,7 +394,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
394
394
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
395
395
|
:returns dict: an associative dictionary of currencies
|
396
396
|
"""
|
397
|
-
|
397
|
+
assetsPromise = self.v1PublicGetAssets(params)
|
398
398
|
#
|
399
399
|
# {
|
400
400
|
# "code":0,
|
@@ -411,7 +411,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
411
411
|
# ]
|
412
412
|
# }
|
413
413
|
#
|
414
|
-
|
414
|
+
marginPromise = self.v1PublicGetMarginAssets(params)
|
415
415
|
#
|
416
416
|
# {
|
417
417
|
# "code":0,
|
@@ -431,7 +431,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
431
431
|
# ]
|
432
432
|
# }
|
433
433
|
#
|
434
|
-
|
434
|
+
cashPromise = self.v1PublicGetCashAssets(params)
|
435
435
|
#
|
436
436
|
# {
|
437
437
|
# "code":0,
|
@@ -448,6 +448,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
448
448
|
# ]
|
449
449
|
# }
|
450
450
|
#
|
451
|
+
assets, margin, cash = [assetsPromise, marginPromise, cashPromise]
|
451
452
|
assetsData = self.safe_list(assets, 'data', [])
|
452
453
|
marginData = self.safe_list(margin, 'data', [])
|
453
454
|
cashData = self.safe_list(cash, 'data', [])
|
@@ -499,7 +500,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
499
500
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
500
501
|
:returns dict[]: an array of objects representing market data
|
501
502
|
"""
|
502
|
-
|
503
|
+
productsPromise = self.v1PublicGetProducts(params)
|
503
504
|
#
|
504
505
|
# {
|
505
506
|
# "code": 0,
|
@@ -520,7 +521,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
520
521
|
# ]
|
521
522
|
# }
|
522
523
|
#
|
523
|
-
|
524
|
+
cashPromise = self.v1PublicGetCashProducts(params)
|
524
525
|
#
|
525
526
|
# {
|
526
527
|
# "code": 0,
|
@@ -550,7 +551,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
550
551
|
# ]
|
551
552
|
# }
|
552
553
|
#
|
553
|
-
|
554
|
+
perpetualsPromise = self.v2PublicGetFuturesContract(params)
|
554
555
|
#
|
555
556
|
# {
|
556
557
|
# "code": 0,
|
@@ -588,6 +589,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
588
589
|
# ]
|
589
590
|
# }
|
590
591
|
#
|
592
|
+
products, cash, perpetuals = [productsPromise, cashPromise, perpetualsPromise]
|
591
593
|
productsData = self.safe_list(products, 'data', [])
|
592
594
|
productsById = self.index_by(productsData, 'symbol')
|
593
595
|
cashData = self.safe_list(cash, 'data', [])
|
ccxt/async_support/__init__.py
CHANGED
ccxt/async_support/ascendex.py
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
from ccxt.async_support.base.exchange import Exchange
|
7
7
|
from ccxt.abstract.ascendex import ImplicitAPI
|
8
|
+
import asyncio
|
8
9
|
import hashlib
|
9
10
|
from ccxt.base.types import Account, Balances, Currencies, Currency, Int, Leverage, Leverages, LeverageTier, LeverageTiers, MarginMode, MarginModes, MarginModification, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction, TransferEntry
|
10
11
|
from typing import List
|
@@ -394,7 +395,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
394
395
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
395
396
|
:returns dict: an associative dictionary of currencies
|
396
397
|
"""
|
397
|
-
|
398
|
+
assetsPromise = self.v1PublicGetAssets(params)
|
398
399
|
#
|
399
400
|
# {
|
400
401
|
# "code":0,
|
@@ -411,7 +412,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
411
412
|
# ]
|
412
413
|
# }
|
413
414
|
#
|
414
|
-
|
415
|
+
marginPromise = self.v1PublicGetMarginAssets(params)
|
415
416
|
#
|
416
417
|
# {
|
417
418
|
# "code":0,
|
@@ -431,7 +432,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
431
432
|
# ]
|
432
433
|
# }
|
433
434
|
#
|
434
|
-
|
435
|
+
cashPromise = self.v1PublicGetCashAssets(params)
|
435
436
|
#
|
436
437
|
# {
|
437
438
|
# "code":0,
|
@@ -448,6 +449,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
448
449
|
# ]
|
449
450
|
# }
|
450
451
|
#
|
452
|
+
assets, margin, cash = await asyncio.gather(*[assetsPromise, marginPromise, cashPromise])
|
451
453
|
assetsData = self.safe_list(assets, 'data', [])
|
452
454
|
marginData = self.safe_list(margin, 'data', [])
|
453
455
|
cashData = self.safe_list(cash, 'data', [])
|
@@ -499,7 +501,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
499
501
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
500
502
|
:returns dict[]: an array of objects representing market data
|
501
503
|
"""
|
502
|
-
|
504
|
+
productsPromise = self.v1PublicGetProducts(params)
|
503
505
|
#
|
504
506
|
# {
|
505
507
|
# "code": 0,
|
@@ -520,7 +522,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
520
522
|
# ]
|
521
523
|
# }
|
522
524
|
#
|
523
|
-
|
525
|
+
cashPromise = self.v1PublicGetCashProducts(params)
|
524
526
|
#
|
525
527
|
# {
|
526
528
|
# "code": 0,
|
@@ -550,7 +552,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
550
552
|
# ]
|
551
553
|
# }
|
552
554
|
#
|
553
|
-
|
555
|
+
perpetualsPromise = self.v2PublicGetFuturesContract(params)
|
554
556
|
#
|
555
557
|
# {
|
556
558
|
# "code": 0,
|
@@ -588,6 +590,7 @@ class ascendex(Exchange, ImplicitAPI):
|
|
588
590
|
# ]
|
589
591
|
# }
|
590
592
|
#
|
593
|
+
products, cash, perpetuals = await asyncio.gather(*[productsPromise, cashPromise, perpetualsPromise])
|
591
594
|
productsData = self.safe_list(products, 'data', [])
|
592
595
|
productsById = self.index_by(productsData, 'symbol')
|
593
596
|
cashData = self.safe_list(cash, 'data', [])
|
ccxt/async_support/bingx.py
CHANGED
@@ -18,6 +18,7 @@ from ccxt.base.errors import ArgumentsRequired
|
|
18
18
|
from ccxt.base.errors import BadRequest
|
19
19
|
from ccxt.base.errors import BadSymbol
|
20
20
|
from ccxt.base.errors import InsufficientFunds
|
21
|
+
from ccxt.base.errors import InvalidOrder
|
21
22
|
from ccxt.base.errors import OrderNotFound
|
22
23
|
from ccxt.base.errors import NotSupported
|
23
24
|
from ccxt.base.errors import OperationFailed
|
@@ -473,6 +474,7 @@ class bingx(Exchange, ImplicitAPI):
|
|
473
474
|
'100419': PermissionDenied, # {"code":100419,"msg":"IP does not match IP whitelist","success":false,"timestamp":1705274099347}
|
474
475
|
'100437': BadRequest, # {"code":100437,"msg":"The withdrawal amount is lower than the minimum limit, please re-enter.","timestamp":1689258588845}
|
475
476
|
'101204': InsufficientFunds, # {"code":101204,"msg":"","data":{}}
|
477
|
+
'110425': InvalidOrder, # {"code":110425,"msg":"Please ensure that the minimum nominal value of the order placed must be greater than 2u","data":{}}
|
476
478
|
},
|
477
479
|
'broad': {},
|
478
480
|
},
|
@@ -2408,6 +2410,7 @@ class bingx(Exchange, ImplicitAPI):
|
|
2408
2410
|
positionSide = None
|
2409
2411
|
hedged = self.safe_bool(params, 'hedged', False)
|
2410
2412
|
if hedged:
|
2413
|
+
params = self.omit(params, 'reduceOnly')
|
2411
2414
|
if reduceOnly:
|
2412
2415
|
positionSide = 'SHORT' if (side == 'buy') else 'LONG'
|
2413
2416
|
else:
|
@@ -2416,7 +2419,7 @@ class bingx(Exchange, ImplicitAPI):
|
|
2416
2419
|
positionSide = 'BOTH'
|
2417
2420
|
request['positionSide'] = positionSide
|
2418
2421
|
request['quantity'] = amount if (market['inverse']) else self.parse_to_numeric(self.amount_to_precision(symbol, amount)) # precision not available for inverse contracts
|
2419
|
-
params = self.omit(params, ['hedged', '
|
2422
|
+
params = self.omit(params, ['hedged', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice', 'trailingAmount', 'trailingPercent', 'trailingType', 'takeProfit', 'stopLoss', 'clientOrderId'])
|
2420
2423
|
return self.extend(request, params)
|
2421
2424
|
|
2422
2425
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
ccxt/async_support/bitfinex.py
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
from ccxt.async_support.base.exchange import Exchange
|
7
7
|
from ccxt.abstract.bitfinex import ImplicitAPI
|
8
|
+
import asyncio
|
8
9
|
import hashlib
|
9
10
|
from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction, TransferEntry
|
10
11
|
from typing import List
|
@@ -565,11 +566,11 @@ class bitfinex(Exchange, ImplicitAPI):
|
|
565
566
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
566
567
|
:returns dict[]: an array of objects representing market data
|
567
568
|
"""
|
568
|
-
|
569
|
+
idsPromise = self.publicGetSymbols()
|
569
570
|
#
|
570
571
|
# ["btcusd", "ltcusd", "ltcbtc"]
|
571
572
|
#
|
572
|
-
|
573
|
+
detailsPromise = self.publicGetSymbolsDetails()
|
573
574
|
#
|
574
575
|
# [
|
575
576
|
# {
|
@@ -584,6 +585,7 @@ class bitfinex(Exchange, ImplicitAPI):
|
|
584
585
|
# },
|
585
586
|
# ]
|
586
587
|
#
|
588
|
+
ids, details = await asyncio.gather(*[idsPromise, detailsPromise])
|
587
589
|
result = []
|
588
590
|
for i in range(0, len(details)):
|
589
591
|
market = details[i]
|
ccxt/async_support/bitfinex2.py
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
from ccxt.async_support.base.exchange import Exchange
|
7
7
|
from ccxt.abstract.bitfinex2 import ImplicitAPI
|
8
|
+
import asyncio
|
8
9
|
import hashlib
|
9
10
|
from ccxt.base.types import Balances, Currencies, Currency, Int, MarginModification, Market, Num, Order, OrderBook, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, TradingFees, Transaction, TransferEntry
|
10
11
|
from typing import List
|
@@ -534,12 +535,13 @@ class bitfinex2(Exchange, ImplicitAPI):
|
|
534
535
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
535
536
|
:returns dict[]: an array of objects representing market data
|
536
537
|
"""
|
537
|
-
|
538
|
-
|
539
|
-
|
540
|
-
futuresMarketsInfo =
|
538
|
+
spotMarketsInfoPromise = self.publicGetConfPubInfoPair(params)
|
539
|
+
futuresMarketsInfoPromise = self.publicGetConfPubInfoPairFutures(params)
|
540
|
+
marginIdsPromise = self.publicGetConfPubListPairMargin(params)
|
541
|
+
spotMarketsInfo, futuresMarketsInfo, marginIds = await asyncio.gather(*[spotMarketsInfoPromise, futuresMarketsInfoPromise, marginIdsPromise])
|
542
|
+
spotMarketsInfo = self.safe_list(spotMarketsInfo, 0, [])
|
543
|
+
futuresMarketsInfo = self.safe_list(futuresMarketsInfo, 0, [])
|
541
544
|
markets = self.array_concat(spotMarketsInfo, futuresMarketsInfo)
|
542
|
-
marginIds = await self.publicGetConfPubListPairMargin(params)
|
543
545
|
marginIds = self.safe_value(marginIds, 0, [])
|
544
546
|
#
|
545
547
|
# [
|
ccxt/async_support/btcturk.py
CHANGED
@@ -7,7 +7,7 @@ from ccxt.async_support.base.exchange import Exchange
|
|
7
7
|
from ccxt.abstract.btcturk import ImplicitAPI
|
8
8
|
import hashlib
|
9
9
|
import math
|
10
|
-
from ccxt.base.types import Balances, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
|
10
|
+
from ccxt.base.types import Balances, Bool, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade
|
11
11
|
from typing import List
|
12
12
|
from ccxt.base.errors import ExchangeError
|
13
13
|
from ccxt.base.errors import BadRequest
|
@@ -621,7 +621,7 @@ class btcturk(Exchange, ImplicitAPI):
|
|
621
621
|
#
|
622
622
|
return self.parse_ohlcvs(response, market, timeframe, since, limit)
|
623
623
|
|
624
|
-
def parse_ohlcvs(self, ohlcvs, market=None, timeframe='1m', since: Int = None, limit: Int = None):
|
624
|
+
def parse_ohlcvs(self, ohlcvs, market=None, timeframe='1m', since: Int = None, limit: Int = None, tail: Bool = False):
|
625
625
|
results = []
|
626
626
|
timestamp = self.safe_value(ohlcvs, 't')
|
627
627
|
high = self.safe_value(ohlcvs, 'h')
|
@@ -640,7 +640,7 @@ class btcturk(Exchange, ImplicitAPI):
|
|
640
640
|
}
|
641
641
|
results.append(self.parse_ohlcv(ohlcv, market))
|
642
642
|
sorted = self.sort_by(results, 0)
|
643
|
-
return self.filter_by_since_limit(sorted, since, limit, 0)
|
643
|
+
return self.filter_by_since_limit(sorted, since, limit, 0, tail)
|
644
644
|
|
645
645
|
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
646
646
|
"""
|
ccxt/async_support/gate.py
CHANGED
@@ -994,8 +994,9 @@ class gate(Exchange, ImplicitAPI):
|
|
994
994
|
return self.array_concat(markets, optionMarkets)
|
995
995
|
|
996
996
|
async def fetch_spot_markets(self, params={}):
|
997
|
-
|
998
|
-
|
997
|
+
marginPromise = self.publicMarginGetCurrencyPairs(params)
|
998
|
+
spotMarketsPromise = self.publicSpotGetCurrencyPairs(params)
|
999
|
+
marginResponse, spotMarketsResponse = await asyncio.gather(*[marginPromise, spotMarketsPromise])
|
999
1000
|
marginMarkets = self.index_by(marginResponse, 'id')
|
1000
1001
|
#
|
1001
1002
|
# Spot
|
ccxt/async_support/gemini.py
CHANGED
@@ -814,8 +814,9 @@ class gemini(Exchange, ImplicitAPI):
|
|
814
814
|
return self.parse_ticker(response, market)
|
815
815
|
|
816
816
|
async def fetch_ticker_v1_and_v2(self, symbol: str, params={}):
|
817
|
-
|
818
|
-
|
817
|
+
tickerPromiseA = self.fetch_ticker_v1(symbol, params)
|
818
|
+
tickerPromiseB = self.fetch_ticker_v2(symbol, params)
|
819
|
+
tickerA, tickerB = await asyncio.gather(*[tickerPromiseA, tickerPromiseB])
|
819
820
|
return self.deep_extend(tickerA, {
|
820
821
|
'open': tickerB['open'],
|
821
822
|
'high': tickerB['high'],
|
@@ -62,7 +62,8 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
62
62
|
'fetchBorrowInterest': False,
|
63
63
|
'fetchBorrowRateHistories': False,
|
64
64
|
'fetchBorrowRateHistory': False,
|
65
|
-
'
|
65
|
+
'fetchCanceledAndClosedOrders': True,
|
66
|
+
'fetchCanceledOrders': True,
|
66
67
|
'fetchClosedOrders': True,
|
67
68
|
'fetchCrossBorrowRate': False,
|
68
69
|
'fetchCrossBorrowRates': False,
|
@@ -95,7 +96,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
95
96
|
'fetchOpenOrders': True,
|
96
97
|
'fetchOrder': True,
|
97
98
|
'fetchOrderBook': True,
|
98
|
-
'fetchOrders':
|
99
|
+
'fetchOrders': True,
|
99
100
|
'fetchOrderTrades': False,
|
100
101
|
'fetchPosition': True,
|
101
102
|
'fetchPositionMode': False,
|
@@ -815,6 +816,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
815
816
|
await self.load_markets()
|
816
817
|
market = self.market(symbol)
|
817
818
|
until = self.safe_integer(params, 'until', self.milliseconds())
|
819
|
+
useTail = (since is None)
|
818
820
|
if since is None:
|
819
821
|
since = 0
|
820
822
|
params = self.omit(params, ['until'])
|
@@ -844,7 +846,7 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
844
846
|
# }
|
845
847
|
# ]
|
846
848
|
#
|
847
|
-
return self.parse_ohlcvs(response, market, timeframe, since, limit)
|
849
|
+
return self.parse_ohlcvs(response, market, timeframe, since, limit, useTail)
|
848
850
|
|
849
851
|
def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
|
850
852
|
#
|
@@ -1645,7 +1647,14 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1645
1647
|
# }
|
1646
1648
|
# ]
|
1647
1649
|
#
|
1648
|
-
|
1650
|
+
orderWithStatus = []
|
1651
|
+
for i in range(0, len(response)):
|
1652
|
+
order = response[i]
|
1653
|
+
extendOrder = {}
|
1654
|
+
if self.safe_string(order, 'status') is None:
|
1655
|
+
extendOrder['ccxtStatus'] = 'open'
|
1656
|
+
orderWithStatus.append(self.extend(order, extendOrder))
|
1657
|
+
return self.parse_orders(orderWithStatus, market, since, limit)
|
1649
1658
|
|
1650
1659
|
async def fetch_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1651
1660
|
"""
|
@@ -1657,8 +1666,53 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1657
1666
|
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
1658
1667
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1659
1668
|
"""
|
1669
|
+
await self.load_markets()
|
1670
|
+
orders = await self.fetch_orders(symbol, None, None, params) # don't filter here because we don't want to catch open orders
|
1671
|
+
closedOrders = self.filter_by_array(orders, 'status', ['closed'], False)
|
1672
|
+
return self.filter_by_symbol_since_limit(closedOrders, symbol, since, limit)
|
1673
|
+
|
1674
|
+
async def fetch_canceled_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1675
|
+
"""
|
1676
|
+
fetch all canceled orders
|
1677
|
+
:param str symbol: unified market symbol
|
1678
|
+
:param int [since]: the earliest time in ms to fetch open orders for
|
1679
|
+
:param int [limit]: the maximum number of open orders structures to retrieve
|
1680
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1681
|
+
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
1682
|
+
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1683
|
+
"""
|
1684
|
+
await self.load_markets()
|
1685
|
+
orders = await self.fetch_orders(symbol, None, None, params) # don't filter here because we don't want to catch open orders
|
1686
|
+
closedOrders = self.filter_by_array(orders, 'status', ['canceled'], False)
|
1687
|
+
return self.filter_by_symbol_since_limit(closedOrders, symbol, since, limit)
|
1688
|
+
|
1689
|
+
async def fetch_canceled_and_closed_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1690
|
+
"""
|
1691
|
+
fetch all closed and canceled orders
|
1692
|
+
:param str symbol: unified market symbol
|
1693
|
+
:param int [since]: the earliest time in ms to fetch open orders for
|
1694
|
+
:param int [limit]: the maximum number of open orders structures to retrieve
|
1695
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1696
|
+
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
1697
|
+
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1698
|
+
"""
|
1699
|
+
await self.load_markets()
|
1700
|
+
orders = await self.fetch_orders(symbol, None, None, params) # don't filter here because we don't want to catch open orders
|
1701
|
+
closedOrders = self.filter_by_array(orders, 'status', ['canceled', 'closed', 'rejected'], False)
|
1702
|
+
return self.filter_by_symbol_since_limit(closedOrders, symbol, since, limit)
|
1703
|
+
|
1704
|
+
async def fetch_orders(self, symbol: Str = None, since: Int = None, limit: Int = None, params={}) -> List[Order]:
|
1705
|
+
"""
|
1706
|
+
fetch all orders
|
1707
|
+
:param str symbol: unified market symbol
|
1708
|
+
:param int [since]: the earliest time in ms to fetch open orders for
|
1709
|
+
:param int [limit]: the maximum number of open orders structures to retrieve
|
1710
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1711
|
+
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
1712
|
+
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1713
|
+
"""
|
1660
1714
|
userAddress = None
|
1661
|
-
userAddress, params = self.handle_public_address('
|
1715
|
+
userAddress, params = self.handle_public_address('fetchOrders', params)
|
1662
1716
|
await self.load_markets()
|
1663
1717
|
market = self.safe_market(symbol)
|
1664
1718
|
request: dict = {
|
@@ -1839,10 +1893,13 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1839
1893
|
market = self.safe_market(marketId, market)
|
1840
1894
|
symbol = market['symbol']
|
1841
1895
|
timestamp = self.safe_integer_2(order, 'timestamp', 'statusTimestamp')
|
1842
|
-
status = self.
|
1896
|
+
status = self.safe_string_2(order, 'status', 'ccxtStatus')
|
1897
|
+
order = self.omit(order, ['ccxtStatus'])
|
1843
1898
|
side = self.safe_string(entry, 'side')
|
1844
1899
|
if side is not None:
|
1845
1900
|
side = 'sell' if (side == 'A') else 'buy'
|
1901
|
+
totalAmount = self.safe_string_2(entry, 'origSz', 'totalSz')
|
1902
|
+
remaining = self.safe_string(entry, 'sz')
|
1846
1903
|
return self.safe_order({
|
1847
1904
|
'info': order,
|
1848
1905
|
'id': self.safe_string(entry, 'oid'),
|
@@ -1857,13 +1914,13 @@ class hyperliquid(Exchange, ImplicitAPI):
|
|
1857
1914
|
'postOnly': None,
|
1858
1915
|
'reduceOnly': self.safe_bool(entry, 'reduceOnly'),
|
1859
1916
|
'side': side,
|
1860
|
-
'price': self.
|
1917
|
+
'price': self.safe_string(entry, 'limitPx'),
|
1861
1918
|
'triggerPrice': self.safe_number(entry, 'triggerPx') if self.safe_bool(entry, 'isTrigger') else None,
|
1862
|
-
'amount':
|
1919
|
+
'amount': totalAmount,
|
1863
1920
|
'cost': None,
|
1864
|
-
'average': self.
|
1865
|
-
'filled':
|
1866
|
-
'remaining':
|
1921
|
+
'average': self.safe_string(entry, 'avgPx'),
|
1922
|
+
'filled': Precise.string_sub(totalAmount, remaining),
|
1923
|
+
'remaining': remaining,
|
1867
1924
|
'status': self.parse_order_status(status),
|
1868
1925
|
'fee': None,
|
1869
1926
|
'trades': None,
|
@@ -5,6 +5,7 @@
|
|
5
5
|
|
6
6
|
from ccxt.async_support.base.exchange import Exchange
|
7
7
|
from ccxt.abstract.independentreserve import ImplicitAPI
|
8
|
+
import asyncio
|
8
9
|
import hashlib
|
9
10
|
from ccxt.base.types import Balances, Currency, Int, Market, Num, Order, OrderBook, OrderSide, OrderType, Str, Ticker, Trade, TradingFees, Transaction
|
10
11
|
from typing import List
|
@@ -154,11 +155,12 @@ class independentreserve(Exchange, ImplicitAPI):
|
|
154
155
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
155
156
|
:returns dict[]: an array of objects representing market data
|
156
157
|
"""
|
157
|
-
|
158
|
+
baseCurrenciesPromise = self.publicGetGetValidPrimaryCurrencyCodes(params)
|
158
159
|
# ['Xbt', 'Eth', 'Usdt', ...]
|
159
|
-
|
160
|
+
quoteCurrenciesPromise = self.publicGetGetValidSecondaryCurrencyCodes(params)
|
160
161
|
# ['Aud', 'Usd', 'Nzd', 'Sgd']
|
161
|
-
|
162
|
+
limitsPromise = self.publicGetGetOrderMinimumVolumes(params)
|
163
|
+
baseCurrencies, quoteCurrencies, limits = await asyncio.gather(*[baseCurrenciesPromise, quoteCurrenciesPromise, limitsPromise])
|
162
164
|
#
|
163
165
|
# {
|
164
166
|
# "Xbt": 0.0001,
|
ccxt/async_support/indodax.py
CHANGED
@@ -831,6 +831,8 @@ class indodax(Exchange, ImplicitAPI):
|
|
831
831
|
elif type == 'limit':
|
832
832
|
priceIsRequired = True
|
833
833
|
quantityIsRequired = True
|
834
|
+
if side == 'buy':
|
835
|
+
request[market['quoteId']] = self.parse_to_numeric(Precise.string_mul(self.number_to_string(amount), self.number_to_string(price)))
|
834
836
|
if priceIsRequired:
|
835
837
|
if price is None:
|
836
838
|
raise InvalidOrder(self.id + ' createOrder() requires a price argument for a ' + type + ' order')
|