ccxt 4.4.39__py2.py3-none-any.whl → 4.4.40__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/ascendex.py +9 -9
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/ascendex.py +9 -9
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/base/ws/aiohttp_client.py +2 -2
- ccxt/async_support/binance.py +13 -17
- ccxt/async_support/bingx.py +1 -2
- ccxt/async_support/bit2c.py +0 -1
- ccxt/async_support/bitbank.py +0 -1
- ccxt/async_support/bitbns.py +0 -1
- ccxt/async_support/bitfinex.py +15 -16
- ccxt/async_support/bitfinex1.py +0 -1
- ccxt/async_support/bitflyer.py +0 -1
- ccxt/async_support/bitget.py +1 -2
- ccxt/async_support/bithumb.py +0 -1
- ccxt/async_support/bitmart.py +3 -4
- ccxt/async_support/bitmex.py +5 -6
- ccxt/async_support/bitopro.py +4 -5
- ccxt/async_support/bitrue.py +5 -7
- ccxt/async_support/bitso.py +1 -2
- ccxt/async_support/bitstamp.py +1 -2
- ccxt/async_support/bitteam.py +1 -3
- ccxt/async_support/bitvavo.py +2 -4
- ccxt/async_support/blockchaincom.py +5 -5
- ccxt/async_support/blofin.py +10 -10
- ccxt/async_support/btcalpha.py +0 -1
- ccxt/async_support/btcbox.py +0 -1
- ccxt/async_support/btcmarkets.py +1 -3
- ccxt/async_support/bybit.py +2 -3
- ccxt/async_support/cex.py +1 -1
- ccxt/async_support/coinbase.py +77 -1
- ccxt/async_support/coinbaseexchange.py +1 -1
- ccxt/async_support/coinbaseinternational.py +62 -0
- ccxt/async_support/coincatch.py +1 -1
- ccxt/async_support/coinex.py +9 -9
- ccxt/async_support/coinlist.py +1 -1
- ccxt/async_support/coinmetro.py +1 -1
- ccxt/async_support/cryptocom.py +91 -2
- ccxt/async_support/currencycom.py +1 -1
- ccxt/async_support/defx.py +1 -2
- ccxt/async_support/delta.py +1 -1
- ccxt/async_support/digifinex.py +1 -1
- ccxt/async_support/exmo.py +2 -2
- ccxt/async_support/gate.py +1 -1
- ccxt/async_support/hashkey.py +3 -5
- ccxt/async_support/htx.py +1 -1
- ccxt/async_support/hyperliquid.py +1 -1
- ccxt/async_support/kraken.py +1 -1
- ccxt/async_support/kucoin.py +24 -24
- ccxt/async_support/luno.py +1 -1
- ccxt/async_support/mexc.py +137 -1
- ccxt/async_support/ndax.py +1 -1
- ccxt/async_support/okcoin.py +18 -18
- ccxt/async_support/okx.py +21 -21
- ccxt/async_support/phemex.py +12 -8
- ccxt/async_support/poloniex.py +1 -1
- ccxt/async_support/poloniexfutures.py +6 -6
- ccxt/async_support/vertex.py +11 -11
- ccxt/async_support/woo.py +33 -33
- ccxt/async_support/woofipro.py +24 -24
- ccxt/async_support/xt.py +26 -26
- ccxt/async_support/zonda.py +1 -1
- ccxt/base/exchange.py +13 -16
- ccxt/binance.py +13 -17
- ccxt/bingx.py +1 -2
- ccxt/bit2c.py +0 -1
- ccxt/bitbank.py +0 -1
- ccxt/bitbns.py +0 -1
- ccxt/bitfinex.py +15 -16
- ccxt/bitfinex1.py +0 -1
- ccxt/bitflyer.py +0 -1
- ccxt/bitget.py +1 -2
- ccxt/bithumb.py +0 -1
- ccxt/bitmart.py +3 -4
- ccxt/bitmex.py +5 -6
- ccxt/bitopro.py +4 -5
- ccxt/bitrue.py +5 -7
- ccxt/bitso.py +1 -2
- ccxt/bitstamp.py +1 -2
- ccxt/bitteam.py +1 -3
- ccxt/bitvavo.py +2 -4
- ccxt/blockchaincom.py +5 -5
- ccxt/blofin.py +10 -10
- ccxt/btcalpha.py +0 -1
- ccxt/btcbox.py +0 -1
- ccxt/btcmarkets.py +1 -3
- ccxt/bybit.py +2 -3
- ccxt/cex.py +1 -1
- ccxt/coinbase.py +77 -1
- ccxt/coinbaseexchange.py +1 -1
- ccxt/coinbaseinternational.py +62 -0
- ccxt/coincatch.py +1 -1
- ccxt/coinex.py +9 -9
- ccxt/coinlist.py +1 -1
- ccxt/coinmetro.py +1 -1
- ccxt/cryptocom.py +91 -2
- ccxt/currencycom.py +1 -1
- ccxt/defx.py +1 -2
- ccxt/delta.py +1 -1
- ccxt/digifinex.py +1 -1
- ccxt/exmo.py +2 -2
- ccxt/gate.py +1 -1
- ccxt/hashkey.py +3 -5
- ccxt/htx.py +1 -1
- ccxt/hyperliquid.py +1 -1
- ccxt/kraken.py +1 -1
- ccxt/kucoin.py +24 -24
- ccxt/luno.py +1 -1
- ccxt/mexc.py +137 -1
- ccxt/ndax.py +1 -1
- ccxt/okcoin.py +18 -18
- ccxt/okx.py +21 -21
- ccxt/phemex.py +12 -8
- ccxt/poloniex.py +1 -1
- ccxt/poloniexfutures.py +6 -6
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/bitget.py +1 -1
- ccxt/pro/bybit.py +12 -1
- ccxt/pro/coinex.py +2 -2
- ccxt/pro/gate.py +6 -6
- ccxt/pro/kucoin.py +3 -3
- ccxt/pro/okx.py +11 -11
- ccxt/pro/upbit.py +2 -2
- ccxt/vertex.py +11 -11
- ccxt/woo.py +33 -33
- ccxt/woofipro.py +24 -24
- ccxt/xt.py +26 -26
- ccxt/zonda.py +1 -1
- {ccxt-4.4.39.dist-info → ccxt-4.4.40.dist-info}/METADATA +4 -4
- {ccxt-4.4.39.dist-info → ccxt-4.4.40.dist-info}/RECORD +134 -134
- {ccxt-4.4.39.dist-info → ccxt-4.4.40.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.4.39.dist-info → ccxt-4.4.40.dist-info}/WHEEL +0 -0
- {ccxt-4.4.39.dist-info → ccxt-4.4.40.dist-info}/top_level.txt +0 -0
ccxt/pro/gate.py
CHANGED
@@ -211,14 +211,14 @@ class gate(ccxt.async_support.gate):
|
|
211
211
|
"""
|
212
212
|
await self.load_markets()
|
213
213
|
market = None if (symbol is None) else self.market(symbol)
|
214
|
-
|
214
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger')
|
215
215
|
messageType = self.get_type_by_market(market)
|
216
216
|
channel = messageType + '.order_cancel_cp'
|
217
217
|
channel, params = self.handle_option_and_params(params, 'cancelAllOrdersWs', 'channel', channel)
|
218
218
|
url = self.get_url_by_market(market)
|
219
219
|
params = self.omit(params, ['stop', 'trigger'])
|
220
220
|
type, query = self.handle_market_type_and_params('cancelAllOrders', market, params)
|
221
|
-
request, requestParams = self.multiOrderSpotPrepareRequest(market,
|
221
|
+
request, requestParams = self.multiOrderSpotPrepareRequest(market, trigger, query) if (type == 'spot') else self.prepareRequest(market, type, query)
|
222
222
|
await self.authenticate(url, messageType)
|
223
223
|
rawOrders = await self.request_private(url, self.extend(request, requestParams), channel)
|
224
224
|
return self.parse_orders(rawOrders, market)
|
@@ -233,15 +233,15 @@ class gate(ccxt.async_support.gate):
|
|
233
233
|
:param str id: Order id
|
234
234
|
:param str symbol: Unified market symbol
|
235
235
|
:param dict [params]: Parameters specified by the exchange api
|
236
|
-
:param bool [params.
|
236
|
+
:param bool [params.trigger]: True if the order to be cancelled is a trigger order
|
237
237
|
:returns: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
238
238
|
"""
|
239
239
|
await self.load_markets()
|
240
240
|
market = None if (symbol is None) else self.market(symbol)
|
241
|
-
|
241
|
+
trigger = self.safe_value_n(params, ['is_stop_order', 'stop', 'trigger'], False)
|
242
242
|
params = self.omit(params, ['is_stop_order', 'stop', 'trigger'])
|
243
243
|
type, query = self.handle_market_type_and_params('cancelOrder', market, params)
|
244
|
-
request, requestParams = self.spotOrderPrepareRequest(market,
|
244
|
+
request, requestParams = self.spotOrderPrepareRequest(market, trigger, query) if (type == 'spot' or type == 'margin') else self.prepareRequest(market, type, query)
|
245
245
|
messageType = self.get_type_by_market(market)
|
246
246
|
channel = messageType + '.order_cancel'
|
247
247
|
url = self.get_url_by_market(market)
|
@@ -286,7 +286,7 @@ class gate(ccxt.async_support.gate):
|
|
286
286
|
:param str id: Order id
|
287
287
|
:param str symbol: Unified market symbol, *required for spot and margin*
|
288
288
|
:param dict [params]: Parameters specified by the exchange api
|
289
|
-
:param bool [params.
|
289
|
+
:param bool [params.trigger]: True if the order being fetched is a trigger order
|
290
290
|
:param str [params.marginMode]: 'cross' or 'isolated' - marginMode for margin trading if not provided self.options['defaultMarginMode'] is used
|
291
291
|
:param str [params.type]: 'spot', 'swap', or 'future', if not provided self.options['defaultMarginMode'] is used
|
292
292
|
:param str [params.settle]: 'btc' or 'usdt' - settle currency for perpetual swap and future - market settle currency is used if symbol is not None, default="usdt" for swap and "btc" for future
|
ccxt/pro/kucoin.py
CHANGED
@@ -898,14 +898,14 @@ class kucoin(ccxt.async_support.kucoin):
|
|
898
898
|
:param int [since]: the earliest time in ms to fetch orders for
|
899
899
|
:param int [limit]: the maximum number of order structures to retrieve
|
900
900
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
901
|
-
:param boolean [params.
|
901
|
+
:param boolean [params.trigger]: trigger orders are watched if True
|
902
902
|
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
903
903
|
"""
|
904
904
|
await self.load_markets()
|
905
|
-
|
905
|
+
trigger = self.safe_value_2(params, 'stop', 'trigger')
|
906
906
|
params = self.omit(params, ['stop', 'trigger'])
|
907
907
|
url = await self.negotiate(True)
|
908
|
-
topic = '/spotMarket/advancedOrders' if
|
908
|
+
topic = '/spotMarket/advancedOrders' if trigger else '/spotMarket/tradeOrders'
|
909
909
|
request: dict = {
|
910
910
|
'privateChannel': True,
|
911
911
|
}
|
ccxt/pro/okx.py
CHANGED
@@ -720,9 +720,9 @@ class okx(ccxt.async_support.okx):
|
|
720
720
|
:returns dict: an array of `liquidation structures <https://github.com/ccxt/ccxt/wiki/Manual#liquidation-structure>`
|
721
721
|
"""
|
722
722
|
await self.load_markets()
|
723
|
-
|
723
|
+
isTrigger = self.safe_value_2(params, 'stop', 'trigger', False)
|
724
724
|
params = self.omit(params, ['stop', 'trigger'])
|
725
|
-
await self.authenticate({'access': 'business' if
|
725
|
+
await self.authenticate({'access': 'business' if isTrigger else 'private'})
|
726
726
|
symbols = self.market_symbols(symbols, None, True, True)
|
727
727
|
messageHash = 'myLiquidations'
|
728
728
|
messageHashes = []
|
@@ -1513,7 +1513,7 @@ class okx(ccxt.async_support.okx):
|
|
1513
1513
|
:param int [since]: the earliest time in ms to fetch trades for
|
1514
1514
|
:param int [limit]: the maximum number of trade structures to retrieve
|
1515
1515
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1516
|
-
:param bool [params.
|
1516
|
+
:param bool [params.trigger]: True if fetching trigger or conditional trades
|
1517
1517
|
:param str [params.type]: 'spot', 'swap', 'future', 'option', 'ANY', 'SPOT', 'MARGIN', 'SWAP', 'FUTURES' or 'OPTION'
|
1518
1518
|
:param str [params.marginMode]: 'cross' or 'isolated', for automatically setting the type to spot margin
|
1519
1519
|
:returns dict[]: a list of `trade structures <https://docs.ccxt.com/#/?id=trade-structure>`
|
@@ -1521,11 +1521,11 @@ class okx(ccxt.async_support.okx):
|
|
1521
1521
|
# By default, receive order updates from any instrument type
|
1522
1522
|
type = None
|
1523
1523
|
type, params = self.handle_option_and_params(params, 'watchMyTrades', 'type', 'ANY')
|
1524
|
-
|
1525
|
-
params = self.omit(params, ['stop'])
|
1524
|
+
isTrigger = self.safe_bool_2(params, 'trigger', 'stop', False)
|
1525
|
+
params = self.omit(params, ['trigger', 'stop'])
|
1526
1526
|
await self.load_markets()
|
1527
|
-
await self.authenticate({'access': 'business' if
|
1528
|
-
channel = 'orders-algo' if
|
1527
|
+
await self.authenticate({'access': 'business' if isTrigger else 'private'})
|
1528
|
+
channel = 'orders-algo' if isTrigger else 'orders'
|
1529
1529
|
messageHash = channel + '::myTrades'
|
1530
1530
|
market = None
|
1531
1531
|
if symbol is not None:
|
@@ -1690,7 +1690,7 @@ class okx(ccxt.async_support.okx):
|
|
1690
1690
|
:param int [since]: the earliest time in ms to fetch orders for
|
1691
1691
|
:param int [limit]: the maximum number of order structures to retrieve
|
1692
1692
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1693
|
-
:param bool [params.
|
1693
|
+
:param bool [params.trigger]: True if fetching trigger or conditional orders
|
1694
1694
|
:param str [params.type]: 'spot', 'swap', 'future', 'option', 'ANY', 'SPOT', 'MARGIN', 'SWAP', 'FUTURES' or 'OPTION'
|
1695
1695
|
:param str [params.marginMode]: 'cross' or 'isolated', for automatically setting the type to spot margin
|
1696
1696
|
:returns dict[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -1698,10 +1698,10 @@ class okx(ccxt.async_support.okx):
|
|
1698
1698
|
type = None
|
1699
1699
|
# By default, receive order updates from any instrument type
|
1700
1700
|
type, params = self.handle_option_and_params(params, 'watchOrders', 'type', 'ANY')
|
1701
|
-
|
1701
|
+
isTrigger = self.safe_value_2(params, 'stop', 'trigger', False)
|
1702
1702
|
params = self.omit(params, ['stop', 'trigger'])
|
1703
1703
|
await self.load_markets()
|
1704
|
-
await self.authenticate({'access': 'business' if
|
1704
|
+
await self.authenticate({'access': 'business' if isTrigger else 'private'})
|
1705
1705
|
market = None
|
1706
1706
|
if symbol is not None:
|
1707
1707
|
market = self.market(symbol)
|
@@ -1718,7 +1718,7 @@ class okx(ccxt.async_support.okx):
|
|
1718
1718
|
request: dict = {
|
1719
1719
|
'instType': uppercaseType,
|
1720
1720
|
}
|
1721
|
-
channel = 'orders-algo' if
|
1721
|
+
channel = 'orders-algo' if isTrigger else 'orders'
|
1722
1722
|
orders = await self.subscribe('private', channel, channel, symbol, self.extend(request, params))
|
1723
1723
|
if self.newUpdates:
|
1724
1724
|
limit = orders.getLimit(symbol, limit)
|
ccxt/pro/upbit.py
CHANGED
@@ -100,11 +100,11 @@ class upbit(ccxt.async_support.upbit):
|
|
100
100
|
|
101
101
|
async def watch_tickers(self, symbols: Strings = None, params={}) -> Tickers:
|
102
102
|
"""
|
103
|
-
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for a specific
|
103
|
+
watches a price ticker, a statistical calculation with the information calculated over the past 24 hours for all markets of a specific list
|
104
104
|
|
105
105
|
https://global-docs.upbit.com/reference/websocket-ticker
|
106
106
|
|
107
|
-
|
107
|
+
:param str[] symbols: unified symbol of the market to fetch the ticker for
|
108
108
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
109
109
|
:returns dict: a `ticker structure <https://docs.ccxt.com/#/?id=ticker-structure>`
|
110
110
|
"""
|
ccxt/vertex.py
CHANGED
@@ -1964,7 +1964,7 @@ class vertex(Exchange, ImplicitAPI):
|
|
1964
1964
|
:param int [since]: the earliest time in ms to fetch open orders for
|
1965
1965
|
:param int [limit]: the maximum number of open orders structures to retrieve
|
1966
1966
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1967
|
-
:param boolean [params.
|
1967
|
+
:param boolean [params.trigger]: whether the order is a trigger/algo order
|
1968
1968
|
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
1969
1969
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1970
1970
|
"""
|
@@ -1974,13 +1974,13 @@ class vertex(Exchange, ImplicitAPI):
|
|
1974
1974
|
userAddress, params = self.handle_public_address('fetchOpenOrders', params)
|
1975
1975
|
request = {}
|
1976
1976
|
market: Market = None
|
1977
|
-
|
1977
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger')
|
1978
1978
|
params = self.omit(params, ['stop', 'trigger'])
|
1979
1979
|
if symbol is not None:
|
1980
1980
|
market = self.market(symbol)
|
1981
1981
|
request['product_id'] = self.parse_to_numeric(market['id'])
|
1982
1982
|
response = None
|
1983
|
-
if
|
1983
|
+
if trigger:
|
1984
1984
|
contracts = self.query_contracts()
|
1985
1985
|
chainId = self.safe_string(contracts, 'chain_id')
|
1986
1986
|
verifyingContractAddress = self.safe_string(contracts, 'endpoint_addr')
|
@@ -2076,14 +2076,14 @@ class vertex(Exchange, ImplicitAPI):
|
|
2076
2076
|
:param int [since]: the earliest time in ms to fetch open orders for
|
2077
2077
|
:param int [limit]: the maximum number of open orders structures to retrieve
|
2078
2078
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2079
|
-
:param boolean [params.
|
2079
|
+
:param boolean [params.trigger]: whether the order is a trigger/algo order
|
2080
2080
|
:param str [params.user]: user address, will default to self.walletAddress if not provided
|
2081
2081
|
:returns Order[]: a list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
2082
2082
|
"""
|
2083
2083
|
self.check_required_credentials()
|
2084
|
-
|
2084
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger')
|
2085
2085
|
params = self.omit(params, ['stop', 'trigger'])
|
2086
|
-
if not
|
2086
|
+
if not trigger:
|
2087
2087
|
raise NotSupported(self.id + ' fetchOrders only support trigger orders')
|
2088
2088
|
userAddress = None
|
2089
2089
|
userAddress, params = self.handle_public_address('fetchOrders', params)
|
@@ -2158,7 +2158,7 @@ class vertex(Exchange, ImplicitAPI):
|
|
2158
2158
|
cancel all open orders in a market
|
2159
2159
|
:param str symbol: unified market symbol
|
2160
2160
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2161
|
-
:param boolean [params.
|
2161
|
+
:param boolean [params.trigger]: whether the order is a trigger/algo order
|
2162
2162
|
:returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
2163
2163
|
"""
|
2164
2164
|
self.check_required_credentials()
|
@@ -2189,10 +2189,10 @@ class vertex(Exchange, ImplicitAPI):
|
|
2189
2189
|
'signature': self.build_cancel_all_orders_sig(cancels, chainId, verifyingContractAddress),
|
2190
2190
|
},
|
2191
2191
|
}
|
2192
|
-
|
2192
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger')
|
2193
2193
|
params = self.omit(params, ['stop', 'trigger'])
|
2194
2194
|
response = None
|
2195
|
-
if
|
2195
|
+
if trigger:
|
2196
2196
|
response = self.v1TriggerPostExecute(self.extend(request, params))
|
2197
2197
|
#
|
2198
2198
|
# {
|
@@ -2286,10 +2286,10 @@ class vertex(Exchange, ImplicitAPI):
|
|
2286
2286
|
'signature': self.build_cancel_orders_sig(cancels, chainId, verifyingContractAddress),
|
2287
2287
|
},
|
2288
2288
|
}
|
2289
|
-
|
2289
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger')
|
2290
2290
|
params = self.omit(params, ['stop', 'trigger'])
|
2291
2291
|
response = None
|
2292
|
-
if
|
2292
|
+
if trigger:
|
2293
2293
|
response = self.v1TriggerPostExecute(self.extend(request, params))
|
2294
2294
|
#
|
2295
2295
|
# {
|
ccxt/woo.py
CHANGED
@@ -975,17 +975,17 @@ class woo(Exchange, ImplicitAPI):
|
|
975
975
|
isTrailingAmountOrder = trailingAmount is not None
|
976
976
|
isTrailingPercentOrder = trailingPercent is not None
|
977
977
|
isTrailing = isTrailingAmountOrder or isTrailingPercentOrder
|
978
|
-
|
978
|
+
isConditional = isTrailing or stopPrice is not None or stopLoss is not None or takeProfit is not None or (self.safe_value(params, 'childOrders') is not None)
|
979
979
|
isMarket = orderType == 'MARKET'
|
980
980
|
timeInForce = self.safe_string_lower(params, 'timeInForce')
|
981
981
|
postOnly = self.is_post_only(isMarket, None, params)
|
982
|
-
reduceOnlyKey = 'reduceOnly' if
|
983
|
-
clientOrderIdKey = 'clientOrderId' if
|
984
|
-
orderQtyKey = 'quantity' if
|
985
|
-
priceKey = 'price' if
|
986
|
-
typeKey = 'type' if
|
982
|
+
reduceOnlyKey = 'reduceOnly' if isConditional else 'reduce_only'
|
983
|
+
clientOrderIdKey = 'clientOrderId' if isConditional else 'client_order_id'
|
984
|
+
orderQtyKey = 'quantity' if isConditional else 'order_quantity'
|
985
|
+
priceKey = 'price' if isConditional else 'order_price'
|
986
|
+
typeKey = 'type' if isConditional else 'order_type'
|
987
987
|
request[typeKey] = orderType # LIMIT/MARKET/IOC/FOK/POST_ONLY/ASK/BID
|
988
|
-
if not
|
988
|
+
if not isConditional:
|
989
989
|
if postOnly:
|
990
990
|
request['order_type'] = 'POST_ONLY'
|
991
991
|
elif timeInForce == 'fok':
|
@@ -996,7 +996,7 @@ class woo(Exchange, ImplicitAPI):
|
|
996
996
|
request[reduceOnlyKey] = reduceOnly
|
997
997
|
if not isMarket and price is not None:
|
998
998
|
request[priceKey] = self.price_to_precision(symbol, price)
|
999
|
-
if isMarket and not
|
999
|
+
if isMarket and not isConditional:
|
1000
1000
|
# for market buy it requires the amount of quote currency to spend
|
1001
1001
|
cost = self.safe_string_2(params, 'cost', 'order_amount')
|
1002
1002
|
params = self.omit(params, ['cost', 'order_amount'])
|
@@ -1064,7 +1064,7 @@ class woo(Exchange, ImplicitAPI):
|
|
1064
1064
|
request['childOrders'] = [outterOrder]
|
1065
1065
|
params = self.omit(params, ['clOrdID', 'clientOrderId', 'client_order_id', 'postOnly', 'timeInForce', 'stopPrice', 'triggerPrice', 'stopLoss', 'takeProfit', 'trailingPercent', 'trailingAmount', 'trailingTriggerPrice'])
|
1066
1066
|
response = None
|
1067
|
-
if
|
1067
|
+
if isConditional:
|
1068
1068
|
response = self.v3PrivatePostAlgoOrder(self.extend(request, params))
|
1069
1069
|
else:
|
1070
1070
|
response = self.v1PrivatePostOrder(self.extend(request, params))
|
@@ -1163,17 +1163,17 @@ class woo(Exchange, ImplicitAPI):
|
|
1163
1163
|
convertedTrailingPercent = Precise.string_div(trailingPercent, '100')
|
1164
1164
|
request['callbackRate'] = convertedTrailingPercent
|
1165
1165
|
params = self.omit(params, ['clOrdID', 'clientOrderId', 'client_order_id', 'stopPrice', 'triggerPrice', 'takeProfitPrice', 'stopLossPrice', 'trailingTriggerPrice', 'trailingAmount', 'trailingPercent'])
|
1166
|
-
|
1166
|
+
isConditional = isTrailing or (stopPrice is not None) or (self.safe_value(params, 'childOrders') is not None)
|
1167
1167
|
response = None
|
1168
1168
|
if isByClientOrder:
|
1169
1169
|
request['client_order_id'] = clientOrderIdExchangeSpecific
|
1170
|
-
if
|
1170
|
+
if isConditional:
|
1171
1171
|
response = self.v3PrivatePutAlgoOrderClientClientOrderId(self.extend(request, params))
|
1172
1172
|
else:
|
1173
1173
|
response = self.v3PrivatePutOrderClientClientOrderId(self.extend(request, params))
|
1174
1174
|
else:
|
1175
1175
|
request['oid'] = id
|
1176
|
-
if
|
1176
|
+
if isConditional:
|
1177
1177
|
response = self.v3PrivatePutAlgoOrderOid(self.extend(request, params))
|
1178
1178
|
else:
|
1179
1179
|
response = self.v3PrivatePutOrderOid(self.extend(request, params))
|
@@ -1203,12 +1203,12 @@ class woo(Exchange, ImplicitAPI):
|
|
1203
1203
|
:param str id: order id
|
1204
1204
|
:param str symbol: unified symbol of the market the order was made in
|
1205
1205
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1206
|
-
:param boolean [params.
|
1206
|
+
:param boolean [params.trigger]: whether the order is a trigger/algo order
|
1207
1207
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1208
1208
|
"""
|
1209
|
-
|
1210
|
-
params = self.omit(params, 'stop')
|
1211
|
-
if not
|
1209
|
+
isTrigger = self.safe_bool_2(params, 'trigger', 'stop', False)
|
1210
|
+
params = self.omit(params, ['trigger', 'stop'])
|
1211
|
+
if not isTrigger and (symbol is None):
|
1212
1212
|
raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
|
1213
1213
|
self.load_markets()
|
1214
1214
|
market: Market = None
|
@@ -1219,7 +1219,7 @@ class woo(Exchange, ImplicitAPI):
|
|
1219
1219
|
clientOrderIdExchangeSpecific = self.safe_string(params, 'client_order_id', clientOrderIdUnified)
|
1220
1220
|
isByClientOrder = clientOrderIdExchangeSpecific is not None
|
1221
1221
|
response = None
|
1222
|
-
if
|
1222
|
+
if isTrigger:
|
1223
1223
|
request['order_id'] = id
|
1224
1224
|
response = self.v3PrivateDeleteAlgoOrderOrderId(self.extend(request, params))
|
1225
1225
|
else:
|
@@ -1251,13 +1251,13 @@ class woo(Exchange, ImplicitAPI):
|
|
1251
1251
|
cancel all open orders in a market
|
1252
1252
|
:param str symbol: unified market symbol
|
1253
1253
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1254
|
-
:param boolean [params.
|
1254
|
+
:param boolean [params.trigger]: whether the order is a trigger/algo order
|
1255
1255
|
:returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1256
1256
|
"""
|
1257
1257
|
self.load_markets()
|
1258
|
-
|
1258
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger')
|
1259
1259
|
params = self.omit(params, ['stop', 'trigger'])
|
1260
|
-
if
|
1260
|
+
if trigger:
|
1261
1261
|
return self.v3PrivateDeleteAlgoOrdersPending(params)
|
1262
1262
|
if symbol is None:
|
1263
1263
|
raise ArgumentsRequired(self.id + ' cancelOrders() requires a symbol argument')
|
@@ -1314,17 +1314,17 @@ class woo(Exchange, ImplicitAPI):
|
|
1314
1314
|
:param str id: the order id
|
1315
1315
|
:param str symbol: unified symbol of the market the order was made in
|
1316
1316
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1317
|
-
:param boolean [params.
|
1317
|
+
:param boolean [params.trigger]: whether the order is a trigger/algo order
|
1318
1318
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1319
1319
|
"""
|
1320
1320
|
self.load_markets()
|
1321
1321
|
market = self.market(symbol) if (symbol is not None) else None
|
1322
|
-
|
1322
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger')
|
1323
1323
|
params = self.omit(params, ['stop', 'trigger'])
|
1324
1324
|
request: dict = {}
|
1325
1325
|
clientOrderId = self.safe_string_2(params, 'clOrdID', 'clientOrderId')
|
1326
1326
|
response = None
|
1327
|
-
if
|
1327
|
+
if trigger:
|
1328
1328
|
request['oid'] = id
|
1329
1329
|
response = self.v3PrivateGetAlgoOrderOid(self.extend(request, params))
|
1330
1330
|
elif clientOrderId:
|
@@ -1382,7 +1382,7 @@ class woo(Exchange, ImplicitAPI):
|
|
1382
1382
|
:param int [since]: the earliest time in ms to fetch orders for
|
1383
1383
|
:param int [limit]: the maximum number of order structures to retrieve
|
1384
1384
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1385
|
-
:param boolean [params.
|
1385
|
+
:param boolean [params.trigger]: whether the order is a trigger/algo order
|
1386
1386
|
:param boolean [params.isTriggered]: whether the order has been triggered(False by default)
|
1387
1387
|
:param str [params.side]: 'buy' or 'sell'
|
1388
1388
|
:param boolean [params.trailing]: set to True if you want to fetch trailing orders
|
@@ -1396,14 +1396,14 @@ class woo(Exchange, ImplicitAPI):
|
|
1396
1396
|
return self.fetch_paginated_call_incremental('fetchOrders', symbol, since, limit, params, 'page', 500)
|
1397
1397
|
request: dict = {}
|
1398
1398
|
market: Market = None
|
1399
|
-
|
1399
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger')
|
1400
1400
|
trailing = self.safe_bool(params, 'trailing', False)
|
1401
1401
|
params = self.omit(params, ['stop', 'trailing', 'trigger'])
|
1402
1402
|
if symbol is not None:
|
1403
1403
|
market = self.market(symbol)
|
1404
1404
|
request['symbol'] = market['id']
|
1405
1405
|
if since is not None:
|
1406
|
-
if
|
1406
|
+
if trigger or trailing:
|
1407
1407
|
request['createdTimeStart'] = since
|
1408
1408
|
else:
|
1409
1409
|
request['start_t'] = since
|
@@ -1411,12 +1411,12 @@ class woo(Exchange, ImplicitAPI):
|
|
1411
1411
|
request['size'] = limit
|
1412
1412
|
else:
|
1413
1413
|
request['size'] = 500
|
1414
|
-
if
|
1414
|
+
if trigger:
|
1415
1415
|
request['algoType'] = 'stop'
|
1416
1416
|
elif trailing:
|
1417
1417
|
request['algoType'] = 'TRAILING_STOP'
|
1418
1418
|
response = None
|
1419
|
-
if
|
1419
|
+
if trigger or trailing:
|
1420
1420
|
response = self.v3PrivateGetAlgoOrders(self.extend(request, params))
|
1421
1421
|
else:
|
1422
1422
|
response = self.v1PrivateGetOrders(self.extend(request, params))
|
@@ -1466,7 +1466,7 @@ class woo(Exchange, ImplicitAPI):
|
|
1466
1466
|
:param int [since]: the earliest time in ms to fetch orders for
|
1467
1467
|
:param int [limit]: the maximum number of order structures to retrieve
|
1468
1468
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1469
|
-
:param boolean [params.
|
1469
|
+
:param boolean [params.trigger]: whether the order is a trigger/algo order
|
1470
1470
|
:param boolean [params.isTriggered]: whether the order has been triggered(False by default)
|
1471
1471
|
:param str [params.side]: 'buy' or 'sell'
|
1472
1472
|
:param boolean [params.trailing]: set to True if you want to fetch trailing orders
|
@@ -1488,7 +1488,7 @@ class woo(Exchange, ImplicitAPI):
|
|
1488
1488
|
:param int [since]: the earliest time in ms to fetch orders for
|
1489
1489
|
:param int [limit]: the maximum number of order structures to retrieve
|
1490
1490
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1491
|
-
:param boolean [params.
|
1491
|
+
:param boolean [params.trigger]: whether the order is a trigger/algo order
|
1492
1492
|
:param boolean [params.isTriggered]: whether the order has been triggered(False by default)
|
1493
1493
|
:param str [params.side]: 'buy' or 'sell'
|
1494
1494
|
:param boolean [params.trailing]: set to True if you want to fetch trailing orders
|
@@ -2056,7 +2056,7 @@ class woo(Exchange, ImplicitAPI):
|
|
2056
2056
|
:param int [since]: timestamp in ms of the earliest ledger entry, default is None
|
2057
2057
|
:param int [limit]: max number of ledger entries to return, default is None
|
2058
2058
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2059
|
-
:returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger
|
2059
|
+
:returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
|
2060
2060
|
"""
|
2061
2061
|
currency, rows = self.get_asset_history_rows(code, since, limit, params)
|
2062
2062
|
return self.parse_ledger(rows, currency, since, limit, params)
|
@@ -2473,8 +2473,8 @@ class woo(Exchange, ImplicitAPI):
|
|
2473
2473
|
if not isSandboxMode:
|
2474
2474
|
applicationId = 'bc830de7-50f3-460b-9ee0-f430f83f9dad'
|
2475
2475
|
brokerId = self.safe_string(self.options, 'brokerId', applicationId)
|
2476
|
-
|
2477
|
-
if
|
2476
|
+
isTrigger = path.find('algo') > -1
|
2477
|
+
if isTrigger:
|
2478
2478
|
params['brokerId'] = brokerId
|
2479
2479
|
else:
|
2480
2480
|
params['broker_id'] = brokerId
|
ccxt/woofipro.py
CHANGED
@@ -1264,15 +1264,15 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1264
1264
|
stopLoss = self.safe_value(params, 'stopLoss')
|
1265
1265
|
takeProfit = self.safe_value(params, 'takeProfit')
|
1266
1266
|
algoType = self.safe_string(params, 'algoType')
|
1267
|
-
|
1267
|
+
isConditional = stopPrice is not None or stopLoss is not None or takeProfit is not None or (self.safe_value(params, 'childOrders') is not None)
|
1268
1268
|
isMarket = orderType == 'MARKET'
|
1269
1269
|
timeInForce = self.safe_string_lower(params, 'timeInForce')
|
1270
1270
|
postOnly = self.is_post_only(isMarket, None, params)
|
1271
|
-
orderQtyKey = 'quantity' if
|
1272
|
-
priceKey = 'price' if
|
1273
|
-
typeKey = 'type' if
|
1271
|
+
orderQtyKey = 'quantity' if isConditional else 'order_quantity'
|
1272
|
+
priceKey = 'price' if isConditional else 'order_price'
|
1273
|
+
typeKey = 'type' if isConditional else 'order_type'
|
1274
1274
|
request[typeKey] = orderType # LIMIT/MARKET/IOC/FOK/POST_ONLY/ASK/BID
|
1275
|
-
if not
|
1275
|
+
if not isConditional:
|
1276
1276
|
if postOnly:
|
1277
1277
|
request['order_type'] = 'POST_ONLY'
|
1278
1278
|
elif timeInForce == 'fok':
|
@@ -1283,7 +1283,7 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1283
1283
|
request['reduce_only'] = reduceOnly
|
1284
1284
|
if price is not None:
|
1285
1285
|
request[priceKey] = self.price_to_precision(symbol, price)
|
1286
|
-
if isMarket and not
|
1286
|
+
if isMarket and not isConditional:
|
1287
1287
|
request[orderQtyKey] = self.amount_to_precision(symbol, amount)
|
1288
1288
|
elif algoType != 'POSITIONAL_TP_SL':
|
1289
1289
|
request[orderQtyKey] = self.amount_to_precision(symbol, amount)
|
@@ -1355,9 +1355,9 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1355
1355
|
stopPrice = self.safe_string_2(params, 'triggerPrice', 'stopPrice')
|
1356
1356
|
stopLoss = self.safe_value(params, 'stopLoss')
|
1357
1357
|
takeProfit = self.safe_value(params, 'takeProfit')
|
1358
|
-
|
1358
|
+
isConditional = stopPrice is not None or stopLoss is not None or takeProfit is not None or (self.safe_value(params, 'childOrders') is not None)
|
1359
1359
|
response = None
|
1360
|
-
if
|
1360
|
+
if isConditional:
|
1361
1361
|
response = self.v1PrivatePostAlgoOrder(request)
|
1362
1362
|
#
|
1363
1363
|
# {
|
@@ -1417,8 +1417,8 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1417
1417
|
stopPrice = self.safe_string_2(orderParams, 'triggerPrice', 'stopPrice')
|
1418
1418
|
stopLoss = self.safe_value(orderParams, 'stopLoss')
|
1419
1419
|
takeProfit = self.safe_value(orderParams, 'takeProfit')
|
1420
|
-
|
1421
|
-
if
|
1420
|
+
isConditional = stopPrice is not None or stopLoss is not None or takeProfit is not None or (self.safe_value(orderParams, 'childOrders') is not None)
|
1421
|
+
if isConditional:
|
1422
1422
|
raise NotSupported(self.id + 'createOrders() only support non-stop order')
|
1423
1423
|
orderRequest = self.create_order_request(marketId, type, side, amount, price, orderParams)
|
1424
1424
|
ordersRequests.append(orderRequest)
|
@@ -1474,16 +1474,16 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1474
1474
|
stopPrice = self.safe_string_n(params, ['triggerPrice', 'stopPrice', 'takeProfitPrice', 'stopLossPrice'])
|
1475
1475
|
if stopPrice is not None:
|
1476
1476
|
request['triggerPrice'] = self.price_to_precision(symbol, stopPrice)
|
1477
|
-
|
1478
|
-
orderQtyKey = 'quantity' if
|
1479
|
-
priceKey = 'price' if
|
1477
|
+
isConditional = (stopPrice is not None) or (self.safe_value(params, 'childOrders') is not None)
|
1478
|
+
orderQtyKey = 'quantity' if isConditional else 'order_quantity'
|
1479
|
+
priceKey = 'price' if isConditional else 'order_price'
|
1480
1480
|
if price is not None:
|
1481
1481
|
request[priceKey] = self.price_to_precision(symbol, price)
|
1482
1482
|
if amount is not None:
|
1483
1483
|
request[orderQtyKey] = self.amount_to_precision(symbol, amount)
|
1484
1484
|
params = self.omit(params, ['stopPrice', 'triggerPrice', 'takeProfitPrice', 'stopLossPrice', 'trailingTriggerPrice', 'trailingAmount', 'trailingPercent'])
|
1485
1485
|
response = None
|
1486
|
-
if
|
1486
|
+
if isConditional:
|
1487
1487
|
response = self.v1PrivatePutAlgoOrder(self.extend(request, params))
|
1488
1488
|
else:
|
1489
1489
|
request['symbol'] = market['id']
|
@@ -1536,9 +1536,9 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1536
1536
|
:param str [params.clientOrderId]: a unique id for the order
|
1537
1537
|
:returns dict: An `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1538
1538
|
"""
|
1539
|
-
|
1539
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger', False)
|
1540
1540
|
params = self.omit(params, ['stop', 'trigger'])
|
1541
|
-
if not
|
1541
|
+
if not trigger and (symbol is None):
|
1542
1542
|
raise ArgumentsRequired(self.id + ' cancelOrder() requires a symbol argument')
|
1543
1543
|
self.load_markets()
|
1544
1544
|
market: Market = None
|
@@ -1551,7 +1551,7 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1551
1551
|
clientOrderIdExchangeSpecific = self.safe_string(params, 'client_order_id', clientOrderIdUnified)
|
1552
1552
|
isByClientOrder = clientOrderIdExchangeSpecific is not None
|
1553
1553
|
response = None
|
1554
|
-
if
|
1554
|
+
if trigger:
|
1555
1555
|
if isByClientOrder:
|
1556
1556
|
request['client_order_id'] = clientOrderIdExchangeSpecific
|
1557
1557
|
params = self.omit(params, ['clOrdID', 'clientOrderId', 'client_order_id'])
|
@@ -1587,7 +1587,7 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1587
1587
|
extendParams['client_order_id'] = clientOrderIdExchangeSpecific
|
1588
1588
|
else:
|
1589
1589
|
extendParams['id'] = id
|
1590
|
-
if
|
1590
|
+
if trigger:
|
1591
1591
|
return self.extend(self.parse_order(response), extendParams)
|
1592
1592
|
data = self.safe_dict(response, 'data', {})
|
1593
1593
|
return self.extend(self.parse_order(data), extendParams)
|
@@ -1642,18 +1642,18 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1642
1642
|
:returns dict: an list of `order structures <https://docs.ccxt.com/#/?id=order-structure>`
|
1643
1643
|
"""
|
1644
1644
|
self.load_markets()
|
1645
|
-
|
1645
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger')
|
1646
1646
|
params = self.omit(params, ['stop', 'trigger'])
|
1647
1647
|
request: dict = {}
|
1648
1648
|
if symbol is not None:
|
1649
1649
|
market = self.market(symbol)
|
1650
1650
|
request['symbol'] = market['id']
|
1651
1651
|
response = None
|
1652
|
-
if
|
1652
|
+
if trigger:
|
1653
1653
|
response = self.v1PrivateDeleteAlgoOrders(self.extend(request, params))
|
1654
1654
|
else:
|
1655
1655
|
response = self.v1PrivateDeleteOrders(self.extend(request, params))
|
1656
|
-
#
|
1656
|
+
# trigger
|
1657
1657
|
# {
|
1658
1658
|
# "success": True,
|
1659
1659
|
# "timestamp": 1702989203989,
|
@@ -1692,12 +1692,12 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1692
1692
|
"""
|
1693
1693
|
self.load_markets()
|
1694
1694
|
market = self.market(symbol) if (symbol is not None) else None
|
1695
|
-
|
1695
|
+
trigger = self.safe_bool_2(params, 'stop', 'trigger', False)
|
1696
1696
|
request: dict = {}
|
1697
1697
|
clientOrderId = self.safe_string_n(params, ['clOrdID', 'clientOrderId', 'client_order_id'])
|
1698
1698
|
params = self.omit(params, ['stop', 'trigger', 'clOrdID', 'clientOrderId', 'client_order_id'])
|
1699
1699
|
response = None
|
1700
|
-
if
|
1700
|
+
if trigger:
|
1701
1701
|
if clientOrderId:
|
1702
1702
|
request['client_order_id'] = clientOrderId
|
1703
1703
|
response = self.v1PrivateGetAlgoClientOrderClientOrderId(self.extend(request, params))
|
@@ -2107,7 +2107,7 @@ class woofipro(Exchange, ImplicitAPI):
|
|
2107
2107
|
:param int [since]: timestamp in ms of the earliest ledger entry, default is None
|
2108
2108
|
:param int [limit]: max number of ledger entries to return, default is None
|
2109
2109
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
2110
|
-
:returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger
|
2110
|
+
:returns dict: a `ledger structure <https://docs.ccxt.com/#/?id=ledger>`
|
2111
2111
|
"""
|
2112
2112
|
currency, rows = self.get_asset_history_rows(code, since, limit, params)
|
2113
2113
|
return self.parse_ledger(rows, currency, since, limit, params)
|