ccxt 4.4.41__py2.py3-none-any.whl → 4.4.42__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 +3 -0
- ccxt/abstract/binancecoinm.py +3 -0
- ccxt/abstract/binanceus.py +3 -0
- ccxt/abstract/binanceusdm.py +3 -0
- ccxt/ace.py +1 -1
- ccxt/alpaca.py +0 -1
- ccxt/ascendex.py +0 -1
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/ace.py +1 -1
- ccxt/async_support/alpaca.py +0 -1
- ccxt/async_support/ascendex.py +0 -1
- ccxt/async_support/base/exchange.py +15 -15
- ccxt/async_support/bigone.py +0 -1
- ccxt/async_support/binance.py +3 -0
- ccxt/async_support/bingx.py +2 -0
- ccxt/async_support/bitfinex.py +122 -0
- ccxt/async_support/blofin.py +16 -7
- ccxt/async_support/cex.py +1 -1
- ccxt/async_support/coinbase.py +8 -9
- ccxt/async_support/coinbaseexchange.py +5 -6
- ccxt/async_support/coinbaseinternational.py +7 -8
- ccxt/async_support/coincatch.py +0 -1
- ccxt/async_support/coincheck.py +0 -1
- ccxt/async_support/coinex.py +91 -6
- ccxt/async_support/coinlist.py +3 -4
- ccxt/async_support/coinmate.py +1 -3
- ccxt/async_support/coinmetro.py +4 -5
- ccxt/async_support/coinone.py +0 -1
- ccxt/async_support/coinsph.py +7 -8
- ccxt/async_support/cryptocom.py +3 -0
- ccxt/async_support/currencycom.py +3 -4
- ccxt/async_support/defx.py +6 -7
- ccxt/async_support/deribit.py +1 -3
- ccxt/async_support/digifinex.py +0 -1
- ccxt/async_support/ellipx.py +0 -2
- ccxt/async_support/exmo.py +1 -2
- ccxt/async_support/gate.py +1 -2
- ccxt/async_support/gemini.py +4 -5
- ccxt/async_support/hashkey.py +79 -67
- ccxt/async_support/hitbtc.py +47 -5
- ccxt/async_support/hollaex.py +4 -6
- ccxt/async_support/htx.py +1 -3
- ccxt/async_support/huobijp.py +0 -1
- ccxt/async_support/idex.py +8 -8
- ccxt/async_support/independentreserve.py +0 -1
- ccxt/async_support/indodax.py +0 -1
- ccxt/async_support/kraken.py +63 -3
- ccxt/async_support/krakenfutures.py +75 -3
- ccxt/async_support/kucoin.py +1 -3
- ccxt/async_support/kucoinfutures.py +10 -9
- ccxt/async_support/kuna.py +1 -3
- ccxt/async_support/latoken.py +1 -3
- ccxt/async_support/lbank.py +0 -1
- ccxt/async_support/luno.py +0 -1
- ccxt/async_support/lykke.py +0 -1
- ccxt/async_support/mercado.py +0 -1
- ccxt/async_support/mexc.py +3 -4
- ccxt/async_support/ndax.py +1 -1
- ccxt/async_support/novadax.py +4 -6
- ccxt/async_support/oceanex.py +0 -1
- ccxt/async_support/okcoin.py +1 -3
- ccxt/async_support/okx.py +1 -3
- ccxt/async_support/onetrading.py +1 -3
- ccxt/async_support/p2b.py +1 -1
- ccxt/async_support/paradex.py +5 -7
- ccxt/async_support/phemex.py +8 -10
- ccxt/async_support/poloniex.py +1 -3
- ccxt/async_support/poloniexfutures.py +6 -6
- ccxt/async_support/probit.py +0 -1
- ccxt/async_support/timex.py +0 -1
- ccxt/async_support/tokocrypto.py +11 -14
- ccxt/async_support/tradeogre.py +1 -1
- ccxt/async_support/upbit.py +0 -1
- ccxt/async_support/wavesexchange.py +4 -5
- ccxt/async_support/whitebit.py +8 -9
- ccxt/async_support/woo.py +98 -12
- ccxt/async_support/woofipro.py +96 -15
- ccxt/async_support/xt.py +3 -2
- ccxt/async_support/yobit.py +0 -1
- ccxt/async_support/zaif.py +0 -1
- ccxt/async_support/zonda.py +1 -2
- ccxt/base/exchange.py +21 -17
- ccxt/bigone.py +0 -1
- ccxt/binance.py +3 -0
- ccxt/bingx.py +2 -0
- ccxt/bitfinex.py +122 -0
- ccxt/blofin.py +16 -7
- ccxt/cex.py +1 -1
- ccxt/coinbase.py +8 -9
- ccxt/coinbaseexchange.py +5 -6
- ccxt/coinbaseinternational.py +7 -8
- ccxt/coincatch.py +0 -1
- ccxt/coincheck.py +0 -1
- ccxt/coinex.py +91 -6
- ccxt/coinlist.py +3 -4
- ccxt/coinmate.py +1 -3
- ccxt/coinmetro.py +4 -5
- ccxt/coinone.py +0 -1
- ccxt/coinsph.py +7 -8
- ccxt/cryptocom.py +3 -0
- ccxt/currencycom.py +3 -4
- ccxt/defx.py +6 -7
- ccxt/deribit.py +1 -3
- ccxt/digifinex.py +0 -1
- ccxt/ellipx.py +0 -2
- ccxt/exmo.py +1 -2
- ccxt/gate.py +1 -2
- ccxt/gemini.py +4 -5
- ccxt/hashkey.py +79 -67
- ccxt/hitbtc.py +47 -5
- ccxt/hollaex.py +4 -6
- ccxt/htx.py +1 -3
- ccxt/huobijp.py +0 -1
- ccxt/idex.py +8 -8
- ccxt/independentreserve.py +0 -1
- ccxt/indodax.py +0 -1
- ccxt/kraken.py +63 -3
- ccxt/krakenfutures.py +75 -3
- ccxt/kucoin.py +1 -3
- ccxt/kucoinfutures.py +10 -9
- ccxt/kuna.py +1 -3
- ccxt/latoken.py +1 -3
- ccxt/lbank.py +0 -1
- ccxt/luno.py +0 -1
- ccxt/lykke.py +0 -1
- ccxt/mercado.py +0 -1
- ccxt/mexc.py +3 -4
- ccxt/ndax.py +1 -1
- ccxt/novadax.py +4 -6
- ccxt/oceanex.py +0 -1
- ccxt/okcoin.py +1 -3
- ccxt/okx.py +1 -3
- ccxt/onetrading.py +1 -3
- ccxt/p2b.py +1 -1
- ccxt/paradex.py +5 -7
- ccxt/phemex.py +8 -10
- ccxt/poloniex.py +1 -3
- ccxt/poloniexfutures.py +6 -6
- ccxt/pro/__init__.py +1 -1
- ccxt/probit.py +0 -1
- ccxt/timex.py +0 -1
- ccxt/tokocrypto.py +11 -14
- ccxt/tradeogre.py +1 -1
- ccxt/upbit.py +0 -1
- ccxt/wavesexchange.py +4 -5
- ccxt/whitebit.py +8 -9
- ccxt/woo.py +98 -12
- ccxt/woofipro.py +96 -15
- ccxt/xt.py +3 -2
- ccxt/yobit.py +0 -1
- ccxt/zaif.py +0 -1
- ccxt/zonda.py +1 -2
- {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/METADATA +5 -5
- {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/RECORD +158 -162
- ccxt/bitbay.py +0 -17
- ccxt/bitfinex2.py +0 -3624
- ccxt/hitbtc3.py +0 -16
- ccxt/pro/bitfinex2.py +0 -1086
- {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/WHEEL +0 -0
- {ccxt-4.4.41.dist-info → ccxt-4.4.42.dist-info}/top_level.txt +0 -0
ccxt/base/exchange.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
|
7
|
-
__version__ = '4.4.
|
7
|
+
__version__ = '4.4.42'
|
8
8
|
|
9
9
|
# -----------------------------------------------------------------------------
|
10
10
|
|
@@ -4550,10 +4550,14 @@ class Exchange(object):
|
|
4550
4550
|
|
4551
4551
|
def handle_option_and_params_2(self, params: object, methodName1: str, optionName1: str, optionName2: str, defaultValue=None):
|
4552
4552
|
value = None
|
4553
|
-
value, params = self.handle_option_and_params(params, methodName1, optionName1
|
4553
|
+
value, params = self.handle_option_and_params(params, methodName1, optionName1)
|
4554
|
+
if value is not None:
|
4555
|
+
# omit optionName2 too from params
|
4556
|
+
params = self.omit(params, optionName2)
|
4557
|
+
return [value, params]
|
4554
4558
|
# if still None, try optionName2
|
4555
4559
|
value2 = None
|
4556
|
-
value2, params = self.handle_option_and_params(params, methodName1, optionName2,
|
4560
|
+
value2, params = self.handle_option_and_params(params, methodName1, optionName2, defaultValue)
|
4557
4561
|
return [value2, params]
|
4558
4562
|
|
4559
4563
|
def handle_option(self, methodName: str, optionName: str, defaultValue=None):
|
@@ -5454,44 +5458,44 @@ class Exchange(object):
|
|
5454
5458
|
query = self.extend(params, {'reduceOnly': True})
|
5455
5459
|
return self.create_order_ws(symbol, type, side, amount, price, query)
|
5456
5460
|
|
5457
|
-
def create_stop_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None,
|
5461
|
+
def create_stop_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, triggerPrice: Num = None, params={}):
|
5458
5462
|
if not self.has['createStopOrder']:
|
5459
5463
|
raise NotSupported(self.id + ' createStopOrder() is not supported yet')
|
5460
|
-
if
|
5464
|
+
if triggerPrice is None:
|
5461
5465
|
raise ArgumentsRequired(self.id + ' create_stop_order() requires a stopPrice argument')
|
5462
|
-
query = self.extend(params, {'stopPrice':
|
5466
|
+
query = self.extend(params, {'stopPrice': triggerPrice})
|
5463
5467
|
return self.create_order(symbol, type, side, amount, price, query)
|
5464
5468
|
|
5465
|
-
def create_stop_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None,
|
5469
|
+
def create_stop_order_ws(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, triggerPrice: Num = None, params={}):
|
5466
5470
|
if not self.has['createStopOrderWs']:
|
5467
5471
|
raise NotSupported(self.id + ' createStopOrderWs() is not supported yet')
|
5468
|
-
if
|
5472
|
+
if triggerPrice is None:
|
5469
5473
|
raise ArgumentsRequired(self.id + ' createStopOrderWs() requires a stopPrice argument')
|
5470
|
-
query = self.extend(params, {'stopPrice':
|
5474
|
+
query = self.extend(params, {'stopPrice': triggerPrice})
|
5471
5475
|
return self.create_order_ws(symbol, type, side, amount, price, query)
|
5472
5476
|
|
5473
|
-
def create_stop_limit_order(self, symbol: str, side: OrderSide, amount: float, price: float,
|
5477
|
+
def create_stop_limit_order(self, symbol: str, side: OrderSide, amount: float, price: float, triggerPrice: float, params={}):
|
5474
5478
|
if not self.has['createStopLimitOrder']:
|
5475
5479
|
raise NotSupported(self.id + ' createStopLimitOrder() is not supported yet')
|
5476
|
-
query = self.extend(params, {'stopPrice':
|
5480
|
+
query = self.extend(params, {'stopPrice': triggerPrice})
|
5477
5481
|
return self.create_order(symbol, 'limit', side, amount, price, query)
|
5478
5482
|
|
5479
|
-
def create_stop_limit_order_ws(self, symbol: str, side: OrderSide, amount: float, price: float,
|
5483
|
+
def create_stop_limit_order_ws(self, symbol: str, side: OrderSide, amount: float, price: float, triggerPrice: float, params={}):
|
5480
5484
|
if not self.has['createStopLimitOrderWs']:
|
5481
5485
|
raise NotSupported(self.id + ' createStopLimitOrderWs() is not supported yet')
|
5482
|
-
query = self.extend(params, {'stopPrice':
|
5486
|
+
query = self.extend(params, {'stopPrice': triggerPrice})
|
5483
5487
|
return self.create_order_ws(symbol, 'limit', side, amount, price, query)
|
5484
5488
|
|
5485
|
-
def create_stop_market_order(self, symbol: str, side: OrderSide, amount: float,
|
5489
|
+
def create_stop_market_order(self, symbol: str, side: OrderSide, amount: float, triggerPrice: float, params={}):
|
5486
5490
|
if not self.has['createStopMarketOrder']:
|
5487
5491
|
raise NotSupported(self.id + ' createStopMarketOrder() is not supported yet')
|
5488
|
-
query = self.extend(params, {'stopPrice':
|
5492
|
+
query = self.extend(params, {'stopPrice': triggerPrice})
|
5489
5493
|
return self.create_order(symbol, 'market', side, amount, None, query)
|
5490
5494
|
|
5491
|
-
def create_stop_market_order_ws(self, symbol: str, side: OrderSide, amount: float,
|
5495
|
+
def create_stop_market_order_ws(self, symbol: str, side: OrderSide, amount: float, triggerPrice: float, params={}):
|
5492
5496
|
if not self.has['createStopMarketOrderWs']:
|
5493
5497
|
raise NotSupported(self.id + ' createStopMarketOrderWs() is not supported yet')
|
5494
|
-
query = self.extend(params, {'stopPrice':
|
5498
|
+
query = self.extend(params, {'stopPrice': triggerPrice})
|
5495
5499
|
return self.create_order_ws(symbol, 'market', side, amount, None, query)
|
5496
5500
|
|
5497
5501
|
def safe_currency_code(self, currencyId: Str, currency: Currency = None):
|
ccxt/bigone.py
CHANGED
ccxt/binance.py
CHANGED
@@ -657,6 +657,8 @@ class binance(Exchange, ImplicitAPI):
|
|
657
657
|
'portfolio/bnb-transfer': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
|
658
658
|
'portfolio/repay-futures-switch': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
|
659
659
|
'portfolio/repay-futures-negative-balance': 150, # Weight(IP): 1500 => cost = 0.1 * 1500 = 150
|
660
|
+
'portfolio/mint': 20,
|
661
|
+
'portfolio/redeem': 20,
|
660
662
|
'lending/auto-invest/plan/add': 0.1, # Weight(IP): 1 => cost = 0.1 * 1 = 0.1
|
661
663
|
'lending/auto-invest/plan/edit': 0.1, # Weight(IP): 1 => cost = 0.1 * 1 = 0.1
|
662
664
|
'lending/auto-invest/plan/edit-status': 0.1, # Weight(IP): 1 => cost = 0.1 * 1 = 0.1
|
@@ -985,6 +987,7 @@ class binance(Exchange, ImplicitAPI):
|
|
985
987
|
'block/order/orders': 5,
|
986
988
|
'block/order/execute': 5,
|
987
989
|
'block/user-trades': 5,
|
990
|
+
'blockTrades': 5,
|
988
991
|
},
|
989
992
|
'post': {
|
990
993
|
'order': 1,
|
ccxt/bingx.py
CHANGED
@@ -5344,6 +5344,8 @@ class bingx(Exchange, ImplicitAPI):
|
|
5344
5344
|
elif market['swap']:
|
5345
5345
|
request['endTs'] = now
|
5346
5346
|
if market['spot']:
|
5347
|
+
if limit is not None:
|
5348
|
+
request['limit'] = limit # default 500, maximum 1000
|
5347
5349
|
response = self.spotV1PrivateGetTradeMyTrades(self.extend(request, params))
|
5348
5350
|
data = self.safe_dict(response, 'data', {})
|
5349
5351
|
fills = self.safe_list(data, 'fills', [])
|
ccxt/bitfinex.py
CHANGED
@@ -100,6 +100,7 @@ class bitfinex(Exchange, ImplicitAPI):
|
|
100
100
|
'fetchOHLCV': True,
|
101
101
|
'fetchOpenInterest': True,
|
102
102
|
'fetchOpenInterestHistory': True,
|
103
|
+
'fetchOpenInterests': True,
|
103
104
|
'fetchOpenOrder': True,
|
104
105
|
'fetchOpenOrders': True,
|
105
106
|
'fetchOrder': True,
|
@@ -419,6 +420,75 @@ class bitfinex(Exchange, ImplicitAPI):
|
|
419
420
|
'TETHERUSE': 'ERC20',
|
420
421
|
},
|
421
422
|
},
|
423
|
+
'features': {
|
424
|
+
'default': {
|
425
|
+
'sandbox': False,
|
426
|
+
'createOrder': {
|
427
|
+
'marginMode': True,
|
428
|
+
'triggerPrice': True,
|
429
|
+
'triggerPriceType': None,
|
430
|
+
'triggerDirection': False,
|
431
|
+
'stopLossPrice': True,
|
432
|
+
'takeProfitPrice': True,
|
433
|
+
'attachedStopLossTakeProfit': None,
|
434
|
+
'timeInForce': {
|
435
|
+
'IOC': True,
|
436
|
+
'FOK': True,
|
437
|
+
'PO': True,
|
438
|
+
'GTD': False,
|
439
|
+
},
|
440
|
+
'hedged': False,
|
441
|
+
'trailing': True, # todo: unify
|
442
|
+
# todo: leverage unify
|
443
|
+
},
|
444
|
+
'createOrders': {
|
445
|
+
'max': 75,
|
446
|
+
},
|
447
|
+
'fetchMyTrades': {
|
448
|
+
'marginMode': False,
|
449
|
+
'limit': 2500,
|
450
|
+
'daysBack': None,
|
451
|
+
'untilDays': 100000, # todo: implement
|
452
|
+
},
|
453
|
+
'fetchOrder': {
|
454
|
+
'marginMode': False,
|
455
|
+
'trigger': False,
|
456
|
+
'trailing': False,
|
457
|
+
},
|
458
|
+
'fetchOpenOrders': {
|
459
|
+
'marginMode': False,
|
460
|
+
'limit': None,
|
461
|
+
'trigger': False,
|
462
|
+
'trailing': False,
|
463
|
+
},
|
464
|
+
'fetchOrders': None,
|
465
|
+
'fetchClosedOrders': {
|
466
|
+
'marginMode': False,
|
467
|
+
'limit': None,
|
468
|
+
'daysBackClosed': None,
|
469
|
+
'daysBackCanceled': None,
|
470
|
+
'untilDays': 100000,
|
471
|
+
'trigger': False,
|
472
|
+
'trailing': False,
|
473
|
+
},
|
474
|
+
'fetchOHLCV': {
|
475
|
+
'limit': 10000,
|
476
|
+
},
|
477
|
+
},
|
478
|
+
'spot': {
|
479
|
+
'extends': 'default',
|
480
|
+
},
|
481
|
+
'swap': {
|
482
|
+
'linear': {
|
483
|
+
'extends': 'default',
|
484
|
+
},
|
485
|
+
'inverse': None,
|
486
|
+
},
|
487
|
+
'future': {
|
488
|
+
'linear': None,
|
489
|
+
'inverse': None,
|
490
|
+
},
|
491
|
+
},
|
422
492
|
'exceptions': {
|
423
493
|
'exact': {
|
424
494
|
'11010': RateLimitExceeded,
|
@@ -3116,6 +3186,58 @@ class bitfinex(Exchange, ImplicitAPI):
|
|
3116
3186
|
'previousFundingDatetime': None,
|
3117
3187
|
}
|
3118
3188
|
|
3189
|
+
def fetch_open_interests(self, symbols: Strings = None, params={}):
|
3190
|
+
"""
|
3191
|
+
Retrieves the open interest for a list of symbols
|
3192
|
+
|
3193
|
+
https://docs.bitfinex.com/reference/rest-public-derivatives-status
|
3194
|
+
|
3195
|
+
:param str[] [symbols]: a list of unified CCXT market symbols
|
3196
|
+
:param dict [params]: exchange specific parameters
|
3197
|
+
:returns dict[]: a list of `open interest structures <https://docs.ccxt.com/#/?id=open-interest-structure>`
|
3198
|
+
"""
|
3199
|
+
self.load_markets()
|
3200
|
+
symbols = self.market_symbols(symbols)
|
3201
|
+
marketIds = ['ALL']
|
3202
|
+
if symbols is not None:
|
3203
|
+
marketIds = self.market_ids(symbols)
|
3204
|
+
request: dict = {
|
3205
|
+
'keys': ','.join(marketIds),
|
3206
|
+
}
|
3207
|
+
response = self.publicGetStatusDeriv(self.extend(request, params))
|
3208
|
+
#
|
3209
|
+
# [
|
3210
|
+
# [
|
3211
|
+
# "tXRPF0:USTF0", # market id
|
3212
|
+
# 1706256986000, # millisecond timestamp
|
3213
|
+
# null,
|
3214
|
+
# 0.512705, # derivative mid price
|
3215
|
+
# 0.512395, # underlying spot mid price
|
3216
|
+
# null,
|
3217
|
+
# 37671483.04, # insurance fund balance
|
3218
|
+
# null,
|
3219
|
+
# 1706284800000, # timestamp of next funding
|
3220
|
+
# 0.00002353, # accrued funding for next period
|
3221
|
+
# 317, # next funding step
|
3222
|
+
# null,
|
3223
|
+
# 0, # current funding
|
3224
|
+
# null,
|
3225
|
+
# null,
|
3226
|
+
# 0.5123016, # mark price
|
3227
|
+
# null,
|
3228
|
+
# null,
|
3229
|
+
# 2233562.03115, # open interest in contracts
|
3230
|
+
# null,
|
3231
|
+
# null,
|
3232
|
+
# null,
|
3233
|
+
# 0.0005, # average spread without funding payment
|
3234
|
+
# 0.0025 # funding payment cap
|
3235
|
+
# ]
|
3236
|
+
# ]
|
3237
|
+
#
|
3238
|
+
result = self.parse_open_interests(response)
|
3239
|
+
return self.filter_by_array(result, 'symbol', symbols)
|
3240
|
+
|
3119
3241
|
def fetch_open_interest(self, symbol: str, params={}):
|
3120
3242
|
"""
|
3121
3243
|
retrieves the open interest of a contract trading pair
|
ccxt/blofin.py
CHANGED
@@ -167,7 +167,7 @@ class blofin(Exchange, ImplicitAPI):
|
|
167
167
|
'rest': 'https://openapi.blofin.com',
|
168
168
|
},
|
169
169
|
'referral': {
|
170
|
-
'url': 'https://blofin.com/register?referral_code=
|
170
|
+
'url': 'https://blofin.com/register?referral_code=f79EsS',
|
171
171
|
'discount': 0.05,
|
172
172
|
},
|
173
173
|
'www': 'https://www.blofin.com',
|
@@ -287,10 +287,18 @@ class blofin(Exchange, ImplicitAPI):
|
|
287
287
|
'brokerId': 'ec6dd3a7dd982d0b',
|
288
288
|
'accountsByType': {
|
289
289
|
'swap': 'futures',
|
290
|
+
'funding': 'funding',
|
290
291
|
'future': 'futures',
|
292
|
+
'copy_trading': 'copy_trading',
|
293
|
+
'earn': 'earn',
|
294
|
+
'spot': 'spot',
|
291
295
|
},
|
292
296
|
'accountsById': {
|
297
|
+
'funding': 'funding',
|
293
298
|
'futures': 'swap',
|
299
|
+
'copy_trading': 'copy_trading',
|
300
|
+
'earn': 'earn',
|
301
|
+
'spot': 'spot',
|
294
302
|
},
|
295
303
|
'sandboxMode': False,
|
296
304
|
'defaultNetwork': 'ERC20',
|
@@ -873,8 +881,9 @@ class blofin(Exchange, ImplicitAPI):
|
|
873
881
|
entry = self.safe_dict(data, 0, {})
|
874
882
|
return self.parse_funding_rate(entry, market)
|
875
883
|
|
876
|
-
def parse_balance_by_type(self,
|
877
|
-
|
884
|
+
def parse_balance_by_type(self, response):
|
885
|
+
data = self.safe_list(response, 'data')
|
886
|
+
if (data is not None) and isinstance(data, list):
|
878
887
|
return self.parse_funding_balance(response)
|
879
888
|
else:
|
880
889
|
return self.parse_balance(response)
|
@@ -986,19 +995,19 @@ class blofin(Exchange, ImplicitAPI):
|
|
986
995
|
:returns dict: a `balance structure <https://docs.ccxt.com/#/?id=balance-structure>`
|
987
996
|
"""
|
988
997
|
self.load_markets()
|
989
|
-
accountType =
|
990
|
-
params = self.
|
998
|
+
accountType = None
|
999
|
+
accountType, params = self.handle_option_and_params_2(params, 'fetchBalance', 'accountType', 'type')
|
991
1000
|
request: dict = {
|
992
1001
|
}
|
993
1002
|
response = None
|
994
|
-
if accountType is not None:
|
1003
|
+
if accountType is not None and accountType != 'swap':
|
995
1004
|
options = self.safe_dict(self.options, 'accountsByType', {})
|
996
1005
|
parsedAccountType = self.safe_string(options, accountType, accountType)
|
997
1006
|
request['accountType'] = parsedAccountType
|
998
1007
|
response = self.privateGetAssetBalances(self.extend(request, params))
|
999
1008
|
else:
|
1000
1009
|
response = self.privateGetAccountBalance(self.extend(request, params))
|
1001
|
-
return self.parse_balance_by_type(
|
1010
|
+
return self.parse_balance_by_type(response)
|
1002
1011
|
|
1003
1012
|
def create_order_request(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, params={}):
|
1004
1013
|
market = self.market(symbol)
|
ccxt/cex.py
CHANGED
@@ -1066,7 +1066,7 @@ class cex(Exchange, ImplicitAPI):
|
|
1066
1066
|
'postOnly': None,
|
1067
1067
|
'side': self.safe_string_lower(order, 'side'),
|
1068
1068
|
'price': self.safe_number(order, 'price'),
|
1069
|
-
'
|
1069
|
+
'triggerPrice': self.safe_number(order, 'stopPrice'),
|
1070
1070
|
'amount': requestedBase,
|
1071
1071
|
'cost': executedQuote,
|
1072
1072
|
'average': self.safe_number(order, 'averagePrice'),
|
ccxt/coinbase.py
CHANGED
@@ -2809,10 +2809,10 @@ class coinbase(Exchange, ImplicitAPI):
|
|
2809
2809
|
'product_id': market['id'],
|
2810
2810
|
'side': side.upper(),
|
2811
2811
|
}
|
2812
|
-
|
2812
|
+
triggerPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
|
2813
2813
|
stopLossPrice = self.safe_number(params, 'stopLossPrice')
|
2814
2814
|
takeProfitPrice = self.safe_number(params, 'takeProfitPrice')
|
2815
|
-
isStop =
|
2815
|
+
isStop = triggerPrice is not None
|
2816
2816
|
isStopLoss = stopLossPrice is not None
|
2817
2817
|
isTakeProfit = takeProfitPrice is not None
|
2818
2818
|
timeInForce = self.safe_string(params, 'timeInForce')
|
@@ -2830,7 +2830,7 @@ class coinbase(Exchange, ImplicitAPI):
|
|
2830
2830
|
'stop_limit_stop_limit_gtd': {
|
2831
2831
|
'base_size': self.amount_to_precision(symbol, amount),
|
2832
2832
|
'limit_price': self.price_to_precision(symbol, price),
|
2833
|
-
'stop_price': self.price_to_precision(symbol,
|
2833
|
+
'stop_price': self.price_to_precision(symbol, triggerPrice),
|
2834
2834
|
'stop_direction': stopDirection,
|
2835
2835
|
'end_time': endTime,
|
2836
2836
|
},
|
@@ -2840,25 +2840,25 @@ class coinbase(Exchange, ImplicitAPI):
|
|
2840
2840
|
'stop_limit_stop_limit_gtc': {
|
2841
2841
|
'base_size': self.amount_to_precision(symbol, amount),
|
2842
2842
|
'limit_price': self.price_to_precision(symbol, price),
|
2843
|
-
'stop_price': self.price_to_precision(symbol,
|
2843
|
+
'stop_price': self.price_to_precision(symbol, triggerPrice),
|
2844
2844
|
'stop_direction': stopDirection,
|
2845
2845
|
},
|
2846
2846
|
}
|
2847
2847
|
elif isStopLoss or isTakeProfit:
|
2848
|
-
|
2848
|
+
tpslPrice = None
|
2849
2849
|
if isStopLoss:
|
2850
2850
|
if stopDirection is None:
|
2851
2851
|
stopDirection = 'STOP_DIRECTION_STOP_UP' if (side == 'buy') else 'STOP_DIRECTION_STOP_DOWN'
|
2852
|
-
|
2852
|
+
tpslPrice = self.price_to_precision(symbol, stopLossPrice)
|
2853
2853
|
else:
|
2854
2854
|
if stopDirection is None:
|
2855
2855
|
stopDirection = 'STOP_DIRECTION_STOP_DOWN' if (side == 'buy') else 'STOP_DIRECTION_STOP_UP'
|
2856
|
-
|
2856
|
+
tpslPrice = self.price_to_precision(symbol, takeProfitPrice)
|
2857
2857
|
request['order_configuration'] = {
|
2858
2858
|
'stop_limit_stop_limit_gtc': {
|
2859
2859
|
'base_size': self.amount_to_precision(symbol, amount),
|
2860
2860
|
'limit_price': self.price_to_precision(symbol, price),
|
2861
|
-
'stop_price':
|
2861
|
+
'stop_price': tpslPrice,
|
2862
2862
|
'stop_direction': stopDirection,
|
2863
2863
|
},
|
2864
2864
|
}
|
@@ -3109,7 +3109,6 @@ class coinbase(Exchange, ImplicitAPI):
|
|
3109
3109
|
'postOnly': postOnly,
|
3110
3110
|
'side': self.safe_string_lower(order, 'side'),
|
3111
3111
|
'price': price,
|
3112
|
-
'stopPrice': triggerPrice,
|
3113
3112
|
'triggerPrice': triggerPrice,
|
3114
3113
|
'amount': amount,
|
3115
3114
|
'filled': self.safe_string(order, 'filled_size'),
|
ccxt/coinbaseexchange.py
CHANGED
@@ -1042,7 +1042,7 @@ class coinbaseexchange(Exchange, ImplicitAPI):
|
|
1042
1042
|
side = self.safe_string(order, 'side')
|
1043
1043
|
timeInForce = self.safe_string(order, 'time_in_force')
|
1044
1044
|
postOnly = self.safe_value(order, 'post_only')
|
1045
|
-
|
1045
|
+
triggerPrice = self.safe_number(order, 'stop_price')
|
1046
1046
|
clientOrderId = self.safe_string(order, 'client_oid')
|
1047
1047
|
return self.safe_order({
|
1048
1048
|
'id': id,
|
@@ -1058,8 +1058,7 @@ class coinbaseexchange(Exchange, ImplicitAPI):
|
|
1058
1058
|
'postOnly': postOnly,
|
1059
1059
|
'side': side,
|
1060
1060
|
'price': price,
|
1061
|
-
'
|
1062
|
-
'triggerPrice': stopPrice,
|
1061
|
+
'triggerPrice': triggerPrice,
|
1063
1062
|
'cost': cost,
|
1064
1063
|
'amount': amount,
|
1065
1064
|
'filled': filled,
|
@@ -1224,9 +1223,9 @@ class coinbaseexchange(Exchange, ImplicitAPI):
|
|
1224
1223
|
clientOrderId = self.safe_string_2(params, 'clientOrderId', 'client_oid')
|
1225
1224
|
if clientOrderId is not None:
|
1226
1225
|
request['client_oid'] = clientOrderId
|
1227
|
-
|
1228
|
-
if
|
1229
|
-
request['stop_price'] = self.price_to_precision(symbol,
|
1226
|
+
triggerPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
|
1227
|
+
if triggerPrice is not None:
|
1228
|
+
request['stop_price'] = self.price_to_precision(symbol, triggerPrice)
|
1230
1229
|
timeInForce = self.safe_string_2(params, 'timeInForce', 'time_in_force')
|
1231
1230
|
if timeInForce is not None:
|
1232
1231
|
request['time_in_force'] = timeInForce
|
ccxt/coinbaseinternational.py
CHANGED
@@ -1630,7 +1630,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
|
|
1630
1630
|
:param float amount: how much you want to trade in units of the base currency, quote currency for 'market' 'buy' orders
|
1631
1631
|
:param float [price]: the price to fulfill the order, in units of the quote currency, ignored in market orders
|
1632
1632
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1633
|
-
:param float [params.stopPrice]:
|
1633
|
+
:param float [params.stopPrice]: alias for triggerPrice
|
1634
1634
|
:param float [params.triggerPrice]: price to trigger stop orders
|
1635
1635
|
:param float [params.stopLossPrice]: price to trigger stop-loss orders
|
1636
1636
|
:param bool [params.postOnly]: True or False
|
@@ -1642,7 +1642,7 @@ class coinbaseinternational(Exchange, ImplicitAPI):
|
|
1642
1642
|
self.load_markets()
|
1643
1643
|
market = self.market(symbol)
|
1644
1644
|
typeId = type.upper()
|
1645
|
-
|
1645
|
+
triggerPrice = self.safe_number_n(params, ['triggerPrice', 'stopPrice', 'stop_price'])
|
1646
1646
|
clientOrderIdprefix = self.safe_string(self.options, 'brokerId', 'nfqkvdjp')
|
1647
1647
|
clientOrderId = clientOrderIdprefix + '-' + self.uuid()
|
1648
1648
|
clientOrderId = clientOrderId[0:17]
|
@@ -1652,12 +1652,12 @@ class coinbaseinternational(Exchange, ImplicitAPI):
|
|
1652
1652
|
'instrument': market['id'],
|
1653
1653
|
'size': self.amount_to_precision(market['symbol'], amount),
|
1654
1654
|
}
|
1655
|
-
if
|
1655
|
+
if triggerPrice is not None:
|
1656
1656
|
if type == 'limit':
|
1657
1657
|
typeId = 'STOP_LIMIT'
|
1658
1658
|
else:
|
1659
1659
|
typeId = 'STOP'
|
1660
|
-
request['stop_price'] =
|
1660
|
+
request['stop_price'] = triggerPrice
|
1661
1661
|
request['type'] = typeId
|
1662
1662
|
if type == 'limit':
|
1663
1663
|
if price is None:
|
@@ -1751,7 +1751,6 @@ class coinbaseinternational(Exchange, ImplicitAPI):
|
|
1751
1751
|
'postOnly': None,
|
1752
1752
|
'side': self.safe_string_lower(order, 'side'),
|
1753
1753
|
'price': self.safe_string(order, 'price'),
|
1754
|
-
'stopPrice': self.safe_string(order, 'stop_price'),
|
1755
1754
|
'triggerPrice': self.safe_string(order, 'stop_price'),
|
1756
1755
|
'amount': self.safe_string(order, 'size'),
|
1757
1756
|
'filled': self.safe_string(order, 'exec_qty'),
|
@@ -1885,9 +1884,9 @@ class coinbaseinternational(Exchange, ImplicitAPI):
|
|
1885
1884
|
request['size'] = self.amount_to_precision(symbol, amount)
|
1886
1885
|
if price is not None:
|
1887
1886
|
request['price'] = self.price_to_precision(symbol, price)
|
1888
|
-
|
1889
|
-
if
|
1890
|
-
request['stop_price'] =
|
1887
|
+
triggerPrice = self.safe_number_n(params, ['stopPrice', 'stop_price', 'triggerPrice'])
|
1888
|
+
if triggerPrice is not None:
|
1889
|
+
request['stop_price'] = triggerPrice
|
1891
1890
|
clientOrderId = self.safe_string_2(params, 'client_order_id', 'clientOrderId')
|
1892
1891
|
if clientOrderId is None:
|
1893
1892
|
raise BadRequest(self.id + ' editOrder() requires a clientOrderId parameter')
|
ccxt/coincatch.py
CHANGED
@@ -3907,7 +3907,6 @@ class coincatch(Exchange, ImplicitAPI):
|
|
3907
3907
|
'amount': amount,
|
3908
3908
|
'filled': self.safe_string_2(order, 'fillQuantity', 'filledQty'),
|
3909
3909
|
'remaining': None,
|
3910
|
-
'stopPrice': None,
|
3911
3910
|
'triggerPrice': triggerPrice,
|
3912
3911
|
'takeProfitPrice': takeProfitPrice,
|
3913
3912
|
'stopLossPrice': stopLossPrice,
|
ccxt/coincheck.py
CHANGED
ccxt/coinex.py
CHANGED
@@ -513,6 +513,92 @@ class coinex(Exchange, ImplicitAPI):
|
|
513
513
|
# CSC, AE, BASE, AIPG, AKASH, POLKADOTASSETHUB ?, ALEO, STX, ALGO, ALPH, BLAST, AR, ARCH, ARDR, ARK, ARRR, MANTA, NTRN, LUNA, AURORA, AVAIL, ASC20, AVA, AYA, AZERO, BAN, BAND, BB, RUNES, BEAM, BELLSCOIN, BITCI, NEAR, AGORIC, BLOCX, BNC, BOBA, BRISE, KRC20, CANTO, CAPS, CCD, CELO, CFX, CHI, CKB, CLORE, CLV, CORE, CSPR, CTXC, DAG, DCR, DERO, DESO, DEFI, DGB, DNX, DOCK, DOGECHAIN, DYDX, DYMENSION, EGLD, ELA, ELF, ENJIN, EOSIO, ERG, ETN_SC, EVMOS, EWC, SGB, FACT, FB, FET, FIO, FIRO, NEO3, FLOW, FLARE, FLUX, LINEA, FREN, FSN, FB_BRC20, GLMR, GRIN, GRS, HACASH, HBAR, HERB, HIVE, MAPO, HMND, HNS, ZKSYNC, HTR, HUAHUA, MERLIN, ICP, ICX, INJ, IOST, IOTA, IOTX, IRIS, IRON, ONE, JOYSTREAM, KAI, KAR, KAS, KAVA, KCN, KDA, KLAY, KLY, KMD, KSM, KUB, KUJIRA, LAT, LBC, LUNC, LUKSO, MARS, METIS, MINA, MANTLE, MOB, MODE, MONA, MOVR, MTL, NEOX, NEXA, NIBI, NIMIQ, NMC, ONOMY, NRG, WAVES, NULS, OAS, OCTA, OLT, ONT, OORT, ORAI, OSMO, P3D, COMPOSABLE, PIVX, RON, POKT, POLYMESH, PRE_MARKET, PYI, QKC, QTUM, QUBIC, RSK, ROSE, ROUTE, RTM, THORCHAIN, RVN, RADIANT, SAGA, SALVIUM, SATOX, SC, SCP, _NULL, SCRT, SDN, RGBPP, SELF, SMH, SPACE, STARGAZE, STC, STEEM, STRATISEVM, STRD, STARKNET, SXP, SYS, TAIKO, TAO, TARA, TENET, THETA, TT, VENOM, VECHAIN, TOMO, VITE, VLX, VSYS, VTC, WAN, WAXP, WEMIX, XCH, XDC, XEC, XELIS, NEM, XHV, XLM, XNA, NANO, XPLA, XPR, XPRT, XRD, XTZ, XVG, XYM, ZANO, ZEC, ZEN, ZEPH, ZETA
|
514
514
|
},
|
515
515
|
},
|
516
|
+
'features': {
|
517
|
+
'spot': {
|
518
|
+
'sandbox': False,
|
519
|
+
'createOrder': {
|
520
|
+
'marginMode': True,
|
521
|
+
'triggerPrice': True,
|
522
|
+
'triggerPriceType': None,
|
523
|
+
'triggerDirection': False,
|
524
|
+
'stopLossPrice': False, # todo
|
525
|
+
'takeProfitPrice': False, # todo
|
526
|
+
'attachedStopLossTakeProfit': None,
|
527
|
+
'timeInForce': {
|
528
|
+
'IOC': True,
|
529
|
+
'FOK': True,
|
530
|
+
'PO': True,
|
531
|
+
'GTD': False,
|
532
|
+
},
|
533
|
+
'hedged': False,
|
534
|
+
'trailing': False,
|
535
|
+
# exchange-supported features
|
536
|
+
# 'marketBuyRequiresPrice': True,
|
537
|
+
# 'marketBuyByCost': True,
|
538
|
+
# 'selfTradePrevention': True,
|
539
|
+
# 'iceberg': True,
|
540
|
+
},
|
541
|
+
'createOrders': {
|
542
|
+
'max': 5,
|
543
|
+
},
|
544
|
+
'fetchMyTrades': {
|
545
|
+
'marginMode': True,
|
546
|
+
'limit': 1000,
|
547
|
+
'daysBack': None,
|
548
|
+
'untilDays': 100000,
|
549
|
+
},
|
550
|
+
'fetchOrder': {
|
551
|
+
'marginMode': False,
|
552
|
+
'trigger': False,
|
553
|
+
'trailing': False,
|
554
|
+
},
|
555
|
+
'fetchOpenOrders': {
|
556
|
+
'marginMode': True,
|
557
|
+
'limit': 1000,
|
558
|
+
'trigger': True,
|
559
|
+
'trailing': False,
|
560
|
+
},
|
561
|
+
'fetchOrders': None,
|
562
|
+
'fetchClosedOrders': {
|
563
|
+
'marginMode': True,
|
564
|
+
'limit': 1000,
|
565
|
+
'daysBackClosed': None,
|
566
|
+
'daysBackCanceled': None,
|
567
|
+
'untilDays': None,
|
568
|
+
'trigger': True,
|
569
|
+
'trailing': False,
|
570
|
+
},
|
571
|
+
'fetchOHLCV': {
|
572
|
+
'limit': 1000,
|
573
|
+
},
|
574
|
+
},
|
575
|
+
'forDerivatives': {
|
576
|
+
'extends': 'spot',
|
577
|
+
'createOrder': {
|
578
|
+
'marginMode': True,
|
579
|
+
'stopLossPrice': True,
|
580
|
+
'takeProfitPrice': True,
|
581
|
+
},
|
582
|
+
'fetchOpenOrders': {
|
583
|
+
'marginMode': False,
|
584
|
+
},
|
585
|
+
'fetchClosedOrders': {
|
586
|
+
'marginMode': False,
|
587
|
+
},
|
588
|
+
},
|
589
|
+
'swap': {
|
590
|
+
'linear': {
|
591
|
+
'extends': 'forDerivatives',
|
592
|
+
},
|
593
|
+
'inverse': {
|
594
|
+
'extends': 'forDerivatives',
|
595
|
+
},
|
596
|
+
},
|
597
|
+
'future': {
|
598
|
+
'linear': None,
|
599
|
+
'inverse': None,
|
600
|
+
},
|
601
|
+
},
|
516
602
|
'commonCurrencies': {
|
517
603
|
'ACM': 'Actinium',
|
518
604
|
},
|
@@ -1977,7 +2063,6 @@ class coinex(Exchange, ImplicitAPI):
|
|
1977
2063
|
'reduceOnly': None,
|
1978
2064
|
'side': side,
|
1979
2065
|
'price': self.safe_string(order, 'price'),
|
1980
|
-
'stopPrice': self.safe_string(order, 'trigger_price'),
|
1981
2066
|
'triggerPrice': self.safe_string(order, 'trigger_price'),
|
1982
2067
|
'takeProfitPrice': self.safe_number(order, 'take_profit_price'),
|
1983
2068
|
'stopLossPrice': self.safe_number(order, 'stop_loss_price'),
|
@@ -2017,7 +2102,7 @@ class coinex(Exchange, ImplicitAPI):
|
|
2017
2102
|
market = self.market(symbol)
|
2018
2103
|
swap = market['swap']
|
2019
2104
|
clientOrderId = self.safe_string_2(params, 'client_id', 'clientOrderId')
|
2020
|
-
|
2105
|
+
triggerPrice = self.safe_string_2(params, 'stopPrice', 'triggerPrice')
|
2021
2106
|
stopLossPrice = self.safe_string(params, 'stopLossPrice')
|
2022
2107
|
takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
|
2023
2108
|
option = self.safe_string(params, 'option')
|
@@ -2062,8 +2147,8 @@ class coinex(Exchange, ImplicitAPI):
|
|
2062
2147
|
request['take_profit_type'] = self.safe_string(params, 'stop_type', 'latest_price')
|
2063
2148
|
else:
|
2064
2149
|
request['amount'] = self.amount_to_precision(symbol, amount)
|
2065
|
-
if
|
2066
|
-
request['trigger_price'] = self.price_to_precision(symbol,
|
2150
|
+
if triggerPrice is not None:
|
2151
|
+
request['trigger_price'] = self.price_to_precision(symbol, triggerPrice)
|
2067
2152
|
request['trigger_price_type'] = self.safe_string(params, 'stop_type', 'latest_price')
|
2068
2153
|
else:
|
2069
2154
|
marginMode = None
|
@@ -2090,8 +2175,8 @@ class coinex(Exchange, ImplicitAPI):
|
|
2090
2175
|
request['amount'] = self.cost_to_precision(symbol, amount)
|
2091
2176
|
else:
|
2092
2177
|
request['amount'] = self.amount_to_precision(symbol, amount)
|
2093
|
-
if
|
2094
|
-
request['trigger_price'] = self.price_to_precision(symbol,
|
2178
|
+
if triggerPrice is not None:
|
2179
|
+
request['trigger_price'] = self.price_to_precision(symbol, triggerPrice)
|
2095
2180
|
params = self.omit(params, ['reduceOnly', 'timeInForce', 'postOnly', 'stopPrice', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice'])
|
2096
2181
|
return self.extend(request, params)
|
2097
2182
|
|