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,268 +1,7 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
|
3
|
-
import
|
4
|
-
import json
|
5
|
-
# import logging
|
6
|
-
import os
|
7
|
-
import sys
|
8
|
-
from traceback import format_tb, format_exception
|
9
|
-
|
10
|
-
import importlib # noqa: E402
|
11
|
-
import re
|
12
|
-
|
13
|
-
# ------------------------------------------------------------------------------
|
14
|
-
# logging.basicConfig(level=logging.INFO)
|
15
|
-
# ------------------------------------------------------------------------------
|
16
|
-
DIR_NAME = os.path.dirname(os.path.abspath(__file__))
|
17
|
-
root = os.path.dirname(os.path.dirname(DIR_NAME))
|
18
|
-
sys.path.append(root)
|
19
|
-
|
20
|
-
import ccxt # noqa: E402
|
21
|
-
import ccxt.pro as ccxtpro # noqa: E402
|
22
|
-
|
23
|
-
# ------------------------------------------------------------------------------
|
24
|
-
# from typing import Optional
|
25
|
-
# from typing import List
|
26
|
-
from ccxt.base.errors import NotSupported
|
27
|
-
from ccxt.base.errors import ProxyError
|
28
|
-
from ccxt.base.errors import OperationFailed
|
29
|
-
# from ccxt.base.errors import ExchangeError
|
30
|
-
from ccxt.base.errors import ExchangeNotAvailable
|
31
|
-
from ccxt.base.errors import OnMaintenance
|
32
|
-
from ccxt.base.errors import AuthenticationError
|
33
|
-
|
34
|
-
# ------------------------------------------------------------------------------
|
35
|
-
|
36
|
-
class Argv(object):
|
37
|
-
id_tests = False
|
38
|
-
static_tests = False
|
39
|
-
ws_tests = False
|
40
|
-
request_tests = False
|
41
|
-
response_tests = False
|
42
|
-
|
43
|
-
sandbox = False
|
44
|
-
privateOnly = False
|
45
|
-
private = False
|
46
|
-
ws = False
|
47
|
-
verbose = False
|
48
|
-
nonce = None
|
49
|
-
exchange = None
|
50
|
-
symbol = None
|
51
|
-
info = False
|
52
|
-
pass
|
53
|
-
|
54
|
-
|
55
|
-
argv = Argv()
|
56
|
-
parser = argparse.ArgumentParser()
|
57
|
-
|
58
|
-
parser.add_argument('--sandbox', action='store_true', help='enable sandbox mode')
|
59
|
-
parser.add_argument('--privateOnly', action='store_true', help='run private tests only')
|
60
|
-
parser.add_argument('--private', action='store_true', help='run private tests')
|
61
|
-
parser.add_argument('--verbose', action='store_true', help='enable verbose output')
|
62
|
-
parser.add_argument('--ws', action='store_true', help='websockets version')
|
63
|
-
parser.add_argument('--info', action='store_true', help='enable info output')
|
64
|
-
parser.add_argument('--static', action='store_true', help='run static tests')
|
65
|
-
parser.add_argument('--useProxy', action='store_true', help='run static tests')
|
66
|
-
parser.add_argument('--idTests', action='store_true', help='run brokerId tests')
|
67
|
-
parser.add_argument('--responseTests', action='store_true', help='run response tests')
|
68
|
-
parser.add_argument('--requestTests', action='store_true', help='run response tests')
|
69
|
-
parser.add_argument('--nonce', type=int, help='integer')
|
70
|
-
parser.add_argument('exchange', type=str, help='exchange id in lowercase', nargs='?')
|
71
|
-
parser.add_argument('symbol', type=str, help='symbol in uppercase', nargs='?')
|
72
|
-
parser.parse_args(namespace=argv)
|
73
|
-
|
74
|
-
# ------------------------------------------------------------------------------
|
75
|
-
|
76
|
-
path = os.path.dirname(ccxt.__file__)
|
77
|
-
if 'site-packages' in os.path.dirname(ccxt.__file__):
|
78
|
-
raise Exception("You are running test_async.py/test.py against a globally-installed version of the library! It was previously installed into your site-packages folder by pip or pip3. To ensure testing against the local folder uninstall it first with pip uninstall ccxt or pip3 uninstall ccxt")
|
79
|
-
|
80
|
-
# ------------------------------------------------------------------------------
|
81
|
-
|
82
|
-
Error = Exception
|
83
|
-
|
84
|
-
# # print an error string
|
85
|
-
# def dump_error(*args):
|
86
|
-
# string = ' '.join([str(arg) for arg in args])
|
87
|
-
# print(string)
|
88
|
-
# sys.stderr.write(string + "\n")
|
89
|
-
# sys.stderr.flush()
|
90
|
-
|
91
|
-
|
92
|
-
def handle_all_unhandled_exceptions(type, value, traceback):
|
93
|
-
dump((type), (value), '\n<UNHANDLED EXCEPTION>\n' + ('\n'.join(format_tb(traceback))))
|
94
|
-
exit(1) # unrecoverable crash
|
95
|
-
|
96
|
-
|
97
|
-
sys.excepthook = handle_all_unhandled_exceptions
|
98
|
-
# ------------------------------------------------------------------------------
|
99
|
-
|
100
|
-
# non-transpiled part, but shared names among langs
|
101
|
-
|
102
|
-
is_synchronous = 'async' not in os.path.basename(__file__)
|
103
|
-
|
104
|
-
rootDir = DIR_NAME + '/../../../'
|
105
|
-
rootDirForSkips = DIR_NAME + '/../../../'
|
106
|
-
envVars = os.environ
|
107
|
-
LOG_CHARS_LENGTH = 10000
|
108
|
-
ext = 'py'
|
109
|
-
proxyTestFileName = 'proxies'
|
110
|
-
|
111
|
-
|
112
|
-
def get_cli_arg_value(arg):
|
113
|
-
arg_exists = getattr(argv, arg) if hasattr(argv, arg) else False
|
114
|
-
with_hyphen = '--' + arg
|
115
|
-
arg_exists_with_hyphen = getattr(argv, with_hyphen) if hasattr(argv, with_hyphen) else False
|
116
|
-
without_hyphen = arg.replace('--', '')
|
117
|
-
arg_exists_wo_hyphen = getattr(argv, without_hyphen) if hasattr(argv, without_hyphen) else False
|
118
|
-
return arg_exists or arg_exists_with_hyphen or arg_exists_wo_hyphen
|
3
|
+
from tests_helpers import get_cli_arg_value, dump, exit_script, get_test_files, init_exchange, set_exchange_prop, call_method, exception_message, io_file_exists, io_file_read, baseMainTestClass, AuthenticationError, NotSupported, OperationFailed, OnMaintenance, ExchangeNotAvailable, ProxyError, get_exchange_prop, close, json_parse, json_stringify, is_null_value, io_dir_read, convert_ascii, call_exchange_method_dynamically, set_fetch_response, call_exchange_method_dynamically_sync # noqa: F401
|
119
4
|
|
120
|
-
isWsTests = get_cli_arg_value('--ws')
|
121
|
-
|
122
|
-
|
123
|
-
class baseMainTestClass():
|
124
|
-
lang = 'PY'
|
125
|
-
is_synchronous = is_synchronous
|
126
|
-
request_tests_failed = False
|
127
|
-
response_tests_failed = False
|
128
|
-
response_tests = False
|
129
|
-
ws_tests = False
|
130
|
-
load_keys = False
|
131
|
-
skipped_settings_for_exchange = {}
|
132
|
-
skipped_methods = {}
|
133
|
-
check_public_tests = {}
|
134
|
-
test_files = {}
|
135
|
-
public_tests = {}
|
136
|
-
new_line = '\n'
|
137
|
-
root_dir = rootDir
|
138
|
-
env_vars = envVars
|
139
|
-
ext = ext
|
140
|
-
root_dir_for_skips = rootDirForSkips
|
141
|
-
only_specific_tests = []
|
142
|
-
proxy_test_file_name = proxyTestFileName
|
143
|
-
pass
|
144
|
-
|
145
|
-
|
146
|
-
def dump(*args):
|
147
|
-
print(' '.join([str(arg) for arg in args]))
|
148
|
-
|
149
|
-
|
150
|
-
def convert_ascii(str):
|
151
|
-
return str # stub
|
152
|
-
|
153
|
-
def json_parse(elem):
|
154
|
-
return json.loads(elem)
|
155
|
-
|
156
|
-
|
157
|
-
def json_stringify(elem):
|
158
|
-
return json.dumps(elem)
|
159
|
-
|
160
|
-
|
161
|
-
def convert_to_snake_case(content):
|
162
|
-
res = re.sub(r'(?<!^)(?=[A-Z])', '_', content).lower()
|
163
|
-
return res.replace('o_h_l_c_v', 'ohlcv')
|
164
|
-
|
165
|
-
|
166
|
-
def get_test_name(methodName):
|
167
|
-
# stub
|
168
|
-
return methodName
|
169
|
-
|
170
|
-
|
171
|
-
def io_file_exists(path):
|
172
|
-
return os.path.isfile(path)
|
173
|
-
|
174
|
-
|
175
|
-
def io_file_read(path, decode=True):
|
176
|
-
fs = open(path, "r", encoding="utf-8")
|
177
|
-
content = fs.read()
|
178
|
-
if decode:
|
179
|
-
return json.loads(content)
|
180
|
-
else:
|
181
|
-
return content
|
182
|
-
|
183
|
-
|
184
|
-
def io_dir_read(path):
|
185
|
-
return os.listdir(path)
|
186
|
-
|
187
|
-
|
188
|
-
def call_method(test_files, methodName, exchange, skippedProperties, args):
|
189
|
-
methodNameToCall = 'test_' + convert_to_snake_case(methodName)
|
190
|
-
return getattr(test_files[methodName], methodNameToCall)(exchange, skippedProperties, *args)
|
191
|
-
|
192
|
-
|
193
|
-
def call_exchange_method_dynamically(exchange, methodName, args):
|
194
|
-
return getattr(exchange, methodName)(*args)
|
195
|
-
|
196
|
-
def call_overriden_method(exchange, methodName, args):
|
197
|
-
# needed for php
|
198
|
-
return call_exchange_method_dynamically(exchange, methodName, args)
|
199
|
-
|
200
|
-
def exception_message(exc):
|
201
|
-
message = '[' + type(exc).__name__ + '] ' + "".join(format_exception(type(exc), exc, exc.__traceback__, limit=6))
|
202
|
-
if len(message) > LOG_CHARS_LENGTH:
|
203
|
-
# Accessing out of range element causes error
|
204
|
-
message = message[0:LOG_CHARS_LENGTH]
|
205
|
-
return message
|
206
|
-
|
207
|
-
|
208
|
-
def exit_script(code=0):
|
209
|
-
exit(code)
|
210
|
-
|
211
|
-
|
212
|
-
def get_exchange_prop(exchange, prop, defaultValue=None):
|
213
|
-
if hasattr(exchange, prop):
|
214
|
-
res = getattr(exchange, prop)
|
215
|
-
if res is not None and res != '':
|
216
|
-
return res
|
217
|
-
return defaultValue
|
218
|
-
|
219
|
-
|
220
|
-
def set_exchange_prop(exchange, prop, value):
|
221
|
-
setattr(exchange, prop, value)
|
222
|
-
# set snake case too
|
223
|
-
setattr(exchange, convert_to_snake_case(prop), value)
|
224
|
-
|
225
|
-
|
226
|
-
def init_exchange(exchangeId, args, is_ws=False):
|
227
|
-
if (is_ws):
|
228
|
-
return getattr(ccxtpro, exchangeId)(args)
|
229
|
-
return getattr(ccxt, exchangeId)(args)
|
230
|
-
|
231
|
-
|
232
|
-
def get_test_files(properties, ws=False):
|
233
|
-
tests = {}
|
234
|
-
finalPropList = properties + [proxyTestFileName]
|
235
|
-
for i in range(0, len(finalPropList)):
|
236
|
-
methodName = finalPropList[i]
|
237
|
-
name_snake_case = convert_to_snake_case(methodName)
|
238
|
-
prefix = 'async' if not is_synchronous else 'sync'
|
239
|
-
dir_to_test = DIR_NAME + '/' + prefix + '/'
|
240
|
-
module_string = 'ccxt.test.' + prefix + '.test_' + name_snake_case
|
241
|
-
if (ws):
|
242
|
-
prefix = 'pro'
|
243
|
-
dir_to_test = DIR_NAME + '/../' + prefix + '/test/Exchange/'
|
244
|
-
module_string = 'ccxt.pro.test.Exchange.test_' + name_snake_case
|
245
|
-
filePathWithExt = dir_to_test + 'test_' + name_snake_case + '.py'
|
246
|
-
if (io_file_exists (filePathWithExt)):
|
247
|
-
imp = importlib.import_module(module_string)
|
248
|
-
tests[methodName] = imp # getattr(imp, finalName)
|
249
|
-
return tests
|
250
|
-
|
251
|
-
def close(exchange):
|
252
|
-
if (not is_synchronous and hasattr(exchange, 'close')):
|
253
|
-
exchange.close()
|
254
|
-
|
255
|
-
def is_null_value(value):
|
256
|
-
return value is None
|
257
|
-
|
258
|
-
def set_fetch_response(exchange: ccxt.Exchange, data):
|
259
|
-
def fetch(url, method='GET', headers=None, body=None):
|
260
|
-
return data
|
261
|
-
exchange.fetch = fetch
|
262
|
-
return exchange
|
263
|
-
|
264
|
-
# *********************************
|
265
|
-
# ***** AUTO-TRANSPILER-START *****
|
266
5
|
class testMainClass(baseMainTestClass):
|
267
6
|
def parse_cli_args(self):
|
268
7
|
self.response_tests = get_cli_arg_value('--responseTests')
|
@@ -451,7 +190,9 @@ class testMainClass(baseMainTestClass):
|
|
451
190
|
args_stringified = '(' + exchange.json(args) + ')' # args.join() breaks when we provide a list of symbols or multidimensional array; "args.toString()" breaks bcz of "array to string conversion"
|
452
191
|
dump(self.add_padding('[INFO] TESTING', 25), self.exchange_hint(exchange), method_name, args_stringified)
|
453
192
|
call_method(self.test_files, method_name, exchange, skipped_properties_for_method, args)
|
454
|
-
|
193
|
+
if self.info:
|
194
|
+
dump(self.add_padding('[INFO] TESTING DONE', 25), self.exchange_hint(exchange), method_name)
|
195
|
+
# add to the list of successed tests
|
455
196
|
if is_public:
|
456
197
|
self.checked_public_tests[method_name] = True
|
457
198
|
return
|
@@ -506,7 +247,7 @@ class testMainClass(baseMainTestClass):
|
|
506
247
|
# formatted message "[TEST_FAILURE] ..." and that output is then regex-matched by
|
507
248
|
# run-tests.js, so the exceptions are still printed out to console from there.
|
508
249
|
max_retries = 3
|
509
|
-
args_stringified = exchange.json(args) # args.join() breaks when we provide a list of symbols
|
250
|
+
args_stringified = exchange.json(args) # args.join() breaks when we provide a list of symbols or multidimensional array; "args.toString()" breaks bcz of "array to string conversion"
|
510
251
|
for i in range(0, max_retries):
|
511
252
|
try:
|
512
253
|
self.test_method(method_name, exchange, args, is_public)
|
@@ -835,12 +576,16 @@ class testMainClass(baseMainTestClass):
|
|
835
576
|
for j in range(0, max_retries):
|
836
577
|
try:
|
837
578
|
self.test_method(proxy_test_name, exchange, [], True)
|
838
|
-
|
579
|
+
return # if successfull, then end the test
|
839
580
|
except Exception as e:
|
840
581
|
exception = e
|
582
|
+
exchange.sleep(j * 1000)
|
841
583
|
# if exception was set, then throw it
|
842
|
-
if exception:
|
584
|
+
if exception is not None:
|
843
585
|
error_message = '[TEST_FAILURE] Failed ' + proxy_test_name + ' : ' + exception_message(exception)
|
586
|
+
# temporary comment the below, because c# transpilation failure
|
587
|
+
# throw new ExchangeError (errorMessage.toString ());
|
588
|
+
dump('[TEST_WARNING]' + str(error_message))
|
844
589
|
|
845
590
|
def start_test(self, exchange, symbol):
|
846
591
|
# we do not need to test aliases
|
@@ -1074,7 +819,10 @@ class testMainClass(baseMainTestClass):
|
|
1074
819
|
output = None
|
1075
820
|
request_url = None
|
1076
821
|
try:
|
1077
|
-
|
822
|
+
if not self.is_synchronous:
|
823
|
+
call_exchange_method_dynamically(exchange, method, self.sanitize_data_input(data['input']))
|
824
|
+
else:
|
825
|
+
call_exchange_method_dynamically_sync(exchange, method, self.sanitize_data_input(data['input']))
|
1078
826
|
except Exception as e:
|
1079
827
|
if not (isinstance(e, ProxyError)):
|
1080
828
|
raise e
|
@@ -1092,8 +840,12 @@ class testMainClass(baseMainTestClass):
|
|
1092
840
|
expected_result = exchange.safe_value(data, 'parsedResponse')
|
1093
841
|
mocked_exchange = set_fetch_response(exchange, data['httpResponse'])
|
1094
842
|
try:
|
1095
|
-
|
1096
|
-
|
843
|
+
if not self.is_synchronous:
|
844
|
+
unified_result = call_exchange_method_dynamically(exchange, method, self.sanitize_data_input(data['input']))
|
845
|
+
self.assert_static_response_output(mocked_exchange, skip_keys, unified_result, expected_result)
|
846
|
+
else:
|
847
|
+
unified_result_sync = call_exchange_method_dynamically_sync(exchange, method, self.sanitize_data_input(data['input']))
|
848
|
+
self.assert_static_response_output(mocked_exchange, skip_keys, unified_result_sync, expected_result)
|
1097
849
|
except Exception as e:
|
1098
850
|
self.request_tests_failed = True
|
1099
851
|
error_message = '[' + self.lang + '][STATIC_RESPONSE_TEST_FAILURE]' + '[' + self.exchange_hint(exchange) + ']' + '[' + method + ']' + '[' + data['description'] + ']' + str(e)
|
@@ -1178,7 +930,8 @@ class testMainClass(baseMainTestClass):
|
|
1178
930
|
# reset options
|
1179
931
|
# exchange.options = exchange.deepExtend (oldExchangeOptions, {});
|
1180
932
|
exchange.extend_exchange_options(exchange.deep_extend(old_exchange_options, {}))
|
1181
|
-
|
933
|
+
if not self.is_synchronous:
|
934
|
+
close(exchange)
|
1182
935
|
return True # in c# methods that will be used with promiseAll need to return something
|
1183
936
|
|
1184
937
|
def test_exchange_response_statically(self, exchange_name, exchange_data, test_name=None):
|
@@ -1227,7 +980,8 @@ class testMainClass(baseMainTestClass):
|
|
1227
980
|
# reset options
|
1228
981
|
# exchange.options = exchange.deepExtend (oldExchangeOptions, {});
|
1229
982
|
exchange.extend_exchange_options(exchange.deep_extend(old_exchange_options, {}))
|
1230
|
-
|
983
|
+
if not self.is_synchronous:
|
984
|
+
close(exchange)
|
1231
985
|
return True # in c# methods that will be used with promiseAll need to return something
|
1232
986
|
|
1233
987
|
def get_number_of_tests_from_exchange(self, exchange, exchange_data, test_name=None):
|
@@ -1272,7 +1026,8 @@ class testMainClass(baseMainTestClass):
|
|
1272
1026
|
if self.request_tests_failed or self.response_tests_failed:
|
1273
1027
|
exit_script(1)
|
1274
1028
|
else:
|
1275
|
-
|
1029
|
+
prefix = '[SYNC]' if (self.is_synchronous) else ''
|
1030
|
+
success_message = '[' + self.lang + ']' + prefix + '[TEST_SUCCESS] ' + str(sum) + ' static ' + type + ' tests passed.'
|
1276
1031
|
dump('[INFO]' + success_message)
|
1277
1032
|
|
1278
1033
|
def run_static_response_tests(self, exchange_name=None, test=None):
|
@@ -1670,13 +1425,3 @@ class testMainClass(baseMainTestClass):
|
|
1670
1425
|
assert broker_id == id, 'vertex - id: ' + str(id) + ' different from broker_id: ' + str(broker_id)
|
1671
1426
|
close(exchange)
|
1672
1427
|
return True
|
1673
|
-
|
1674
|
-
# ***** AUTO-TRANSPILER-END *****
|
1675
|
-
# *******************************
|
1676
|
-
|
1677
|
-
|
1678
|
-
if __name__ == '__main__':
|
1679
|
-
argvSymbol = argv.symbol if argv.symbol and '/' in argv.symbol else None
|
1680
|
-
# in python, we check it through "symbol" arg (as opposed to JS/PHP) because argvs were already built above
|
1681
|
-
argvMethod = argv.symbol if argv.symbol and '()' in argv.symbol else None
|
1682
|
-
(testMainClass().init(argv.exchange, argvSymbol, argvMethod))
|
ccxt/timex.py
CHANGED
@@ -723,7 +723,7 @@ class timex(Exchange, ImplicitAPI):
|
|
723
723
|
:param str type: 'market' or 'limit'
|
724
724
|
:param str side: 'buy' or 'sell'
|
725
725
|
:param float amount: how much of currency you want to trade in units of base currency
|
726
|
-
:param float [price]: the price at which the order is to be
|
726
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
727
727
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
728
728
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
729
729
|
"""
|
ccxt/tokocrypto.py
CHANGED
@@ -1564,7 +1564,7 @@ class tokocrypto(Exchange, ImplicitAPI):
|
|
1564
1564
|
:param str type: 'market' or 'limit'
|
1565
1565
|
:param str side: 'buy' or 'sell'
|
1566
1566
|
:param float amount: how much of currency you want to trade in units of base currency
|
1567
|
-
:param float [price]: the price at which the order is to be
|
1567
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1568
1568
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1569
1569
|
:param float [params.triggerPrice]: the price at which a trigger order would be triggered
|
1570
1570
|
:param float [params.cost]: for spot market buy orders, the quote quantity that can be used alternative for the amount
|
ccxt/tradeogre.py
CHANGED
@@ -445,7 +445,7 @@ class tradeogre(Exchange, ImplicitAPI):
|
|
445
445
|
:param str type: must be 'limit'
|
446
446
|
:param str side: 'buy' or 'sell'
|
447
447
|
:param float amount: how much of currency you want to trade in units of base currency
|
448
|
-
:param float price: the price at which the order is to be
|
448
|
+
:param float price: the price at which the order is to be fulfilled, in units of the quote currency
|
449
449
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
450
450
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
451
451
|
"""
|
ccxt/upbit.py
CHANGED
@@ -997,7 +997,7 @@ class upbit(Exchange, ImplicitAPI):
|
|
997
997
|
:param str type: 'market' or 'limit'
|
998
998
|
:param str side: 'buy' or 'sell'
|
999
999
|
:param float amount: how much you want to trade in units of the base currency
|
1000
|
-
:param float [price]: the price at which the order is to be
|
1000
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1001
1001
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1002
1002
|
:param float [params.cost]: for market buy orders, the quote quantity that can be used alternative for the amount
|
1003
1003
|
:param str [params.timeInForce]: 'IOC' or 'FOK'
|
ccxt/vertex.py
CHANGED
@@ -1565,7 +1565,7 @@ class vertex(Exchange, ImplicitAPI):
|
|
1565
1565
|
:param str type: 'market' or 'limit'
|
1566
1566
|
:param str side: 'buy' or 'sell'
|
1567
1567
|
:param float amount: how much of currency you want to trade in units of base currency
|
1568
|
-
:param float [price]: the price at which the order is to be
|
1568
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1569
1569
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1570
1570
|
:param str [params.timeInForce]: ioc, fok
|
1571
1571
|
:param bool [params.postOnly]: True or False whether the order is post-only
|
@@ -1660,7 +1660,7 @@ class vertex(Exchange, ImplicitAPI):
|
|
1660
1660
|
:param str type: 'market' or 'limit'
|
1661
1661
|
:param str side: 'buy' or 'sell'
|
1662
1662
|
:param float amount: how much of currency you want to trade in units of base currency
|
1663
|
-
:param float [price]: the price at which the order is to be
|
1663
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1664
1664
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1665
1665
|
:param str [params.timeInForce]: ioc, fok
|
1666
1666
|
:param bool [params.postOnly]: True or False whether the order is post-only
|
ccxt/wavesexchange.py
CHANGED
@@ -1220,7 +1220,7 @@ class wavesexchange(Exchange, ImplicitAPI):
|
|
1220
1220
|
:param str type: 'market' or 'limit'
|
1221
1221
|
:param str side: 'buy' or 'sell'
|
1222
1222
|
:param float amount: how much of currency you want to trade in units of base currency
|
1223
|
-
:param float [price]: the price at which the order is to be
|
1223
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1224
1224
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1225
1225
|
:param float [params.stopPrice]: The price at which a stop order is triggered at
|
1226
1226
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
ccxt/wazirx.py
CHANGED
@@ -812,7 +812,7 @@ class wazirx(Exchange, ImplicitAPI):
|
|
812
812
|
:param str type: 'market' or 'limit'
|
813
813
|
:param str side: 'buy' or 'sell'
|
814
814
|
:param float amount: how much of currency you want to trade in units of base currency
|
815
|
-
:param float [price]: the price at which the order is to be
|
815
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
816
816
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
817
817
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
818
818
|
"""
|
ccxt/whitebit.py
CHANGED
@@ -1200,7 +1200,7 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1200
1200
|
:param str type: 'market' or 'limit'
|
1201
1201
|
:param str side: 'buy' or 'sell'
|
1202
1202
|
:param float amount: how much of currency you want to trade in units of base currency
|
1203
|
-
:param float [price]: the price at which the order is to be
|
1203
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1204
1204
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1205
1205
|
:param float [params.cost]: *market orders only* the cost of the order in units of the base currency
|
1206
1206
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
@@ -1281,7 +1281,7 @@ class whitebit(Exchange, ImplicitAPI):
|
|
1281
1281
|
:param str type: 'market' or 'limit'
|
1282
1282
|
:param str side: 'buy' or 'sell'
|
1283
1283
|
:param float amount: how much of currency you want to trade in units of base currency
|
1284
|
-
:param float price: the price at which the order is to be
|
1284
|
+
:param float price: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1285
1285
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1286
1286
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1287
1287
|
"""
|
ccxt/woo.py
CHANGED
@@ -52,7 +52,7 @@ class woo(Exchange, ImplicitAPI):
|
|
52
52
|
'createMarketBuyOrderWithCost': True,
|
53
53
|
'createMarketOrder': False,
|
54
54
|
'createMarketOrderWithCost': False,
|
55
|
-
'createMarketSellOrderWithCost':
|
55
|
+
'createMarketSellOrderWithCost': True,
|
56
56
|
'createOrder': True,
|
57
57
|
'createOrderWithTakeProfitAndStopLoss': True,
|
58
58
|
'createReduceOnlyOrder': True,
|
@@ -832,8 +832,22 @@ class woo(Exchange, ImplicitAPI):
|
|
832
832
|
market = self.market(symbol)
|
833
833
|
if not market['spot']:
|
834
834
|
raise NotSupported(self.id + ' createMarketBuyOrderWithCost() supports spot orders only')
|
835
|
-
|
836
|
-
|
835
|
+
return self.create_order(symbol, 'market', 'buy', cost, 1, params)
|
836
|
+
|
837
|
+
def create_market_sell_order_with_cost(self, symbol: str, cost: float, params={}):
|
838
|
+
"""
|
839
|
+
create a market sell order by providing the symbol and cost
|
840
|
+
:see: https://docs.woo.org/#send-order
|
841
|
+
:param str symbol: unified symbol of the market to create an order in
|
842
|
+
:param float cost: how much you want to trade in units of the quote currency
|
843
|
+
:param dict [params]: extra parameters specific to the exchange API endpoint
|
844
|
+
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
845
|
+
"""
|
846
|
+
self.load_markets()
|
847
|
+
market = self.market(symbol)
|
848
|
+
if not market['spot']:
|
849
|
+
raise NotSupported(self.id + ' createMarketSellOrderWithCost() supports spot orders only')
|
850
|
+
return self.create_order(symbol, 'market', 'sell', cost, 1, params)
|
837
851
|
|
838
852
|
def create_trailing_amount_order(self, symbol: str, type: OrderType, side: OrderSide, amount: float, price: Num = None, trailingAmount=None, trailingTriggerPrice=None, params={}) -> Order:
|
839
853
|
"""
|
@@ -888,7 +902,7 @@ class woo(Exchange, ImplicitAPI):
|
|
888
902
|
:param str type: 'market' or 'limit'
|
889
903
|
:param str side: 'buy' or 'sell'
|
890
904
|
:param float amount: how much of currency you want to trade in units of base currency
|
891
|
-
:param float [price]: the price at which the order is to be
|
905
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
892
906
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
893
907
|
:param float [params.triggerPrice]: The price a trigger order is triggered at
|
894
908
|
:param dict [params.takeProfit]: *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered(perpetual swap markets only)
|
@@ -941,28 +955,22 @@ class woo(Exchange, ImplicitAPI):
|
|
941
955
|
request['order_type'] = 'IOC'
|
942
956
|
if reduceOnly:
|
943
957
|
request[reduceOnlyKey] = reduceOnly
|
944
|
-
if price is not None:
|
958
|
+
if not isMarket and price is not None:
|
945
959
|
request[priceKey] = self.price_to_precision(symbol, price)
|
946
960
|
if isMarket and not isStop:
|
947
961
|
# for market buy it requires the amount of quote currency to spend
|
948
|
-
|
962
|
+
cost = self.safe_string_2(params, 'cost', 'order_amount')
|
963
|
+
params = self.omit(params, ['cost', 'order_amount'])
|
964
|
+
isPriceProvided = price is not None
|
965
|
+
if market['spot'] and (isPriceProvided or (cost is not None)):
|
949
966
|
quoteAmount = None
|
950
|
-
createMarketBuyOrderRequiresPrice = True
|
951
|
-
createMarketBuyOrderRequiresPrice, params = self.handle_option_and_params(params, 'createOrder', 'createMarketBuyOrderRequiresPrice', True)
|
952
|
-
cost = self.safe_number_2(params, 'cost', 'order_amount')
|
953
|
-
params = self.omit(params, ['cost', 'order_amount'])
|
954
967
|
if cost is not None:
|
955
968
|
quoteAmount = self.cost_to_precision(symbol, cost)
|
956
|
-
elif createMarketBuyOrderRequiresPrice:
|
957
|
-
if price is None:
|
958
|
-
raise InvalidOrder(self.id + ' createOrder() requires the price argument for market buy orders to calculate the total cost to spend(amount * price), alternatively set the createMarketBuyOrderRequiresPrice option or param to False and pass the cost to spend(quote quantity) in the amount argument')
|
959
|
-
else:
|
960
|
-
amountString = self.number_to_string(amount)
|
961
|
-
priceString = self.number_to_string(price)
|
962
|
-
costRequest = Precise.string_mul(amountString, priceString)
|
963
|
-
quoteAmount = self.cost_to_precision(symbol, costRequest)
|
964
969
|
else:
|
965
|
-
|
970
|
+
amountString = self.number_to_string(amount)
|
971
|
+
priceString = self.number_to_string(price)
|
972
|
+
costRequest = Precise.string_mul(amountString, priceString)
|
973
|
+
quoteAmount = self.cost_to_precision(symbol, costRequest)
|
966
974
|
request['order_amount'] = quoteAmount
|
967
975
|
else:
|
968
976
|
request['order_quantity'] = self.amount_to_precision(symbol, amount)
|
@@ -1066,7 +1074,7 @@ class woo(Exchange, ImplicitAPI):
|
|
1066
1074
|
:param str type: 'market' or 'limit'
|
1067
1075
|
:param str side: 'buy' or 'sell'
|
1068
1076
|
:param float amount: how much of currency you want to trade in units of base currency
|
1069
|
-
:param float [price]: the price at which the order is to be
|
1077
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1070
1078
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1071
1079
|
:param float [params.triggerPrice]: The price a trigger order is triggered at
|
1072
1080
|
:param float [params.stopLossPrice]: price to trigger stop-loss orders
|
@@ -1496,8 +1504,8 @@ class woo(Exchange, ImplicitAPI):
|
|
1496
1504
|
side = self.safe_string_lower(order, 'side')
|
1497
1505
|
filled = self.omit_zero(self.safe_value_2(order, 'executed', 'totalExecutedQuantity'))
|
1498
1506
|
average = self.omit_zero(self.safe_string_2(order, 'average_executed_price', 'averageExecutedPrice'))
|
1499
|
-
remaining = Precise.string_sub(cost, filled)
|
1500
|
-
fee = self.
|
1507
|
+
# remaining = Precise.string_sub(cost, filled)
|
1508
|
+
fee = self.safe_number_2(order, 'total_fee', 'totalFee')
|
1501
1509
|
feeCurrency = self.safe_string_2(order, 'fee_asset', 'feeAsset')
|
1502
1510
|
transactions = self.safe_value(order, 'Transactions')
|
1503
1511
|
stopPrice = self.safe_number(order, 'triggerPrice')
|
@@ -1536,7 +1544,7 @@ class woo(Exchange, ImplicitAPI):
|
|
1536
1544
|
'average': average,
|
1537
1545
|
'amount': amount,
|
1538
1546
|
'filled': filled,
|
1539
|
-
'remaining':
|
1547
|
+
'remaining': None, # TO_DO
|
1540
1548
|
'cost': cost,
|
1541
1549
|
'trades': transactions,
|
1542
1550
|
'fee': {
|
ccxt/woofipro.py
CHANGED
@@ -1196,7 +1196,7 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1196
1196
|
:param str type: 'market' or 'limit'
|
1197
1197
|
:param str side: 'buy' or 'sell'
|
1198
1198
|
:param float amount: how much you want to trade in units of the base currency
|
1199
|
-
:param float [price]: the price that the order is to be
|
1199
|
+
:param float [price]: the price that the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1200
1200
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1201
1201
|
:returns dict: request to be sent to the exchange
|
1202
1202
|
"""
|
@@ -1283,7 +1283,7 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1283
1283
|
:param str type: 'market' or 'limit'
|
1284
1284
|
:param str side: 'buy' or 'sell'
|
1285
1285
|
:param float amount: how much of currency you want to trade in units of base currency
|
1286
|
-
:param float [price]: the price at which the order is to be
|
1286
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1287
1287
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1288
1288
|
:param float [params.triggerPrice]: The price a trigger order is triggered at
|
1289
1289
|
:param dict [params.takeProfit]: *takeProfit object in params* containing the triggerPrice at which the attached take profit order will be triggered(perpetual swap markets only)
|
@@ -1400,7 +1400,7 @@ class woofipro(Exchange, ImplicitAPI):
|
|
1400
1400
|
:param str type: 'market' or 'limit'
|
1401
1401
|
:param str side: 'buy' or 'sell'
|
1402
1402
|
:param float amount: how much of currency you want to trade in units of base currency
|
1403
|
-
:param float [price]: the price at which the order is to be
|
1403
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1404
1404
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1405
1405
|
:param float [params.triggerPrice]: The price a trigger order is triggered at
|
1406
1406
|
:param float [params.stopLossPrice]: price to trigger stop-loss orders
|
ccxt/yobit.py
CHANGED
@@ -760,7 +760,7 @@ class yobit(Exchange, ImplicitAPI):
|
|
760
760
|
:param str type: must be 'limit'
|
761
761
|
:param str side: 'buy' or 'sell'
|
762
762
|
:param float amount: how much of currency you want to trade in units of base currency
|
763
|
-
:param float [price]: the price at which the order is to be
|
763
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
764
764
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
765
765
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
766
766
|
"""
|
ccxt/zaif.py
CHANGED
@@ -429,7 +429,7 @@ class zaif(Exchange, ImplicitAPI):
|
|
429
429
|
:param str type: must be 'limit'
|
430
430
|
:param str side: 'buy' or 'sell'
|
431
431
|
:param float amount: how much of currency you want to trade in units of base currency
|
432
|
-
:param float [price]: the price at which the order is to be
|
432
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
433
433
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
434
434
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
435
435
|
"""
|
ccxt/zonda.py
CHANGED
@@ -1323,7 +1323,7 @@ class zonda(Exchange, ImplicitAPI):
|
|
1323
1323
|
:param str type: 'market' or 'limit'
|
1324
1324
|
:param str side: 'buy' or 'sell'
|
1325
1325
|
:param float amount: how much of currency you want to trade in units of base currency
|
1326
|
-
:param float [price]: the price at which the order is to be
|
1326
|
+
:param float [price]: the price at which the order is to be fulfilled, in units of the quote currency, ignored in market orders
|
1327
1327
|
:param dict [params]: extra parameters specific to the exchange API endpoint
|
1328
1328
|
:returns dict: an `order structure <https://docs.ccxt.com/#/?id=order-structure>`
|
1329
1329
|
"""
|