ccxt 4.3.12 → 4.3.14

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/coinex.js CHANGED
@@ -1719,111 +1719,7 @@ export default class coinex extends Exchange {
1719
1719
  }
1720
1720
  parseOrder(order, market = undefined) {
1721
1721
  //
1722
- // Spot and Margin fetchOpenOrders, fetchClosedOrders
1723
- //
1724
- // {
1725
- // "account_id": 0,
1726
- // "amount": "0.0005",
1727
- // "asset_fee": "0",
1728
- // "avg_price": "0.00",
1729
- // "client_id": "",
1730
- // "create_time": 1651089247,
1731
- // "deal_amount": "0",
1732
- // "deal_fee": "0",
1733
- // "deal_money": "0",
1734
- // "fee_asset": null,
1735
- // "fee_discount": "1",
1736
- // "finished_time": 0,
1737
- // "id": 74660190839,
1738
- // "left": "0.0005",
1739
- // "maker_fee_rate": "0.002",
1740
- // "market": "BTCUSDT",
1741
- // "money_fee": "0",
1742
- // "order_type": "limit",
1743
- // "price": "31000",
1744
- // "status": "not_deal",
1745
- // "stock_fee": "0",
1746
- // "taker_fee_rate": "0.002",
1747
- // "type": "buy"
1748
- // }
1749
- //
1750
- // Swap fetchOpenOrders, fetchClosedOrders
1751
- //
1752
- // {
1753
- // "amount": "0.0005",
1754
- // "client_id": "",
1755
- // "create_time": 1651030414.088431,
1756
- // "deal_asset_fee": "0",
1757
- // "deal_fee": "0.00960069",
1758
- // "deal_profit": "0.009825",
1759
- // "deal_stock": "19.20138",
1760
- // "effect_type": 0,
1761
- // "fee_asset": "",
1762
- // "fee_discount": "0",
1763
- // "left": "0",
1764
- // "leverage": "3",
1765
- // "maker_fee": "0",
1766
- // "market": "BTCUSDT",
1767
- // "order_id": 18253447431,
1768
- // "position_id": 0,
1769
- // "position_type": 1,
1770
- // "price": "0",
1771
- // "side": 1,
1772
- // "source": "web",
1773
- // "stop_id": 0,
1774
- // "taker_fee": "0.0005",
1775
- // "target": 0,
1776
- // "type": 2,
1777
- // "update_time": 1651030414.08847,
1778
- // "user_id": 3620173
1779
- // }
1780
- //
1781
- // Spot and Margin Stop fetchOpenOrders, fetchClosedOrders
1782
- //
1783
- // {
1784
- // "account_id": 0,
1785
- // "amount": "155",
1786
- // "client_id": "",
1787
- // "create_time": 1651089182,
1788
- // "fee_asset": null,
1789
- // "fee_discount": "1",
1790
- // "maker_fee": "0.002",
1791
- // "market": "BTCUSDT",
1792
- // "order_id": 74660111965,
1793
- // "order_type": "market",
1794
- // "price": "0",
1795
- // "state": 0,
1796
- // "stop_price": "31500",
1797
- // "taker_fee": "0.002",
1798
- // "type": "buy"
1799
- // }
1800
- //
1801
- // Swap Stop fetchOpenOrders
1802
- //
1803
- // {
1804
- // "amount": "0.0005",
1805
- // "client_id": "",
1806
- // "create_time": 1651089147.321691,
1807
- // "effect_type": 1,
1808
- // "fee_asset": "",
1809
- // "fee_discount": "0.00000000000000000000",
1810
- // "maker_fee": "0.00030",
1811
- // "market": "BTCUSDT",
1812
- // "order_id": 18332143848,
1813
- // "price": "31000.00",
1814
- // "side": 2,
1815
- // "source": "api.v1",
1816
- // "state": 1,
1817
- // "stop_price": "31500.00",
1818
- // "stop_type": 1,
1819
- // "taker_fee": "0.00050",
1820
- // "target": 0,
1821
- // "type": 1,
1822
- // "update_time": 1651089147.321691,
1823
- // "user_id": 3620173
1824
- // }
1825
- //
1826
- // Spot and Margin createOrder, createOrders, editOrder, cancelOrders, cancelOrder v2
1722
+ // Spot and Margin createOrder, createOrders, editOrder, cancelOrders, cancelOrder, fetchOpenOrders
1827
1723
  //
1828
1724
  // {
1829
1725
  // "amount": "0.0001",
@@ -1849,13 +1745,37 @@ export default class coinex extends Exchange {
1849
1745
  // "updated_at": 1714114386250
1850
1746
  // }
1851
1747
  //
1852
- // Spot, Margin and Swap trigger createOrder, createOrders, editOrder v2
1748
+ // Spot and Margin fetchClosedOrders
1749
+ //
1750
+ // {
1751
+ // "order_id": 117180532345,
1752
+ // "market": "BTCUSDT",
1753
+ // "market_type": "SPOT",
1754
+ // "side": "sell",
1755
+ // "type": "market",
1756
+ // "ccy": "BTC",
1757
+ // "amount": "0.00015484",
1758
+ // "price": "0",
1759
+ // "client_id": "",
1760
+ // "created_at": 1714116494219,
1761
+ // "updated_at": 0,
1762
+ // "base_fee": "0",
1763
+ // "quote_fee": "0.0199931699632",
1764
+ // "discount_fee": "0",
1765
+ // "maker_fee_rate": "0",
1766
+ // "taker_fee_rate": "0.002",
1767
+ // "unfilled_amount": "0",
1768
+ // "filled_amount": "0.00015484",
1769
+ // "filled_value": "9.9965849816"
1770
+ // }
1771
+ //
1772
+ // Spot, Margin and Swap trigger createOrder, createOrders, editOrder
1853
1773
  //
1854
1774
  // {
1855
1775
  // "stop_id": 117180138153
1856
1776
  // }
1857
1777
  //
1858
- // Swap createOrder, createOrders, editOrder, cancelOrders, cancelOrder v2
1778
+ // Swap createOrder, createOrders, editOrder, cancelOrders, cancelOrder, fetchOpenOrders, fetchClosedOrders
1859
1779
  //
1860
1780
  // {
1861
1781
  // "amount": "0.0001",
@@ -1880,7 +1800,7 @@ export default class coinex extends Exchange {
1880
1800
  // "updated_at": 1714116769986
1881
1801
  // }
1882
1802
  //
1883
- // Swap stopLossPrice and takeProfitPrice createOrder v2
1803
+ // Swap stopLossPrice and takeProfitPrice createOrder
1884
1804
  //
1885
1805
  // {
1886
1806
  // "adl_level": 1,
@@ -1915,25 +1835,7 @@ export default class coinex extends Exchange {
1915
1835
  // "updated_at": 1714119054559
1916
1836
  // }
1917
1837
  //
1918
- // Swap and Spot stop cancelOrders, cancelOrder v2
1919
- //
1920
- // {
1921
- // "amount": "0.0001",
1922
- // "client_id": "x-167673045-a7d7714c6478acf6",
1923
- // "created_at": 1714187923820,
1924
- // "market": "BTCUSDT",
1925
- // "market_type": "FUTURES",
1926
- // "price": "61000",
1927
- // "side": "buy",
1928
- // "stop_id": 136984426097,
1929
- // "trigger_direction": "higher",
1930
- // "trigger_price": "62000",
1931
- // "trigger_price_type": "latest_price",
1932
- // "type": "limit",
1933
- // "updated_at": 1714187974363
1934
- // }
1935
- //
1936
- // Swap fetchOrder v2
1838
+ // Swap fetchOrder
1937
1839
  //
1938
1840
  // {
1939
1841
  // "amount": "0.0001",
@@ -1959,7 +1861,7 @@ export default class coinex extends Exchange {
1959
1861
  // "updated_at": 1714460987164
1960
1862
  // }
1961
1863
  //
1962
- // Spot and Margin fetchOrder v2
1864
+ // Spot and Margin fetchOrder
1963
1865
  //
1964
1866
  // {
1965
1867
  // "amount": "0.0001",
@@ -1986,91 +1888,100 @@ export default class coinex extends Exchange {
1986
1888
  // "updated_at": 1714461638958
1987
1889
  // }
1988
1890
  //
1891
+ // Swap trigger fetchOpenOrders, fetchClosedOrders - Spot and Swap trigger cancelOrders, cancelOrder
1892
+ //
1893
+ // {
1894
+ // "amount": "0.0001",
1895
+ // "client_id": "x-167673045-a7d7714c6478acf6",
1896
+ // "created_at": 1714187923820,
1897
+ // "market": "BTCUSDT",
1898
+ // "market_type": "FUTURES",
1899
+ // "price": "61000",
1900
+ // "side": "buy",
1901
+ // "stop_id": 136984426097,
1902
+ // "trigger_direction": "higher",
1903
+ // "trigger_price": "62000",
1904
+ // "trigger_price_type": "latest_price",
1905
+ // "type": "limit",
1906
+ // "updated_at": 1714187974363
1907
+ // }
1908
+ //
1909
+ // Spot and Margin trigger fetchOpenOrders, fetchClosedOrders
1910
+ //
1911
+ // {
1912
+ // "stop_id": 117586439530,
1913
+ // "market": "BTCUSDT",
1914
+ // "market_type": "SPOT",
1915
+ // "ccy": "BTC",
1916
+ // "side": "buy",
1917
+ // "type": "limit",
1918
+ // "amount": "0.0001",
1919
+ // "price": "51000",
1920
+ // "trigger_price": "52000",
1921
+ // "trigger_direction": "higher",
1922
+ // "trigger_price_type": "mark_price",
1923
+ // "client_id": "x-167673045-df61777094c69312",
1924
+ // "created_at": 1714551237335,
1925
+ // "updated_at": 1714551237335
1926
+ // }
1927
+ //
1989
1928
  const rawStatus = this.safeString(order, 'status');
1990
- let timestamp = this.safeTimestamp(order, 'create_time');
1991
- if (timestamp === undefined) {
1992
- timestamp = this.safeInteger(order, 'created_at');
1993
- }
1994
- let update = this.safeTimestamp(order, 'update_time');
1995
- if (update === undefined) {
1996
- update = this.safeInteger(order, 'updated_at');
1929
+ const timestamp = this.safeInteger(order, 'created_at');
1930
+ let updatedTimestamp = this.safeInteger(order, 'updated_at');
1931
+ if (updatedTimestamp === 0) {
1932
+ updatedTimestamp = timestamp;
1997
1933
  }
1998
1934
  const marketId = this.safeString(order, 'market');
1999
1935
  const defaultType = this.safeString(this.options, 'defaultType');
2000
- const orderType = ('source' in order) ? 'swap' : defaultType;
2001
- market = this.safeMarket(marketId, market, undefined, orderType);
2002
- const feeCurrencyId = this.safeString2(order, 'fee_asset', 'fee_ccy');
1936
+ let orderType = this.safeStringLower(order, 'market_type', defaultType);
1937
+ if (orderType === 'futures') {
1938
+ orderType = 'swap';
1939
+ }
1940
+ const marketType = (orderType === 'swap') ? 'swap' : 'spot';
1941
+ market = this.safeMarket(marketId, market, undefined, marketType);
1942
+ const feeCurrencyId = this.safeString(order, 'fee_ccy');
2003
1943
  let feeCurrency = this.safeCurrencyCode(feeCurrencyId);
2004
1944
  if (feeCurrency === undefined) {
2005
1945
  feeCurrency = market['quote'];
2006
1946
  }
2007
- const rawIntegerSide = this.safeInteger(order, 'side');
2008
- const rawStringSide = this.safeString(order, 'side');
2009
- let side = undefined;
2010
- if (rawIntegerSide === 1) {
2011
- side = 'sell';
2012
- }
2013
- else if (rawIntegerSide === 2) {
1947
+ let side = this.safeString(order, 'side');
1948
+ if (side === 'long') {
2014
1949
  side = 'buy';
2015
1950
  }
2016
- else if ((rawStringSide === 'buy') || (rawStringSide === 'sell')) {
2017
- side = rawStringSide;
2018
- }
2019
- else {
2020
- side = this.safeString(order, 'type');
2021
- }
2022
- const rawType = this.safeString(order, 'order_type');
2023
- let type = undefined;
2024
- if (rawType === undefined) {
2025
- const typeInteger = this.safeInteger(order, 'type');
2026
- const typeString = this.safeString(order, 'type');
2027
- if (typeInteger === 1) {
2028
- type = 'limit';
2029
- }
2030
- else if (typeInteger === 2) {
2031
- type = 'market';
2032
- }
2033
- else if ((typeString === 'limit') || (typeString === 'market')) {
2034
- type = typeString;
2035
- }
2036
- else if (typeString === 'maker_only') {
2037
- type = 'limit';
2038
- }
2039
- }
2040
- else {
2041
- type = rawType;
1951
+ else if (side === 'short') {
1952
+ side = 'sell';
2042
1953
  }
2043
1954
  let clientOrderId = this.safeString(order, 'client_id');
2044
1955
  if (clientOrderId === '') {
2045
1956
  clientOrderId = undefined;
2046
1957
  }
2047
1958
  return this.safeOrder({
2048
- 'id': this.safeStringN(order, ['id', 'order_id', 'stop_id']),
1959
+ 'id': this.safeStringN(order, ['position_id', 'order_id', 'stop_id']),
2049
1960
  'clientOrderId': clientOrderId,
2050
1961
  'datetime': this.iso8601(timestamp),
2051
1962
  'timestamp': timestamp,
2052
- 'lastTradeTimestamp': update,
1963
+ 'lastTradeTimestamp': updatedTimestamp,
2053
1964
  'status': this.parseOrderStatus(rawStatus),
2054
1965
  'symbol': market['symbol'],
2055
- 'type': type,
1966
+ 'type': this.safeString(order, 'type'),
2056
1967
  'timeInForce': undefined,
2057
1968
  'postOnly': undefined,
2058
1969
  'reduceOnly': undefined,
2059
1970
  'side': side,
2060
1971
  'price': this.safeString(order, 'price'),
2061
- 'stopPrice': this.safeString2(order, 'stop_price', 'trigger_price'),
2062
- 'triggerPrice': this.safeString2(order, 'stop_price', 'trigger_price'),
1972
+ 'stopPrice': this.safeString(order, 'trigger_price'),
1973
+ 'triggerPrice': this.safeString(order, 'trigger_price'),
2063
1974
  'takeProfitPrice': this.safeNumber(order, 'take_profit_price'),
2064
1975
  'stopLossPrice': this.safeNumber(order, 'stop_loss_price'),
2065
- 'cost': this.safeString2(order, 'deal_money', 'filled_value'),
2066
- 'average': this.safeString2(order, 'avg_price', 'avg_entry_price'),
1976
+ 'cost': this.safeString(order, 'filled_value'),
1977
+ 'average': this.safeString(order, 'avg_entry_price'),
2067
1978
  'amount': this.safeString(order, 'amount'),
2068
- 'filled': this.safeString2(order, 'deal_amount', 'filled_amount'),
2069
- 'remaining': this.safeString2(order, 'left', 'unfilled_amount'),
1979
+ 'filled': this.safeString(order, 'filled_amount'),
1980
+ 'remaining': this.safeString(order, 'unfilled_amount'),
2070
1981
  'trades': undefined,
2071
1982
  'fee': {
2072
1983
  'currency': feeCurrency,
2073
- 'cost': this.safeStringN(order, ['deal_fee', 'quote_fee', 'fee']),
1984
+ 'cost': this.safeString2(order, 'quote_fee', 'fee'),
2074
1985
  },
2075
1986
  'info': order,
2076
1987
  }, market);
@@ -3325,7 +3236,7 @@ export default class coinex extends Exchange {
3325
3236
  }
3326
3237
  else {
3327
3238
  let marginMode = undefined;
3328
- [marginMode, params] = this.handleMarginModeAndParams('fetchOrdersByStatus', params);
3239
+ [marginMode, params] = this.handleMarginModeAndParams('cancelAllOrders', params);
3329
3240
  if (marginMode !== undefined) {
3330
3241
  request['market_type'] = 'MARGIN';
3331
3242
  }
@@ -3429,244 +3340,340 @@ export default class coinex extends Exchange {
3429
3340
  return this.parseOrder(data, market);
3430
3341
  }
3431
3342
  async fetchOrdersByStatus(status, symbol = undefined, since = undefined, limit = undefined, params = {}) {
3343
+ /**
3344
+ * @method
3345
+ * @name coinex#fetchOrdersByStatus
3346
+ * @description fetch a list of orders
3347
+ * @see https://docs.coinex.com/api/v2/spot/order/http/list-finished-order
3348
+ * @see https://docs.coinex.com/api/v2/spot/order/http/list-finished-stop-order
3349
+ * @see https://docs.coinex.com/api/v2/futures/order/http/list-finished-order
3350
+ * @see https://docs.coinex.com/api/v2/futures/order/http/list-finished-stop-order
3351
+ * @param {string} symbol unified market symbol of the market orders were made in
3352
+ * @param {int} [since] the earliest time in ms to fetch orders for
3353
+ * @param {int} [limit] the maximum number of order structures to retrieve
3354
+ * @param {boolean} [params.trigger] set to true for fetching trigger orders
3355
+ * @param {string} [params.marginMode] 'cross' or 'isolated' for fetching spot margin orders
3356
+ * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
3357
+ */
3432
3358
  await this.loadMarkets();
3433
- limit = (limit === undefined) ? 100 : limit;
3434
- const request = {
3435
- 'limit': limit,
3436
- // 'page': 1, // SPOT
3437
- // 'offset': 0, // SWAP
3438
- // 'side': 0, // SWAP, 0: All, 1: Sell, 2: Buy
3439
- };
3440
- const stop = this.safeValue(params, 'stop');
3441
- const side = this.safeInteger(params, 'side');
3442
- params = this.omit(params, 'stop');
3359
+ const request = {};
3443
3360
  let market = undefined;
3444
3361
  if (symbol !== undefined) {
3445
3362
  market = this.market(symbol);
3446
3363
  request['market'] = market['id'];
3447
3364
  }
3448
- const [marketType, query] = this.handleMarketTypeAndParams('fetchOrdersByStatus', market, params);
3449
- const accountId = this.safeInteger(params, 'account_id');
3450
- let marginMode = undefined;
3451
- [marginMode, params] = this.handleMarginModeAndParams('fetchOrdersByStatus', params);
3452
- if (marginMode !== undefined) {
3453
- if (accountId === undefined) {
3454
- throw new BadRequest(this.id + ' fetchOpenOrders() and fetchClosedOrders() require an account_id parameter for margin orders');
3455
- }
3456
- request['account_id'] = accountId;
3365
+ if (limit !== undefined) {
3366
+ request['limit'] = limit;
3457
3367
  }
3458
- params = this.omit(query, 'account_id');
3368
+ const stop = this.safeBool2(params, 'stop', 'trigger');
3369
+ params = this.omit(params, ['stop', 'trigger']);
3370
+ let marketType = undefined;
3371
+ [marketType, params] = this.handleMarketTypeAndParams('fetchOrdersByStatus', market, params);
3459
3372
  let response = undefined;
3373
+ const isClosed = (status === 'finished') || (status === 'closed');
3374
+ const isOpen = (status === 'pending') || (status === 'open');
3460
3375
  if (marketType === 'swap') {
3461
- if (symbol === undefined) {
3462
- throw new ArgumentsRequired(this.id + ' fetchOrdersByStatus() requires a symbol argument for swap markets');
3463
- }
3464
- if (side !== undefined) {
3465
- request['side'] = side;
3466
- }
3467
- else {
3468
- request['side'] = 0;
3469
- }
3470
- request['offset'] = 0;
3471
- if (stop) {
3472
- response = await this.v1PerpetualPrivateGetOrderStopPending(this.extend(request, params));
3376
+ request['market_type'] = 'FUTURES';
3377
+ if (isClosed) {
3378
+ if (stop) {
3379
+ response = await this.v2PrivateGetFuturesFinishedStopOrder(this.extend(request, params));
3380
+ //
3381
+ // {
3382
+ // "code": 0,
3383
+ // "data": [
3384
+ // {
3385
+ // "stop_id": 52431158859,
3386
+ // "market": "BTCUSDT",
3387
+ // "market_type": "FUTURES",
3388
+ // "side": "sell",
3389
+ // "type": "market",
3390
+ // "amount": "0.0005",
3391
+ // "price": "20599.64",
3392
+ // "client_id": "",
3393
+ // "created_at": 1667547909856,
3394
+ // "updated_at": 1667547909856,
3395
+ // "trigger_price": "20599.64",
3396
+ // "trigger_price_type": "latest_price",
3397
+ // "trigger_direction": ""
3398
+ // },
3399
+ // ],
3400
+ // "message": "OK",
3401
+ // "pagination": {
3402
+ // "has_next": false
3403
+ // }
3404
+ // }
3405
+ //
3406
+ }
3407
+ else {
3408
+ response = await this.v2PrivateGetFuturesFinishedOrder(this.extend(request, params));
3409
+ //
3410
+ // {
3411
+ // "code": 0,
3412
+ // "data": [
3413
+ // {
3414
+ // "order_id": 136915813578,
3415
+ // "market": "BTCUSDT",
3416
+ // "market_type": "FUTURES",
3417
+ // "side": "sell",
3418
+ // "type": "market",
3419
+ // "amount": "0.0001",
3420
+ // "price": "0",
3421
+ // "client_id": "x-167673045-4f264600c432ac06",
3422
+ // "created_at": 1714119323764,
3423
+ // "updated_at": 1714119323764,
3424
+ // "unfilled_amount": "0",
3425
+ // "filled_amount": "0.0001",
3426
+ // "filled_value": "6.442017",
3427
+ // "fee": "0.003221",
3428
+ // "fee_ccy": "USDT",
3429
+ // "maker_fee_rate": "0",
3430
+ // "taker_fee_rate": "0.0005"
3431
+ // },
3432
+ // ],
3433
+ // "message": "OK",
3434
+ // "pagination": {
3435
+ // "has_next": false
3436
+ // }
3437
+ // }
3438
+ //
3439
+ }
3473
3440
  }
3474
- else {
3475
- if (status === 'finished') {
3476
- response = await this.v1PerpetualPrivateGetOrderFinished(this.extend(request, params));
3441
+ else if (isOpen) {
3442
+ if (stop) {
3443
+ response = await this.v2PrivateGetFuturesPendingStopOrder(this.extend(request, params));
3444
+ //
3445
+ // {
3446
+ // "code": 0,
3447
+ // "data": [
3448
+ // {
3449
+ // "stop_id": 137481469849,
3450
+ // "market": "BTCUSDT",
3451
+ // "market_type": "FUTURES",
3452
+ // "side": "buy",
3453
+ // "type": "limit",
3454
+ // "amount": "0.0001",
3455
+ // "price": "51000",
3456
+ // "client_id": "x-167673045-2b932341949fa2a1",
3457
+ // "created_at": 1714552257876,
3458
+ // "updated_at": 1714552257876,
3459
+ // "trigger_price": "52000",
3460
+ // "trigger_price_type": "latest_price",
3461
+ // "trigger_direction": "higher"
3462
+ // }
3463
+ // ],
3464
+ // "message": "OK",
3465
+ // "pagination": {
3466
+ // "total": 1,
3467
+ // "has_next": false
3468
+ // }
3469
+ // }
3470
+ //
3477
3471
  }
3478
- else if (status === 'pending') {
3479
- response = await this.v1PerpetualPrivateGetOrderPending(this.extend(request, params));
3472
+ else {
3473
+ response = await this.v2PrivateGetFuturesPendingOrder(this.extend(request, params));
3474
+ //
3475
+ // {
3476
+ // "code": 0,
3477
+ // "data": [
3478
+ // {
3479
+ // "order_id": 137480580906,
3480
+ // "market": "BTCUSDT",
3481
+ // "market_type": "FUTURES",
3482
+ // "side": "buy",
3483
+ // "type": "limit",
3484
+ // "amount": "0.0001",
3485
+ // "price": "51000",
3486
+ // "client_id": "",
3487
+ // "created_at": 1714551877569,
3488
+ // "updated_at": 1714551877569,
3489
+ // "unfilled_amount": "0.0001",
3490
+ // "filled_amount": "0",
3491
+ // "filled_value": "0",
3492
+ // "fee": "0",
3493
+ // "fee_ccy": "USDT",
3494
+ // "maker_fee_rate": "0.0003",
3495
+ // "taker_fee_rate": "0.0005",
3496
+ // "last_filled_amount": "0",
3497
+ // "last_filled_price": "0",
3498
+ // "realized_pnl": "0"
3499
+ // }
3500
+ // ],
3501
+ // "message": "OK",
3502
+ // "pagination": {
3503
+ // "total": 1,
3504
+ // "has_next": false
3505
+ // }
3506
+ // }
3507
+ //
3480
3508
  }
3481
3509
  }
3482
3510
  }
3483
3511
  else {
3484
- request['page'] = 1;
3485
- if (status === 'finished') {
3512
+ let marginMode = undefined;
3513
+ [marginMode, params] = this.handleMarginModeAndParams('fetchOrdersByStatus', params);
3514
+ if (marginMode !== undefined) {
3515
+ request['market_type'] = 'MARGIN';
3516
+ }
3517
+ else {
3518
+ request['market_type'] = 'SPOT';
3519
+ }
3520
+ if (isClosed) {
3486
3521
  if (stop) {
3487
- response = await this.v1PrivateGetOrderStopFinished(this.extend(request, params));
3522
+ response = await this.v2PrivateGetSpotFinishedStopOrder(this.extend(request, params));
3523
+ //
3524
+ // {
3525
+ // "code": 0,
3526
+ // "data": [
3527
+ // {
3528
+ // "stop_id": 117654881420,
3529
+ // "market": "BTCUSDT",
3530
+ // "market_type": "SPOT",
3531
+ // "ccy": "USDT",
3532
+ // "side": "buy",
3533
+ // "type": "market",
3534
+ // "amount": "5.83325524",
3535
+ // "price": "0",
3536
+ // "trigger_price": "57418",
3537
+ // "trigger_direction": "lower",
3538
+ // "trigger_price_type": "mark_price",
3539
+ // "client_id": "",
3540
+ // "created_at": 1714618050597,
3541
+ // "updated_at": 0
3542
+ // }
3543
+ // ],
3544
+ // "message": "OK",
3545
+ // "pagination": {
3546
+ // "has_next": false
3547
+ // }
3548
+ // }
3549
+ //
3488
3550
  }
3489
3551
  else {
3490
- response = await this.v1PrivateGetOrderFinished(this.extend(request, params));
3552
+ response = await this.v2PrivateGetSpotFinishedOrder(this.extend(request, params));
3553
+ //
3554
+ // {
3555
+ // "code": 0,
3556
+ // "data": [
3557
+ // {
3558
+ // "order_id": 117180532345,
3559
+ // "market": "BTCUSDT",
3560
+ // "market_type": "SPOT",
3561
+ // "side": "sell",
3562
+ // "type": "market",
3563
+ // "ccy": "BTC",
3564
+ // "amount": "0.00015484",
3565
+ // "price": "0",
3566
+ // "client_id": "",
3567
+ // "created_at": 1714116494219,
3568
+ // "updated_at": 0,
3569
+ // "base_fee": "0",
3570
+ // "quote_fee": "0.0199931699632",
3571
+ // "discount_fee": "0",
3572
+ // "maker_fee_rate": "0",
3573
+ // "taker_fee_rate": "0.002",
3574
+ // "unfilled_amount": "0",
3575
+ // "filled_amount": "0.00015484",
3576
+ // "filled_value": "9.9965849816"
3577
+ // },
3578
+ // ],
3579
+ // "message": "OK",
3580
+ // "pagination": {
3581
+ // "has_next": false
3582
+ // }
3583
+ // }
3584
+ //
3491
3585
  }
3492
3586
  }
3493
3587
  else if (status === 'pending') {
3494
3588
  if (stop) {
3495
- response = await this.v1PrivateGetOrderStopPending(this.extend(request, params));
3589
+ response = await this.v2PrivateGetSpotPendingStopOrder(this.extend(request, params));
3590
+ //
3591
+ // {
3592
+ // "code": 0,
3593
+ // "data": [
3594
+ // {
3595
+ // "stop_id": 117586439530,
3596
+ // "market": "BTCUSDT",
3597
+ // "market_type": "SPOT",
3598
+ // "ccy": "BTC",
3599
+ // "side": "buy",
3600
+ // "type": "limit",
3601
+ // "amount": "0.0001",
3602
+ // "price": "51000",
3603
+ // "trigger_price": "52000",
3604
+ // "trigger_direction": "higher",
3605
+ // "trigger_price_type": "mark_price",
3606
+ // "client_id": "x-167673045-df61777094c69312",
3607
+ // "created_at": 1714551237335,
3608
+ // "updated_at": 1714551237335
3609
+ // }
3610
+ // ],
3611
+ // "message": "OK",
3612
+ // "pagination": {
3613
+ // "total": 1,
3614
+ // "has_next": false
3615
+ // }
3616
+ // }
3617
+ //
3496
3618
  }
3497
3619
  else {
3498
- response = await this.v1PrivateGetOrderPending(this.extend(request, params));
3620
+ response = await this.v2PrivateGetSpotPendingOrder(this.extend(request, params));
3621
+ //
3622
+ // {
3623
+ // "code": 0,
3624
+ // "data": [
3625
+ // {
3626
+ // "order_id": 117585921297,
3627
+ // "market": "BTCUSDT",
3628
+ // "market_type": "SPOT",
3629
+ // "side": "buy",
3630
+ // "type": "limit",
3631
+ // "ccy": "BTC",
3632
+ // "amount": "0.00011793",
3633
+ // "price": "52000",
3634
+ // "client_id": "",
3635
+ // "created_at": 1714550707486,
3636
+ // "updated_at": 1714550707486,
3637
+ // "base_fee": "0",
3638
+ // "quote_fee": "0",
3639
+ // "discount_fee": "0",
3640
+ // "maker_fee_rate": "0.002",
3641
+ // "taker_fee_rate": "0.002",
3642
+ // "last_fill_amount": "0",
3643
+ // "last_fill_price": "0",
3644
+ // "unfilled_amount": "0.00011793",
3645
+ // "filled_amount": "0",
3646
+ // "filled_value": "0"
3647
+ // }
3648
+ // ],
3649
+ // "message": "OK",
3650
+ // "pagination": {
3651
+ // "total": 1,
3652
+ // "has_next": false
3653
+ // }
3654
+ // }
3655
+ //
3499
3656
  }
3500
3657
  }
3501
3658
  }
3502
- //
3503
- // Spot and Margin
3504
- //
3505
- // {
3506
- // "code": 0,
3507
- // "data": {
3508
- // "count": 1,
3509
- // "curr_page": 1,
3510
- // "data": [
3511
- // {
3512
- // "account_id": 0,
3513
- // "amount": "0.0005",
3514
- // "asset_fee": "0",
3515
- // "avg_price": "0.00",
3516
- // "client_id": "",
3517
- // "create_time": 1651089247,
3518
- // "deal_amount": "0",
3519
- // "deal_fee": "0",
3520
- // "deal_money": "0",
3521
- // "fee_asset": null,
3522
- // "fee_discount": "1",
3523
- // "finished_time": 0,
3524
- // "id": 74660190839,
3525
- // "left": "0.0005",
3526
- // "maker_fee_rate": "0.002",
3527
- // "market": "BTCUSDT",
3528
- // "money_fee": "0",
3529
- // "order_type": "limit",
3530
- // "price": "31000",
3531
- // "status": "not_deal",
3532
- // "stock_fee": "0",
3533
- // "taker_fee_rate": "0.002",
3534
- // "type": "buy"
3535
- // }
3536
- // ],
3537
- // "has_next": false,
3538
- // "total": 1
3539
- // },
3540
- // "message": "Success"
3541
- // }
3542
- //
3543
- // Swap
3544
- //
3545
- // {
3546
- // "code": 0,
3547
- // "data": {
3548
- // "limit": 100,
3549
- // "offset": 0,
3550
- // "records": [
3551
- // {
3552
- // "amount": "0.0005",
3553
- // "client_id": "",
3554
- // "create_time": 1651030414.088431,
3555
- // "deal_asset_fee": "0",
3556
- // "deal_fee": "0.00960069",
3557
- // "deal_profit": "0.009825",
3558
- // "deal_stock": "19.20138",
3559
- // "effect_type": 0,
3560
- // "fee_asset": "",
3561
- // "fee_discount": "0",
3562
- // "left": "0",
3563
- // "leverage": "3",
3564
- // "maker_fee": "0",
3565
- // "market": "BTCUSDT",
3566
- // "order_id": 18253447431,
3567
- // "position_id": 0,
3568
- // "position_type": 1,
3569
- // "price": "0",
3570
- // "side": 1,
3571
- // "source": "web",
3572
- // "stop_id": 0,
3573
- // "taker_fee": "0.0005",
3574
- // "target": 0,
3575
- // "type": 2,
3576
- // "update_time": 1651030414.08847,
3577
- // "user_id": 3620173
3578
- // },
3579
- // ]
3580
- // },
3581
- // "message": "OK"
3582
- // }
3583
- //
3584
- // Spot and Margin Stop
3585
- //
3586
- // {
3587
- // "code": 0,
3588
- // "data": {
3589
- // "count": 1,
3590
- // "curr_page": 1,
3591
- // "data": [
3592
- // {
3593
- // "account_id": 0,
3594
- // "amount": "155",
3595
- // "client_id": "",
3596
- // "create_time": 1651089182,
3597
- // "fee_asset": null,
3598
- // "fee_discount": "1",
3599
- // "maker_fee": "0.002",
3600
- // "market": "BTCUSDT",
3601
- // "order_id": 74660111965,
3602
- // "order_type": "market",
3603
- // "price": "0",
3604
- // "state": 0,
3605
- // "stop_price": "31500",
3606
- // "taker_fee": "0.002",
3607
- // "type": "buy"
3608
- // }
3609
- // ],
3610
- // "has_next": false,
3611
- // "total": 0
3612
- // },
3613
- // "message": "Success"
3614
- // }
3615
- //
3616
- // Swap Stop
3617
- //
3618
- // {
3619
- // "code": 0,
3620
- // "data": {
3621
- // "limit": 100,
3622
- // "offset": 0,
3623
- // "records": [
3624
- // {
3625
- // "amount": "0.0005",
3626
- // "client_id": "",
3627
- // "create_time": 1651089147.321691,
3628
- // "effect_type": 1,
3629
- // "fee_asset": "",
3630
- // "fee_discount": "0.00000000000000000000",
3631
- // "maker_fee": "0.00030",
3632
- // "market": "BTCUSDT",
3633
- // "order_id": 18332143848,
3634
- // "price": "31000.00",
3635
- // "side": 2,
3636
- // "source": "api.v1",
3637
- // "state": 1,
3638
- // "stop_price": "31500.00",
3639
- // "stop_type": 1,
3640
- // "taker_fee": "0.00050",
3641
- // "target": 0,
3642
- // "type": 1,
3643
- // "update_time": 1651089147.321691,
3644
- // "user_id": 3620173
3645
- // }
3646
- // ],
3647
- // "total": 1
3648
- // },
3649
- // "message": "OK"
3650
- // }
3651
- //
3652
- const tradeRequest = (marketType === 'swap') ? 'records' : 'data';
3653
- const data = this.safeValue(response, 'data');
3654
- const orders = this.safeList(data, tradeRequest, []);
3655
- return this.parseOrders(orders, market, since, limit);
3659
+ const data = this.safeList(response, 'data', []);
3660
+ return this.parseOrders(data, market, since, limit);
3656
3661
  }
3657
3662
  async fetchOpenOrders(symbol = undefined, since = undefined, limit = undefined, params = {}) {
3658
3663
  /**
3659
3664
  * @method
3660
3665
  * @name coinex#fetchOpenOrders
3661
3666
  * @description fetch all unfilled currently open orders
3662
- * @see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http027_query_pending_stop
3663
- * @see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http025_query_pending
3664
- * @see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot003_trade013_stop_pending_order
3665
- * @see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot003_trade011_pending_order
3667
+ * @see https://docs.coinex.com/api/v2/spot/order/http/list-pending-order
3668
+ * @see https://docs.coinex.com/api/v2/spot/order/http/list-pending-stop-order
3669
+ * @see https://docs.coinex.com/api/v2/futures/order/http/list-pending-order
3670
+ * @see https://docs.coinex.com/api/v2/futures/order/http/list-pending-stop-order
3666
3671
  * @param {string} symbol unified market symbol
3667
3672
  * @param {int} [since] the earliest time in ms to fetch open orders for
3668
- * @param {int} [limit] the maximum number of open orders structures to retrieve
3673
+ * @param {int} [limit] the maximum number of open order structures to retrieve
3669
3674
  * @param {object} [params] extra parameters specific to the exchange API endpoint
3675
+ * @param {boolean} [params.trigger] set to true for fetching trigger orders
3676
+ * @param {string} [params.marginMode] 'cross' or 'isolated' for fetching spot margin orders
3670
3677
  * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
3671
3678
  */
3672
3679
  return await this.fetchOrdersByStatus('pending', symbol, since, limit, params);
@@ -3676,13 +3683,15 @@ export default class coinex extends Exchange {
3676
3683
  * @method
3677
3684
  * @name coinex#fetchClosedOrders
3678
3685
  * @description fetches information on multiple closed orders made by the user
3679
- * @see https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http029_query_finished
3680
- * @see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot003_trade010_stop_finished_order
3681
- * @see https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot003_trade012_finished_order
3686
+ * @see https://docs.coinex.com/api/v2/spot/order/http/list-finished-order
3687
+ * @see https://docs.coinex.com/api/v2/spot/order/http/list-finished-stop-order
3688
+ * @see https://docs.coinex.com/api/v2/futures/order/http/list-finished-order
3689
+ * @see https://docs.coinex.com/api/v2/futures/order/http/list-finished-stop-order
3682
3690
  * @param {string} symbol unified market symbol of the market orders were made in
3683
3691
  * @param {int} [since] the earliest time in ms to fetch orders for
3684
3692
  * @param {int} [limit] the maximum number of order structures to retrieve
3685
- * @param {object} [params] extra parameters specific to the exchange API endpoint
3693
+ * @param {boolean} [params.trigger] set to true for fetching trigger orders
3694
+ * @param {string} [params.marginMode] 'cross' or 'isolated' for fetching spot margin orders
3686
3695
  * @returns {Order[]} a list of [order structures]{@link https://docs.ccxt.com/#/?id=order-structure}
3687
3696
  */
3688
3697
  return await this.fetchOrdersByStatus('finished', symbol, since, limit, params);
@@ -6115,6 +6124,8 @@ export default class coinex extends Exchange {
6115
6124
  preparedString += nonce + this.secret;
6116
6125
  const signature = this.hash(this.encode(preparedString), sha256);
6117
6126
  headers = {
6127
+ 'Content-Type': 'application/json; charset=utf-8',
6128
+ 'Accept': 'application/json',
6118
6129
  'X-COINEX-KEY': this.apiKey,
6119
6130
  'X-COINEX-SIGN': signature,
6120
6131
  'X-COINEX-TIMESTAMP': nonce,