ccxt 4.1.68__py2.py3-none-any.whl → 4.1.70__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/phemex.py +8 -0
- ccxt/ascendex.py +69 -68
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/ascendex.py +69 -68
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/coinex.py +348 -59
- ccxt/async_support/phemex.py +14 -2
- ccxt/base/exchange.py +1 -1
- ccxt/coinex.py +348 -59
- ccxt/phemex.py +14 -2
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/binance.py +2 -2
- ccxt/pro/htx.py +3 -2
- ccxt/test/test_async.py +51 -29
- ccxt/test/test_sync.py +51 -29
- {ccxt-4.1.68.dist-info → ccxt-4.1.70.dist-info}/METADATA +5 -5
- {ccxt-4.1.68.dist-info → ccxt-4.1.70.dist-info}/RECORD +20 -20
- {ccxt-4.1.68.dist-info → ccxt-4.1.70.dist-info}/WHEEL +0 -0
- {ccxt-4.1.68.dist-info → ccxt-4.1.70.dist-info}/top_level.txt +0 -0
ccxt/async_support/coinex.py
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
from ccxt.async_support.base.exchange import Exchange
|
7
7
|
from ccxt.abstract.coinex import ImplicitAPI
|
8
8
|
import asyncio
|
9
|
-
from ccxt.base.types import Balances, Currency, Int, Market, Order, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
|
9
|
+
from ccxt.base.types import Balances, Currency, Int, Market, Order, OrderRequest, OrderSide, OrderType, Str, Strings, Ticker, Tickers, Trade, Transaction
|
10
10
|
from typing import List
|
11
11
|
from ccxt.base.errors import ExchangeError
|
12
12
|
from ccxt.base.errors import PermissionDenied
|
@@ -55,8 +55,10 @@ class coinex(Exchange, ImplicitAPI):
|
|
55
55
|
'borrowIsolatedMargin': True,
|
56
56
|
'cancelAllOrders': True,
|
57
57
|
'cancelOrder': True,
|
58
|
+
'cancelOrders': True,
|
58
59
|
'createDepositAddress': True,
|
59
60
|
'createOrder': True,
|
61
|
+
'createOrders': True,
|
60
62
|
'createReduceOnlyOrder': True,
|
61
63
|
'editOrder': True,
|
62
64
|
'fetchBalance': True,
|
@@ -1494,6 +1496,8 @@ class coinex(Exchange, ImplicitAPI):
|
|
1494
1496
|
|
1495
1497
|
def parse_order_status(self, status):
|
1496
1498
|
statuses = {
|
1499
|
+
'rejected': 'rejected',
|
1500
|
+
'open': 'open',
|
1497
1501
|
'not_deal': 'open',
|
1498
1502
|
'part_deal': 'open',
|
1499
1503
|
'done': 'closed',
|
@@ -1527,7 +1531,7 @@ class coinex(Exchange, ImplicitAPI):
|
|
1527
1531
|
# "client_id": "",
|
1528
1532
|
# }
|
1529
1533
|
#
|
1530
|
-
# Spot and Margin createOrder, cancelOrder, fetchOrder
|
1534
|
+
# Spot and Margin createOrder, createOrders, cancelOrder, cancelOrders, fetchOrder
|
1531
1535
|
#
|
1532
1536
|
# {
|
1533
1537
|
# "amount":"1.5",
|
@@ -1726,13 +1730,50 @@ class coinex(Exchange, ImplicitAPI):
|
|
1726
1730
|
# "user_id": 3620173
|
1727
1731
|
# }
|
1728
1732
|
#
|
1733
|
+
# swap: cancelOrders
|
1734
|
+
#
|
1735
|
+
# {
|
1736
|
+
# "amount": "0.0005",
|
1737
|
+
# "client_id": "x-167673045-b0cee0c584718b65",
|
1738
|
+
# "create_time": 1701233683.294231,
|
1739
|
+
# "deal_asset_fee": "0.00000000000000000000",
|
1740
|
+
# "deal_fee": "0.00000000000000000000",
|
1741
|
+
# "deal_profit": "0.00000000000000000000",
|
1742
|
+
# "deal_stock": "0.00000000000000000000",
|
1743
|
+
# "effect_type": 1,
|
1744
|
+
# "fee_asset": "",
|
1745
|
+
# "fee_discount": "0.00000000000000000000",
|
1746
|
+
# "last_deal_amount": "0.00000000000000000000",
|
1747
|
+
# "last_deal_id": 0,
|
1748
|
+
# "last_deal_price": "0.00000000000000000000",
|
1749
|
+
# "last_deal_role": 0,
|
1750
|
+
# "last_deal_time": 0,
|
1751
|
+
# "last_deal_type": 0,
|
1752
|
+
# "left": "0.0005",
|
1753
|
+
# "leverage": "3",
|
1754
|
+
# "maker_fee": "0.00030",
|
1755
|
+
# "market": "BTCUSDT",
|
1756
|
+
# "option": 0,
|
1757
|
+
# "order_id": 115940476323,
|
1758
|
+
# "position_id": 0,
|
1759
|
+
# "position_type": 2,
|
1760
|
+
# "price": "25000.00",
|
1761
|
+
# "side": 2,
|
1762
|
+
# "source": "api.v1",
|
1763
|
+
# "stop_id": 0,
|
1764
|
+
# "stop_loss_price": "0.00000000000000000000",
|
1765
|
+
# "stop_loss_type": 0,
|
1766
|
+
# "take_profit_price": "0.00000000000000000000",
|
1767
|
+
# "take_profit_type": 0,
|
1768
|
+
# "taker_fee": "0.00050",
|
1769
|
+
# "target": 0,
|
1770
|
+
# "type": 1,
|
1771
|
+
# "update_time": 1701233721.718884,
|
1772
|
+
# "user_id": 3620173
|
1773
|
+
# }
|
1774
|
+
#
|
1775
|
+
rawStatus = self.safe_string(order, 'status')
|
1729
1776
|
timestamp = self.safe_timestamp(order, 'create_time')
|
1730
|
-
priceString = self.safe_string(order, 'price')
|
1731
|
-
costString = self.safe_string(order, 'deal_money')
|
1732
|
-
amountString = self.safe_string(order, 'amount')
|
1733
|
-
filledString = self.safe_string(order, 'deal_amount')
|
1734
|
-
averageString = self.safe_string(order, 'avg_price')
|
1735
|
-
remainingString = self.safe_string(order, 'left')
|
1736
1777
|
marketId = self.safe_string(order, 'market')
|
1737
1778
|
defaultType = self.safe_string(self.options, 'defaultType')
|
1738
1779
|
orderType = 'swap' if ('source' in order) else defaultType
|
@@ -1741,7 +1782,6 @@ class coinex(Exchange, ImplicitAPI):
|
|
1741
1782
|
feeCurrency = self.safe_currency_code(feeCurrencyId)
|
1742
1783
|
if feeCurrency is None:
|
1743
1784
|
feeCurrency = market['quote']
|
1744
|
-
status = self.parse_order_status(self.safe_string(order, 'status'))
|
1745
1785
|
rawSide = self.safe_integer(order, 'side')
|
1746
1786
|
side: Str = None
|
1747
1787
|
if rawSide == 1:
|
@@ -1769,21 +1809,23 @@ class coinex(Exchange, ImplicitAPI):
|
|
1769
1809
|
'datetime': self.iso8601(timestamp),
|
1770
1810
|
'timestamp': timestamp,
|
1771
1811
|
'lastTradeTimestamp': self.safe_timestamp(order, 'update_time'),
|
1772
|
-
'status':
|
1812
|
+
'status': self.parse_order_status(rawStatus),
|
1773
1813
|
'symbol': market['symbol'],
|
1774
1814
|
'type': type,
|
1775
1815
|
'timeInForce': None,
|
1776
1816
|
'postOnly': None,
|
1777
1817
|
'reduceOnly': None,
|
1778
1818
|
'side': side,
|
1779
|
-
'price':
|
1819
|
+
'price': self.safe_string(order, 'price'),
|
1780
1820
|
'stopPrice': self.safe_string(order, 'stop_price'),
|
1781
1821
|
'triggerPrice': self.safe_string(order, 'stop_price'),
|
1782
|
-
'
|
1783
|
-
'
|
1784
|
-
'
|
1785
|
-
'
|
1786
|
-
'
|
1822
|
+
'takeProfitPrice': self.safe_number(order, 'take_profit_price'),
|
1823
|
+
'stopLossPrice': self.safe_number(order, 'stop_loss_price'),
|
1824
|
+
'cost': self.safe_string(order, 'deal_money'),
|
1825
|
+
'average': self.safe_string(order, 'avg_price'),
|
1826
|
+
'amount': self.safe_string(order, 'amount'),
|
1827
|
+
'filled': self.safe_string(order, 'deal_amount'),
|
1828
|
+
'remaining': self.safe_string(order, 'left'),
|
1787
1829
|
'trades': None,
|
1788
1830
|
'fee': {
|
1789
1831
|
'currency': feeCurrency,
|
@@ -1792,32 +1834,7 @@ class coinex(Exchange, ImplicitAPI):
|
|
1792
1834
|
'info': order,
|
1793
1835
|
}, market)
|
1794
1836
|
|
1795
|
-
|
1796
|
-
"""
|
1797
|
-
create a trade order
|
1798
|
-
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http017_put_limit
|
1799
|
-
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http018_put_market
|
1800
|
-
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http019_put_limit_stop
|
1801
|
-
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http020_put_market_stop
|
1802
|
-
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http031_market_close
|
1803
|
-
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http030_limit_close
|
1804
|
-
:param str symbol: unified symbol of the market to create an order in
|
1805
|
-
:param str type: 'market' or 'limit'
|
1806
|
-
:param str side: 'buy' or 'sell'
|
1807
|
-
:param float amount: how much of currency you want to trade in units of base currency
|
1808
|
-
:param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
1809
|
-
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1810
|
-
:param float triggerPrice: price at which to triger stop orders
|
1811
|
-
:param float stopPrice: price at which to triger stop orders
|
1812
|
-
:param float stopLossPrice: price at which to trigger stop-loss orders
|
1813
|
-
:param float takeProfitPrice: price at which to trigger take-profit orders
|
1814
|
-
:param str [params.timeInForce]: "GTC", "IOC", "FOK", "PO"
|
1815
|
-
:param bool params.postOnly:
|
1816
|
-
:param bool params.reduceOnly:
|
1817
|
-
:param bool [params.position_id]: *required for reduce only orders* the position id to reduce
|
1818
|
-
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1819
|
-
"""
|
1820
|
-
await self.load_markets()
|
1837
|
+
def create_order_request(self, symbol, type, side, amount, price=None, params={}):
|
1821
1838
|
market = self.market(symbol)
|
1822
1839
|
swap = market['swap']
|
1823
1840
|
clientOrderId = self.safe_string_2(params, 'client_id', 'clientOrderId')
|
@@ -1831,11 +1848,10 @@ class coinex(Exchange, ImplicitAPI):
|
|
1831
1848
|
timeInForceRaw = self.safe_string(params, 'timeInForce') # Spot: IOC, FOK, PO, GTC, ... NORMAL(default), MAKER_ONLY
|
1832
1849
|
reduceOnly = self.safe_value(params, 'reduceOnly')
|
1833
1850
|
if reduceOnly:
|
1834
|
-
if market['
|
1851
|
+
if not market['swap']:
|
1835
1852
|
raise InvalidOrder(self.id + ' createOrder() does not support reduceOnly for ' + market['type'] + ' orders, reduceOnly orders are supported for swap markets only')
|
1836
1853
|
if positionId is None:
|
1837
1854
|
raise ArgumentsRequired(self.id + ' createOrder() requires a position_id/positionId parameter for reduceOnly orders')
|
1838
|
-
method = None
|
1839
1855
|
request = {
|
1840
1856
|
'market': market['id'],
|
1841
1857
|
}
|
@@ -1852,13 +1868,10 @@ class coinex(Exchange, ImplicitAPI):
|
|
1852
1868
|
raise ArgumentsRequired(self.id + ' createOrder() requires a position_id parameter for stop loss and take profit orders')
|
1853
1869
|
request['position_id'] = positionId
|
1854
1870
|
if stopLossPrice:
|
1855
|
-
method = 'perpetualPrivatePostPositionStopLoss'
|
1856
1871
|
request['stop_loss_price'] = self.price_to_precision(symbol, stopLossPrice)
|
1857
1872
|
elif takeProfitPrice:
|
1858
|
-
method = 'perpetualPrivatePostPositionTakeProfit'
|
1859
1873
|
request['take_profit_price'] = self.price_to_precision(symbol, takeProfitPrice)
|
1860
1874
|
else:
|
1861
|
-
method = 'perpetualPrivatePostOrderPut' + self.capitalize(type)
|
1862
1875
|
requestSide = 2 if (side == 'buy') else 1
|
1863
1876
|
if stopPrice is not None:
|
1864
1877
|
request['stop_price'] = self.price_to_precision(symbol, stopPrice)
|
@@ -1866,10 +1879,7 @@ class coinex(Exchange, ImplicitAPI):
|
|
1866
1879
|
request['amount'] = self.amount_to_precision(symbol, amount)
|
1867
1880
|
request['side'] = requestSide
|
1868
1881
|
if type == 'limit':
|
1869
|
-
method = 'perpetualPrivatePostOrderPutStopLimit'
|
1870
1882
|
request['price'] = self.price_to_precision(symbol, price)
|
1871
|
-
elif type == 'market':
|
1872
|
-
method = 'perpetualPrivatePostOrderPutStopMarket'
|
1873
1883
|
request['amount'] = self.amount_to_precision(symbol, amount)
|
1874
1884
|
timeInForce = None
|
1875
1885
|
if (type != 'market') or (stopPrice is not None):
|
@@ -1885,7 +1895,6 @@ class coinex(Exchange, ImplicitAPI):
|
|
1885
1895
|
request['effect_type'] = timeInForce # exchange takes 'IOC' and 'FOK'
|
1886
1896
|
if type == 'limit' and stopPrice is None:
|
1887
1897
|
if reduceOnly:
|
1888
|
-
method = 'perpetualPrivatePostOrderCloseLimit'
|
1889
1898
|
request['position_id'] = positionId
|
1890
1899
|
else:
|
1891
1900
|
request['side'] = requestSide
|
@@ -1893,13 +1902,11 @@ class coinex(Exchange, ImplicitAPI):
|
|
1893
1902
|
request['amount'] = self.amount_to_precision(symbol, amount)
|
1894
1903
|
elif type == 'market' and stopPrice is None:
|
1895
1904
|
if reduceOnly:
|
1896
|
-
method = 'perpetualPrivatePostOrderCloseMarket'
|
1897
1905
|
request['position_id'] = positionId
|
1898
1906
|
else:
|
1899
1907
|
request['side'] = requestSide
|
1900
1908
|
request['amount'] = self.amount_to_precision(symbol, amount)
|
1901
1909
|
else:
|
1902
|
-
method = 'privatePostOrder' + self.capitalize(type)
|
1903
1910
|
request['type'] = side
|
1904
1911
|
if (type == 'market') and (side == 'buy'):
|
1905
1912
|
if self.options['createMarketBuyOrderRequiresPrice']:
|
@@ -1919,10 +1926,6 @@ class coinex(Exchange, ImplicitAPI):
|
|
1919
1926
|
request['price'] = self.price_to_precision(symbol, price)
|
1920
1927
|
if stopPrice is not None:
|
1921
1928
|
request['stop_price'] = self.price_to_precision(symbol, stopPrice)
|
1922
|
-
if type == 'limit':
|
1923
|
-
method = 'privatePostOrderStopLimit'
|
1924
|
-
elif type == 'market':
|
1925
|
-
method = 'privatePostOrderStopMarket'
|
1926
1929
|
if (type != 'market') or (stopPrice is not None):
|
1927
1930
|
# following options cannot be applied to vanilla market orders(but can be applied to stop-market orders)
|
1928
1931
|
if (timeInForceRaw is not None) or postOnly:
|
@@ -1940,7 +1943,77 @@ class coinex(Exchange, ImplicitAPI):
|
|
1940
1943
|
raise BadRequest(self.id + ' createOrder() requires an account_id parameter for margin orders')
|
1941
1944
|
request['account_id'] = accountId
|
1942
1945
|
params = self.omit(params, ['reduceOnly', 'positionId', 'timeInForce', 'postOnly', 'stopPrice', 'triggerPrice', 'stopLossPrice', 'takeProfitPrice'])
|
1943
|
-
|
1946
|
+
return self.extend(request, params)
|
1947
|
+
|
1948
|
+
async def create_order(self, symbol: str, type: OrderType, side: OrderSide, amount, price=None, params={}):
|
1949
|
+
"""
|
1950
|
+
create a trade order
|
1951
|
+
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http017_put_limit
|
1952
|
+
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http018_put_market
|
1953
|
+
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http019_put_limit_stop
|
1954
|
+
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http020_put_market_stop
|
1955
|
+
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http031_market_close
|
1956
|
+
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http030_limit_close
|
1957
|
+
:param str symbol: unified symbol of the market to create an order in
|
1958
|
+
:param str type: 'market' or 'limit'
|
1959
|
+
:param str side: 'buy' or 'sell'
|
1960
|
+
:param float amount: how much you want to trade in units of the base currency
|
1961
|
+
:param float [price]: the price at which the order is to be fullfilled, in units of the quote currency, ignored in market orders
|
1962
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1963
|
+
:param float [params.triggerPrice]: price to trigger stop orders
|
1964
|
+
:param float [params.stopLossPrice]: price to trigger stop loss orders
|
1965
|
+
:param float [params.takeProfitPrice]: price to trigger take profit orders
|
1966
|
+
:param str [params.timeInForce]: 'GTC', 'IOC', 'FOK', 'PO'
|
1967
|
+
:param boolean [params.postOnly]: set to True if you wish to make a post only order
|
1968
|
+
:param boolean [params.reduceOnly]: *contract only* indicates if self order is to reduce the size of a position
|
1969
|
+
:param int [params.position_id]: *required for reduce only orders* the position id to reduce
|
1970
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1971
|
+
"""
|
1972
|
+
await self.load_markets()
|
1973
|
+
market = self.market(symbol)
|
1974
|
+
reduceOnly = self.safe_value(params, 'reduceOnly')
|
1975
|
+
triggerPrice = self.safe_number_2(params, 'stopPrice', 'triggerPrice')
|
1976
|
+
stopLossTriggerPrice = self.safe_number(params, 'stopLossPrice')
|
1977
|
+
takeProfitTriggerPrice = self.safe_number(params, 'takeProfitPrice')
|
1978
|
+
isTriggerOrder = triggerPrice is not None
|
1979
|
+
isStopLossTriggerOrder = stopLossTriggerPrice is not None
|
1980
|
+
isTakeProfitTriggerOrder = takeProfitTriggerPrice is not None
|
1981
|
+
isStopLossOrTakeProfitTrigger = isStopLossTriggerOrder or isTakeProfitTriggerOrder
|
1982
|
+
request = self.create_order_request(symbol, type, side, amount, price, params)
|
1983
|
+
response = None
|
1984
|
+
if market['spot']:
|
1985
|
+
if isTriggerOrder:
|
1986
|
+
if type == 'limit':
|
1987
|
+
response = await self.privatePostOrderStopLimit(request)
|
1988
|
+
else:
|
1989
|
+
response = await self.privatePostOrderStopMarket(request)
|
1990
|
+
else:
|
1991
|
+
if type == 'limit':
|
1992
|
+
response = await self.privatePostOrderLimit(request)
|
1993
|
+
else:
|
1994
|
+
response = await self.privatePostOrderMarket(request)
|
1995
|
+
else:
|
1996
|
+
if isTriggerOrder:
|
1997
|
+
if type == 'limit':
|
1998
|
+
response = await self.perpetualPrivatePostOrderPutStopLimit(request)
|
1999
|
+
else:
|
2000
|
+
response = await self.perpetualPrivatePostOrderPutStopMarket(request)
|
2001
|
+
elif isStopLossOrTakeProfitTrigger:
|
2002
|
+
if isStopLossTriggerOrder:
|
2003
|
+
response = await self.perpetualPrivatePostPositionStopLoss(request)
|
2004
|
+
elif isTakeProfitTriggerOrder:
|
2005
|
+
response = await self.perpetualPrivatePostPositionTakeProfit(request)
|
2006
|
+
else:
|
2007
|
+
if reduceOnly:
|
2008
|
+
if type == 'limit':
|
2009
|
+
response = await self.perpetualPrivatePostOrderCloseLimit(request)
|
2010
|
+
else:
|
2011
|
+
response = await self.perpetualPrivatePostOrderCloseMarket(request)
|
2012
|
+
else:
|
2013
|
+
if type == 'limit':
|
2014
|
+
response = await self.perpetualPrivatePostOrderPutLimit(request)
|
2015
|
+
else:
|
2016
|
+
response = await self.perpetualPrivatePostOrderPutMarket(request)
|
1944
2017
|
#
|
1945
2018
|
# Spot and Margin
|
1946
2019
|
#
|
@@ -2018,9 +2091,225 @@ class coinex(Exchange, ImplicitAPI):
|
|
2018
2091
|
#
|
2019
2092
|
# {"code":0,"data":{"status":"success"},"message":"OK"}
|
2020
2093
|
#
|
2021
|
-
data = self.safe_value(response, 'data')
|
2094
|
+
data = self.safe_value(response, 'data', {})
|
2022
2095
|
return self.parse_order(data, market)
|
2023
2096
|
|
2097
|
+
async def create_orders(self, orders: List[OrderRequest], params={}) -> List[Order]:
|
2098
|
+
"""
|
2099
|
+
create a list of trade orders(all orders should be of the same symbol)
|
2100
|
+
:see: https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot003_trade002_batch_limit_orders
|
2101
|
+
:param array orders: list of orders to create, each object should contain the parameters required by createOrder, namely symbol, type, side, amount, price and params
|
2102
|
+
:param dict [params]: extra parameters specific to the api endpoint
|
2103
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
2104
|
+
"""
|
2105
|
+
await self.load_markets()
|
2106
|
+
ordersRequests = []
|
2107
|
+
symbol = None
|
2108
|
+
for i in range(0, len(orders)):
|
2109
|
+
rawOrder = orders[i]
|
2110
|
+
marketId = self.safe_string(rawOrder, 'symbol')
|
2111
|
+
if symbol is None:
|
2112
|
+
symbol = marketId
|
2113
|
+
else:
|
2114
|
+
if symbol != marketId:
|
2115
|
+
raise BadRequest(self.id + ' createOrders() requires all orders to have the same symbol')
|
2116
|
+
type = self.safe_string(rawOrder, 'type')
|
2117
|
+
side = self.safe_string(rawOrder, 'side')
|
2118
|
+
amount = self.safe_value(rawOrder, 'amount')
|
2119
|
+
price = self.safe_value(rawOrder, 'price')
|
2120
|
+
orderParams = self.safe_value(rawOrder, 'params', {})
|
2121
|
+
if type != 'limit':
|
2122
|
+
raise NotSupported(self.id + ' createOrders() does not support ' + type + ' orders, only limit orders are accepted')
|
2123
|
+
orderRequest = self.create_order_request(marketId, type, side, amount, price, orderParams)
|
2124
|
+
ordersRequests.append(orderRequest)
|
2125
|
+
market = self.market(symbol)
|
2126
|
+
if not market['spot']:
|
2127
|
+
raise NotSupported(self.id + ' createOrders() does not support ' + market['type'] + ' orders, only spot orders are accepted')
|
2128
|
+
request = {
|
2129
|
+
'market': market['id'],
|
2130
|
+
'batch_orders': self.json(ordersRequests),
|
2131
|
+
}
|
2132
|
+
response = await self.privatePostOrderLimitBatch(request)
|
2133
|
+
#
|
2134
|
+
# {
|
2135
|
+
# "code": 0,
|
2136
|
+
# "data": [
|
2137
|
+
# {
|
2138
|
+
# "code": 0,
|
2139
|
+
# "data": {
|
2140
|
+
# "amount": "0.0005",
|
2141
|
+
# "asset_fee": "0",
|
2142
|
+
# "avg_price": "0.00",
|
2143
|
+
# "client_id": "x-167673045-d34bfb41242d8fd1",
|
2144
|
+
# "create_time": 1701229157,
|
2145
|
+
# "deal_amount": "0",
|
2146
|
+
# "deal_fee": "0",
|
2147
|
+
# "deal_money": "0",
|
2148
|
+
# "fee_asset": null,
|
2149
|
+
# "fee_discount": "1",
|
2150
|
+
# "finished_time": null,
|
2151
|
+
# "id": 107745856676,
|
2152
|
+
# "left": "0.0005",
|
2153
|
+
# "maker_fee_rate": "0.002",
|
2154
|
+
# "market": "BTCUSDT",
|
2155
|
+
# "money_fee": "0",
|
2156
|
+
# "order_type": "limit",
|
2157
|
+
# "price": "23000",
|
2158
|
+
# "source_id": "",
|
2159
|
+
# "status": "not_deal",
|
2160
|
+
# "stock_fee": "0",
|
2161
|
+
# "taker_fee_rate": "0.002",
|
2162
|
+
# "type": "buy"
|
2163
|
+
# },
|
2164
|
+
# "message": "OK"
|
2165
|
+
# },
|
2166
|
+
# ],
|
2167
|
+
# "message": "Success"
|
2168
|
+
# }
|
2169
|
+
#
|
2170
|
+
data = self.safe_value(response, 'data', [])
|
2171
|
+
results = []
|
2172
|
+
for i in range(0, len(data)):
|
2173
|
+
entry = data[i]
|
2174
|
+
status = None
|
2175
|
+
code = self.safe_integer(entry, 'code')
|
2176
|
+
if code is not None:
|
2177
|
+
if code != 0:
|
2178
|
+
status = 'rejected'
|
2179
|
+
else:
|
2180
|
+
status = 'open'
|
2181
|
+
item = self.safe_value(entry, 'data', {})
|
2182
|
+
item['status'] = status
|
2183
|
+
order = self.parse_order(item, market)
|
2184
|
+
results.append(order)
|
2185
|
+
return results
|
2186
|
+
|
2187
|
+
async def cancel_orders(self, ids, symbol: Str = None, params={}):
|
2188
|
+
"""
|
2189
|
+
cancel multiple orders
|
2190
|
+
:see: https://viabtc.github.io/coinex_api_en_doc/spot/#docsspot003_trade016_batch_cancel_order
|
2191
|
+
:see: https://viabtc.github.io/coinex_api_en_doc/futures/#docsfutures001_http021-0_cancel_order_batch
|
2192
|
+
:param str[] ids: order ids
|
2193
|
+
:param str symbol: unified market symbol
|
2194
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2195
|
+
:returns dict: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
2196
|
+
"""
|
2197
|
+
if symbol is None:
|
2198
|
+
raise ArgumentsRequired(self.id + ' cancelOrders() requires a symbol argument')
|
2199
|
+
await self.load_markets()
|
2200
|
+
market = self.market(symbol)
|
2201
|
+
request = {
|
2202
|
+
'market': market['id'],
|
2203
|
+
}
|
2204
|
+
idsString = ','.join(ids)
|
2205
|
+
response = None
|
2206
|
+
if market['spot']:
|
2207
|
+
request['batch_ids'] = idsString
|
2208
|
+
response = await self.privateDeleteOrderPendingBatch(self.extend(request, params))
|
2209
|
+
else:
|
2210
|
+
request['order_ids'] = idsString
|
2211
|
+
response = await self.perpetualPrivatePostOrderCancelBatch(self.extend(request, params))
|
2212
|
+
#
|
2213
|
+
# spot
|
2214
|
+
#
|
2215
|
+
# {
|
2216
|
+
# "code": 0,
|
2217
|
+
# "data": [
|
2218
|
+
# {
|
2219
|
+
# "code": 0,
|
2220
|
+
# "data": {
|
2221
|
+
# "account_id": 0,
|
2222
|
+
# "amount": "0.0005",
|
2223
|
+
# "asset_fee": "0",
|
2224
|
+
# "avg_price": "0.00",
|
2225
|
+
# "client_id": "x-167673045-d4e03c38f4d19b4e",
|
2226
|
+
# "create_time": 1701229157,
|
2227
|
+
# "deal_amount": "0",
|
2228
|
+
# "deal_fee": "0",
|
2229
|
+
# "deal_money": "0",
|
2230
|
+
# "fee_asset": null,
|
2231
|
+
# "fee_discount": "1",
|
2232
|
+
# "finished_time": 0,
|
2233
|
+
# "id": 107745856682,
|
2234
|
+
# "left": "0",
|
2235
|
+
# "maker_fee_rate": "0.002",
|
2236
|
+
# "market": "BTCUSDT",
|
2237
|
+
# "money_fee": "0",
|
2238
|
+
# "order_type": "limit",
|
2239
|
+
# "price": "22000",
|
2240
|
+
# "status": "not_deal",
|
2241
|
+
# "stock_fee": "0",
|
2242
|
+
# "taker_fee_rate": "0.002",
|
2243
|
+
# "type": "buy"
|
2244
|
+
# },
|
2245
|
+
# "message": ""
|
2246
|
+
# },
|
2247
|
+
# ],
|
2248
|
+
# "message": "Success"
|
2249
|
+
# }
|
2250
|
+
#
|
2251
|
+
# swap
|
2252
|
+
#
|
2253
|
+
# {
|
2254
|
+
# "code": 0,
|
2255
|
+
# "data": [
|
2256
|
+
# {
|
2257
|
+
# "code": 0,
|
2258
|
+
# "message": "",
|
2259
|
+
# "order": {
|
2260
|
+
# "amount": "0.0005",
|
2261
|
+
# "client_id": "x-167673045-b0cee0c584718b65",
|
2262
|
+
# "create_time": 1701233683.294231,
|
2263
|
+
# "deal_asset_fee": "0.00000000000000000000",
|
2264
|
+
# "deal_fee": "0.00000000000000000000",
|
2265
|
+
# "deal_profit": "0.00000000000000000000",
|
2266
|
+
# "deal_stock": "0.00000000000000000000",
|
2267
|
+
# "effect_type": 1,
|
2268
|
+
# "fee_asset": "",
|
2269
|
+
# "fee_discount": "0.00000000000000000000",
|
2270
|
+
# "last_deal_amount": "0.00000000000000000000",
|
2271
|
+
# "last_deal_id": 0,
|
2272
|
+
# "last_deal_price": "0.00000000000000000000",
|
2273
|
+
# "last_deal_role": 0,
|
2274
|
+
# "last_deal_time": 0,
|
2275
|
+
# "last_deal_type": 0,
|
2276
|
+
# "left": "0.0005",
|
2277
|
+
# "leverage": "3",
|
2278
|
+
# "maker_fee": "0.00030",
|
2279
|
+
# "market": "BTCUSDT",
|
2280
|
+
# "option": 0,
|
2281
|
+
# "order_id": 115940476323,
|
2282
|
+
# "position_id": 0,
|
2283
|
+
# "position_type": 2,
|
2284
|
+
# "price": "25000.00",
|
2285
|
+
# "side": 2,
|
2286
|
+
# "source": "api.v1",
|
2287
|
+
# "stop_id": 0,
|
2288
|
+
# "stop_loss_price": "0.00000000000000000000",
|
2289
|
+
# "stop_loss_type": 0,
|
2290
|
+
# "take_profit_price": "0.00000000000000000000",
|
2291
|
+
# "take_profit_type": 0,
|
2292
|
+
# "taker_fee": "0.00050",
|
2293
|
+
# "target": 0,
|
2294
|
+
# "type": 1,
|
2295
|
+
# "update_time": 1701233721.718884,
|
2296
|
+
# "user_id": 3620173
|
2297
|
+
# }
|
2298
|
+
# },
|
2299
|
+
# ],
|
2300
|
+
# "message": "OK"
|
2301
|
+
# }
|
2302
|
+
#
|
2303
|
+
data = self.safe_value(response, 'data', [])
|
2304
|
+
results = []
|
2305
|
+
for i in range(0, len(data)):
|
2306
|
+
entry = data[i]
|
2307
|
+
dataRequest = 'data' if market['spot'] else 'order'
|
2308
|
+
item = self.safe_value(entry, dataRequest, {})
|
2309
|
+
order = self.parse_order(item, market)
|
2310
|
+
results.append(order)
|
2311
|
+
return results
|
2312
|
+
|
2024
2313
|
async def edit_order(self, id, symbol, type, side, amount=None, price=None, params={}):
|
2025
2314
|
"""
|
2026
2315
|
edit a trade order
|
ccxt/async_support/phemex.py
CHANGED
@@ -161,7 +161,8 @@ class phemex(Exchange, ImplicitAPI):
|
|
161
161
|
},
|
162
162
|
'v1': {
|
163
163
|
'get': {
|
164
|
-
'md/
|
164
|
+
'md/fullbook': 5, # ?symbol=<symbol>
|
165
|
+
'md/orderbook': 5, # ?symbol=<symbol>
|
165
166
|
'md/trade': 5, # ?symbol=<symbol>&id=<id>
|
166
167
|
'md/ticker/24hr': 5, # ?symbol=<symbol>&id=<id>
|
167
168
|
'md/ticker/24hr/all': 5, # ?id=<id>
|
@@ -214,6 +215,11 @@ class phemex(Exchange, ImplicitAPI):
|
|
214
215
|
'phemex-user/users/children': 5, # ?offset=<offset>&limit=<limit>&withCount=<withCount>
|
215
216
|
'phemex-user/wallets/v2/depositAddress': 5, # ?_t=1592722635531¤cy=USDT
|
216
217
|
'phemex-user/wallets/tradeAccountDetail': 5, # ?bizCode=¤cy=&end=1642443347321&limit=10&offset=0&side=&start=1&type=4&withCount=true
|
218
|
+
'phemex-deposit/wallets/api/depositAddress': 5, # ?currency=<currency>&chainName=<chainName>
|
219
|
+
'phemex-deposit/wallets/api/depositHist': 5, # ?currency=<currency>&offset=<offset>&limit=<limit>&withCount=<withCount>
|
220
|
+
'phemex-deposit/wallets/api/chainCfg': 5, # ?currency=<currency>
|
221
|
+
'phemex-withdraw/wallets/api/withdrawHist': 5, # ?currency=<currency>&chainName=<chainNameList>&offset=<offset>&limit=<limit>&withCount=<withCount>
|
222
|
+
'phemex-withdraw/wallets/api/asset/info': 5, # ?currency=<currency>&amount=<amount>
|
217
223
|
'phemex-user/order/closedPositionList': 5, # ?currency=USD&limit=10&offset=0&symbol=&withCount=true
|
218
224
|
'exchange/margins/transfer': 5, # ?start=<start>&end=<end>&offset=<offset>&limit=<limit>&withCount=<withCount>
|
219
225
|
'exchange/wallets/confirm/withdraw': 5, # ?code=<withdrawConfirmCode>
|
@@ -252,6 +258,9 @@ class phemex(Exchange, ImplicitAPI):
|
|
252
258
|
'assets/futures/sub-accounts/transfer': 5, # for sub-account only
|
253
259
|
'assets/universal-transfer': 5, # for Main account only
|
254
260
|
'assets/convert': 5,
|
261
|
+
# withdraw
|
262
|
+
'phemex-withdraw/wallets/api/createWithdraw': 5, # ?currency=<currency>&address=<address>&amount=<amount>&addressTag=<addressTag>&chainName=<chainName>
|
263
|
+
'phemex-withdraw/wallets/api/cancelWithdraw': 5, # ?id=<id>
|
255
264
|
},
|
256
265
|
'put': {
|
257
266
|
# spot
|
@@ -987,7 +996,10 @@ class phemex(Exchange, ImplicitAPI):
|
|
987
996
|
if market['linear'] and market['settle'] == 'USDT':
|
988
997
|
response = await self.v2GetMdV2Orderbook(self.extend(request, params))
|
989
998
|
else:
|
990
|
-
|
999
|
+
if (limit is not None) and (limit <= 30):
|
1000
|
+
response = await self.v1GetMdOrderbook(self.extend(request, params))
|
1001
|
+
else:
|
1002
|
+
response = await self.v1GetMdFullbook(self.extend(request, params))
|
991
1003
|
#
|
992
1004
|
# {
|
993
1005
|
# "error": null,
|