ccxt 4.4.5__py2.py3-none-any.whl → 4.4.6__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/bitmart.py +4 -0
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/bitflyer.py +2 -2
- ccxt/async_support/bitget.py +8 -1
- ccxt/async_support/bitmart.py +179 -127
- ccxt/async_support/bybit.py +11 -1
- ccxt/async_support/coinbase.py +6 -8
- ccxt/async_support/kraken.py +5 -1
- ccxt/async_support/mexc.py +29 -6
- ccxt/base/exchange.py +1 -1
- ccxt/bitflyer.py +2 -2
- ccxt/bitget.py +8 -1
- ccxt/bitmart.py +179 -127
- ccxt/bybit.py +11 -1
- ccxt/coinbase.py +6 -8
- ccxt/kraken.py +5 -1
- ccxt/mexc.py +29 -6
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/htx.py +14 -0
- ccxt/pro/kraken.py +57 -0
- {ccxt-4.4.5.dist-info → ccxt-4.4.6.dist-info}/METADATA +4 -4
- {ccxt-4.4.5.dist-info → ccxt-4.4.6.dist-info}/RECORD +27 -27
- {ccxt-4.4.5.dist-info → ccxt-4.4.6.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.5.dist-info → ccxt-4.4.6.dist-info}/WHEEL +0 -0
- {ccxt-4.4.5.dist-info → ccxt-4.4.6.dist-info}/top_level.txt +0 -0
ccxt/async_support/mexc.py
CHANGED
@@ -45,6 +45,9 @@ class mexc(Exchange, ImplicitAPI):
|
|
45
45
|
'future': False,
|
46
46
|
'option': False,
|
47
47
|
'addMargin': True,
|
48
|
+
'borrowCrossMargin': False,
|
49
|
+
'borrowIsolatedMargin': False,
|
50
|
+
'borrowMargin': False,
|
48
51
|
'cancelAllOrders': True,
|
49
52
|
'cancelOrder': True,
|
50
53
|
'cancelOrders': None,
|
@@ -58,12 +61,21 @@ class mexc(Exchange, ImplicitAPI):
|
|
58
61
|
'createOrders': True,
|
59
62
|
'createPostOnlyOrder': True,
|
60
63
|
'createReduceOnlyOrder': True,
|
64
|
+
'createStopLimitOrder': True,
|
65
|
+
'createStopMarketOrder': True,
|
66
|
+
'createStopOrder': True,
|
67
|
+
'createTriggerOrder': True,
|
61
68
|
'deposit': None,
|
62
69
|
'editOrder': None,
|
63
70
|
'fetchAccounts': True,
|
64
71
|
'fetchBalance': True,
|
65
72
|
'fetchBidsAsks': True,
|
66
|
-
'
|
73
|
+
'fetchBorrowInterest': False,
|
74
|
+
'fetchBorrowRate': False,
|
75
|
+
'fetchBorrowRateHistories': False,
|
76
|
+
'fetchBorrowRateHistory': False,
|
77
|
+
'fetchBorrowRates': False,
|
78
|
+
'fetchBorrowRatesPerSymbol': False,
|
67
79
|
'fetchCanceledOrders': True,
|
68
80
|
'fetchClosedOrder': None,
|
69
81
|
'fetchClosedOrders': True,
|
@@ -84,6 +96,7 @@ class mexc(Exchange, ImplicitAPI):
|
|
84
96
|
'fetchIndexOHLCV': True,
|
85
97
|
'fetchIsolatedBorrowRate': False,
|
86
98
|
'fetchIsolatedBorrowRates': False,
|
99
|
+
'fetchIsolatedPositions': False,
|
87
100
|
'fetchL2OrderBook': True,
|
88
101
|
'fetchLedger': None,
|
89
102
|
'fetchLedgerEntry': None,
|
@@ -92,11 +105,13 @@ class mexc(Exchange, ImplicitAPI):
|
|
92
105
|
'fetchLeverageTiers': True,
|
93
106
|
'fetchMarginAdjustmentHistory': False,
|
94
107
|
'fetchMarginMode': False,
|
95
|
-
'fetchMarketLeverageTiers':
|
108
|
+
'fetchMarketLeverageTiers': 'emulated',
|
96
109
|
'fetchMarkets': True,
|
97
110
|
'fetchMarkOHLCV': True,
|
98
111
|
'fetchMyTrades': True,
|
99
112
|
'fetchOHLCV': True,
|
113
|
+
'fetchOpenInterest': False,
|
114
|
+
'fetchOpenInterestHistory': False,
|
100
115
|
'fetchOpenOrder': None,
|
101
116
|
'fetchOpenOrders': True,
|
102
117
|
'fetchOrder': True,
|
@@ -414,6 +429,8 @@ class mexc(Exchange, ImplicitAPI):
|
|
414
429
|
},
|
415
430
|
},
|
416
431
|
'options': {
|
432
|
+
'adjustForTimeDifference': False,
|
433
|
+
'timeDifference': 0,
|
417
434
|
'createMarketBuyOrderRequiresPrice': True,
|
418
435
|
'unavailableContracts': {
|
419
436
|
'BTC/USDT:USDT': True,
|
@@ -468,6 +485,7 @@ class mexc(Exchange, ImplicitAPI):
|
|
468
485
|
'AVAXC': 'AVAX_CCHAIN',
|
469
486
|
'ERC20': 'ETH',
|
470
487
|
'ACA': 'ACALA',
|
488
|
+
'BEP20': 'BSC',
|
471
489
|
# 'ADA': 'Cardano(ADA)',
|
472
490
|
# 'AE': 'AE',
|
473
491
|
# 'ALGO': 'Algorand(ALGO)',
|
@@ -1008,6 +1026,8 @@ class mexc(Exchange, ImplicitAPI):
|
|
1008
1026
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1009
1027
|
:returns dict[]: an array of objects representing market data
|
1010
1028
|
"""
|
1029
|
+
if self.options['adjustForTimeDifference']:
|
1030
|
+
await self.load_time_difference()
|
1011
1031
|
spotMarketPromise = self.fetch_spot_markets(params)
|
1012
1032
|
swapMarketPromise = self.fetch_swap_markets(params)
|
1013
1033
|
spotMarket, swapMarket = await asyncio.gather(*[spotMarketPromise, swapMarketPromise])
|
@@ -4248,7 +4268,7 @@ class mexc(Exchange, ImplicitAPI):
|
|
4248
4268
|
# 'coin': currency['id'] + network example: USDT-TRX,
|
4249
4269
|
# 'status': 'status',
|
4250
4270
|
# 'startTime': since, # default 90 days
|
4251
|
-
# 'endTime': self.
|
4271
|
+
# 'endTime': self.nonce(),
|
4252
4272
|
# 'limit': limit, # default 1000, maximum 1000
|
4253
4273
|
}
|
4254
4274
|
currency = None
|
@@ -4301,7 +4321,7 @@ class mexc(Exchange, ImplicitAPI):
|
|
4301
4321
|
# 'coin': currency['id'],
|
4302
4322
|
# 'status': 'status',
|
4303
4323
|
# 'startTime': since, # default 90 days
|
4304
|
-
# 'endTime': self.
|
4324
|
+
# 'endTime': self.nonce(),
|
4305
4325
|
# 'limit': limit, # default 1000, maximum 1000
|
4306
4326
|
}
|
4307
4327
|
currency = None
|
@@ -5266,6 +5286,9 @@ class mexc(Exchange, ImplicitAPI):
|
|
5266
5286
|
positions = self.parse_positions(data, symbols, params)
|
5267
5287
|
return self.filter_by_since_limit(positions, since, limit)
|
5268
5288
|
|
5289
|
+
def nonce(self):
|
5290
|
+
return self.milliseconds() - self.safe_integer(self.options, 'timeDifference', 0)
|
5291
|
+
|
5269
5292
|
def sign(self, path, api='public', method='GET', params={}, headers=None, body=None):
|
5270
5293
|
section = self.safe_string(api, 0)
|
5271
5294
|
access = self.safe_string(api, 1)
|
@@ -5278,7 +5301,7 @@ class mexc(Exchange, ImplicitAPI):
|
|
5278
5301
|
url = self.urls['api'][section][access] + '/api/' + self.version + '/' + path
|
5279
5302
|
paramsEncoded = ''
|
5280
5303
|
if access == 'private':
|
5281
|
-
params['timestamp'] = self.
|
5304
|
+
params['timestamp'] = self.nonce()
|
5282
5305
|
params['recvWindow'] = self.safe_integer(self.options, 'recvWindow', 5000)
|
5283
5306
|
if params:
|
5284
5307
|
paramsEncoded = self.urlencode(params)
|
@@ -5301,7 +5324,7 @@ class mexc(Exchange, ImplicitAPI):
|
|
5301
5324
|
url += '?' + self.urlencode(params)
|
5302
5325
|
else:
|
5303
5326
|
self.check_required_credentials()
|
5304
|
-
timestamp = str(self.
|
5327
|
+
timestamp = str(self.nonce())
|
5305
5328
|
auth = ''
|
5306
5329
|
headers = {
|
5307
5330
|
'ApiKey': self.apiKey,
|
ccxt/base/exchange.py
CHANGED
ccxt/bitflyer.py
CHANGED
@@ -995,8 +995,8 @@ class bitflyer(Exchange, ImplicitAPI):
|
|
995
995
|
feedback = self.id + ' ' + body
|
996
996
|
# i.e. {"status":-2,"error_message":"Under maintenance","data":null}
|
997
997
|
errorMessage = self.safe_string(response, 'error_message')
|
998
|
-
statusCode = self.
|
998
|
+
statusCode = self.safe_integer(response, 'status')
|
999
999
|
if errorMessage is not None:
|
1000
1000
|
self.throw_exactly_matched_exception(self.exceptions['exact'], statusCode, feedback)
|
1001
|
-
|
1001
|
+
raise ExchangeError(feedback)
|
1002
1002
|
return None
|
ccxt/bitget.py
CHANGED
@@ -1336,6 +1336,8 @@ class bitget(Exchange, ImplicitAPI):
|
|
1336
1336
|
'TONCOIN': 'TON',
|
1337
1337
|
},
|
1338
1338
|
'options': {
|
1339
|
+
'timeDifference': 0, # the difference between system clock and Binance clock
|
1340
|
+
'adjustForTimeDifference': False, # controls the adjustment logic upon instantiation
|
1339
1341
|
'timeframes': {
|
1340
1342
|
'spot': {
|
1341
1343
|
'1m': '1min',
|
@@ -1538,6 +1540,8 @@ class bitget(Exchange, ImplicitAPI):
|
|
1538
1540
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1539
1541
|
:returns dict[]: an array of objects representing market data
|
1540
1542
|
"""
|
1543
|
+
if self.options['adjustForTimeDifference']:
|
1544
|
+
self.load_time_difference()
|
1541
1545
|
sandboxMode = self.safe_bool(self.options, 'sandboxMode', False)
|
1542
1546
|
types = self.safe_value(self.options, 'fetchMarkets', ['spot', 'swap'])
|
1543
1547
|
if sandboxMode:
|
@@ -8202,6 +8206,9 @@ class bitget(Exchange, ImplicitAPI):
|
|
8202
8206
|
raise ExchangeError(feedback) # unknown message
|
8203
8207
|
return None
|
8204
8208
|
|
8209
|
+
def nonce(self):
|
8210
|
+
return self.milliseconds() - self.options['timeDifference']
|
8211
|
+
|
8205
8212
|
def sign(self, path, api=[], method='GET', params={}, headers=None, body=None):
|
8206
8213
|
signed = api[0] == 'private'
|
8207
8214
|
endpoint = api[1]
|
@@ -8217,7 +8224,7 @@ class bitget(Exchange, ImplicitAPI):
|
|
8217
8224
|
url = url + '?' + self.urlencode(query)
|
8218
8225
|
if signed:
|
8219
8226
|
self.check_required_credentials()
|
8220
|
-
timestamp = str(self.
|
8227
|
+
timestamp = str(self.nonce())
|
8221
8228
|
auth = timestamp + method + payload
|
8222
8229
|
if method == 'POST':
|
8223
8230
|
body = self.json(params)
|
ccxt/bitmart.py
CHANGED
@@ -268,6 +268,10 @@ class bitmart(Exchange, ImplicitAPI):
|
|
268
268
|
'contract/private/submit-plan-order': 2.5,
|
269
269
|
'contract/private/cancel-plan-order': 1.5,
|
270
270
|
'contract/private/submit-leverage': 2.5,
|
271
|
+
'contract/private/submit-tp-sl-order': 2.5,
|
272
|
+
'contract/private/modify-plan-order': 2.5,
|
273
|
+
'contract/private/modify-preset-plan-order': 2.5,
|
274
|
+
'contract/private/modify-tp-sl-order': 2.5,
|
271
275
|
},
|
272
276
|
},
|
273
277
|
},
|
@@ -881,43 +885,43 @@ class bitmart(Exchange, ImplicitAPI):
|
|
881
885
|
def fetch_contract_markets(self, params={}):
|
882
886
|
response = self.publicGetContractPublicDetails(params)
|
883
887
|
#
|
884
|
-
#
|
885
|
-
#
|
886
|
-
#
|
887
|
-
#
|
888
|
-
#
|
889
|
-
#
|
890
|
-
#
|
891
|
-
#
|
892
|
-
#
|
893
|
-
#
|
894
|
-
#
|
895
|
-
#
|
896
|
-
#
|
897
|
-
#
|
898
|
-
#
|
899
|
-
#
|
900
|
-
#
|
901
|
-
#
|
902
|
-
#
|
903
|
-
#
|
904
|
-
#
|
905
|
-
#
|
906
|
-
#
|
907
|
-
#
|
908
|
-
#
|
909
|
-
#
|
910
|
-
#
|
911
|
-
#
|
912
|
-
#
|
913
|
-
#
|
914
|
-
#
|
915
|
-
#
|
916
|
-
#
|
917
|
-
#
|
918
|
-
#
|
888
|
+
# {
|
889
|
+
# "code": 1000,
|
890
|
+
# "message": "Ok",
|
891
|
+
# "data": {
|
892
|
+
# "symbols": [
|
893
|
+
# {
|
894
|
+
# "symbol": "BTCUSDT",
|
895
|
+
# "product_type": 1,
|
896
|
+
# "open_timestamp": 1645977600000,
|
897
|
+
# "expire_timestamp": 0,
|
898
|
+
# "settle_timestamp": 0,
|
899
|
+
# "base_currency": "BTC",
|
900
|
+
# "quote_currency": "USDT",
|
901
|
+
# "last_price": "63547.4",
|
902
|
+
# "volume_24h": "110938430",
|
903
|
+
# "turnover_24h": "7004836342.6944",
|
904
|
+
# "index_price": "63587.85404255",
|
905
|
+
# "index_name": "BTCUSDT",
|
906
|
+
# "contract_size": "0.001",
|
907
|
+
# "min_leverage": "1",
|
908
|
+
# "max_leverage": "100",
|
909
|
+
# "price_precision": "0.1",
|
910
|
+
# "vol_precision": "1",
|
911
|
+
# "max_volume": "1000000",
|
912
|
+
# "min_volume": "1",
|
913
|
+
# "funding_rate": "0.0000801",
|
914
|
+
# "expected_funding_rate": "-0.0000035",
|
915
|
+
# "open_interest": "278214",
|
916
|
+
# "open_interest_value": "17555316.9355496",
|
917
|
+
# "high_24h": "64109.4",
|
918
|
+
# "low_24h": "61857.6",
|
919
|
+
# "change_24h": "0.0239264900886327",
|
920
|
+
# "funding_time": 1726819200000
|
921
|
+
# },
|
922
|
+
# ]
|
923
|
+
# }
|
919
924
|
# }
|
920
|
-
# }
|
921
925
|
#
|
922
926
|
data = self.safe_value(response, 'data', {})
|
923
927
|
symbols = self.safe_value(data, 'symbols', [])
|
@@ -1192,33 +1196,34 @@ class bitmart(Exchange, ImplicitAPI):
|
|
1192
1196
|
# swap
|
1193
1197
|
#
|
1194
1198
|
# {
|
1195
|
-
#
|
1196
|
-
#
|
1197
|
-
#
|
1198
|
-
#
|
1199
|
-
#
|
1200
|
-
#
|
1201
|
-
#
|
1202
|
-
#
|
1203
|
-
#
|
1204
|
-
#
|
1205
|
-
#
|
1206
|
-
#
|
1207
|
-
#
|
1208
|
-
#
|
1209
|
-
#
|
1210
|
-
#
|
1211
|
-
#
|
1212
|
-
#
|
1213
|
-
#
|
1214
|
-
#
|
1215
|
-
#
|
1216
|
-
#
|
1217
|
-
#
|
1218
|
-
#
|
1219
|
-
#
|
1220
|
-
#
|
1221
|
-
#
|
1199
|
+
# "symbol": "BTCUSDT",
|
1200
|
+
# "product_type": 1,
|
1201
|
+
# "open_timestamp": 1645977600000,
|
1202
|
+
# "expire_timestamp": 0,
|
1203
|
+
# "settle_timestamp": 0,
|
1204
|
+
# "base_currency": "BTC",
|
1205
|
+
# "quote_currency": "USDT",
|
1206
|
+
# "last_price": "63547.4",
|
1207
|
+
# "volume_24h": "110938430",
|
1208
|
+
# "turnover_24h": "7004836342.6944",
|
1209
|
+
# "index_price": "63587.85404255",
|
1210
|
+
# "index_name": "BTCUSDT",
|
1211
|
+
# "contract_size": "0.001",
|
1212
|
+
# "min_leverage": "1",
|
1213
|
+
# "max_leverage": "100",
|
1214
|
+
# "price_precision": "0.1",
|
1215
|
+
# "vol_precision": "1",
|
1216
|
+
# "max_volume": "1000000",
|
1217
|
+
# "min_volume": "1",
|
1218
|
+
# "funding_rate": "0.0000801",
|
1219
|
+
# "expected_funding_rate": "-0.0000035",
|
1220
|
+
# "open_interest": "278214",
|
1221
|
+
# "open_interest_value": "17555316.9355496",
|
1222
|
+
# "high_24h": "64109.4",
|
1223
|
+
# "low_24h": "61857.6",
|
1224
|
+
# "change_24h": "0.0239264900886327",
|
1225
|
+
# "funding_time": 1726819200000
|
1226
|
+
# }
|
1222
1227
|
#
|
1223
1228
|
result = self.safe_list(ticker, 'result', [])
|
1224
1229
|
average = self.safe_string_2(ticker, 'avg_price', 'index_price')
|
@@ -1307,27 +1312,43 @@ class bitmart(Exchange, ImplicitAPI):
|
|
1307
1312
|
request['symbol'] = market['id']
|
1308
1313
|
response = self.publicGetContractPublicDetails(self.extend(request, params))
|
1309
1314
|
#
|
1310
|
-
#
|
1311
|
-
#
|
1312
|
-
#
|
1313
|
-
#
|
1314
|
-
#
|
1315
|
-
#
|
1316
|
-
#
|
1317
|
-
#
|
1318
|
-
#
|
1319
|
-
#
|
1320
|
-
#
|
1321
|
-
#
|
1322
|
-
#
|
1323
|
-
#
|
1324
|
-
#
|
1325
|
-
#
|
1326
|
-
#
|
1327
|
-
#
|
1328
|
-
#
|
1329
|
-
#
|
1330
|
-
#
|
1315
|
+
# {
|
1316
|
+
# "code": 1000,
|
1317
|
+
# "message": "Ok",
|
1318
|
+
# "data": {
|
1319
|
+
# "symbols": [
|
1320
|
+
# {
|
1321
|
+
# "symbol": "BTCUSDT",
|
1322
|
+
# "product_type": 1,
|
1323
|
+
# "open_timestamp": 1645977600000,
|
1324
|
+
# "expire_timestamp": 0,
|
1325
|
+
# "settle_timestamp": 0,
|
1326
|
+
# "base_currency": "BTC",
|
1327
|
+
# "quote_currency": "USDT",
|
1328
|
+
# "last_price": "63547.4",
|
1329
|
+
# "volume_24h": "110938430",
|
1330
|
+
# "turnover_24h": "7004836342.6944",
|
1331
|
+
# "index_price": "63587.85404255",
|
1332
|
+
# "index_name": "BTCUSDT",
|
1333
|
+
# "contract_size": "0.001",
|
1334
|
+
# "min_leverage": "1",
|
1335
|
+
# "max_leverage": "100",
|
1336
|
+
# "price_precision": "0.1",
|
1337
|
+
# "vol_precision": "1",
|
1338
|
+
# "max_volume": "1000000",
|
1339
|
+
# "min_volume": "1",
|
1340
|
+
# "funding_rate": "0.0000801",
|
1341
|
+
# "expected_funding_rate": "-0.0000035",
|
1342
|
+
# "open_interest": "278214",
|
1343
|
+
# "open_interest_value": "17555316.9355496",
|
1344
|
+
# "high_24h": "64109.4",
|
1345
|
+
# "low_24h": "61857.6",
|
1346
|
+
# "change_24h": "0.0239264900886327",
|
1347
|
+
# "funding_time": 1726819200000
|
1348
|
+
# },
|
1349
|
+
# ]
|
1350
|
+
# }
|
1351
|
+
# }
|
1331
1352
|
#
|
1332
1353
|
elif market['spot']:
|
1333
1354
|
request['symbol'] = market['id']
|
@@ -1414,43 +1435,43 @@ class bitmart(Exchange, ImplicitAPI):
|
|
1414
1435
|
elif type == 'swap':
|
1415
1436
|
response = self.publicGetContractPublicDetails(params)
|
1416
1437
|
#
|
1417
|
-
#
|
1418
|
-
#
|
1419
|
-
#
|
1420
|
-
#
|
1421
|
-
#
|
1422
|
-
#
|
1423
|
-
#
|
1424
|
-
#
|
1425
|
-
#
|
1426
|
-
#
|
1427
|
-
#
|
1428
|
-
#
|
1429
|
-
#
|
1430
|
-
#
|
1431
|
-
#
|
1432
|
-
#
|
1433
|
-
#
|
1434
|
-
#
|
1435
|
-
#
|
1436
|
-
#
|
1437
|
-
#
|
1438
|
-
#
|
1439
|
-
#
|
1440
|
-
#
|
1441
|
-
#
|
1442
|
-
#
|
1443
|
-
#
|
1444
|
-
#
|
1445
|
-
#
|
1446
|
-
#
|
1447
|
-
#
|
1448
|
-
#
|
1449
|
-
#
|
1450
|
-
#
|
1451
|
-
#
|
1452
|
-
#
|
1453
|
-
#
|
1438
|
+
# {
|
1439
|
+
# "code": 1000,
|
1440
|
+
# "message": "Ok",
|
1441
|
+
# "data": {
|
1442
|
+
# "symbols": [
|
1443
|
+
# {
|
1444
|
+
# "symbol": "BTCUSDT",
|
1445
|
+
# "product_type": 1,
|
1446
|
+
# "open_timestamp": 1645977600000,
|
1447
|
+
# "expire_timestamp": 0,
|
1448
|
+
# "settle_timestamp": 0,
|
1449
|
+
# "base_currency": "BTC",
|
1450
|
+
# "quote_currency": "USDT",
|
1451
|
+
# "last_price": "63547.4",
|
1452
|
+
# "volume_24h": "110938430",
|
1453
|
+
# "turnover_24h": "7004836342.6944",
|
1454
|
+
# "index_price": "63587.85404255",
|
1455
|
+
# "index_name": "BTCUSDT",
|
1456
|
+
# "contract_size": "0.001",
|
1457
|
+
# "min_leverage": "1",
|
1458
|
+
# "max_leverage": "100",
|
1459
|
+
# "price_precision": "0.1",
|
1460
|
+
# "vol_precision": "1",
|
1461
|
+
# "max_volume": "1000000",
|
1462
|
+
# "min_volume": "1",
|
1463
|
+
# "funding_rate": "0.0000801",
|
1464
|
+
# "expected_funding_rate": "-0.0000035",
|
1465
|
+
# "open_interest": "278214",
|
1466
|
+
# "open_interest_value": "17555316.9355496",
|
1467
|
+
# "high_24h": "64109.4",
|
1468
|
+
# "low_24h": "61857.6",
|
1469
|
+
# "change_24h": "0.0239264900886327",
|
1470
|
+
# "funding_time": 1726819200000
|
1471
|
+
# },
|
1472
|
+
# ]
|
1473
|
+
# }
|
1474
|
+
# }
|
1454
1475
|
#
|
1455
1476
|
else:
|
1456
1477
|
raise NotSupported(self.id + ' fetchTickers() does not support ' + type + ' markets, only spot and swap markets are accepted')
|
@@ -2366,6 +2387,7 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2366
2387
|
:see: https://developer-pro.bitmart.com/en/futures/#submit-order-signed
|
2367
2388
|
:see: https://developer-pro.bitmart.com/en/futures/#submit-plan-order-signed
|
2368
2389
|
:see: https://developer-pro.bitmart.com/en/futuresv2/#submit-plan-order-signed
|
2390
|
+
:see: https://developer-pro.bitmart.com/en/futuresv2/#submit-tp-or-sl-order-signed
|
2369
2391
|
:param str symbol: unified symbol of the market to create an order in
|
2370
2392
|
:param str type: 'market', 'limit' or 'trailing' for swap markets only
|
2371
2393
|
:param str side: 'buy' or 'sell'
|
@@ -2383,6 +2405,9 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2383
2405
|
:param int [params.activation_price_type]: *swap trailing order only* 1: last price, 2: fair price, default is 1
|
2384
2406
|
:param str [params.trailingPercent]: *swap only* the percent to trail away from the current market price, min 0.1 max 5
|
2385
2407
|
:param str [params.trailingTriggerPrice]: *swap only* the price to trigger a trailing order, default uses the price argument
|
2408
|
+
:param str [params.stopLossPrice]: *swap only* the price to trigger a stop-loss order
|
2409
|
+
:param str [params.takeProfitPrice]: *swap only* the price to trigger a take-profit order
|
2410
|
+
:param int [params.plan_category]: *swap tp/sl only* 1: tp/sl, 2: position tp/sl, default is 1
|
2386
2411
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
2387
2412
|
"""
|
2388
2413
|
self.load_markets()
|
@@ -2390,6 +2415,10 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2390
2415
|
result = self.handle_margin_mode_and_params('createOrder', params)
|
2391
2416
|
marginMode = self.safe_string(result, 0)
|
2392
2417
|
triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stopPrice', 'trigger_price'])
|
2418
|
+
stopLossPrice = self.safe_string(params, 'stopLossPrice')
|
2419
|
+
takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
|
2420
|
+
isStopLoss = stopLossPrice is not None
|
2421
|
+
isTakeProfit = takeProfitPrice is not None
|
2393
2422
|
isTriggerOrder = triggerPrice is not None
|
2394
2423
|
response = None
|
2395
2424
|
if market['spot']:
|
@@ -2402,6 +2431,8 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2402
2431
|
swapRequest = self.create_swap_order_request(symbol, type, side, amount, price, params)
|
2403
2432
|
if isTriggerOrder:
|
2404
2433
|
response = self.privatePostContractPrivateSubmitPlanOrder(swapRequest)
|
2434
|
+
elif isStopLoss or isTakeProfit:
|
2435
|
+
response = self.privatePostContractPrivateSubmitTpSlOrder(swapRequest)
|
2405
2436
|
else:
|
2406
2437
|
response = self.privatePostContractPrivateSubmitOrder(swapRequest)
|
2407
2438
|
#
|
@@ -2496,8 +2527,9 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2496
2527
|
:see: https://developer-pro.bitmart.com/en/futures/#submit-order-signed
|
2497
2528
|
:see: https://developer-pro.bitmart.com/en/futures/#submit-plan-order-signed
|
2498
2529
|
:see: https://developer-pro.bitmart.com/en/futuresv2/#submit-plan-order-signed
|
2530
|
+
:see: https://developer-pro.bitmart.com/en/futuresv2/#submit-tp-or-sl-order-signed
|
2499
2531
|
:param str symbol: unified symbol of the market to create an order in
|
2500
|
-
:param str type: 'market', 'limit' or '
|
2532
|
+
:param str type: 'market', 'limit', 'trailing', 'stop_loss', or 'take_profit'
|
2501
2533
|
:param str side: 'buy' or 'sell'
|
2502
2534
|
:param float amount: how much of currency you want to trade in units of base currency
|
2503
2535
|
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
@@ -2512,9 +2544,20 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2512
2544
|
:param int [params.activation_price_type]: *swap trailing order only* 1: last price, 2: fair price, default is 1
|
2513
2545
|
:param str [params.trailingPercent]: *swap only* the percent to trail away from the current market price, min 0.1 max 5
|
2514
2546
|
:param str [params.trailingTriggerPrice]: *swap only* the price to trigger a trailing order, default uses the price argument
|
2547
|
+
:param str [params.stopLossPrice]: *swap only* the price to trigger a stop-loss order
|
2548
|
+
:param str [params.takeProfitPrice]: *swap only* the price to trigger a take-profit order
|
2549
|
+
:param int [params.plan_category]: *swap tp/sl only* 1: tp/sl, 2: position tp/sl, default is 1
|
2515
2550
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
2516
2551
|
"""
|
2517
2552
|
market = self.market(symbol)
|
2553
|
+
stopLossPrice = self.safe_string(params, 'stopLossPrice')
|
2554
|
+
takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
|
2555
|
+
isStopLoss = stopLossPrice is not None
|
2556
|
+
isTakeProfit = takeProfitPrice is not None
|
2557
|
+
if isStopLoss:
|
2558
|
+
type = 'stop_loss'
|
2559
|
+
elif isTakeProfit:
|
2560
|
+
type = 'take_profit'
|
2518
2561
|
request: dict = {
|
2519
2562
|
'symbol': market['id'],
|
2520
2563
|
'type': type,
|
@@ -2524,7 +2567,7 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2524
2567
|
mode = self.safe_integer(params, 'mode') # only for swap
|
2525
2568
|
isMarketOrder = type == 'market'
|
2526
2569
|
postOnly = None
|
2527
|
-
reduceOnly = self.
|
2570
|
+
reduceOnly = self.safe_bool(params, 'reduceOnly')
|
2528
2571
|
isExchangeSpecificPo = (mode == 4)
|
2529
2572
|
postOnly, params = self.handle_post_only(isMarketOrder, isExchangeSpecificPo, params)
|
2530
2573
|
ioc = ((timeInForce == 'IOC') or (mode == 3))
|
@@ -2563,6 +2606,18 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2563
2606
|
request['price_way'] = 1
|
2564
2607
|
else:
|
2565
2608
|
request['price_way'] = 2
|
2609
|
+
marginMode = None
|
2610
|
+
marginMode, params = self.handle_margin_mode_and_params('createOrder', params, 'cross')
|
2611
|
+
if isStopLoss or isTakeProfit:
|
2612
|
+
reduceOnly = True
|
2613
|
+
request['price_type'] = self.safe_integer(params, 'price_type', 1)
|
2614
|
+
request['executive_price'] = self.price_to_precision(symbol, price)
|
2615
|
+
if isStopLoss:
|
2616
|
+
request['trigger_price'] = self.price_to_precision(symbol, stopLossPrice)
|
2617
|
+
else:
|
2618
|
+
request['trigger_price'] = self.price_to_precision(symbol, takeProfitPrice)
|
2619
|
+
else:
|
2620
|
+
request['open_type'] = marginMode
|
2566
2621
|
if side == 'buy':
|
2567
2622
|
if reduceOnly:
|
2568
2623
|
request['side'] = 2 # buy close short
|
@@ -2573,15 +2628,12 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2573
2628
|
request['side'] = 3 # sell close long
|
2574
2629
|
else:
|
2575
2630
|
request['side'] = 4 # sell open short
|
2576
|
-
marginMode = None
|
2577
|
-
marginMode, params = self.handle_margin_mode_and_params('createOrder', params, 'cross')
|
2578
|
-
request['open_type'] = marginMode
|
2579
2631
|
clientOrderId = self.safe_string(params, 'clientOrderId')
|
2580
2632
|
if clientOrderId is not None:
|
2581
2633
|
params = self.omit(params, 'clientOrderId')
|
2582
2634
|
request['client_order_id'] = clientOrderId
|
2583
2635
|
leverage = self.safe_integer(params, 'leverage')
|
2584
|
-
params = self.omit(params, ['timeInForce', 'postOnly', 'reduceOnly', 'leverage', 'trailingTriggerPrice', 'trailingPercent', 'triggerPrice', 'stopPrice'])
|
2636
|
+
params = self.omit(params, ['timeInForce', 'postOnly', 'reduceOnly', 'leverage', 'trailingTriggerPrice', 'trailingPercent', 'triggerPrice', 'stopPrice', 'stopLossPrice', 'takeProfitPrice'])
|
2585
2637
|
if leverage is not None:
|
2586
2638
|
request['leverage'] = self.number_to_string(leverage)
|
2587
2639
|
elif isTriggerOrder:
|
ccxt/bybit.py
CHANGED
@@ -1613,12 +1613,19 @@ class bybit(Exchange, ImplicitAPI):
|
|
1613
1613
|
def fetch_future_markets(self, params):
|
1614
1614
|
params = self.extend(params)
|
1615
1615
|
params['limit'] = 1000 # minimize number of requests
|
1616
|
+
preLaunchMarkets = []
|
1616
1617
|
usePrivateInstrumentsInfo = self.safe_bool(self.options, 'usePrivateInstrumentsInfo', False)
|
1617
1618
|
response: dict = None
|
1618
1619
|
if usePrivateInstrumentsInfo:
|
1619
1620
|
response = self.privateGetV5MarketInstrumentsInfo(params)
|
1620
1621
|
else:
|
1621
|
-
|
1622
|
+
linearPromises = [
|
1623
|
+
self.publicGetV5MarketInstrumentsInfo(params),
|
1624
|
+
self.publicGetV5MarketInstrumentsInfo(self.extend(params, {'status': 'PreLaunch'})),
|
1625
|
+
]
|
1626
|
+
promises = linearPromises
|
1627
|
+
response = self.safe_dict(promises, 0, {})
|
1628
|
+
preLaunchMarkets = self.safe_dict(promises, 1, {})
|
1622
1629
|
data = self.safe_dict(response, 'result', {})
|
1623
1630
|
markets = self.safe_list(data, 'list', [])
|
1624
1631
|
paginationCursor = self.safe_string(data, 'nextPageCursor')
|
@@ -1681,6 +1688,9 @@ class bybit(Exchange, ImplicitAPI):
|
|
1681
1688
|
# "time": 1672712495660
|
1682
1689
|
# }
|
1683
1690
|
#
|
1691
|
+
preLaunchData = self.safe_dict(preLaunchMarkets, 'result', {})
|
1692
|
+
preLaunchMarketsList = self.safe_list(preLaunchData, 'list', [])
|
1693
|
+
markets = self.array_concat(markets, preLaunchMarketsList)
|
1684
1694
|
result = []
|
1685
1695
|
category = self.safe_string(data, 'category')
|
1686
1696
|
for i in range(0, len(markets)):
|