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.
@@ -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
- 'fetchBorrowRateHistory': None,
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': None,
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.milliseconds(),
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.milliseconds(),
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.milliseconds()
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.milliseconds())
5327
+ timestamp = str(self.nonce())
5305
5328
  auth = ''
5306
5329
  headers = {
5307
5330
  'ApiKey': self.apiKey,
ccxt/base/exchange.py CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # -----------------------------------------------------------------------------
6
6
 
7
- __version__ = '4.4.5'
7
+ __version__ = '4.4.6'
8
8
 
9
9
  # -----------------------------------------------------------------------------
10
10
 
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.safe_number(response, 'status')
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
- self.throw_broadly_matched_exception(self.exceptions['broad'], errorMessage, feedback)
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.milliseconds())
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
- # "code": 1000,
886
- # "message": "Ok",
887
- # "trace": "9b92a999-9463-4c96-91a4-93ad1cad0d72",
888
- # "data": {
889
- # "symbols": [
890
- # {
891
- # "symbol": "BTCUSDT",
892
- # "product_type": 1,
893
- # "open_timestamp": 1594080000,
894
- # "expire_timestamp": 0,
895
- # "settle_timestamp": 0,
896
- # "base_currency": "BTC",
897
- # "quote_currency": "USDT",
898
- # "last_price": "23920",
899
- # "volume_24h": "18969368",
900
- # "turnover_24h": "458933659.7858",
901
- # "index_price": "23945.25191635",
902
- # "index_name": "BTCUSDT",
903
- # "contract_size": "0.001",
904
- # "min_leverage": "1",
905
- # "max_leverage": "100",
906
- # "price_precision": "0.1",
907
- # "vol_precision": "1",
908
- # "max_volume": "500000",
909
- # "min_volume": "1",
910
- # "funding_rate": "0.0001",
911
- # "expected_funding_rate": "0.00011",
912
- # "open_interest": "4134180870",
913
- # "open_interest_value": "94100888927.0433258",
914
- # "high_24h": "23900",
915
- # "low_24h": "23100",
916
- # "change_24h": "0.004"
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
- # "symbol": "BTCUSDT",
1196
- # "product_type": 1,
1197
- # "open_timestamp": 1594080000,
1198
- # "expire_timestamp": 0,
1199
- # "settle_timestamp": 0,
1200
- # "base_currency": "BTC",
1201
- # "quote_currency": "USDT",
1202
- # "last_price": "23920",
1203
- # "volume_24h": "18969368",
1204
- # "turnover_24h": "458933659.7858",
1205
- # "index_price": "23945.25191635",
1206
- # "index_name": "BTCUSDT",
1207
- # "contract_size": "0.001",
1208
- # "min_leverage": "1",
1209
- # "max_leverage": "100",
1210
- # "price_precision": "0.1",
1211
- # "vol_precision": "1",
1212
- # "max_volume": "500000",
1213
- # "min_volume": "1",
1214
- # "funding_rate": "0.0001",
1215
- # "expected_funding_rate": "0.00011",
1216
- # "open_interest": "4134180870",
1217
- # "open_interest_value": "94100888927.0433258",
1218
- # "high_24h": "23900",
1219
- # "low_24h": "23100",
1220
- # "change_24h": "0.004"
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
- # "message":"OK",
1312
- # "code":1000,
1313
- # "trace":"4a0ebceb-d3f7-45a3-8feb-f61e230e24cd",
1314
- # "data":{
1315
- # "tickers":[
1316
- # {
1317
- # "contract_symbol":"DOGEUSDT",
1318
- # "last_price":"0.130180",
1319
- # "index_price":"0.13028635",
1320
- # "last_funding_rate":"0.00002025",
1321
- # "price_change_percent_24h":"-2.326",
1322
- # "volume_24h":"116789313.01797258",
1323
- # "url":"https://futures.bitmart.com/en?symbol=DOGEUSDT",
1324
- # "high_price":"0.134520",
1325
- # "low_price":"0.128570",
1326
- # "legal_coin_price":"0.13017401"
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
- # "code": 1000,
1419
- # "message": "Ok",
1420
- # "trace": "9b92a999-9463-4c96-91a4-93ad1cad0d72",
1421
- # "data": {
1422
- # "symbols": [
1423
- # {
1424
- # "symbol": "BTCUSDT",
1425
- # "product_type": 1,
1426
- # "open_timestamp": 1594080000,
1427
- # "expire_timestamp": 0,
1428
- # "settle_timestamp": 0,
1429
- # "base_currency": "BTC",
1430
- # "quote_currency": "USDT",
1431
- # "last_price": "23920",
1432
- # "volume_24h": "18969368",
1433
- # "turnover_24h": "458933659.7858",
1434
- # "index_price": "23945.25191635",
1435
- # "index_name": "BTCUSDT",
1436
- # "contract_size": "0.001",
1437
- # "min_leverage": "1",
1438
- # "max_leverage": "100",
1439
- # "price_precision": "0.1",
1440
- # "vol_precision": "1",
1441
- # "max_volume": "500000",
1442
- # "min_volume": "1",
1443
- # "funding_rate": "0.0001",
1444
- # "expected_funding_rate": "0.00011",
1445
- # "open_interest": "4134180870",
1446
- # "open_interest_value": "94100888927.0433258",
1447
- # "high_24h": "23900",
1448
- # "low_24h": "23100",
1449
- # "change_24h": "0.004"
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 'trailing'
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.safe_value(params, 'reduceOnly')
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
- response = self.publicGetV5MarketInstrumentsInfo(params)
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)):