ccxt 4.3.53__py2.py3-none-any.whl → 4.3.55__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/kucoin.py +3 -0
- ccxt/abstract/kucoinfutures.py +3 -0
- ccxt/ace.py +1 -1
- ccxt/alpaca.py +1 -1
- ccxt/ascendex.py +6 -4
- ccxt/async_support/__init__.py +1 -1
- ccxt/async_support/ace.py +1 -1
- ccxt/async_support/alpaca.py +1 -1
- ccxt/async_support/ascendex.py +6 -4
- ccxt/async_support/base/exchange.py +1 -1
- ccxt/async_support/bigone.py +1 -1
- ccxt/async_support/binance.py +6 -6
- ccxt/async_support/bingx.py +4 -4
- ccxt/async_support/bit2c.py +1 -1
- ccxt/async_support/bitbank.py +1 -1
- ccxt/async_support/bitbns.py +1 -1
- ccxt/async_support/bitfinex.py +1 -1
- ccxt/async_support/bitfinex2.py +1 -1
- ccxt/async_support/bitflyer.py +1 -1
- ccxt/async_support/bitget.py +2 -2
- ccxt/async_support/bithumb.py +1 -1
- ccxt/async_support/bitmart.py +3 -3
- ccxt/async_support/bitmex.py +1 -1
- ccxt/async_support/bitopro.py +1 -1
- ccxt/async_support/bitrue.py +1 -1
- ccxt/async_support/bitso.py +1 -1
- ccxt/async_support/bitstamp.py +1 -1
- ccxt/async_support/bitteam.py +1 -1
- ccxt/async_support/bitvavo.py +2 -2
- ccxt/async_support/bl3p.py +1 -1
- ccxt/async_support/blockchaincom.py +28 -28
- ccxt/async_support/blofin.py +1 -1
- ccxt/async_support/btcalpha.py +4 -11
- ccxt/async_support/btcbox.py +1 -1
- ccxt/async_support/btcmarkets.py +1 -1
- ccxt/async_support/btcturk.py +1 -1
- ccxt/async_support/bybit.py +2 -2
- ccxt/async_support/cex.py +2 -2
- ccxt/async_support/coinbase.py +33 -33
- ccxt/async_support/coinbaseexchange.py +1 -1
- ccxt/async_support/coinbaseinternational.py +1 -1
- ccxt/async_support/coincheck.py +1 -1
- ccxt/async_support/coinex.py +2 -2
- ccxt/async_support/coinlist.py +2 -2
- ccxt/async_support/coinmate.py +1 -1
- ccxt/async_support/coinmetro.py +1 -1
- ccxt/async_support/coinone.py +1 -1
- ccxt/async_support/coinsph.py +1 -1
- ccxt/async_support/coinspot.py +1 -1
- ccxt/async_support/cryptocom.py +1 -1
- ccxt/async_support/currencycom.py +1 -1
- ccxt/async_support/delta.py +2 -2
- ccxt/async_support/deribit.py +4 -4
- ccxt/async_support/digifinex.py +2 -2
- ccxt/async_support/exmo.py +2 -2
- ccxt/async_support/gate.py +2 -2
- ccxt/async_support/gemini.py +1 -1
- ccxt/async_support/hitbtc.py +1 -1
- ccxt/async_support/hollaex.py +1 -1
- ccxt/async_support/htx.py +3 -3
- ccxt/async_support/huobijp.py +1 -1
- ccxt/async_support/hyperliquid.py +2 -2
- ccxt/async_support/idex.py +1 -1
- ccxt/async_support/independentreserve.py +1 -1
- ccxt/async_support/indodax.py +1 -1
- ccxt/async_support/kraken.py +2 -2
- ccxt/async_support/kucoin.py +127 -46
- ccxt/async_support/kucoinfutures.py +1 -1
- ccxt/async_support/kuna.py +1 -1
- ccxt/async_support/latoken.py +1 -1
- ccxt/async_support/lbank.py +1 -1
- ccxt/async_support/luno.py +1 -1
- ccxt/async_support/lykke.py +1 -1
- ccxt/async_support/mercado.py +1 -1
- ccxt/async_support/mexc.py +1 -1
- ccxt/async_support/ndax.py +1 -1
- ccxt/async_support/novadax.py +1 -1
- ccxt/async_support/oceanex.py +1 -1
- ccxt/async_support/okcoin.py +1 -1
- ccxt/async_support/okx.py +3 -3
- ccxt/async_support/onetrading.py +1 -1
- ccxt/async_support/oxfun.py +2 -2
- ccxt/async_support/p2b.py +1 -1
- ccxt/async_support/paymium.py +1 -1
- ccxt/async_support/phemex.py +30 -3
- ccxt/async_support/poloniex.py +6 -4
- ccxt/async_support/poloniexfutures.py +1 -1
- ccxt/async_support/probit.py +1 -1
- ccxt/async_support/timex.py +1 -1
- ccxt/async_support/tokocrypto.py +1 -1
- ccxt/async_support/tradeogre.py +1 -1
- ccxt/async_support/upbit.py +1 -1
- ccxt/async_support/vertex.py +2 -2
- ccxt/async_support/wavesexchange.py +1 -1
- ccxt/async_support/wazirx.py +1 -1
- ccxt/async_support/whitebit.py +2 -2
- ccxt/async_support/woo.py +31 -23
- ccxt/async_support/woofipro.py +3 -3
- ccxt/async_support/yobit.py +1 -1
- ccxt/async_support/zaif.py +1 -1
- ccxt/async_support/zonda.py +1 -1
- ccxt/base/exchange.py +1 -1
- ccxt/base/types.py +4 -1
- ccxt/bigone.py +1 -1
- ccxt/binance.py +6 -6
- ccxt/bingx.py +4 -4
- ccxt/bit2c.py +1 -1
- ccxt/bitbank.py +1 -1
- ccxt/bitbns.py +1 -1
- ccxt/bitfinex.py +1 -1
- ccxt/bitfinex2.py +1 -1
- ccxt/bitflyer.py +1 -1
- ccxt/bitget.py +2 -2
- ccxt/bithumb.py +1 -1
- ccxt/bitmart.py +3 -3
- ccxt/bitmex.py +1 -1
- ccxt/bitopro.py +1 -1
- ccxt/bitrue.py +1 -1
- ccxt/bitso.py +1 -1
- ccxt/bitstamp.py +1 -1
- ccxt/bitteam.py +1 -1
- ccxt/bitvavo.py +2 -2
- ccxt/bl3p.py +1 -1
- ccxt/blockchaincom.py +28 -28
- ccxt/blofin.py +1 -1
- ccxt/btcalpha.py +4 -11
- ccxt/btcbox.py +1 -1
- ccxt/btcmarkets.py +1 -1
- ccxt/btcturk.py +1 -1
- ccxt/bybit.py +2 -2
- ccxt/cex.py +2 -2
- ccxt/coinbase.py +33 -33
- ccxt/coinbaseexchange.py +1 -1
- ccxt/coinbaseinternational.py +1 -1
- ccxt/coincheck.py +1 -1
- ccxt/coinex.py +2 -2
- ccxt/coinlist.py +2 -2
- ccxt/coinmate.py +1 -1
- ccxt/coinmetro.py +1 -1
- ccxt/coinone.py +1 -1
- ccxt/coinsph.py +1 -1
- ccxt/coinspot.py +1 -1
- ccxt/cryptocom.py +1 -1
- ccxt/currencycom.py +1 -1
- ccxt/delta.py +2 -2
- ccxt/deribit.py +4 -4
- ccxt/digifinex.py +2 -2
- ccxt/exmo.py +2 -2
- ccxt/gate.py +2 -2
- ccxt/gemini.py +1 -1
- ccxt/hitbtc.py +1 -1
- ccxt/hollaex.py +1 -1
- ccxt/htx.py +3 -3
- ccxt/huobijp.py +1 -1
- ccxt/hyperliquid.py +2 -2
- ccxt/idex.py +1 -1
- ccxt/independentreserve.py +1 -1
- ccxt/indodax.py +1 -1
- ccxt/kraken.py +2 -2
- ccxt/kucoin.py +127 -46
- ccxt/kucoinfutures.py +1 -1
- ccxt/kuna.py +1 -1
- ccxt/latoken.py +1 -1
- ccxt/lbank.py +1 -1
- ccxt/luno.py +1 -1
- ccxt/lykke.py +1 -1
- ccxt/mercado.py +1 -1
- ccxt/mexc.py +1 -1
- ccxt/ndax.py +1 -1
- ccxt/novadax.py +1 -1
- ccxt/oceanex.py +1 -1
- ccxt/okcoin.py +1 -1
- ccxt/okx.py +3 -3
- ccxt/onetrading.py +1 -1
- ccxt/oxfun.py +2 -2
- ccxt/p2b.py +1 -1
- ccxt/paymium.py +1 -1
- ccxt/phemex.py +30 -3
- ccxt/poloniex.py +6 -4
- ccxt/poloniexfutures.py +1 -1
- ccxt/pro/__init__.py +1 -1
- ccxt/pro/binance.py +3 -3
- ccxt/pro/bitvavo.py +2 -2
- ccxt/pro/bybit.py +20 -14
- ccxt/pro/cex.py +3 -3
- ccxt/pro/coinbase.py +22 -1
- ccxt/pro/cryptocom.py +1 -1
- ccxt/pro/gate.py +2 -2
- ccxt/pro/hitbtc.py +1 -1
- ccxt/pro/kraken.py +2 -2
- ccxt/pro/kucoin.py +65 -28
- ccxt/pro/okx.py +2 -2
- ccxt/pro/oxfun.py +2 -2
- ccxt/pro/poloniex.py +1 -1
- ccxt/pro/vertex.py +2 -2
- ccxt/probit.py +1 -1
- ccxt/test/{test_async.py → tests_async.py} +27 -280
- ccxt/test/tests_helpers.py +284 -0
- ccxt/test/tests_init.py +35 -0
- ccxt/test/{test_sync.py → tests_sync.py} +27 -282
- ccxt/timex.py +1 -1
- ccxt/tokocrypto.py +1 -1
- ccxt/tradeogre.py +1 -1
- ccxt/upbit.py +1 -1
- ccxt/vertex.py +2 -2
- ccxt/wavesexchange.py +1 -1
- ccxt/wazirx.py +1 -1
- ccxt/whitebit.py +2 -2
- ccxt/woo.py +31 -23
- ccxt/woofipro.py +3 -3
- ccxt/yobit.py +1 -1
- ccxt/zaif.py +1 -1
- ccxt/zonda.py +1 -1
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/METADATA +5 -5
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/RECORD +219 -252
- ccxt/test/base/__init__.py +0 -29
- ccxt/test/base/test_account.py +0 -26
- ccxt/test/base/test_balance.py +0 -56
- ccxt/test/base/test_borrow_interest.py +0 -35
- ccxt/test/base/test_borrow_rate.py +0 -32
- ccxt/test/base/test_calculate_fee.py +0 -51
- ccxt/test/base/test_crypto.py +0 -127
- ccxt/test/base/test_currency.py +0 -76
- ccxt/test/base/test_datetime.py +0 -109
- ccxt/test/base/test_decimal_to_precision.py +0 -392
- ccxt/test/base/test_deep_extend.py +0 -68
- ccxt/test/base/test_deposit_withdrawal.py +0 -50
- ccxt/test/base/test_exchange_datetime_functions.py +0 -76
- ccxt/test/base/test_funding_rate_history.py +0 -29
- ccxt/test/base/test_last_price.py +0 -31
- ccxt/test/base/test_ledger_entry.py +0 -45
- ccxt/test/base/test_ledger_item.py +0 -48
- ccxt/test/base/test_leverage_tier.py +0 -33
- ccxt/test/base/test_liquidation.py +0 -50
- ccxt/test/base/test_margin_mode.py +0 -24
- ccxt/test/base/test_margin_modification.py +0 -35
- ccxt/test/base/test_market.py +0 -193
- ccxt/test/base/test_number.py +0 -411
- ccxt/test/base/test_ohlcv.py +0 -33
- ccxt/test/base/test_open_interest.py +0 -32
- ccxt/test/base/test_order.py +0 -64
- ccxt/test/base/test_order_book.py +0 -69
- ccxt/test/base/test_position.py +0 -60
- ccxt/test/base/test_shared_methods.py +0 -353
- ccxt/test/base/test_status.py +0 -24
- ccxt/test/base/test_throttle.py +0 -126
- ccxt/test/base/test_ticker.py +0 -92
- ccxt/test/base/test_trade.py +0 -47
- ccxt/test/base/test_trading_fee.py +0 -26
- ccxt/test/base/test_transaction.py +0 -39
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/LICENSE.txt +0 -0
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/WHEEL +0 -0
- {ccxt-4.3.53.dist-info → ccxt-4.3.55.dist-info}/top_level.txt +0 -0
@@ -1,45 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
16
|
-
|
17
|
-
def test_ledger_entry(exchange, skipped_properties, method, entry, requested_code, now):
|
18
|
-
format = {
|
19
|
-
'info': {},
|
20
|
-
'id': 'x1234',
|
21
|
-
'currency': 'BTC',
|
22
|
-
'account': 'spot',
|
23
|
-
'referenceId': 'foo',
|
24
|
-
'referenceAccount': 'bar',
|
25
|
-
'status': 'ok',
|
26
|
-
'amount': exchange.parse_number('22'),
|
27
|
-
'before': exchange.parse_number('111'),
|
28
|
-
'after': exchange.parse_number('133'),
|
29
|
-
'fee': {},
|
30
|
-
'direction': 'in',
|
31
|
-
'timestamp': 1638230400000,
|
32
|
-
'datetime': '2021-11-30T00:00:00.000Z',
|
33
|
-
'type': 'deposit',
|
34
|
-
}
|
35
|
-
empty_allowed_for = ['referenceId', 'referenceAccount', 'id']
|
36
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
|
37
|
-
test_shared_methods.assert_timestamp_and_datetime(exchange, skipped_properties, method, entry, now)
|
38
|
-
test_shared_methods.assert_currency_code(exchange, skipped_properties, method, entry, entry['currency'], requested_code)
|
39
|
-
#
|
40
|
-
test_shared_methods.assert_in_array(exchange, skipped_properties, method, entry, 'direction', ['in', 'out'])
|
41
|
-
test_shared_methods.assert_in_array(exchange, skipped_properties, method, entry, 'type', ['trade', 'transaction', 'margin', 'cashback', 'referral', 'transfer', 'fee'])
|
42
|
-
# testSharedMethods.assertInArray (exchange, skippedProperties, method, entry, 'account', ['spot', 'swap', .. ]); # todo
|
43
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'amount', '0')
|
44
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'before', '0')
|
45
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'after', '0')
|
@@ -1,48 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
|
16
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
17
|
-
|
18
|
-
|
19
|
-
def test_ledger_item(exchange, method, entry, requested_code, now):
|
20
|
-
format = {
|
21
|
-
'info': {},
|
22
|
-
'id': 'x1234',
|
23
|
-
'currency': 'BTC',
|
24
|
-
'account': 'spot',
|
25
|
-
'referenceId': '',
|
26
|
-
'referenceAccount': '',
|
27
|
-
'status': 'ok',
|
28
|
-
'amount': exchange.parse_number('22'),
|
29
|
-
'before': exchange.parse_number('111'),
|
30
|
-
'after': exchange.parse_number('133'),
|
31
|
-
'fee': {},
|
32
|
-
'direction': 'in',
|
33
|
-
'timestamp': 1638230400000,
|
34
|
-
'datetime': '2021-11-30T00:00:00.000Z',
|
35
|
-
'type': 'deposit',
|
36
|
-
}
|
37
|
-
empty_not_allowed_for = ['id', 'currency', 'account', 'status', 'direction']
|
38
|
-
test_shared_methods.assert_structure(exchange, method, entry, format, empty_not_allowed_for)
|
39
|
-
test_shared_methods.assert_timestamp(exchange, method, entry, now)
|
40
|
-
test_shared_methods.assert_currency_code(exchange, method, entry, entry['currency'], requested_code)
|
41
|
-
#
|
42
|
-
test_shared_methods.assert_in_array(exchange, method, entry, 'direction', ['in', 'out'])
|
43
|
-
# testSharedMethods.assertInArray (exchange, method, entry, 'type', ['trade', 'transaction', 'margin', 'cashback', 'referral', 'transfer', 'fee', ]);
|
44
|
-
# testSharedMethods.assertInArray (exchange, method, entry, 'account', ['spot', 'swap', .. ]);
|
45
|
-
test_shared_methods.assert_greater_or_equal(exchange, method, entry, 'amount', '0')
|
46
|
-
test_shared_methods.assert_greater_or_equal(exchange, method, entry, 'before', '0')
|
47
|
-
test_shared_methods.assert_greater_or_equal(exchange, method, entry, 'after', '0')
|
48
|
-
test_shared_methods.assert_fee(exchange, method, entry['fee'])
|
@@ -1,33 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
16
|
-
|
17
|
-
def test_leverage_tier(exchange, skipped_properties, method, entry):
|
18
|
-
format = {
|
19
|
-
'tier': exchange.parse_number('1'),
|
20
|
-
'minNotional': exchange.parse_number('0'),
|
21
|
-
'maxNotional': exchange.parse_number('5000'),
|
22
|
-
'maintenanceMarginRate': exchange.parse_number('0.01'),
|
23
|
-
'maxLeverage': exchange.parse_number('25'),
|
24
|
-
'info': {},
|
25
|
-
}
|
26
|
-
empty_allowed_for = ['maintenanceMarginRate']
|
27
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
|
28
|
-
#
|
29
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'tier', '0')
|
30
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'minNotional', '0')
|
31
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'maxNotional', '0')
|
32
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'maxLeverage', '1')
|
33
|
-
test_shared_methods.assert_less_or_equal(exchange, skipped_properties, method, entry, 'maintenanceMarginRate', '1')
|
@@ -1,50 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.base.precise import Precise # noqa E402
|
16
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
17
|
-
|
18
|
-
def test_liquidation(exchange, skipped_properties, method, entry, symbol):
|
19
|
-
format = {
|
20
|
-
'info': {},
|
21
|
-
'symbol': 'ETH/BTC',
|
22
|
-
'contracts': exchange.parse_number('1.234'),
|
23
|
-
'contractSize': exchange.parse_number('1.234'),
|
24
|
-
'price': exchange.parse_number('1.234'),
|
25
|
-
'baseValue': exchange.parse_number('1.234'),
|
26
|
-
'quoteValue': exchange.parse_number('1.234'),
|
27
|
-
'timestamp': 1502962946216,
|
28
|
-
'datetime': '2017-09-01T00:00:00',
|
29
|
-
}
|
30
|
-
# todo: atm, many exchanges fail, so temporarily decrease stict mode
|
31
|
-
empty_allowed_for = ['timestamp', 'datetime', 'quoteValue', 'baseValue', 'previousClose', 'price', 'contractSize', 'contracts']
|
32
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
|
33
|
-
test_shared_methods.assert_timestamp_and_datetime(exchange, skipped_properties, method, entry)
|
34
|
-
log_text = test_shared_methods.log_template(exchange, method, entry)
|
35
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'contracts', '0')
|
36
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'contractSize', '0')
|
37
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'price', '0')
|
38
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'baseValue', '0')
|
39
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, entry, 'quoteValue', '0')
|
40
|
-
contracts = exchange.safe_string(entry, 'contracts')
|
41
|
-
contract_size = exchange.safe_string(entry, 'contractSize')
|
42
|
-
price = exchange.safe_string(entry, 'price')
|
43
|
-
base_value = exchange.safe_string(entry, 'baseValue')
|
44
|
-
if contracts and contract_size:
|
45
|
-
assert Precise.string_eq(base_value, Precise.string_mul(contracts, contract_size)), 'baseValue == contracts * contractSize' + log_text
|
46
|
-
if price:
|
47
|
-
assert Precise.string_eq(base_value, Precise.string_mul(Precise.string_mul(contracts, contract_size), price)), 'quoteValue == contracts * contractSize * price' + log_text
|
48
|
-
# if singular was called, then symbol needs to be asserted
|
49
|
-
if method == 'watchLiquidations' or method == 'fetchLiquidations':
|
50
|
-
test_shared_methods.assert_symbol(exchange, skipped_properties, method, entry, 'symbol', symbol)
|
@@ -1,24 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
16
|
-
|
17
|
-
def test_margin_mode(exchange, skipped_properties, method, entry):
|
18
|
-
format = {
|
19
|
-
'info': {},
|
20
|
-
'symbol': 'BTC/USDT:USDT',
|
21
|
-
'marginMode': 'cross',
|
22
|
-
}
|
23
|
-
empty_allowed_for = ['symbol']
|
24
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
|
@@ -1,35 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
16
|
-
|
17
|
-
def test_margin_modification(exchange, skipped_properties, method, entry):
|
18
|
-
format = {
|
19
|
-
'info': {},
|
20
|
-
'type': 'add',
|
21
|
-
'amount': exchange.parse_number('0.1'),
|
22
|
-
'total': exchange.parse_number('0.29934828'),
|
23
|
-
'code': 'USDT',
|
24
|
-
'symbol': 'ADA/USDT:USDT',
|
25
|
-
'status': 'ok',
|
26
|
-
}
|
27
|
-
empty_allowed_for = ['status', 'symbol', 'code', 'total', 'amount']
|
28
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, entry, format, empty_allowed_for)
|
29
|
-
test_shared_methods.assert_currency_code(exchange, skipped_properties, method, entry, entry['code'])
|
30
|
-
#
|
31
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'amount', '0')
|
32
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, entry, 'total', '0')
|
33
|
-
test_shared_methods.assert_in_array(exchange, skipped_properties, method, entry, 'type', ['add', 'reduce', 'set'])
|
34
|
-
test_shared_methods.assert_in_array(exchange, skipped_properties, method, entry, 'status', ['ok', 'pending', 'canceled', 'failed'])
|
35
|
-
test_shared_methods.assert_symbol(exchange, skipped_properties, method, entry, 'symbol')
|
ccxt/test/base/test_market.py
DELETED
@@ -1,193 +0,0 @@
|
|
1
|
-
import os
|
2
|
-
import sys
|
3
|
-
|
4
|
-
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
|
5
|
-
sys.path.append(root)
|
6
|
-
|
7
|
-
# ----------------------------------------------------------------------------
|
8
|
-
|
9
|
-
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
|
10
|
-
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
|
11
|
-
|
12
|
-
# ----------------------------------------------------------------------------
|
13
|
-
# -*- coding: utf-8 -*-
|
14
|
-
|
15
|
-
from ccxt.base.precise import Precise # noqa E402
|
16
|
-
from ccxt.test.base import test_shared_methods # noqa E402
|
17
|
-
|
18
|
-
def test_market(exchange, skipped_properties, method, market):
|
19
|
-
format = {
|
20
|
-
'id': 'btcusd',
|
21
|
-
'symbol': 'BTC/USD',
|
22
|
-
'base': 'BTC',
|
23
|
-
'quote': 'USD',
|
24
|
-
'taker': exchange.parse_number('0.0011'),
|
25
|
-
'maker': exchange.parse_number('0.0009'),
|
26
|
-
'baseId': 'btc',
|
27
|
-
'quoteId': 'usd',
|
28
|
-
'active': False,
|
29
|
-
'type': 'spot',
|
30
|
-
'linear': False,
|
31
|
-
'inverse': False,
|
32
|
-
'spot': False,
|
33
|
-
'swap': False,
|
34
|
-
'future': False,
|
35
|
-
'option': False,
|
36
|
-
'margin': False,
|
37
|
-
'contract': False,
|
38
|
-
'contractSize': exchange.parse_number('0.001'),
|
39
|
-
'expiry': 1656057600000,
|
40
|
-
'expiryDatetime': '2022-06-24T08:00:00.000Z',
|
41
|
-
'optionType': 'put',
|
42
|
-
'strike': exchange.parse_number('56000'),
|
43
|
-
'settle': 'XYZ',
|
44
|
-
'settleId': 'Xyz',
|
45
|
-
'precision': {
|
46
|
-
'price': exchange.parse_number('0.001'),
|
47
|
-
'amount': exchange.parse_number('0.001'),
|
48
|
-
'cost': exchange.parse_number('0.001'),
|
49
|
-
},
|
50
|
-
'limits': {
|
51
|
-
'amount': {
|
52
|
-
'min': exchange.parse_number('0.01'),
|
53
|
-
'max': exchange.parse_number('1000'),
|
54
|
-
},
|
55
|
-
'price': {
|
56
|
-
'min': exchange.parse_number('0.01'),
|
57
|
-
'max': exchange.parse_number('1000'),
|
58
|
-
},
|
59
|
-
'cost': {
|
60
|
-
'min': exchange.parse_number('0.01'),
|
61
|
-
'max': exchange.parse_number('1000'),
|
62
|
-
},
|
63
|
-
},
|
64
|
-
'info': {},
|
65
|
-
}
|
66
|
-
empty_allowed_for = ['linear', 'inverse', 'settle', 'settleId', 'expiry', 'expiryDatetime', 'optionType', 'strike', 'margin', 'contractSize']
|
67
|
-
test_shared_methods.assert_structure(exchange, skipped_properties, method, market, format, empty_allowed_for)
|
68
|
-
test_shared_methods.assert_symbol(exchange, skipped_properties, method, market, 'symbol')
|
69
|
-
log_text = test_shared_methods.log_template(exchange, method, market)
|
70
|
-
#
|
71
|
-
valid_types = ['spot', 'margin', 'swap', 'future', 'option', 'index']
|
72
|
-
test_shared_methods.assert_in_array(exchange, skipped_properties, method, market, 'type', valid_types)
|
73
|
-
has_index = ('index' in market) # todo: add in all
|
74
|
-
# check if string is consistent with 'type'
|
75
|
-
if market['spot']:
|
76
|
-
assert market['type'] == 'spot', '\"type\" string should be \"spot\" when spot is true' + log_text
|
77
|
-
elif market['swap']:
|
78
|
-
assert market['type'] == 'swap', '\"type\" string should be \"swap\" when swap is true' + log_text
|
79
|
-
elif market['future']:
|
80
|
-
assert market['type'] == 'future', '\"type\" string should be \"future\" when future is true' + log_text
|
81
|
-
elif market['option']:
|
82
|
-
assert market['type'] == 'option', '\"type\" string should be \"option\" when option is true' + log_text
|
83
|
-
elif has_index and market['index']:
|
84
|
-
# todo: add index in all implementations
|
85
|
-
assert market['type'] == 'index', '\"type\" string should be \"index\" when index is true' + log_text
|
86
|
-
# margin check (todo: add margin as mandatory, instead of undefined)
|
87
|
-
if market['spot']:
|
88
|
-
# for spot market, 'margin' can be either true/false or undefined
|
89
|
-
test_shared_methods.assert_in_array(exchange, skipped_properties, method, market, 'margin', [True, False, None])
|
90
|
-
else:
|
91
|
-
# otherwise, it must be false or undefined
|
92
|
-
test_shared_methods.assert_in_array(exchange, skipped_properties, method, market, 'margin', [False, None])
|
93
|
-
if not ('contractSize' in skipped_properties):
|
94
|
-
if not market['spot']:
|
95
|
-
# if not spot, then contractSize should be defined
|
96
|
-
assert market['contractSize'] is not None, '\"contractSize\" must be defined when \"spot\" is false' + log_text
|
97
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, market, 'contractSize', '0')
|
98
|
-
# typical values
|
99
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, market, 'expiry', '0')
|
100
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, market, 'strike', '0')
|
101
|
-
test_shared_methods.assert_in_array(exchange, skipped_properties, method, market, 'optionType', ['put', 'call'])
|
102
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, market, 'taker', '-100')
|
103
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, market, 'maker', '-100')
|
104
|
-
# 'contract' boolean check
|
105
|
-
if market['future'] or market['swap'] or market['option'] or (has_index and market['index']):
|
106
|
-
# if it's some kind of contract market, then `conctract` should be true
|
107
|
-
assert market['contract'], '\"contract\" must be true when \"future\", \"swap\", \"option\" or \"index\" is true' + log_text
|
108
|
-
else:
|
109
|
-
assert not market['contract'], '\"contract\" must be false when neither \"future\", \"swap\",\"option\" or \"index\" is true' + log_text
|
110
|
-
is_swap_or_future = market['swap'] or market['future']
|
111
|
-
contract_size = exchange.safe_string(market, 'contractSize')
|
112
|
-
# contract fields
|
113
|
-
if market['contract']:
|
114
|
-
# linear & inverse should have different values (true/false)
|
115
|
-
# todo: expand logic on other market types
|
116
|
-
if is_swap_or_future:
|
117
|
-
assert market['linear'] != market['inverse'], 'market linear and inverse must not be the same' + log_text
|
118
|
-
if not ('contractSize' in skipped_properties):
|
119
|
-
# contract size should be defined
|
120
|
-
assert contract_size is not None, '\"contractSize\" must be defined when \"contract\" is true' + log_text
|
121
|
-
# contract size should be above zero
|
122
|
-
assert Precise.string_gt(contract_size, '0'), '\"contractSize\" must be > 0 when \"contract\" is true' + log_text
|
123
|
-
if not ('settle' in skipped_properties):
|
124
|
-
# settle should be defined
|
125
|
-
assert (market['settle'] is not None) and (market['settleId'] is not None), '\"settle\" & \"settleId\" must be defined when \"contract\" is true' + log_text
|
126
|
-
# spot should be false
|
127
|
-
assert not market['spot'], '\"spot\" must be false when \"contract\" is true' + log_text
|
128
|
-
else:
|
129
|
-
# linear & inverse needs to be undefined
|
130
|
-
assert (market['linear'] is None) and (market['inverse'] is None), 'market linear and inverse must be undefined when \"contract\" is false' + log_text
|
131
|
-
# contract size should be undefined
|
132
|
-
if not ('contractSize' in skipped_properties):
|
133
|
-
assert contract_size is None, '\"contractSize\" must be undefined when \"contract\" is false' + log_text
|
134
|
-
# settle should be undefined
|
135
|
-
assert (market['settle'] is None) and (market['settleId'] is None), '\"settle\" must be undefined when \"contract\" is false' + log_text
|
136
|
-
# spot should be true
|
137
|
-
assert market['spot'], '\"spot\" must be true when \"contract\" is false' + log_text
|
138
|
-
# option fields
|
139
|
-
if market['option']:
|
140
|
-
# if option, then strike and optionType should be defined
|
141
|
-
assert market['strike'] is not None, '\"strike\" must be defined when \"option\" is true' + log_text
|
142
|
-
assert market['optionType'] is not None, '\"optionType\" must be defined when \"option\" is true' + log_text
|
143
|
-
else:
|
144
|
-
# if not option, then strike and optionType should be undefined
|
145
|
-
assert market['strike'] is None, '\"strike\" must be undefined when \"option\" is false' + log_text
|
146
|
-
assert market['optionType'] is None, '\"optionType\" must be undefined when \"option\" is false' + log_text
|
147
|
-
# future, swap and option should be mutually exclusive
|
148
|
-
if market['future']:
|
149
|
-
assert not market['swap'] and not market['option'], 'market swap and option must be false when \"future\" is true' + log_text
|
150
|
-
elif market['swap']:
|
151
|
-
assert not market['future'] and not market['option'], 'market future and option must be false when \"swap\" is true' + log_text
|
152
|
-
elif market['option']:
|
153
|
-
assert not market['future'] and not market['swap'], 'market future and swap must be false when \"option\" is true' + log_text
|
154
|
-
# expiry field
|
155
|
-
if market['future'] or market['option']:
|
156
|
-
# future or option markets need 'expiry' and 'expiryDatetime'
|
157
|
-
assert market['expiry'] is not None, '\"expiry\" must be defined when \"future\" is true' + log_text
|
158
|
-
assert market['expiryDatetime'] is not None, '\"expiryDatetime\" must be defined when \"future\" is true' + log_text
|
159
|
-
# expiry datetime should be correct
|
160
|
-
iso_string = exchange.iso8601(market['expiry'])
|
161
|
-
assert market['expiryDatetime'] == iso_string, 'expiryDatetime (\"' + market['expiryDatetime'] + '\") must be equal to expiry in iso8601 format \"' + iso_string + '\"' + log_text
|
162
|
-
else:
|
163
|
-
# otherwise, they need to be undefined
|
164
|
-
assert (market['expiry'] is None) and (market['expiryDatetime'] is None), '\"expiry\" and \"expiryDatetime\" must be undefined when it is not future|option market' + log_text
|
165
|
-
# check precisions
|
166
|
-
if not ('precision' in skipped_properties):
|
167
|
-
precision_keys = list(market['precision'].keys())
|
168
|
-
keys_length = len(precision_keys)
|
169
|
-
assert keys_length >= 2, 'precision should have \"amount\" and \"price\" keys at least' + log_text
|
170
|
-
for i in range(0, len(precision_keys)):
|
171
|
-
test_shared_methods.check_precision_accuracy(exchange, skipped_properties, method, market['precision'], precision_keys[i])
|
172
|
-
# check limits
|
173
|
-
if not ('limits' in skipped_properties):
|
174
|
-
limits_keys = list(market['limits'].keys())
|
175
|
-
keys_length = len(limits_keys)
|
176
|
-
assert keys_length >= 3, 'limits should have \"amount\", \"price\" and \"cost\" keys at least' + log_text
|
177
|
-
for i in range(0, len(limits_keys)):
|
178
|
-
key = limits_keys[i]
|
179
|
-
limit_entry = market['limits'][key]
|
180
|
-
# min >= 0
|
181
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, limit_entry, 'min', '0')
|
182
|
-
# max >= 0
|
183
|
-
test_shared_methods.assert_greater(exchange, skipped_properties, method, limit_entry, 'max', '0')
|
184
|
-
# max >= min
|
185
|
-
min_string = exchange.safe_string(limit_entry, 'min')
|
186
|
-
if min_string is not None:
|
187
|
-
test_shared_methods.assert_greater_or_equal(exchange, skipped_properties, method, limit_entry, 'max', min_string)
|
188
|
-
# check whether valid currency ID and CODE is used
|
189
|
-
if not ('currency' in skipped_properties) and not ('currencyIdAndCode' in skipped_properties):
|
190
|
-
test_shared_methods.assert_valid_currency_id_and_code(exchange, skipped_properties, method, market, market['baseId'], market['base'])
|
191
|
-
test_shared_methods.assert_valid_currency_id_and_code(exchange, skipped_properties, method, market, market['quoteId'], market['quote'])
|
192
|
-
test_shared_methods.assert_valid_currency_id_and_code(exchange, skipped_properties, method, market, market['settleId'], market['settle'])
|
193
|
-
test_shared_methods.assert_timestamp(exchange, skipped_properties, method, market, None, 'created')
|