ccxt 4.1.91__py2.py3-none-any.whl → 4.1.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/bybit.py +1 -0
- ccxt/abstract/coinbase.py +6 -0
- ccxt/abstract/coinone.py +63 -21
- ccxt/abstract/kucoinfutures.py +2 -0
- ccxt/abstract/okx.py +2 -0
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/base/exchange.py +8 -4
- ccxt/async_support/binance.py +10 -9
- ccxt/async_support/bingx.py +8 -5
- ccxt/async_support/bitget.py +138 -92
- ccxt/async_support/bitrue.py +2 -9
- ccxt/async_support/bybit.py +1 -0
- ccxt/async_support/coinbase.py +42 -1
- ccxt/async_support/coinone.py +385 -137
- ccxt/async_support/hitbtc.py +38 -0
- ccxt/async_support/kucoinfutures.py +17 -4
- ccxt/async_support/okx.py +2 -0
- ccxt/base/exchange.py +2 -1
- ccxt/binance.py +10 -9
- ccxt/bingx.py +8 -5
- ccxt/bitget.py +138 -92
- ccxt/bitrue.py +2 -9
- ccxt/bybit.py +1 -0
- ccxt/coinbase.py +42 -1
- ccxt/coinone.py +385 -137
- ccxt/hitbtc.py +38 -0
- ccxt/kucoinfutures.py +17 -4
- ccxt/okx.py +2 -0
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/bingx.py +38 -4
- {ccxt-4.1.91.dist-info → ccxt-4.1.95.dist-info}/METADATA +4 -4
- {ccxt-4.1.91.dist-info → ccxt-4.1.95.dist-info}/RECORD +35 -35
- {ccxt-4.1.91.dist-info → ccxt-4.1.95.dist-info}/WHEEL +0 -0
- {ccxt-4.1.91.dist-info → ccxt-4.1.95.dist-info}/top_level.txt +0 -0
ccxt/async_support/hitbtc.py
CHANGED
@@ -48,6 +48,7 @@ class hitbtc(Exchange, ImplicitAPI):
|
|
48
48
|
'addMargin': True,
|
49
49
|
'cancelAllOrders': True,
|
50
50
|
'cancelOrder': True,
|
51
|
+
'closePosition': False,
|
51
52
|
'createDepositAddress': True,
|
52
53
|
'createOrder': True,
|
53
54
|
'createPostOnlyOrder': True,
|
@@ -2660,6 +2661,8 @@ class hitbtc(Exchange, ImplicitAPI):
|
|
2660
2661
|
marketType = None
|
2661
2662
|
marginMode = None
|
2662
2663
|
marketType, params = self.handle_market_type_and_params('fetchPositions', None, params)
|
2664
|
+
if marketType == 'spot':
|
2665
|
+
marketType = 'swap'
|
2663
2666
|
marginMode, params = self.handle_margin_mode_and_params('fetchPositions', params)
|
2664
2667
|
params = self.omit(params, ['marginMode', 'margin'])
|
2665
2668
|
response = None
|
@@ -3264,6 +3267,41 @@ class hitbtc(Exchange, ImplicitAPI):
|
|
3264
3267
|
}
|
3265
3268
|
return result
|
3266
3269
|
|
3270
|
+
async def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
|
3271
|
+
"""
|
3272
|
+
closes open positions for a market
|
3273
|
+
:see: https://api.hitbtc.com/#close-all-futures-margin-positions
|
3274
|
+
:param dict [params]: extra parameters specific to the okx api endpoint
|
3275
|
+
:param str [params.symbol]: *required* unified market symbol
|
3276
|
+
:param str [params.marginMode]: 'cross' or 'isolated', default is 'cross'
|
3277
|
+
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
3278
|
+
"""
|
3279
|
+
await self.load_markets()
|
3280
|
+
marginMode = None
|
3281
|
+
marginMode, params = self.handle_margin_mode_and_params('closePosition', params, 'cross')
|
3282
|
+
market = self.market(symbol)
|
3283
|
+
request = {
|
3284
|
+
'symbol': market['id'],
|
3285
|
+
'margin_mode': marginMode,
|
3286
|
+
}
|
3287
|
+
response = await self.privateDeleteFuturesPositionMarginModeSymbol(self.extend(request, params))
|
3288
|
+
#
|
3289
|
+
# {
|
3290
|
+
# "id":"202471640",
|
3291
|
+
# "symbol":"TRXUSDT_PERP",
|
3292
|
+
# "margin_mode":"Cross",
|
3293
|
+
# "leverage":"1.00",
|
3294
|
+
# "quantity":"0",
|
3295
|
+
# "price_entry":"0",
|
3296
|
+
# "price_margin_call":"0",
|
3297
|
+
# "price_liquidation":"0",
|
3298
|
+
# "pnl":"0.001234100000",
|
3299
|
+
# "created_at":"2023-10-29T14:46:13.235Z",
|
3300
|
+
# "updated_at":"2023-12-19T09:34:40.014Z"
|
3301
|
+
# }
|
3302
|
+
#
|
3303
|
+
return self.parse_order(response, market)
|
3304
|
+
|
3267
3305
|
def handle_margin_mode_and_params(self, methodName, params={}, defaultValue=None):
|
3268
3306
|
"""
|
3269
3307
|
* @ignore
|
@@ -168,6 +168,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
|
|
168
168
|
'positions': 4.44,
|
169
169
|
'funding-history': 4.44,
|
170
170
|
'sub/api-key': 1,
|
171
|
+
'trade-statistics': 1,
|
171
172
|
},
|
172
173
|
'post': {
|
173
174
|
'withdrawals': 1,
|
@@ -189,6 +190,7 @@ class kucoinfutures(kucoin, ImplicitAPI):
|
|
189
190
|
'orders': 4.44,
|
190
191
|
'stopOrders': 1,
|
191
192
|
'sub/api-key': 1,
|
193
|
+
'orders/client-order/{clientOid}': 1,
|
192
194
|
},
|
193
195
|
},
|
194
196
|
'webExchange': {
|
@@ -1189,13 +1191,24 @@ class kucoinfutures(kucoin, ImplicitAPI):
|
|
1189
1191
|
:param str id: order id
|
1190
1192
|
:param str symbol: unified symbol of the market the order was made in
|
1191
1193
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1194
|
+
:param str [params.clientOrderId]: cancel order by client order id
|
1192
1195
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1193
1196
|
"""
|
1194
1197
|
await self.load_markets()
|
1195
|
-
|
1196
|
-
|
1197
|
-
}
|
1198
|
-
response =
|
1198
|
+
clientOrderId = self.safe_string_2(params, 'clientOid', 'clientOrderId')
|
1199
|
+
params = self.omit(params, ['clientOrderId'])
|
1200
|
+
request = {}
|
1201
|
+
response = None
|
1202
|
+
if clientOrderId is not None:
|
1203
|
+
if symbol is None:
|
1204
|
+
raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument when cancelling by clientOrderId')
|
1205
|
+
market = self.market(symbol)
|
1206
|
+
request['symbol'] = market['id']
|
1207
|
+
request['clientOid'] = clientOrderId
|
1208
|
+
response = await self.futuresPrivateDeleteOrdersClientOrderClientOid(self.extend(request, params))
|
1209
|
+
else:
|
1210
|
+
request['orderId'] = id
|
1211
|
+
response = await self.futuresPrivateDeleteOrdersOrderId(self.extend(request, params))
|
1199
1212
|
#
|
1200
1213
|
# {
|
1201
1214
|
# "code": "200000",
|
ccxt/async_support/okx.py
CHANGED
@@ -273,6 +273,7 @@ class okx(Exchange, ImplicitAPI):
|
|
273
273
|
# rfq
|
274
274
|
'rfq/counterparties': 4,
|
275
275
|
'rfq/maker-instrument-settings': 4,
|
276
|
+
'rfq/mmp-config': 4,
|
276
277
|
'rfq/rfqs': 10,
|
277
278
|
'rfq/quotes': 10,
|
278
279
|
'rfq/trades': 4,
|
@@ -412,6 +413,7 @@ class okx(Exchange, ImplicitAPI):
|
|
412
413
|
'rfq/execute-quote': 15,
|
413
414
|
'rfq/maker-instrument-settings': 4,
|
414
415
|
'rfq/mmp-reset': 4,
|
416
|
+
'rfq/mmp-config': 100,
|
415
417
|
'rfq/create-quote': 0.4,
|
416
418
|
'rfq/cancel-quote': 0.4,
|
417
419
|
'rfq/cancel-batch-quotes': 10,
|
ccxt/base/exchange.py
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
# -----------------------------------------------------------------------------
|
6
6
|
|
7
|
-
__version__ = '4.1.
|
7
|
+
__version__ = '4.1.95'
|
8
8
|
|
9
9
|
# -----------------------------------------------------------------------------
|
10
10
|
|
@@ -115,6 +115,7 @@ class Exchange(object):
|
|
115
115
|
aiohttp_trust_env = False
|
116
116
|
requests_trust_env = False
|
117
117
|
session = None # Session () by default
|
118
|
+
socks_proxy_session = None
|
118
119
|
verify = True # SSL verification
|
119
120
|
validateServerSsl = True
|
120
121
|
validateClientSsl = False
|
ccxt/binance.py
CHANGED
@@ -3035,7 +3035,7 @@ class binance(Exchange, ImplicitAPI):
|
|
3035
3035
|
:see: https://binance-docs.github.io/apidocs/futures/en/#24hr-ticker-price-change-statistics # swap
|
3036
3036
|
:see: https://binance-docs.github.io/apidocs/delivery/en/#24hr-ticker-price-change-statistics # future
|
3037
3037
|
:see: https://binance-docs.github.io/apidocs/voptions/en/#24hr-ticker-price-change-statistics # option
|
3038
|
-
:param str[]
|
3038
|
+
:param str[] [symbols]: unified symbols of the markets to fetch the ticker for, all market tickers are returned if not assigned
|
3039
3039
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
3040
3040
|
:returns dict: a dictionary of `ticker structures <https://docs.ccxt.com/#/?id=ticker-structure>`
|
3041
3041
|
"""
|
@@ -3049,18 +3049,19 @@ class binance(Exchange, ImplicitAPI):
|
|
3049
3049
|
type, params = self.handle_market_type_and_params('fetchTickers', market, params)
|
3050
3050
|
subType = None
|
3051
3051
|
subType, params = self.handle_sub_type_and_params('fetchTickers', market, params)
|
3052
|
-
|
3053
|
-
defaultMethod = None
|
3052
|
+
response = None
|
3054
3053
|
if type == 'option':
|
3055
|
-
|
3054
|
+
response = self.eapiPublicGetTicker(params)
|
3056
3055
|
elif self.is_linear(type, subType):
|
3057
|
-
|
3056
|
+
response = self.fapiPublicGetTicker24hr(params)
|
3058
3057
|
elif self.is_inverse(type, subType):
|
3059
|
-
|
3058
|
+
response = self.dapiPublicGetTicker24hr(params)
|
3060
3059
|
else:
|
3061
|
-
|
3062
|
-
|
3063
|
-
|
3060
|
+
request = {}
|
3061
|
+
if symbols is not None:
|
3062
|
+
marketIds = self.market_ids(symbols)
|
3063
|
+
request['symbols'] = self.json(marketIds)
|
3064
|
+
response = self.publicGetTicker24hr(self.extend(request, params))
|
3064
3065
|
return self.parse_tickers(response, symbols)
|
3065
3066
|
|
3066
3067
|
def parse_ohlcv(self, ohlcv, market: Market = None) -> list:
|
ccxt/bingx.py
CHANGED
@@ -876,14 +876,17 @@ class bingx(Exchange, ImplicitAPI):
|
|
876
876
|
type = 'spot' if (cost is None) else 'swap'
|
877
877
|
currencyId = self.safe_string_2(trade, 'currency', 'N')
|
878
878
|
currencyCode = self.safe_currency_code(currencyId)
|
879
|
-
m = self.safe_value(trade, 'm'
|
879
|
+
m = self.safe_value(trade, 'm')
|
880
880
|
marketId = self.safe_string(trade, 's')
|
881
881
|
isBuyerMaker = self.safe_value_2(trade, 'buyerMaker', 'isBuyerMaker')
|
882
|
-
takeOrMaker =
|
882
|
+
takeOrMaker = None
|
883
|
+
if (isBuyerMaker is not None) or (m is not None):
|
884
|
+
takeOrMaker = 'maker' if (isBuyerMaker or m) else 'taker'
|
883
885
|
side = self.safe_string_lower_2(trade, 'side', 'S')
|
884
886
|
if side is None:
|
885
|
-
|
886
|
-
|
887
|
+
if (isBuyerMaker is not None) or (m is not None):
|
888
|
+
side = 'sell' if (isBuyerMaker or m) else 'buy'
|
889
|
+
takeOrMaker = 'taker'
|
887
890
|
return self.safe_trade({
|
888
891
|
'id': self.safe_string_n(trade, ['id', 't']),
|
889
892
|
'info': trade,
|
@@ -895,7 +898,7 @@ class bingx(Exchange, ImplicitAPI):
|
|
895
898
|
'side': self.parse_order_side(side),
|
896
899
|
'takerOrMaker': takeOrMaker,
|
897
900
|
'price': self.safe_string_2(trade, 'price', 'p'),
|
898
|
-
'amount': self.safe_string_n(trade, ['qty', 'amount', 'q']),
|
901
|
+
'amount': self.safe_string_n(trade, ['qty', 'volume', 'amount', 'q']),
|
899
902
|
'cost': cost,
|
900
903
|
'fee': {
|
901
904
|
'cost': self.parse_number(Precise.string_abs(self.safe_string_2(trade, 'commission', 'n'))),
|
ccxt/bitget.py
CHANGED
@@ -57,7 +57,7 @@ class bitget(Exchange, ImplicitAPI):
|
|
57
57
|
'cancelOrder': True,
|
58
58
|
'cancelOrders': True,
|
59
59
|
'closeAllPositions': True,
|
60
|
-
'closePosition':
|
60
|
+
'closePosition': True,
|
61
61
|
'createMarketBuyOrderWithCost': True,
|
62
62
|
'createMarketOrderWithCost': False,
|
63
63
|
'createMarketSellOrderWithCost': False,
|
@@ -3431,7 +3431,7 @@ class bitget(Exchange, ImplicitAPI):
|
|
3431
3431
|
|
3432
3432
|
def parse_order(self, order, market: Market = None) -> Order:
|
3433
3433
|
#
|
3434
|
-
# createOrder, editOrder
|
3434
|
+
# createOrder, editOrder, closePosition
|
3435
3435
|
#
|
3436
3436
|
# {
|
3437
3437
|
# "clientOid": "abe95dbe-6081-4a6f-a2d3-ae49601cd479",
|
@@ -3708,8 +3708,12 @@ class bitget(Exchange, ImplicitAPI):
|
|
3708
3708
|
'clientOrderId': self.safe_string_2(order, 'clientOrderId', 'clientOid'),
|
3709
3709
|
'status': 'rejected',
|
3710
3710
|
}, market)
|
3711
|
+
isContractOrder = ('posSide' in order)
|
3712
|
+
marketType = 'contract' if isContractOrder else 'spot'
|
3713
|
+
if market is not None:
|
3714
|
+
marketType = market['type']
|
3711
3715
|
marketId = self.safe_string(order, 'symbol')
|
3712
|
-
market = self.safe_market(marketId, market)
|
3716
|
+
market = self.safe_market(marketId, market, None, marketType)
|
3713
3717
|
timestamp = self.safe_integer_2(order, 'cTime', 'ctime')
|
3714
3718
|
updateTimestamp = self.safe_integer(order, 'uTime')
|
3715
3719
|
rawStatus = self.safe_string_2(order, 'status', 'state')
|
@@ -4690,31 +4694,36 @@ class bitget(Exchange, ImplicitAPI):
|
|
4690
4694
|
:param str [params.isPlan]: *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
|
4691
4695
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
4692
4696
|
"""
|
4693
|
-
if symbol is None:
|
4694
|
-
raise ArgumentsRequired(self.id + ' fetchOpenOrders() requires a symbol argument')
|
4695
4697
|
self.load_markets()
|
4696
4698
|
sandboxMode = self.safe_value(self.options, 'sandboxMode', False)
|
4697
4699
|
market = None
|
4698
|
-
|
4699
|
-
|
4700
|
-
market = self.market(sandboxSymbol)
|
4701
|
-
else:
|
4702
|
-
market = self.market(symbol)
|
4700
|
+
type = None
|
4701
|
+
request = {}
|
4703
4702
|
marginMode = None
|
4704
4703
|
marginMode, params = self.handle_margin_mode_and_params('fetchOpenOrders', params)
|
4704
|
+
if symbol is not None:
|
4705
|
+
if sandboxMode:
|
4706
|
+
sandboxSymbol = self.convert_symbol_for_sandbox(symbol)
|
4707
|
+
market = self.market(sandboxSymbol)
|
4708
|
+
else:
|
4709
|
+
market = self.market(symbol)
|
4710
|
+
request['symbol'] = market['id']
|
4711
|
+
defaultType = self.safe_string_2(self.options, 'fetchOpenOrders', 'defaultType', 'spot')
|
4712
|
+
marketType = market['type'] if ('type' in market) else defaultType
|
4713
|
+
type = self.safe_string(params, 'type', marketType)
|
4714
|
+
else:
|
4715
|
+
defaultType = self.safe_string_2(self.options, 'fetchOpenOrders', 'defaultType', 'spot')
|
4716
|
+
type = self.safe_string(params, 'type', defaultType)
|
4705
4717
|
paginate = False
|
4706
4718
|
paginate, params = self.handle_option_and_params(params, 'fetchOpenOrders', 'paginate')
|
4707
4719
|
if paginate:
|
4708
4720
|
cursorReceived = None
|
4709
|
-
if
|
4721
|
+
if type == 'spot':
|
4710
4722
|
if marginMode is not None:
|
4711
4723
|
cursorReceived = 'minId'
|
4712
4724
|
else:
|
4713
4725
|
cursorReceived = 'endId'
|
4714
4726
|
return self.fetch_paginated_call_cursor('fetchOpenOrders', symbol, since, limit, params, cursorReceived, 'idLessThan')
|
4715
|
-
request = {
|
4716
|
-
'symbol': market['id'],
|
4717
|
-
}
|
4718
4727
|
response = None
|
4719
4728
|
stop = self.safe_value_2(params, 'stop', 'trigger')
|
4720
4729
|
params = self.omit(params, ['stop', 'trigger'])
|
@@ -4723,35 +4732,37 @@ class bitget(Exchange, ImplicitAPI):
|
|
4723
4732
|
request['startTime'] = since
|
4724
4733
|
if limit is not None:
|
4725
4734
|
request['limit'] = limit
|
4726
|
-
if (
|
4735
|
+
if (type == 'swap') or (type == 'future') or (marginMode is not None):
|
4727
4736
|
clientOrderId = self.safe_string_2(params, 'clientOid', 'clientOrderId')
|
4728
4737
|
params = self.omit(params, 'clientOrderId')
|
4729
4738
|
if clientOrderId is not None:
|
4730
4739
|
request['clientOid'] = clientOrderId
|
4731
|
-
|
4740
|
+
query = None
|
4741
|
+
query = self.omit(params, ['type'])
|
4742
|
+
if type == 'spot':
|
4732
4743
|
if marginMode is not None:
|
4733
4744
|
if since is None:
|
4734
4745
|
since = self.milliseconds() - 7776000000
|
4735
4746
|
request['startTime'] = since
|
4736
4747
|
if marginMode == 'isolated':
|
4737
|
-
response = self.privateMarginGetV2MarginIsolatedOpenOrders(self.extend(request,
|
4748
|
+
response = self.privateMarginGetV2MarginIsolatedOpenOrders(self.extend(request, query))
|
4738
4749
|
elif marginMode == 'cross':
|
4739
|
-
response = self.privateMarginGetV2MarginCrossedOpenOrders(self.extend(request,
|
4750
|
+
response = self.privateMarginGetV2MarginCrossedOpenOrders(self.extend(request, query))
|
4740
4751
|
else:
|
4741
4752
|
if stop:
|
4742
|
-
response = self.privateSpotGetV2SpotTradeCurrentPlanOrder(self.extend(request,
|
4753
|
+
response = self.privateSpotGetV2SpotTradeCurrentPlanOrder(self.extend(request, query))
|
4743
4754
|
else:
|
4744
|
-
response = self.privateSpotGetV2SpotTradeUnfilledOrders(self.extend(request,
|
4755
|
+
response = self.privateSpotGetV2SpotTradeUnfilledOrders(self.extend(request, query))
|
4745
4756
|
else:
|
4746
4757
|
productType = None
|
4747
|
-
productType,
|
4758
|
+
productType, query = self.handle_product_type_and_params(market, query)
|
4748
4759
|
request['productType'] = productType
|
4749
4760
|
if stop:
|
4750
|
-
planType = self.safe_string(
|
4761
|
+
planType = self.safe_string(query, 'planType', 'normal_plan')
|
4751
4762
|
request['planType'] = planType
|
4752
|
-
response = self.privateMixGetV2MixOrderOrdersPlanPending(self.extend(request,
|
4763
|
+
response = self.privateMixGetV2MixOrderOrdersPlanPending(self.extend(request, query))
|
4753
4764
|
else:
|
4754
|
-
response = self.privateMixGetV2MixOrderOrdersPending(self.extend(request,
|
4765
|
+
response = self.privateMixGetV2MixOrderOrdersPending(self.extend(request, query))
|
4755
4766
|
#
|
4756
4767
|
# spot
|
4757
4768
|
#
|
@@ -4928,7 +4939,7 @@ class bitget(Exchange, ImplicitAPI):
|
|
4928
4939
|
# }
|
4929
4940
|
#
|
4930
4941
|
data = self.safe_value(response, 'data')
|
4931
|
-
if
|
4942
|
+
if type == 'spot':
|
4932
4943
|
if (marginMode is not None) or stop:
|
4933
4944
|
resultList = self.safe_value(data, 'orderList', [])
|
4934
4945
|
return self.parse_orders(resultList, market, since, limit)
|
@@ -4953,12 +4964,13 @@ class bitget(Exchange, ImplicitAPI):
|
|
4953
4964
|
:param int [params.until]: the latest time in ms to fetch entries for
|
4954
4965
|
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
|
4955
4966
|
:param str [params.isPlan]: *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
|
4967
|
+
:param str [params.productType]: *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
|
4956
4968
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
4957
4969
|
"""
|
4958
|
-
if symbol is None:
|
4959
|
-
raise ArgumentsRequired(self.id + ' fetchClosedOrders() requires a symbol argument')
|
4960
4970
|
self.load_markets()
|
4961
|
-
market =
|
4971
|
+
market = None
|
4972
|
+
if symbol is not None:
|
4973
|
+
market = self.market(symbol)
|
4962
4974
|
response = self.fetch_canceled_and_closed_orders(symbol, since, limit, params)
|
4963
4975
|
result = []
|
4964
4976
|
for i in range(0, len(response)):
|
@@ -4984,12 +4996,13 @@ class bitget(Exchange, ImplicitAPI):
|
|
4984
4996
|
:param int [params.until]: the latest time in ms to fetch entries for
|
4985
4997
|
:param boolean [params.paginate]: default False, when True will automatically paginate by calling self endpoint multiple times. See in the docs all the [available parameters](https://github.com/ccxt/ccxt/wiki/Manual#pagination-params)
|
4986
4998
|
:param str [params.isPlan]: *swap only* 'plan' for stop orders and 'profit_loss' for tp/sl orders, default is 'plan'
|
4999
|
+
:param str [params.productType]: *contract only* 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
|
4987
5000
|
:returns dict: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
4988
5001
|
"""
|
4989
|
-
if symbol is None:
|
4990
|
-
raise ArgumentsRequired(self.id + ' fetchCanceledOrders() requires a symbol argument')
|
4991
5002
|
self.load_markets()
|
4992
|
-
market =
|
5003
|
+
market = None
|
5004
|
+
if symbol is not None:
|
5005
|
+
market = self.market(symbol)
|
4993
5006
|
response = self.fetch_canceled_and_closed_orders(symbol, since, limit, params)
|
4994
5007
|
result = []
|
4995
5008
|
for i in range(0, len(response)):
|
@@ -5004,25 +5017,27 @@ class bitget(Exchange, ImplicitAPI):
|
|
5004
5017
|
sandboxMode = self.safe_value(self.options, 'sandboxMode', False)
|
5005
5018
|
market = None
|
5006
5019
|
if sandboxMode:
|
5007
|
-
|
5008
|
-
|
5009
|
-
|
5020
|
+
if symbol is not None:
|
5021
|
+
sandboxSymbol = self.convert_symbol_for_sandbox(symbol)
|
5022
|
+
symbol = sandboxSymbol
|
5023
|
+
request = {}
|
5024
|
+
if symbol is not None:
|
5010
5025
|
market = self.market(symbol)
|
5026
|
+
request['symbol'] = market['id']
|
5027
|
+
marketType = None
|
5028
|
+
marketType, params = self.handle_market_type_and_params('fetchCanceledAndClosedOrders', market, params)
|
5011
5029
|
marginMode = None
|
5012
5030
|
marginMode, params = self.handle_margin_mode_and_params('fetchCanceledAndClosedOrders', params)
|
5013
5031
|
paginate = False
|
5014
5032
|
paginate, params = self.handle_option_and_params(params, 'fetchCanceledAndClosedOrders', 'paginate')
|
5015
5033
|
if paginate:
|
5016
5034
|
cursorReceived = None
|
5017
|
-
if
|
5035
|
+
if marketType == 'spot':
|
5018
5036
|
if marginMode is not None:
|
5019
5037
|
cursorReceived = 'minId'
|
5020
5038
|
else:
|
5021
5039
|
cursorReceived = 'endId'
|
5022
5040
|
return self.fetch_paginated_call_cursor('fetchCanceledAndClosedOrders', symbol, since, limit, params, cursorReceived, 'idLessThan')
|
5023
|
-
request = {
|
5024
|
-
'symbol': market['id'],
|
5025
|
-
}
|
5026
5041
|
response = None
|
5027
5042
|
stop = self.safe_value_2(params, 'stop', 'trigger')
|
5028
5043
|
params = self.omit(params, ['stop', 'trigger'])
|
@@ -5031,13 +5046,13 @@ class bitget(Exchange, ImplicitAPI):
|
|
5031
5046
|
request['startTime'] = since
|
5032
5047
|
if limit is not None:
|
5033
5048
|
request['limit'] = limit
|
5034
|
-
if (
|
5049
|
+
if (marketType == 'swap') or (marketType == 'future') or (marginMode is not None):
|
5035
5050
|
clientOrderId = self.safe_string_2(params, 'clientOid', 'clientOrderId')
|
5036
5051
|
params = self.omit(params, 'clientOrderId')
|
5037
5052
|
if clientOrderId is not None:
|
5038
5053
|
request['clientOid'] = clientOrderId
|
5039
5054
|
now = self.milliseconds()
|
5040
|
-
if
|
5055
|
+
if marketType == 'spot':
|
5041
5056
|
if marginMode is not None:
|
5042
5057
|
if since is None:
|
5043
5058
|
since = now - 7776000000
|
@@ -5048,6 +5063,8 @@ class bitget(Exchange, ImplicitAPI):
|
|
5048
5063
|
response = self.privateMarginGetV2MarginCrossedHistoryOrders(self.extend(request, params))
|
5049
5064
|
else:
|
5050
5065
|
if stop:
|
5066
|
+
if symbol is None:
|
5067
|
+
raise ArgumentsRequired(self.id + ' fetchCanceledAndClosedOrders() requires a symbol argument')
|
5051
5068
|
endTime = self.safe_integer_n(params, ['endTime', 'until', 'till'])
|
5052
5069
|
params = self.omit(params, ['until', 'till'])
|
5053
5070
|
if since is None:
|
@@ -5247,7 +5264,7 @@ class bitget(Exchange, ImplicitAPI):
|
|
5247
5264
|
# }
|
5248
5265
|
#
|
5249
5266
|
data = self.safe_value(response, 'data', {})
|
5250
|
-
if
|
5267
|
+
if marketType == 'spot':
|
5251
5268
|
if (marginMode is not None) or stop:
|
5252
5269
|
return self.safe_value(data, 'orderList', [])
|
5253
5270
|
else:
|
@@ -5879,11 +5896,10 @@ class bitget(Exchange, ImplicitAPI):
|
|
5879
5896
|
#
|
5880
5897
|
# closeAllPositions
|
5881
5898
|
#
|
5882
|
-
#
|
5883
|
-
#
|
5884
|
-
#
|
5885
|
-
#
|
5886
|
-
# }
|
5899
|
+
# {
|
5900
|
+
# "orderId": "1120923953904893955",
|
5901
|
+
# "clientOid": "1120923953904893956"
|
5902
|
+
# }
|
5887
5903
|
#
|
5888
5904
|
marketId = self.safe_string(position, 'symbol')
|
5889
5905
|
market = self.safe_market(marketId, market, None, 'contract')
|
@@ -5942,7 +5958,7 @@ class bitget(Exchange, ImplicitAPI):
|
|
5942
5958
|
percentage = Precise.string_mul(Precise.string_div(unrealizedPnl, initialMargin, 4), '100')
|
5943
5959
|
return self.safe_position({
|
5944
5960
|
'info': position,
|
5945
|
-
'id':
|
5961
|
+
'id': self.safe_string(position, 'orderId'),
|
5946
5962
|
'symbol': symbol,
|
5947
5963
|
'notional': self.parse_number(notional),
|
5948
5964
|
'marginMode': marginMode,
|
@@ -7456,57 +7472,87 @@ class bitget(Exchange, ImplicitAPI):
|
|
7456
7472
|
'info': info,
|
7457
7473
|
}
|
7458
7474
|
|
7475
|
+
def close_position(self, symbol: str, side: OrderSide = None, params={}) -> Order:
|
7476
|
+
"""
|
7477
|
+
closes an open position for a market
|
7478
|
+
:see: https://www.bitget.com/api-doc/contract/trade/Flash-Close-Position
|
7479
|
+
:param str symbol: unified CCXT market symbol
|
7480
|
+
:param str [side]: one-way mode: 'buy' or 'sell', hedge-mode: 'long' or 'short'
|
7481
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
7482
|
+
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
7483
|
+
"""
|
7484
|
+
self.load_markets()
|
7485
|
+
sandboxMode = self.safe_value(self.options, 'sandboxMode', False)
|
7486
|
+
market = None
|
7487
|
+
if sandboxMode:
|
7488
|
+
sandboxSymbol = self.convert_symbol_for_sandbox(symbol)
|
7489
|
+
market = self.market(sandboxSymbol)
|
7490
|
+
else:
|
7491
|
+
market = self.market(symbol)
|
7492
|
+
productType = None
|
7493
|
+
productType, params = self.handle_product_type_and_params(market, params)
|
7494
|
+
request = {
|
7495
|
+
'symbol': market['id'],
|
7496
|
+
'productType': productType,
|
7497
|
+
}
|
7498
|
+
if side is not None:
|
7499
|
+
request['holdSide'] = side
|
7500
|
+
response = self.privateMixPostV2MixOrderClosePositions(self.extend(request, params))
|
7501
|
+
#
|
7502
|
+
# {
|
7503
|
+
# "code": "00000",
|
7504
|
+
# "msg": "success",
|
7505
|
+
# "requestTime": 1702975017017,
|
7506
|
+
# "data": {
|
7507
|
+
# "successList": [
|
7508
|
+
# {
|
7509
|
+
# "orderId": "1120923953904893955",
|
7510
|
+
# "clientOid": "1120923953904893956"
|
7511
|
+
# }
|
7512
|
+
# ],
|
7513
|
+
# "failureList": [],
|
7514
|
+
# "result": False
|
7515
|
+
# }
|
7516
|
+
# }
|
7517
|
+
#
|
7518
|
+
data = self.safe_value(response, 'data', {})
|
7519
|
+
order = self.safe_value(data, 'successList', [])
|
7520
|
+
return self.parse_order(order[0], market)
|
7521
|
+
|
7459
7522
|
def close_all_positions(self, params={}) -> List[Position]:
|
7460
7523
|
"""
|
7461
|
-
closes open positions for a market
|
7462
|
-
:see: https://
|
7463
|
-
:param dict [params]: extra parameters specific to the
|
7464
|
-
:param str [params.
|
7465
|
-
:
|
7466
|
-
:returns dict[]: `A list of position structures <https://docs.ccxt.com/#/?id=position-structure>`
|
7524
|
+
closes all open positions for a market type
|
7525
|
+
:see: https://www.bitget.com/api-doc/contract/trade/Flash-Close-Position
|
7526
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
7527
|
+
:param str [params.productType]: 'USDT-FUTURES', 'USDC-FUTURES', 'COIN-FUTURES', 'SUSDT-FUTURES', 'SUSDC-FUTURES' or 'SCOIN-FUTURES'
|
7528
|
+
:returns dict[]: A list of `position structures <https://docs.ccxt.com/#/?id=position-structure>`
|
7467
7529
|
"""
|
7468
7530
|
self.load_markets()
|
7469
|
-
|
7470
|
-
|
7471
|
-
|
7472
|
-
|
7473
|
-
|
7474
|
-
|
7475
|
-
|
7476
|
-
|
7477
|
-
|
7478
|
-
|
7479
|
-
|
7480
|
-
|
7481
|
-
|
7482
|
-
|
7483
|
-
|
7484
|
-
|
7485
|
-
|
7486
|
-
|
7487
|
-
|
7488
|
-
|
7489
|
-
|
7490
|
-
#
|
7491
|
-
# {
|
7492
|
-
# "code": "00000",
|
7493
|
-
# "msg": "success",
|
7494
|
-
# "requestTime": 1700814442466,
|
7495
|
-
# "data": {
|
7496
|
-
# "orderInfo": [
|
7497
|
-
# {
|
7498
|
-
# "symbol": "XRPUSDT_UMCBL",
|
7499
|
-
# "orderId": "1111861847410757635",
|
7500
|
-
# "clientOid": "1111861847410757637"
|
7501
|
-
# },
|
7502
|
-
# ],
|
7503
|
-
# "failure": [],
|
7504
|
-
# "result": True
|
7505
|
-
# }
|
7506
|
-
# }
|
7531
|
+
productType = None
|
7532
|
+
productType, params = self.handle_product_type_and_params(None, params)
|
7533
|
+
request = {
|
7534
|
+
'productType': productType,
|
7535
|
+
}
|
7536
|
+
response = self.privateMixPostV2MixOrderClosePositions(self.extend(request, params))
|
7537
|
+
#
|
7538
|
+
# {
|
7539
|
+
# "code": "00000",
|
7540
|
+
# "msg": "success",
|
7541
|
+
# "requestTime": 1702975017017,
|
7542
|
+
# "data": {
|
7543
|
+
# "successList": [
|
7544
|
+
# {
|
7545
|
+
# "orderId": "1120923953904893955",
|
7546
|
+
# "clientOid": "1120923953904893956"
|
7547
|
+
# }
|
7548
|
+
# ],
|
7549
|
+
# "failureList": [],
|
7550
|
+
# "result": False
|
7551
|
+
# }
|
7552
|
+
# }
|
7507
7553
|
#
|
7508
7554
|
data = self.safe_value(response, 'data', {})
|
7509
|
-
orderInfo = self.safe_value(data, '
|
7555
|
+
orderInfo = self.safe_value(data, 'successList', [])
|
7510
7556
|
return self.parse_positions(orderInfo, None, params)
|
7511
7557
|
|
7512
7558
|
def handle_errors(self, code, reason, url, method, headers, body, response, requestHeaders, requestBody):
|
ccxt/bitrue.py
CHANGED
@@ -1483,15 +1483,8 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1483
1483
|
first = self.safe_string(symbols, 0)
|
1484
1484
|
market = self.market(first)
|
1485
1485
|
if market['swap']:
|
1486
|
-
|
1487
|
-
if market['linear']:
|
1488
|
-
response = self.fapiV1PublicGetTicker(self.extend(request, params))
|
1489
|
-
elif market['inverse']:
|
1490
|
-
response = self.dapiV1PublicGetTicker(self.extend(request, params))
|
1491
|
-
response['symbol'] = market['id']
|
1492
|
-
data = [response]
|
1486
|
+
raise NotSupported(self.id + ' fetchTickers does not support swap markets, please use fetchTicker instead')
|
1493
1487
|
elif market['spot']:
|
1494
|
-
request['symbol'] = market['id']
|
1495
1488
|
response = self.spotV1PublicGetTicker24hr(self.extend(request, params))
|
1496
1489
|
data = response
|
1497
1490
|
else:
|
@@ -1499,7 +1492,7 @@ class bitrue(Exchange, ImplicitAPI):
|
|
1499
1492
|
else:
|
1500
1493
|
type, params = self.handle_market_type_and_params('fetchTickers', None, params)
|
1501
1494
|
if type != 'spot':
|
1502
|
-
raise NotSupported(self.id + ' fetchTickers only support spot when symbols
|
1495
|
+
raise NotSupported(self.id + ' fetchTickers only support spot when symbols are not proved')
|
1503
1496
|
response = self.spotV1PublicGetTicker24hr(self.extend(request, params))
|
1504
1497
|
data = response
|
1505
1498
|
#
|
ccxt/bybit.py
CHANGED
@@ -311,6 +311,7 @@ class bybit(Exchange, ImplicitAPI):
|
|
311
311
|
'v5/account/fee-rate': 10, # 5/s = 1000 / (20 * 10)
|
312
312
|
'v5/account/info': 5,
|
313
313
|
'v5/account/transaction-log': 1,
|
314
|
+
'v5/account/smp-group': 1,
|
314
315
|
'v5/account/mmp-state': 5,
|
315
316
|
# asset
|
316
317
|
'v5/asset/exchange/order-record': 5, # 10/s => cost = 50 / 10 = 5
|