ccxt 4.4.5__py2.py3-none-any.whl → 4.4.7__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 +12 -3
- ccxt/async_support/bingx.py +3 -0
- ccxt/async_support/bitflyer.py +2 -2
- ccxt/async_support/bitget.py +16 -5
- ccxt/async_support/bitmart.py +288 -128
- ccxt/async_support/bybit.py +25 -11
- ccxt/async_support/coinbase.py +6 -8
- ccxt/async_support/gate.py +3 -0
- ccxt/async_support/kraken.py +5 -1
- ccxt/async_support/kucoin.py +2 -2
- ccxt/async_support/mexc.py +114 -19
- ccxt/base/exchange.py +16 -3
- ccxt/bingx.py +3 -0
- ccxt/bitflyer.py +2 -2
- ccxt/bitget.py +16 -5
- ccxt/bitmart.py +288 -128
- ccxt/bybit.py +25 -11
- ccxt/coinbase.py +6 -8
- ccxt/gate.py +3 -0
- ccxt/kraken.py +5 -1
- ccxt/kucoin.py +2 -2
- ccxt/mexc.py +114 -19
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/bitget.py +62 -0
- ccxt/pro/htx.py +14 -0
- ccxt/pro/kraken.py +57 -0
- ccxt/pro/okx.py +11 -5
- {ccxt-4.4.5.dist-info → ccxt-4.4.7.dist-info}/METADATA +4 -4
- {ccxt-4.4.5.dist-info → ccxt-4.4.7.dist-info}/RECORD +35 -35
- {ccxt-4.4.5.dist-info → ccxt-4.4.7.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.5.dist-info → ccxt-4.4.7.dist-info}/WHEEL +0 -0
- {ccxt-4.4.5.dist-info → ccxt-4.4.7.dist-info}/top_level.txt +0 -0
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')
|
@@ -2185,7 +2206,7 @@ class bitmart(Exchange, ImplicitAPI):
|
|
2185
2206
|
|
2186
2207
|
def parse_order(self, order: dict, market: Market = None) -> Order:
|
2187
2208
|
#
|
2188
|
-
# createOrder
|
2209
|
+
# createOrder, editOrder
|
2189
2210
|
#
|
2190
2211
|
# {
|
2191
2212
|
# "order_id": 2707217580
|
@@ -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:
|
@@ -4414,6 +4466,114 @@ class bitmart(Exchange, ImplicitAPI):
|
|
4414
4466
|
'datetime': self.iso8601(timestamp),
|
4415
4467
|
})
|
4416
4468
|
|
4469
|
+
def edit_order(self, id: str, symbol: str, type: OrderType, side: OrderSide, amount: Num = None, price: Num = None, params={}) -> Order:
|
4470
|
+
"""
|
4471
|
+
edits an open order
|
4472
|
+
:see: https://developer-pro.bitmart.com/en/futuresv2/#modify-plan-order-signed
|
4473
|
+
:see: https://developer-pro.bitmart.com/en/futuresv2/#modify-tp-sl-order-signed
|
4474
|
+
:see: https://developer-pro.bitmart.com/en/futuresv2/#modify-preset-plan-order-signed
|
4475
|
+
:param str id: order id
|
4476
|
+
:param str symbol: unified symbol of the market to edit an order in
|
4477
|
+
:param str type: 'market' or 'limit'
|
4478
|
+
:param str side: 'buy' or 'sell'
|
4479
|
+
:param float [amount]: how much you want to trade in units of the base currency
|
4480
|
+
:param float [price]: the price to fulfill the order, in units of the quote currency, ignored in market orders
|
4481
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
4482
|
+
:param str [params.triggerPrice]: *swap only* the price to trigger a stop order
|
4483
|
+
:param str [params.stopLossPrice]: *swap only* the price to trigger a stop-loss order
|
4484
|
+
:param str [params.takeProfitPrice]: *swap only* the price to trigger a take-profit order
|
4485
|
+
:param str [params.stopLoss.triggerPrice]: *swap only* the price to trigger a preset stop-loss order
|
4486
|
+
:param str [params.takeProfit.triggerPrice]: *swap only* the price to trigger a preset take-profit order
|
4487
|
+
:param str [params.clientOrderId]: client order id of the order
|
4488
|
+
:param int [params.price_type]: *swap only* 1: last price, 2: fair price, default is 1
|
4489
|
+
:param int [params.plan_category]: *swap tp/sl only* 1: tp/sl, 2: position tp/sl, default is 1
|
4490
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
4491
|
+
"""
|
4492
|
+
self.load_markets()
|
4493
|
+
market = self.market(symbol)
|
4494
|
+
if not market['swap']:
|
4495
|
+
raise NotSupported(self.id + ' editOrder() does not support ' + market['type'] + ' markets, only swap markets are supported')
|
4496
|
+
stopLossPrice = self.safe_string(params, 'stopLossPrice')
|
4497
|
+
takeProfitPrice = self.safe_string(params, 'takeProfitPrice')
|
4498
|
+
triggerPrice = self.safe_string_n(params, ['triggerPrice', 'stopPrice', 'trigger_price'])
|
4499
|
+
stopLoss = self.safe_dict(params, 'stopLoss', {})
|
4500
|
+
takeProfit = self.safe_dict(params, 'takeProfit', {})
|
4501
|
+
presetStopLoss = self.safe_string(stopLoss, 'triggerPrice')
|
4502
|
+
presetTakeProfit = self.safe_string(takeProfit, 'triggerPrice')
|
4503
|
+
isTriggerOrder = triggerPrice is not None
|
4504
|
+
isStopLoss = stopLossPrice is not None
|
4505
|
+
isTakeProfit = takeProfitPrice is not None
|
4506
|
+
isPresetStopLoss = presetStopLoss is not None
|
4507
|
+
isPresetTakeProfit = presetTakeProfit is not None
|
4508
|
+
request: dict = {
|
4509
|
+
'symbol': market['id'],
|
4510
|
+
}
|
4511
|
+
clientOrderId = self.safe_string(params, 'clientOrderId')
|
4512
|
+
if clientOrderId is not None:
|
4513
|
+
params = self.omit(params, 'clientOrderId')
|
4514
|
+
request['client_order_id'] = clientOrderId
|
4515
|
+
if id is not None:
|
4516
|
+
request['order_id'] = id
|
4517
|
+
params = self.omit(params, ['triggerPrice', 'stopPrice', 'stopLossPrice', 'takeProfitPrice', 'stopLoss', 'takeProfit'])
|
4518
|
+
response = None
|
4519
|
+
if isTriggerOrder or isStopLoss or isTakeProfit:
|
4520
|
+
request['price_type'] = self.safe_integer(params, 'price_type', 1)
|
4521
|
+
if price is not None:
|
4522
|
+
request['executive_price'] = self.price_to_precision(symbol, price)
|
4523
|
+
if isTriggerOrder:
|
4524
|
+
request['type'] = type
|
4525
|
+
request['trigger_price'] = self.price_to_precision(symbol, triggerPrice)
|
4526
|
+
response = self.privatePostContractPrivateModifyPlanOrder(self.extend(request, params))
|
4527
|
+
#
|
4528
|
+
# {
|
4529
|
+
# "code": 1000,
|
4530
|
+
# "message": "Ok",
|
4531
|
+
# "data": {
|
4532
|
+
# "order_id": "3000023150003503"
|
4533
|
+
# },
|
4534
|
+
# "trace": "324523453245.108.1734567125596324575"
|
4535
|
+
# }
|
4536
|
+
#
|
4537
|
+
elif isStopLoss or isTakeProfit:
|
4538
|
+
request['category'] = type
|
4539
|
+
if isStopLoss:
|
4540
|
+
request['trigger_price'] = self.price_to_precision(symbol, stopLossPrice)
|
4541
|
+
else:
|
4542
|
+
request['trigger_price'] = self.price_to_precision(symbol, takeProfitPrice)
|
4543
|
+
response = self.privatePostContractPrivateModifyTpSlOrder(self.extend(request, params))
|
4544
|
+
#
|
4545
|
+
# {
|
4546
|
+
# "code": 1000,
|
4547
|
+
# "message": "Ok",
|
4548
|
+
# "data": {
|
4549
|
+
# "order_id": "3000023150003480"
|
4550
|
+
# },
|
4551
|
+
# "trace": "23452345.104.1724536582682345459"
|
4552
|
+
# }
|
4553
|
+
#
|
4554
|
+
elif isPresetStopLoss or isPresetTakeProfit:
|
4555
|
+
if isPresetStopLoss:
|
4556
|
+
request['preset_stop_loss_price_type'] = self.safe_integer(params, 'price_type', 1)
|
4557
|
+
request['preset_stop_loss_price'] = self.price_to_precision(symbol, presetStopLoss)
|
4558
|
+
else:
|
4559
|
+
request['preset_take_profit_price_type'] = self.safe_integer(params, 'price_type', 1)
|
4560
|
+
request['preset_take_profit_price'] = self.price_to_precision(symbol, presetTakeProfit)
|
4561
|
+
response = self.privatePostContractPrivateModifyPresetPlanOrder(self.extend(request, params))
|
4562
|
+
#
|
4563
|
+
# {
|
4564
|
+
# "code": 1000,
|
4565
|
+
# "message": "Ok",
|
4566
|
+
# "data": {
|
4567
|
+
# "order_id": "3000023150003496"
|
4568
|
+
# },
|
4569
|
+
# "trace": "a5c3234534534a836bc476a203.123452.172716624359200197"
|
4570
|
+
# }
|
4571
|
+
#
|
4572
|
+
else:
|
4573
|
+
raise NotSupported(self.id + ' editOrder() only supports trigger, stop loss and take profit orders')
|
4574
|
+
data = self.safe_dict(response, 'data', {})
|
4575
|
+
return self.parse_order(data, market)
|
4576
|
+
|
4417
4577
|
def nonce(self):
|
4418
4578
|
return self.milliseconds()
|
4419
4579
|
|
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)):
|
@@ -5775,13 +5785,17 @@ class bybit(Exchange, ImplicitAPI):
|
|
5775
5785
|
currencyId = self.safe_string_2(item, 'coin', 'currency')
|
5776
5786
|
code = self.safe_currency_code(currencyId, currency)
|
5777
5787
|
currency = self.safe_currency(currencyId, currency)
|
5778
|
-
|
5779
|
-
|
5780
|
-
direction = 'out' if Precise.string_lt(
|
5788
|
+
amountString = self.safe_string_2(item, 'amount', 'change')
|
5789
|
+
afterString = self.safe_string_2(item, 'wallet_balance', 'cashBalance')
|
5790
|
+
direction = 'out' if Precise.string_lt(amountString, '0') else 'in'
|
5781
5791
|
before = None
|
5782
|
-
|
5783
|
-
|
5784
|
-
|
5792
|
+
after = None
|
5793
|
+
amount = None
|
5794
|
+
if afterString is not None and amountString is not None:
|
5795
|
+
difference = amountString if (direction == 'out') else Precise.string_neg(amountString)
|
5796
|
+
before = self.parse_to_numeric(Precise.string_add(afterString, difference))
|
5797
|
+
after = self.parse_to_numeric(afterString)
|
5798
|
+
amount = self.parse_to_numeric(Precise.string_abs(amountString))
|
5785
5799
|
timestamp = self.parse8601(self.safe_string(item, 'exec_time'))
|
5786
5800
|
if timestamp is None:
|
5787
5801
|
timestamp = self.safe_integer(item, 'transactionTime')
|
@@ -5794,15 +5808,15 @@ class bybit(Exchange, ImplicitAPI):
|
|
5794
5808
|
'referenceAccount': None,
|
5795
5809
|
'type': self.parse_ledger_entry_type(self.safe_string(item, 'type')),
|
5796
5810
|
'currency': code,
|
5797
|
-
'amount':
|
5811
|
+
'amount': amount,
|
5798
5812
|
'timestamp': timestamp,
|
5799
5813
|
'datetime': self.iso8601(timestamp),
|
5800
|
-
'before':
|
5801
|
-
'after':
|
5814
|
+
'before': before,
|
5815
|
+
'after': after,
|
5802
5816
|
'status': 'ok',
|
5803
5817
|
'fee': {
|
5804
5818
|
'currency': code,
|
5805
|
-
'cost': self.
|
5819
|
+
'cost': self.safe_number(item, 'fee'),
|
5806
5820
|
},
|
5807
5821
|
}, currency)
|
5808
5822
|
|