ccxt 4.3.11__py2.py3-none-any.whl → 4.3.13__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. ccxt/__init__.py +1 -1
  2. ccxt/abstract/bybit.py +1 -0
  3. ccxt/async_support/__init__.py +1 -1
  4. ccxt/async_support/base/exchange.py +1 -1
  5. ccxt/async_support/bigone.py +22 -22
  6. ccxt/async_support/binance.py +7 -7
  7. ccxt/async_support/bingx.py +2 -2
  8. ccxt/async_support/bitget.py +10 -8
  9. ccxt/async_support/bitmart.py +7 -11
  10. ccxt/async_support/bitmex.py +2 -2
  11. ccxt/async_support/bybit.py +76 -65
  12. ccxt/async_support/coinbase.py +8 -8
  13. ccxt/async_support/coinbaseinternational.py +2 -2
  14. ccxt/async_support/coinex.py +501 -445
  15. ccxt/async_support/coinlist.py +12 -12
  16. ccxt/async_support/coinmetro.py +2 -2
  17. ccxt/async_support/cryptocom.py +16 -16
  18. ccxt/async_support/digifinex.py +3 -3
  19. ccxt/async_support/gate.py +2 -2
  20. ccxt/async_support/hitbtc.py +3 -3
  21. ccxt/async_support/htx.py +6 -9
  22. ccxt/async_support/indodax.py +2 -2
  23. ccxt/async_support/kraken.py +3 -1
  24. ccxt/async_support/kucoin.py +4 -4
  25. ccxt/async_support/kucoinfutures.py +6 -6
  26. ccxt/async_support/mexc.py +5 -5
  27. ccxt/async_support/okx.py +9 -9
  28. ccxt/async_support/poloniexfutures.py +4 -4
  29. ccxt/async_support/probit.py +2 -2
  30. ccxt/async_support/whitebit.py +72 -1
  31. ccxt/async_support/woo.py +2 -2
  32. ccxt/base/exchange.py +14 -2
  33. ccxt/base/types.py +25 -0
  34. ccxt/bigone.py +22 -22
  35. ccxt/binance.py +7 -7
  36. ccxt/bingx.py +2 -2
  37. ccxt/bitget.py +10 -8
  38. ccxt/bitmart.py +7 -11
  39. ccxt/bitmex.py +2 -2
  40. ccxt/bybit.py +76 -65
  41. ccxt/coinbase.py +8 -8
  42. ccxt/coinbaseinternational.py +2 -2
  43. ccxt/coinex.py +501 -445
  44. ccxt/coinlist.py +12 -12
  45. ccxt/coinmetro.py +2 -2
  46. ccxt/cryptocom.py +16 -16
  47. ccxt/digifinex.py +3 -3
  48. ccxt/gate.py +2 -2
  49. ccxt/hitbtc.py +3 -3
  50. ccxt/htx.py +6 -9
  51. ccxt/indodax.py +2 -2
  52. ccxt/kraken.py +3 -1
  53. ccxt/kucoin.py +4 -4
  54. ccxt/kucoinfutures.py +6 -6
  55. ccxt/mexc.py +5 -5
  56. ccxt/okx.py +9 -9
  57. ccxt/poloniexfutures.py +4 -4
  58. ccxt/pro/__init__.py +1 -1
  59. ccxt/pro/bitget.py +139 -87
  60. ccxt/pro/bybit.py +192 -12
  61. ccxt/pro/coinbase.py +90 -20
  62. ccxt/pro/mexc.py +21 -1
  63. ccxt/probit.py +2 -2
  64. ccxt/test/base/test_datetime.py +6 -0
  65. ccxt/test/base/test_ledger_entry.py +2 -2
  66. ccxt/whitebit.py +72 -1
  67. ccxt/woo.py +2 -2
  68. {ccxt-4.3.11.dist-info → ccxt-4.3.13.dist-info}/METADATA +4 -4
  69. {ccxt-4.3.11.dist-info → ccxt-4.3.13.dist-info}/RECORD +71 -73
  70. ccxt/async_support/flowbtc.py +0 -34
  71. ccxt/flowbtc.py +0 -34
  72. {ccxt-4.3.11.dist-info → ccxt-4.3.13.dist-info}/WHEEL +0 -0
  73. {ccxt-4.3.11.dist-info → ccxt-4.3.13.dist-info}/top_level.txt +0 -0
ccxt/bybit.py CHANGED
@@ -6,7 +6,7 @@
6
6
  from ccxt.base.exchange import Exchange
7
7
  from ccxt.abstract.bybit import ImplicitAPI
8
8
  import hashlib
9
- from ccxt.base.types import Balances, Currencies, Currency, Greeks, Int, Leverage, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
9
+ from ccxt.base.types import Balances, CrossBorrowRate, Currencies, Currency, Greeks, Int, Leverage, Market, MarketInterface, Num, Option, OptionChain, Order, OrderBook, OrderRequest, CancellationRequest, OrderSide, OrderType, Position, Str, Strings, Ticker, Tickers, Trade, TradingFeeInterface, TradingFees, Transaction, TransferEntry
10
10
  from typing import List
11
11
  from ccxt.base.errors import ExchangeError
12
12
  from ccxt.base.errors import AuthenticationError
@@ -336,6 +336,7 @@ class bybit(Exchange, ImplicitAPI):
336
336
  'v5/account/fee-rate': 10, # 5/s = 1000 / (20 * 10)
337
337
  'v5/account/info': 5,
338
338
  'v5/account/transaction-log': 1,
339
+ 'v5/account/contract-transaction-log': 1,
339
340
  'v5/account/smp-group': 1,
340
341
  'v5/account/mmp-state': 5,
341
342
  # asset
@@ -2417,9 +2418,9 @@ class bybit(Exchange, ImplicitAPI):
2417
2418
  request['category'] = type
2418
2419
  if since is not None:
2419
2420
  request['startTime'] = since
2420
- until = self.safe_integer_2(params, 'until', 'till') # unified in milliseconds
2421
+ until = self.safe_integer(params, 'until') # unified in milliseconds
2421
2422
  endTime = self.safe_integer(params, 'endTime', until) # exchange-specific in milliseconds
2422
- params = self.omit(params, ['endTime', 'till', 'until'])
2423
+ params = self.omit(params, ['endTime', 'until'])
2423
2424
  if endTime is not None:
2424
2425
  request['endTime'] = endTime
2425
2426
  else:
@@ -3810,40 +3811,8 @@ class bybit(Exchange, ImplicitAPI):
3810
3811
  result = self.safe_dict(response, 'result', {})
3811
3812
  return self.parse_order(result, market)
3812
3813
 
3813
- def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
3814
- """
3815
- edit a trade order
3816
- :see: https://bybit-exchange.github.io/docs/v5/order/amend-order
3817
- :see: https://bybit-exchange.github.io/docs/derivatives/unified/replace-order
3818
- :see: https://bybit-exchange.github.io/docs/api-explorer/derivatives/trade/contract/replace-order
3819
- :param str id: cancel order id
3820
- :param str symbol: unified symbol of the market to create an order in
3821
- :param str type: 'market' or 'limit'
3822
- :param str side: 'buy' or 'sell'
3823
- :param float amount: how much of currency you want to trade in units of base currency
3824
- :param float price: the price at which the order is to be fullfilled, in units of the base currency, ignored in market orders
3825
- :param dict [params]: extra parameters specific to the exchange API endpoint
3826
- :param float [params.triggerPrice]: The price that a trigger order is triggered at
3827
- :param float [params.stopLossPrice]: The price that a stop loss order is triggered at
3828
- :param float [params.takeProfitPrice]: The price that a take profit order is triggered at
3829
- :param dict [params.takeProfit]: *takeProfit object in params* containing the triggerPrice that the attached take profit order will be triggered
3830
- :param float [params.takeProfit.triggerPrice]: take profit trigger price
3831
- :param dict [params.stopLoss]: *stopLoss object in params* containing the triggerPrice that the attached stop loss order will be triggered
3832
- :param float [params.stopLoss.triggerPrice]: stop loss trigger price
3833
- :param str [params.triggerBy]: 'IndexPrice', 'MarkPrice' or 'LastPrice', default is 'LastPrice', required if no initial value for triggerPrice
3834
- :param str [params.slTriggerBy]: 'IndexPrice', 'MarkPrice' or 'LastPrice', default is 'LastPrice', required if no initial value for stopLoss
3835
- :param str [params.tpTriggerby]: 'IndexPrice', 'MarkPrice' or 'LastPrice', default is 'LastPrice', required if no initial value for takeProfit
3836
- :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3837
- """
3838
- if symbol is None:
3839
- raise ArgumentsRequired(self.id + ' editOrder() requires a symbol argument')
3840
- self.load_markets()
3814
+ def edit_order_request(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
3841
3815
  market = self.market(symbol)
3842
- enableUnifiedMargin, enableUnifiedAccount = self.is_unified_enabled()
3843
- isUnifiedAccount = (enableUnifiedMargin or enableUnifiedAccount)
3844
- isUsdcSettled = market['settle'] == 'USDC'
3845
- if isUsdcSettled and not isUnifiedAccount:
3846
- return self.edit_usdc_order(id, symbol, type, side, amount, price, params)
3847
3816
  request = {
3848
3817
  'symbol': market['id'],
3849
3818
  'orderId': id,
@@ -3904,6 +3873,43 @@ class bybit(Exchange, ImplicitAPI):
3904
3873
  if clientOrderId is not None:
3905
3874
  request['orderLinkId'] = clientOrderId
3906
3875
  params = self.omit(params, ['stopPrice', 'stopLossPrice', 'takeProfitPrice', 'triggerPrice', 'clientOrderId', 'stopLoss', 'takeProfit'])
3876
+ return request
3877
+
3878
+ def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}):
3879
+ """
3880
+ edit a trade order
3881
+ :see: https://bybit-exchange.github.io/docs/v5/order/amend-order
3882
+ :see: https://bybit-exchange.github.io/docs/derivatives/unified/replace-order
3883
+ :see: https://bybit-exchange.github.io/docs/api-explorer/derivatives/trade/contract/replace-order
3884
+ :param str id: cancel order id
3885
+ :param str symbol: unified symbol of the market to create an order in
3886
+ :param str type: 'market' or 'limit'
3887
+ :param str side: 'buy' or 'sell'
3888
+ :param float amount: how much of currency you want to trade in units of base currency
3889
+ :param float price: the price at which the order is to be fullfilled, in units of the base currency, ignored in market orders
3890
+ :param dict [params]: extra parameters specific to the exchange API endpoint
3891
+ :param float [params.triggerPrice]: The price that a trigger order is triggered at
3892
+ :param float [params.stopLossPrice]: The price that a stop loss order is triggered at
3893
+ :param float [params.takeProfitPrice]: The price that a take profit order is triggered at
3894
+ :param dict [params.takeProfit]: *takeProfit object in params* containing the triggerPrice that the attached take profit order will be triggered
3895
+ :param float [params.takeProfit.triggerPrice]: take profit trigger price
3896
+ :param dict [params.stopLoss]: *stopLoss object in params* containing the triggerPrice that the attached stop loss order will be triggered
3897
+ :param float [params.stopLoss.triggerPrice]: stop loss trigger price
3898
+ :param str [params.triggerBy]: 'IndexPrice', 'MarkPrice' or 'LastPrice', default is 'LastPrice', required if no initial value for triggerPrice
3899
+ :param str [params.slTriggerBy]: 'IndexPrice', 'MarkPrice' or 'LastPrice', default is 'LastPrice', required if no initial value for stopLoss
3900
+ :param str [params.tpTriggerby]: 'IndexPrice', 'MarkPrice' or 'LastPrice', default is 'LastPrice', required if no initial value for takeProfit
3901
+ :returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3902
+ """
3903
+ self.load_markets()
3904
+ if symbol is None:
3905
+ raise ArgumentsRequired(self.id + ' editOrder() requires a symbol argument')
3906
+ market = self.market(symbol)
3907
+ enableUnifiedMargin, enableUnifiedAccount = self.is_unified_enabled()
3908
+ isUnifiedAccount = (enableUnifiedMargin or enableUnifiedAccount)
3909
+ isUsdcSettled = market['settle'] == 'USDC'
3910
+ if isUsdcSettled and not isUnifiedAccount:
3911
+ return self.edit_usdc_order(id, symbol, type, side, amount, price, params)
3912
+ request = self.edit_order_request(id, symbol, type, side, amount, price, params)
3907
3913
  response = self.privatePostV5OrderAmend(self.extend(request, params))
3908
3914
  #
3909
3915
  # {
@@ -3959,26 +3965,8 @@ class bybit(Exchange, ImplicitAPI):
3959
3965
  result = self.safe_dict(response, 'result', {})
3960
3966
  return self.parse_order(result, market)
3961
3967
 
3962
- def cancel_order(self, id: str, symbol: Str = None, params={}):
3963
- """
3964
- cancels an open order
3965
- :see: https://bybit-exchange.github.io/docs/v5/order/cancel-order
3966
- :param str id: order id
3967
- :param str symbol: unified symbol of the market the order was made in
3968
- :param dict [params]: extra parameters specific to the exchange API endpoint
3969
- :param boolean [params.stop]: *spot only* whether the order is a stop order
3970
- :param str [params.orderFilter]: *spot only* 'Order' or 'StopOrder' or 'tpslOrder'
3971
- :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
3972
- """
3973
- if symbol is None:
3974
- raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
3975
- self.load_markets()
3968
+ def cancel_order_request(self, id: str, symbol: Str = None, params={}):
3976
3969
  market = self.market(symbol)
3977
- enableUnifiedMargin, enableUnifiedAccount = self.is_unified_enabled()
3978
- isUnifiedAccount = (enableUnifiedMargin or enableUnifiedAccount)
3979
- isUsdcSettled = market['settle'] == 'USDC'
3980
- if isUsdcSettled and not isUnifiedAccount:
3981
- return self.cancel_usdc_order(id, symbol, params)
3982
3970
  request = {
3983
3971
  'symbol': market['id'],
3984
3972
  # 'orderLinkId': 'string',
@@ -3988,7 +3976,7 @@ class bybit(Exchange, ImplicitAPI):
3988
3976
  }
3989
3977
  if market['spot']:
3990
3978
  # only works for spot market
3991
- isStop = self.safe_value_2(params, 'stop', 'trigger', False)
3979
+ isStop = self.safe_bool_2(params, 'stop', 'trigger', False)
3992
3980
  params = self.omit(params, ['stop', 'trigger'])
3993
3981
  request['orderFilter'] = 'StopOrder' if isStop else 'Order'
3994
3982
  if id is not None: # The user can also use argument params["orderLinkId"]
@@ -4001,7 +3989,30 @@ class bybit(Exchange, ImplicitAPI):
4001
3989
  request['category'] = 'inverse'
4002
3990
  elif market['option']:
4003
3991
  request['category'] = 'option'
4004
- response = self.privatePostV5OrderCancel(self.extend(request, params))
3992
+ return self.extend(request, params)
3993
+
3994
+ def cancel_order(self, id: str, symbol: Str = None, params={}):
3995
+ """
3996
+ cancels an open order
3997
+ :see: https://bybit-exchange.github.io/docs/v5/order/cancel-order
3998
+ :param str id: order id
3999
+ :param str symbol: unified symbol of the market the order was made in
4000
+ :param dict [params]: extra parameters specific to the exchange API endpoint
4001
+ :param boolean [params.stop]: *spot only* whether the order is a stop order
4002
+ :param str [params.orderFilter]: *spot only* 'Order' or 'StopOrder' or 'tpslOrder'
4003
+ :returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
4004
+ """
4005
+ if symbol is None:
4006
+ raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
4007
+ self.load_markets()
4008
+ market = self.market(symbol)
4009
+ enableUnifiedMargin, enableUnifiedAccount = self.is_unified_enabled()
4010
+ isUnifiedAccount = (enableUnifiedMargin or enableUnifiedAccount)
4011
+ isUsdcSettled = market['settle'] == 'USDC'
4012
+ if isUsdcSettled and not isUnifiedAccount:
4013
+ return self.cancel_usdc_order(id, symbol, params)
4014
+ requestExtended = self.cancel_order_request(id, symbol, params)
4015
+ response = self.privatePostV5OrderCancel(requestExtended)
4005
4016
  #
4006
4017
  # {
4007
4018
  # "retCode": 0,
@@ -4474,9 +4485,9 @@ class bybit(Exchange, ImplicitAPI):
4474
4485
  request['limit'] = limit
4475
4486
  if since is not None:
4476
4487
  request['startTime'] = since
4477
- until = self.safe_integer_2(params, 'until', 'till') # unified in milliseconds
4488
+ until = self.safe_integer(params, 'until') # unified in milliseconds
4478
4489
  endTime = self.safe_integer(params, 'endTime', until) # exchange-specific in milliseconds
4479
- params = self.omit(params, ['endTime', 'till', 'until'])
4490
+ params = self.omit(params, ['endTime', 'until'])
4480
4491
  if endTime is not None:
4481
4492
  request['endTime'] = endTime
4482
4493
  response = self.privateGetV5OrderHistory(self.extend(request, params))
@@ -4632,9 +4643,9 @@ class bybit(Exchange, ImplicitAPI):
4632
4643
  request['limit'] = limit
4633
4644
  if since is not None:
4634
4645
  request['startTime'] = since
4635
- until = self.safe_integer_2(params, 'until', 'till') # unified in milliseconds
4646
+ until = self.safe_integer(params, 'until') # unified in milliseconds
4636
4647
  endTime = self.safe_integer(params, 'endTime', until) # exchange-specific in milliseconds
4637
- params = self.omit(params, ['endTime', 'till', 'until'])
4648
+ params = self.omit(params, ['endTime', 'until'])
4638
4649
  if endTime is not None:
4639
4650
  request['endTime'] = endTime
4640
4651
  response = self.privateGetV5OrderHistory(self.extend(request, params))
@@ -5379,7 +5390,7 @@ class bybit(Exchange, ImplicitAPI):
5379
5390
  # 'coin': currency['id'],
5380
5391
  # 'currency': currency['id'], # alias
5381
5392
  # 'start_date': self.iso8601(since),
5382
- # 'end_date': self.iso8601(till),
5393
+ # 'end_date': self.iso8601(until),
5383
5394
  # 'wallet_fund_type': 'Deposit', # Withdraw, RealisedPNL, Commission, Refund, Prize, ExchangeOrderWithdraw, ExchangeOrderDeposit
5384
5395
  # 'page': 1,
5385
5396
  # 'limit': 20, # max 50
@@ -6338,8 +6349,8 @@ class bybit(Exchange, ImplicitAPI):
6338
6349
  }
6339
6350
  if since is not None:
6340
6351
  request['startTime'] = since
6341
- until = self.safe_integer_2(params, 'until', 'till') # unified in milliseconds
6342
- params = self.omit(params, ['till', 'until'])
6352
+ until = self.safe_integer(params, 'until') # unified in milliseconds
6353
+ params = self.omit(params, ['until'])
6343
6354
  if until is not None:
6344
6355
  request['endTime'] = until
6345
6356
  if limit is not None:
@@ -6477,7 +6488,7 @@ class bybit(Exchange, ImplicitAPI):
6477
6488
  'info': interest,
6478
6489
  }, market)
6479
6490
 
6480
- def fetch_cross_borrow_rate(self, code: str, params={}):
6491
+ def fetch_cross_borrow_rate(self, code: str, params={}) -> CrossBorrowRate:
6481
6492
  """
6482
6493
  fetch the rate of interest to borrow a currency for margin trading
6483
6494
  :see: https://bybit-exchange.github.io/docs/zh-TW/v5/spot-margin-normal/interest-quota
ccxt/coinbase.py CHANGED
@@ -3109,9 +3109,9 @@ class coinbase(Exchange, ImplicitAPI):
3109
3109
  request['limit'] = limit
3110
3110
  if since is not None:
3111
3111
  request['start_date'] = self.iso8601(since)
3112
- until = self.safe_integer_n(params, ['until', 'till'])
3112
+ until = self.safe_integer_n(params, ['until'])
3113
3113
  if until is not None:
3114
- params = self.omit(params, ['until', 'till'])
3114
+ params = self.omit(params, ['until'])
3115
3115
  request['end_date'] = self.iso8601(until)
3116
3116
  response = self.v3PrivateGetBrokerageOrdersHistoricalBatch(self.extend(request, params))
3117
3117
  #
@@ -3179,9 +3179,9 @@ class coinbase(Exchange, ImplicitAPI):
3179
3179
  request['limit'] = limit
3180
3180
  if since is not None:
3181
3181
  request['start_date'] = self.iso8601(since)
3182
- until = self.safe_integer_n(params, ['until', 'till'])
3182
+ until = self.safe_integer_n(params, ['until'])
3183
3183
  if until is not None:
3184
- params = self.omit(params, ['until', 'till'])
3184
+ params = self.omit(params, ['until'])
3185
3185
  request['end_date'] = self.iso8601(until)
3186
3186
  response = self.v3PrivateGetBrokerageOrdersHistoricalBatch(self.extend(request, params))
3187
3187
  #
@@ -3309,8 +3309,8 @@ class coinbase(Exchange, ImplicitAPI):
3309
3309
  'product_id': market['id'],
3310
3310
  'granularity': self.safe_string(self.timeframes, timeframe, timeframe),
3311
3311
  }
3312
- until = self.safe_integer_n(params, ['until', 'till', 'end'])
3313
- params = self.omit(params, ['until', 'till'])
3312
+ until = self.safe_integer_n(params, ['until', 'end'])
3313
+ params = self.omit(params, ['until'])
3314
3314
  duration = self.parse_timeframe(timeframe)
3315
3315
  requestedDuration = limit * duration
3316
3316
  sinceString = None
@@ -3437,9 +3437,9 @@ class coinbase(Exchange, ImplicitAPI):
3437
3437
  request['limit'] = limit
3438
3438
  if since is not None:
3439
3439
  request['start_sequence_timestamp'] = self.iso8601(since)
3440
- until = self.safe_integer_n(params, ['until', 'till'])
3440
+ until = self.safe_integer_n(params, ['until'])
3441
3441
  if until is not None:
3442
- params = self.omit(params, ['until', 'till'])
3442
+ params = self.omit(params, ['until'])
3443
3443
  request['end_sequence_timestamp'] = self.iso8601(until)
3444
3444
  response = self.v3PrivateGetBrokerageOrdersHistoricalFills(self.extend(request, params))
3445
3445
  #
@@ -1725,9 +1725,9 @@ class coinbaseinternational(Exchange, ImplicitAPI):
1725
1725
  request['result_limit'] = limit
1726
1726
  if since is not None:
1727
1727
  request['time_from'] = self.iso8601(since)
1728
- until = self.safe_string_n(params, ['until', 'till'])
1728
+ until = self.safe_string_n(params, ['until'])
1729
1729
  if until is not None:
1730
- params = self.omit(params, ['until', 'till'])
1730
+ params = self.omit(params, ['until'])
1731
1731
  request['ref_datetime'] = self.iso8601(until)
1732
1732
  response = self.v1PrivateGetPortfoliosFills(self.extend(request, params))
1733
1733
  #