ccxt 4.0.106 → 4.0.108

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.
package/js/src/bitmart.js CHANGED
@@ -1318,40 +1318,47 @@ export default class bitmart extends Exchange {
1318
1318
  // private fetchMyTrades spot
1319
1319
  //
1320
1320
  // {
1321
- // "detail_id":256348632,
1322
- // "order_id":2147484350,
1323
- // "symbol":"BTC_USDT",
1324
- // "create_time":1590462303000,
1321
+ // "tradeId":"182342999769370687",
1322
+ // "orderId":"183270218784142990",
1323
+ // "clientOrderId":"183270218784142990",
1324
+ // "symbol":"ADA_USDT",
1325
1325
  // "side":"buy",
1326
- // "fees":"0.00001350",
1327
- // "fee_coin_name":"BTC",
1328
- // "notional":"88.00000000",
1329
- // "price_avg":"8800.00",
1330
- // "size":"0.01000",
1331
- // "exec_type":"M"
1326
+ // "orderMode":"spot",
1327
+ // "type":"market",
1328
+ // "price":"0.245948",
1329
+ // "size":"20.71",
1330
+ // "notional":"5.09358308",
1331
+ // "fee":"0.00509358",
1332
+ // "feeCoinName":"USDT",
1333
+ // "tradeRole":"taker",
1334
+ // "createTime":1695658457836,
1332
1335
  // }
1333
1336
  //
1334
- const id = this.safeString(trade, 'detail_id');
1335
- const timestamp = this.safeInteger2(trade, 'order_time', 'create_time');
1336
- const type = undefined;
1337
- const side = this.safeStringLower2(trade, 'type', 'side');
1338
- let takerOrMaker = undefined;
1339
- const execType = this.safeString(trade, 'exec_type');
1340
- if (execType !== undefined) {
1341
- takerOrMaker = (execType === 'M') ? 'maker' : 'taker';
1342
- }
1343
- let priceString = this.safeString(trade, 'price');
1344
- priceString = this.safeString(trade, 'price_avg', priceString);
1345
- let amountString = this.safeString(trade, 'count');
1346
- amountString = this.safeString(trade, 'size', amountString);
1347
- const costString = this.safeString2(trade, 'amount', 'notional');
1348
- const orderId = this.safeString(trade, 'order_id');
1337
+ const id = this.safeString(trade, 'tradeId');
1338
+ const timestamp = this.safeInteger2(trade, 'order_time', 'createTime');
1339
+ const side = this.safeStringLower2(trade, 'side', 'type');
1340
+ const takerOrMaker = this.safeString(trade, 'tradeRole');
1341
+ const isPublicTrade = ('order_time' in trade);
1342
+ const price = this.safeString(trade, 'price');
1343
+ let amount = undefined;
1344
+ let cost = undefined;
1345
+ let type = undefined;
1346
+ if (isPublicTrade) {
1347
+ amount = this.safeString(trade, 'count');
1348
+ cost = this.safeString(trade, 'amount');
1349
+ }
1350
+ else {
1351
+ amount = this.safeString(trade, 'size');
1352
+ cost = this.safeString(trade, 'notional');
1353
+ type = this.safeString(trade, 'type');
1354
+ }
1355
+ const orderId = this.safeString(trade, 'orderId');
1349
1356
  const marketId = this.safeString(trade, 'symbol');
1350
1357
  market = this.safeMarket(marketId, market, '_');
1351
- const feeCostString = this.safeString(trade, 'fees');
1358
+ const feeCostString = this.safeString(trade, 'fee');
1352
1359
  let fee = undefined;
1353
1360
  if (feeCostString !== undefined) {
1354
- const feeCurrencyId = this.safeString(trade, 'fee_coin_name');
1361
+ const feeCurrencyId = this.safeString(trade, 'feeCoinName');
1355
1362
  let feeCurrencyCode = this.safeCurrencyCode(feeCurrencyId);
1356
1363
  if (feeCurrencyCode === undefined) {
1357
1364
  feeCurrencyCode = (side === 'buy') ? market['base'] : market['quote'];
@@ -1370,9 +1377,9 @@ export default class bitmart extends Exchange {
1370
1377
  'symbol': market['symbol'],
1371
1378
  'type': type,
1372
1379
  'side': side,
1373
- 'price': priceString,
1374
- 'amount': amountString,
1375
- 'cost': costString,
1380
+ 'price': price,
1381
+ 'amount': amount,
1382
+ 'cost': cost,
1376
1383
  'takerOrMaker': takerOrMaker,
1377
1384
  'fee': fee,
1378
1385
  }, market);
@@ -1575,66 +1582,83 @@ export default class bitmart extends Exchange {
1575
1582
  /**
1576
1583
  * @method
1577
1584
  * @name bitmart#fetchMyTrades
1585
+ * @see https://developer-pro.bitmart.com/en/spot/#account-trade-list-v4-signed
1578
1586
  * @description fetch all trades made by the user
1579
1587
  * @param {string} symbol unified market symbol
1580
1588
  * @param {int} [since] the earliest time in ms to fetch trades for
1581
1589
  * @param {int} [limit] the maximum number of trades structures to retrieve
1582
1590
  * @param {object} [params] extra parameters specific to the bitmart api endpoint
1591
+ * @param {int} [params.until] the latest time in ms to fetch trades for
1592
+ * @param {boolean} [params.marginMode] *spot* whether to fetch trades for margin orders or spot orders, defaults to spot orders (only isolated margin orders are supported)
1583
1593
  * @returns {Trade[]} a list of [trade structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#trade-structure}
1584
1594
  */
1585
- if (symbol === undefined) {
1586
- throw new ArgumentsRequired(this.id + ' fetchMyTrades() requires a symbol argument');
1587
- }
1588
1595
  await this.loadMarkets();
1589
- const market = this.market(symbol);
1590
- if (!market['spot']) {
1591
- throw new NotSupported(this.id + ' fetchMyTrades() does not support ' + market['type'] + ' orders, only spot orders are accepted');
1596
+ let market = undefined;
1597
+ const request = {};
1598
+ if (symbol !== undefined) {
1599
+ market = this.market(symbol);
1600
+ }
1601
+ let type = undefined;
1602
+ [type, params] = this.handleMarketTypeAndParams('fetchMyTrades', market, params);
1603
+ if (type !== 'spot') {
1604
+ throw new NotSupported(this.id + ' fetchMyTrades() does not support ' + type + ' orders, only spot orders are accepted');
1605
+ }
1606
+ let marginMode = undefined;
1607
+ [marginMode, params] = this.handleMarginModeAndParams('fetchMyTrades', params);
1608
+ if (marginMode === 'isolated') {
1609
+ request['orderMode'] = 'iso_margin';
1592
1610
  }
1593
1611
  const options = this.safeValue(this.options, 'fetchMyTrades', {});
1594
1612
  const defaultLimit = this.safeInteger(options, 'limit', 200);
1595
1613
  if (limit === undefined) {
1596
1614
  limit = defaultLimit;
1597
1615
  }
1598
- const request = {
1599
- 'symbol': market['id'],
1600
- 'N': limit,
1601
- };
1602
- const response = await this.privateGetSpotV2Trades(this.extend(request, params));
1616
+ request['limit'] = limit;
1617
+ if (symbol !== undefined) {
1618
+ request['symbol'] = market['id'];
1619
+ }
1620
+ const until = this.safeInteger2(params, 'until', 'endTime');
1621
+ if (until !== undefined) {
1622
+ params = this.omit(params, ['endTime']);
1623
+ request['endTime'] = until;
1624
+ }
1625
+ const response = await this.privatePostSpotV4QueryTrades(this.extend(request, params));
1603
1626
  //
1604
1627
  // spot
1605
1628
  //
1606
- // {
1607
- // "message":"OK",
1608
- // "code":1000,
1609
- // "trace":"a06a5c53-8e6f-42d6-8082-2ff4718d221c",
1610
- // "data":{
1611
- // "current_page":1,
1612
- // "trades":[
1613
- // {
1614
- // "detail_id":256348632,
1615
- // "order_id":2147484350,
1616
- // "symbol":"BTC_USDT",
1617
- // "create_time":1590462303000,
1618
- // "side":"buy",
1619
- // "fees":"0.00001350",
1620
- // "fee_coin_name":"BTC",
1621
- // "notional":"88.00000000",
1622
- // "price_avg":"8800.00",
1623
- // "size":"0.01000",
1624
- // "exec_type":"M"
1625
- // },
1626
- // ]
1627
- // }
1628
- // }
1629
+ // {
1630
+ // "code":1000,
1631
+ // "message":"success",
1632
+ // "data":[
1633
+ // {
1634
+ // "tradeId":"182342999769370687",
1635
+ // "orderId":"183270218784142990",
1636
+ // "clientOrderId":"183270218784142990",
1637
+ // "symbol":"ADA_USDT",
1638
+ // "side":"buy",
1639
+ // "orderMode":"spot",
1640
+ // "type":"market",
1641
+ // "price":"0.245948",
1642
+ // "size":"20.71",
1643
+ // "notional":"5.09358308",
1644
+ // "fee":"0.00509358",
1645
+ // "feeCoinName":"USDT",
1646
+ // "tradeRole":"taker",
1647
+ // "createTime":1695658457836,
1648
+ // "updateTime":1695658457836
1649
+ // }
1650
+ // ],
1651
+ // "trace":"fbaee9e0e2f5442fba5b3262fc86b0ac.65.16956593456523085"
1652
+ // }
1629
1653
  //
1630
1654
  const data = this.safeValue(response, 'data', {});
1631
- const trades = this.safeValue(data, 'trades', []);
1632
- return this.parseTrades(trades, market, since, limit);
1655
+ return this.parseTrades(data, market, since, limit);
1633
1656
  }
1634
1657
  async fetchOrderTrades(id, symbol = undefined, since = undefined, limit = undefined, params = {}) {
1635
1658
  /**
1636
1659
  * @method
1637
1660
  * @name bitmart#fetchOrderTrades
1661
+ * @see https://developer-pro.bitmart.com/en/spot/#order-trade-list-v4-signed
1638
1662
  * @description fetch all the trades made from a single order
1639
1663
  * @param {string} id order id
1640
1664
  * @param {string} symbol unified market symbol
@@ -1643,55 +1667,13 @@ export default class bitmart extends Exchange {
1643
1667
  * @param {object} [params] extra parameters specific to the bitmart api endpoint
1644
1668
  * @returns {object[]} a list of [trade structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#trade-structure}
1645
1669
  */
1646
- if (symbol === undefined) {
1647
- throw new ArgumentsRequired(this.id + ' fetchOrderTrades() requires a symbol argument');
1648
- }
1649
1670
  await this.loadMarkets();
1650
- const market = this.market(symbol);
1651
- if (!market['spot']) {
1652
- throw new NotSupported(this.id + ' fetchOrderTrades() does not support ' + market['type'] + ' orders, only spot orders are accepted');
1653
- }
1654
- const options = this.safeValue(this.options, 'fetchOrderTrades', {});
1655
- const defaultLimit = this.safeInteger(options, 'limit', 200);
1656
- if (limit === undefined) {
1657
- limit = defaultLimit;
1658
- }
1659
1671
  const request = {
1660
- 'symbol': market['id'],
1661
- 'order_id': id,
1662
- 'N': limit,
1672
+ 'orderId': id,
1663
1673
  };
1664
- const response = await this.privateGetSpotV2Trades(this.extend(request, params));
1665
- //
1666
- // spot
1667
- //
1668
- // {
1669
- // "message":"OK",
1670
- // "code":1000,
1671
- // "trace":"a06a5c53-8e6f-42d6-8082-2ff4718d221c",
1672
- // "data":{
1673
- // "current_page":1,
1674
- // "trades":[
1675
- // {
1676
- // "detail_id":256348632,
1677
- // "order_id":2147484350,
1678
- // "symbol":"BTC_USDT",
1679
- // "create_time":1590462303000,
1680
- // "side":"buy",
1681
- // "fees":"0.00001350",
1682
- // "fee_coin_name":"BTC",
1683
- // "notional":"88.00000000",
1684
- // "price_avg":"8800.00",
1685
- // "size":"0.01000",
1686
- // "exec_type":"M"
1687
- // },
1688
- // ]
1689
- // }
1690
- // }
1691
- //
1674
+ const response = await this.privatePostSpotV4QueryOrderTrades(this.extend(request, params));
1692
1675
  const data = this.safeValue(response, 'data', {});
1693
- const trades = this.safeValue(data, 'trades', []);
1694
- return this.parseTrades(trades, market, since, limit);
1676
+ return this.parseTrades(data, undefined, since, limit);
1695
1677
  }
1696
1678
  customParseBalance(response, marketType) {
1697
1679
  const data = this.safeValue(response, 'data', {});
@@ -1950,24 +1932,55 @@ export default class bitmart extends Exchange {
1950
1932
  // "status":"8"
1951
1933
  // }
1952
1934
  //
1935
+ // spot v4
1936
+ // {
1937
+ // "orderId" : "118100034543076010",
1938
+ // "clientOrderId" : "118100034543076010",
1939
+ // "symbol" : "BTC_USDT",
1940
+ // "side" : "buy",
1941
+ // "orderMode" : "spot",
1942
+ // "type" : "limit",
1943
+ // "state" : "filled",
1944
+ // "price" : "48800.00",
1945
+ // "priceAvg" : "39999.00",
1946
+ // "size" : "0.10000",
1947
+ // "filledSize" : "0.10000",
1948
+ // "notional" : "4880.00000000",
1949
+ // "filledNotional" : "3999.90000000",
1950
+ // "createTime" : 1681701557927,
1951
+ // "updateTime" : 1681701559408
1952
+ // }
1953
+ //
1954
+ // swap: fetchOpenOrders
1955
+ //
1956
+ // {
1957
+ // "order_id": "230935812485489",
1958
+ // "client_order_id": "",
1959
+ // "price": "24000",
1960
+ // "size": "1",
1961
+ // "symbol": "BTCUSDT",
1962
+ // "state": 2,
1963
+ // "side": 1,
1964
+ // "type": "limit",
1965
+ // "leverage": "10",
1966
+ // "open_type": "isolated",
1967
+ // "deal_avg_price": "0",
1968
+ // "deal_size": "0",
1969
+ // "create_time": 1695702258629,
1970
+ // "update_time": 1695702258642
1971
+ // }
1972
+ //
1953
1973
  let id = undefined;
1954
1974
  if (typeof order === 'string') {
1955
1975
  id = order;
1956
1976
  order = {};
1957
1977
  }
1958
- id = this.safeString(order, 'order_id', id);
1959
- const timestamp = this.safeInteger(order, 'create_time');
1978
+ id = this.safeString2(order, 'order_id', 'orderId', id);
1979
+ const timestamp = this.safeInteger2(order, 'create_time', 'createTime');
1960
1980
  const marketId = this.safeString(order, 'symbol');
1961
- const symbol = this.safeSymbol(marketId, market, '_');
1962
- let status = undefined;
1963
- if (market !== undefined) {
1964
- status = this.parseOrderStatusByType(market['type'], this.safeString(order, 'status'));
1965
- }
1966
- const amount = this.safeString(order, 'size');
1967
- const filled = this.safeString(order, 'filled_size');
1968
- const average = this.safeString(order, 'price_avg');
1969
- const price = this.safeString(order, 'price');
1970
- const side = this.safeString(order, 'side');
1981
+ const symbol = this.safeSymbol(marketId, market);
1982
+ market = this.safeMarket(symbol, market);
1983
+ const orderType = this.safeString(market, 'type', 'spot');
1971
1984
  let type = this.safeString(order, 'type');
1972
1985
  let timeInForce = undefined;
1973
1986
  let postOnly = undefined;
@@ -1982,29 +1995,38 @@ export default class bitmart extends Exchange {
1982
1995
  }
1983
1996
  return this.safeOrder({
1984
1997
  'id': id,
1985
- 'clientOrderId': undefined,
1998
+ 'clientOrderId': this.safeString(order, 'client_order_id'),
1986
1999
  'info': order,
1987
2000
  'timestamp': timestamp,
1988
2001
  'datetime': this.iso8601(timestamp),
1989
- 'lastTradeTimestamp': undefined,
2002
+ 'lastTradeTimestamp': this.safeInteger(order, 'update_time'),
1990
2003
  'symbol': symbol,
1991
2004
  'type': type,
1992
2005
  'timeInForce': timeInForce,
1993
2006
  'postOnly': postOnly,
1994
- 'side': side,
1995
- 'price': price,
2007
+ 'side': this.parseOrderSide(this.safeString(order, 'side')),
2008
+ 'price': this.omitZero(this.safeString(order, 'price')),
1996
2009
  'stopPrice': undefined,
1997
2010
  'triggerPrice': undefined,
1998
- 'amount': amount,
1999
- 'cost': undefined,
2000
- 'average': average,
2001
- 'filled': filled,
2011
+ 'amount': this.omitZero(this.safeString(order, 'size')),
2012
+ 'cost': this.safeString2(order, 'filled_notional', 'filledNotional'),
2013
+ 'average': this.safeStringN(order, ['price_avg', 'priceAvg', 'deal_avg_price']),
2014
+ 'filled': this.safeStringN(order, ['filled_size', 'filledSize', 'deal_size']),
2002
2015
  'remaining': undefined,
2003
- 'status': status,
2016
+ 'status': this.parseOrderStatusByType(orderType, this.safeString2(order, 'status', 'state')),
2004
2017
  'fee': undefined,
2005
2018
  'trades': undefined,
2006
2019
  }, market);
2007
2020
  }
2021
+ parseOrderSide(side) {
2022
+ const sides = {
2023
+ '1': 'open long',
2024
+ '2': 'close short',
2025
+ '3': 'close long',
2026
+ '4': 'open short',
2027
+ };
2028
+ return this.safeString(sides, side, side);
2029
+ }
2008
2030
  parseOrderStatusByType(type, status) {
2009
2031
  const statusesByType = {
2010
2032
  'spot': {
@@ -2015,7 +2037,11 @@ export default class bitmart extends Exchange {
2015
2037
  '5': 'open',
2016
2038
  '6': 'closed',
2017
2039
  '7': 'canceling',
2018
- '8': 'canceled', // Canceled
2040
+ '8': 'canceled',
2041
+ 'new': 'open',
2042
+ 'partially_filled': 'filled',
2043
+ 'filled': 'filled',
2044
+ 'partially_canceled': 'canceled',
2019
2045
  },
2020
2046
  'swap': {
2021
2047
  '1': 'open',
@@ -2308,19 +2334,116 @@ export default class bitmart extends Exchange {
2308
2334
  /**
2309
2335
  * @method
2310
2336
  * @name bitmart#fetchOpenOrders
2337
+ * @see https://developer-pro.bitmart.com/en/spot/#current-open-orders-v4-signed
2338
+ * @see https://developer-pro.bitmart.com/en/futures/#get-all-open-orders-keyed
2311
2339
  * @description fetch all unfilled currently open orders
2312
2340
  * @param {string} symbol unified market symbol
2313
2341
  * @param {int} [since] the earliest time in ms to fetch open orders for
2314
- * @param {int} [limit] the maximum number of open orders structures to retrieve
2342
+ * @param {int} [limit] the maximum number of open order structures to retrieve
2315
2343
  * @param {object} [params] extra parameters specific to the bitmart api endpoint
2344
+ * @param {boolean} [params.marginMode] *spot* whether to fetch trades for margin orders or spot orders, defaults to spot orders (only isolated margin orders are supported)
2345
+ * @param {int} [params.until] *spot* the latest time in ms to fetch orders for
2346
+ * @param {string} [params.type] *swap* order type, 'limit' or 'market'
2347
+ * @param {string} [params.order_state] *swap* the order state, 'all' or 'partially_filled', default is 'all'
2316
2348
  * @returns {Order[]} a list of [order structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
2317
2349
  */
2318
- return await this.fetchOrdersByStatus('open', symbol, since, limit, params);
2350
+ await this.loadMarkets();
2351
+ let market = undefined;
2352
+ const request = {};
2353
+ if (symbol !== undefined) {
2354
+ market = this.market(symbol);
2355
+ request['symbol'] = market['id'];
2356
+ }
2357
+ if (limit !== undefined) {
2358
+ request['limit'] = limit;
2359
+ }
2360
+ let type = undefined;
2361
+ let response = undefined;
2362
+ [type, params] = this.handleMarketTypeAndParams('fetchOpenOrders', market, params);
2363
+ if (type === 'spot') {
2364
+ let marginMode = undefined;
2365
+ [marginMode, params] = this.handleMarginModeAndParams('fetchOpenOrders', params);
2366
+ if (marginMode === 'isolated') {
2367
+ request['orderMode'] = 'iso_margin';
2368
+ }
2369
+ if (since !== undefined) {
2370
+ request['startTime'] = since;
2371
+ }
2372
+ const until = this.safeInteger2(params, 'until', 'endTime');
2373
+ if (until !== undefined) {
2374
+ params = this.omit(params, ['endTime']);
2375
+ request['endTime'] = until;
2376
+ }
2377
+ response = await this.privatePostSpotV4QueryOpenOrders(this.extend(request, params));
2378
+ }
2379
+ else if (type === 'swap') {
2380
+ response = await this.privateGetContractPrivateGetOpenOrders(this.extend(request, params));
2381
+ }
2382
+ else {
2383
+ throw new NotSupported(this.id + ' fetchOpenOrders() does not support ' + type + ' orders, only spot and swap orders are accepted');
2384
+ }
2385
+ //
2386
+ // spot
2387
+ //
2388
+ // {
2389
+ // "code": 1000,
2390
+ // "message": "success",
2391
+ // "data": [
2392
+ // {
2393
+ // "orderId": "183299373022163211",
2394
+ // "clientOrderId": "183299373022163211",
2395
+ // "symbol": "BTC_USDT",
2396
+ // "side": "buy",
2397
+ // "orderMode": "spot",
2398
+ // "type": "limit",
2399
+ // "state": "new",
2400
+ // "price": "25000.00",
2401
+ // "priceAvg": "0.00",
2402
+ // "size": "0.00020",
2403
+ // "filledSize": "0.00000",
2404
+ // "notional": "5.00000000",
2405
+ // "filledNotional": "0.00000000",
2406
+ // "createTime": 1695703703338,
2407
+ // "updateTime": 1695703703359
2408
+ // }
2409
+ // ],
2410
+ // "trace": "15f11d48e3234c81a2e786cr2e7a38e6.71.16957022303515933"
2411
+ // }
2412
+ //
2413
+ // swap
2414
+ //
2415
+ // {
2416
+ // "code": 1000,
2417
+ // "message": "Ok",
2418
+ // "data": [
2419
+ // {
2420
+ // "order_id": "230935812485489",
2421
+ // "client_order_id": "",
2422
+ // "price": "24000",
2423
+ // "size": "1",
2424
+ // "symbol": "BTCUSDT",
2425
+ // "state": 2,
2426
+ // "side": 1,
2427
+ // "type": "limit",
2428
+ // "leverage": "10",
2429
+ // "open_type": "isolated",
2430
+ // "deal_avg_price": "0",
2431
+ // "deal_size": "0",
2432
+ // "create_time": 1695702258629,
2433
+ // "update_time": 1695702258642
2434
+ // }
2435
+ // ],
2436
+ // "trace": "7f9d94g10f9d4513bc08a7rfc3a5559a.71.16957022303515933"
2437
+ // }
2438
+ //
2439
+ const data = this.safeValue(response, 'data', []);
2440
+ return this.parseOrders(data, market, since, limit);
2319
2441
  }
2320
2442
  async fetchClosedOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2321
2443
  /**
2322
2444
  * @method
2323
2445
  * @name bitmart#fetchClosedOrders
2446
+ * @see https://developer-pro.bitmart.com/en/spot/#account-orders-v4-signed
2324
2447
  * @description fetches information on multiple closed orders made by the user
2325
2448
  * @param {string} symbol unified market symbol of the market orders were made in
2326
2449
  * @param {int} [since] the earliest time in ms to fetch orders for
@@ -2328,7 +2451,31 @@ export default class bitmart extends Exchange {
2328
2451
  * @param {object} [params] extra parameters specific to the bitmart api endpoint
2329
2452
  * @returns {Order[]} a list of [order structures]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
2330
2453
  */
2331
- return await this.fetchOrdersByStatus('closed', symbol, since, limit, params);
2454
+ await this.loadMarkets();
2455
+ let market = undefined;
2456
+ const request = {};
2457
+ if (symbol !== undefined) {
2458
+ market = this.market(symbol);
2459
+ request['symbol'] = market['id'];
2460
+ }
2461
+ let type = undefined;
2462
+ [type, params] = this.handleMarketTypeAndParams('fetchClosedOrders', market, params);
2463
+ if (type !== 'spot') {
2464
+ throw new NotSupported(this.id + ' fetchClosedOrders() does not support ' + type + ' orders, only spot orders are accepted');
2465
+ }
2466
+ let marginMode = undefined;
2467
+ [marginMode, params] = this.handleMarginModeAndParams('fetchClosedOrders', params);
2468
+ if (marginMode === 'isolated') {
2469
+ request['orderMode'] = 'iso_margin';
2470
+ }
2471
+ const until = this.safeInteger2(params, 'until', 'endTime');
2472
+ if (until !== undefined) {
2473
+ params = this.omit(params, ['endTime']);
2474
+ request['endTime'] = until;
2475
+ }
2476
+ const response = await this.privatePostSpotV4QueryHistoryOrders(this.extend(request, params));
2477
+ const data = this.safeValue(response, 'data');
2478
+ return this.parseOrders(data, market, since, limit);
2332
2479
  }
2333
2480
  async fetchCanceledOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
2334
2481
  /**
@@ -2347,49 +2494,29 @@ export default class bitmart extends Exchange {
2347
2494
  /**
2348
2495
  * @method
2349
2496
  * @name bitmart#fetchOrder
2497
+ * @see https://developer-pro.bitmart.com/en/spot/#query-order-by-id-v4-signed
2498
+ * @see https://developer-pro.bitmart.com/en/spot/#query-order-by-clientorderid-v4-signed
2350
2499
  * @description fetches information on an order made by the user
2351
2500
  * @param {string} symbol unified symbol of the market the order was made in
2352
2501
  * @param {object} [params] extra parameters specific to the bitmart api endpoint
2502
+ * @param {string} [params.clientOrderId] fetch the order by client order id instead of order id
2353
2503
  * @returns {object} An [order structure]{@link https://github.com/ccxt/ccxt/wiki/Manual#order-structure}
2354
2504
  */
2355
- if (symbol === undefined) {
2356
- throw new ArgumentsRequired(this.id + ' fetchOrder() requires a symbol argument');
2357
- }
2358
2505
  await this.loadMarkets();
2359
- const market = this.market(symbol);
2360
- if (!market['spot']) {
2361
- throw new NotSupported(this.id + ' fetchOrder() does not support ' + market['type'] + ' orders, only spot orders are accepted');
2506
+ const request = {};
2507
+ const clientOrderId = this.safeString(params, 'clientOrderId');
2508
+ if (!clientOrderId) {
2509
+ request['orderId'] = id;
2510
+ }
2511
+ let response = undefined;
2512
+ if (clientOrderId !== undefined) {
2513
+ response = await this.privatePostSpotV4QueryClientOrder(this.extend(request, params));
2514
+ }
2515
+ else {
2516
+ response = await this.privatePostSpotV4QueryOrder(this.extend(request, params));
2362
2517
  }
2363
- const request = {
2364
- 'symbol': market['id'],
2365
- 'order_id': id,
2366
- };
2367
- const response = await this.privateGetSpotV2OrderDetail(this.extend(request, params));
2368
- //
2369
- // spot
2370
- //
2371
- // {
2372
- // "message":"OK",
2373
- // "code":1000,
2374
- // "trace":"a27c2cb5-ead4-471d-8455-1cfeda054ea6",
2375
- // "data": {
2376
- // "order_id":1736871726781,
2377
- // "symbol":"BTC_USDT",
2378
- // "create_time":1591096004000,
2379
- // "side":"sell",
2380
- // "type":"market",
2381
- // "price":"0.00",
2382
- // "price_avg":"0.00",
2383
- // "size":"0.02000",
2384
- // "notional":"0.00000000",
2385
- // "filled_notional":"0.00000000",
2386
- // "filled_size":"0.00000",
2387
- // "status":"8"
2388
- // }
2389
- // }
2390
- //
2391
2518
  const data = this.safeValue(response, 'data', {});
2392
- return this.parseOrder(data, market);
2519
+ return this.parseOrder(data, undefined);
2393
2520
  }
2394
2521
  async fetchDepositAddress(code, params = {}) {
2395
2522
  /**
package/js/src/exmo.d.ts CHANGED
@@ -64,12 +64,15 @@ export default class exmo extends Exchange {
64
64
  fetchTrades(symbol: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Trade[]>;
65
65
  fetchMyTrades(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<any>;
66
66
  createOrder(symbol: string, type: OrderType, side: OrderSide, amount: any, price?: any, params?: {}): Promise<import("./base/types.js").Order>;
67
- cancelOrder(id: string, symbol?: string, params?: {}): Promise<any>;
67
+ cancelOrder(id: string, symbol?: string, params?: {}): Promise<import("./base/types.js").Order>;
68
68
  fetchOrder(id: string, symbol?: string, params?: {}): Promise<any>;
69
69
  fetchOrderTrades(id: string, symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Trade[]>;
70
70
  fetchOpenOrders(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<any>;
71
+ parseStatus(status: any): string;
72
+ parseSide(orderType: any): string;
71
73
  parseOrder(order: any, market?: any): import("./base/types.js").Order;
72
- fetchCanceledOrders(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<import("./base/types.js").Order[]>;
74
+ fetchCanceledOrders(symbol?: string, since?: Int, limit?: Int, params?: {}): Promise<any[]>;
75
+ editOrder(id: string, symbol: any, type: any, side: any, amount?: any, price?: any, params?: {}): Promise<import("./base/types.js").Order>;
73
76
  fetchDepositAddress(code: string, params?: {}): Promise<{
74
77
  currency: string;
75
78
  address: any;