Open sam31415 opened 6 years ago
Hi @sam31415 ,
Thanks for reporting this. The default retries number is 5, which can be reseted in your code, however will not solve the problem as you described it. This is a tricky one, as exchanges' maintenance window or downtime can last for several days.
Hi,
Thanks, do you mean that I can control this from the algorithm? Or do I need to change my local version of the Catalyst code?
But what is the reason for not having an infinite number of retries, warning simply the user when the attempt fails? I really think that a trading algorithm should crash only if there is no alternative.
Hi @sam31415 ,
In the ExchangeTradingAlgorithmBase
(exchange_algorithm.py) the following defaults are defined:
self.attempts = dict(
get_transactions_attempts=5,
order_attempts=5,
synchronize_portfolio_attempts=5,
get_order_attempts=5,
get_open_orders_attempts=5,
cancel_order_attempts=5,
get_spot_value_attempts=5,
get_history_window_attempts=5,
retry_sleeptime=5,
)
They can be reseted in your initialize
function by doing something like this (for example): context.attempts["synchronize_portfolio_attempts"]=100
.
I agree with you that a trading algorithm should be resilient. Thanks for bringing this up, we will try to address this.
Ah great, I didn't know about context.attempts. Thanks!
Dear Catalyst Maintainers,
Before I tell you about my issue, let me describe my environment:
Environment
aiohttp 3.1.3
alembic 0.9.9
async-timeout 2.0.1
attrdict 2.0.0
attrs 17.4.0
bcolz 0.12.1
bcolz 1.1.2 py36h00f5784_0
bokeh 0.12.14 py36_0
boto3 1.7.4
botocore 1.10.4
Bottleneck 1.2.1
bzip2 1.0.6 h9a117a8_4
ca-certificates 2017.08.26 h1d4fec5_0
cchardet 2.1.1
ccxt 1.13.1
certifi 2018.4.16
chardet 3.0.4
click 6.7 py36h5253387_0
cloudpickle 0.5.2 py36_1
configparser 3.5.0
contextlib2 0.5.5
cycler 0.10.0
cyordereddict 1.0.0
Cython 0.28.2
cython 0.27.3 py36h1860423_0
cytoolz 0.9.0.1 py36h14c3975_0
dask 0.17.2 py36_0
dask-core 0.17.2 py36_0
decorator 4.3.0
distributed 1.21.4 py36_0
docutils 0.14
empyrical 0.2.1
enigma-catalyst 0.5.9
eth-abi 1.0.0
eth-account 0.1.0a2
eth-hash 0.1.2
eth-keyfile 0.5.1
eth-keys 0.2.0b3
eth-rlp 0.1.0
eth-utils 1.0.2
hdf5 1.10.1 h9caa474_1
heapdict 1.0.0 py36_2
hexbytes 0.1.0
idna 2.6
idna-ssl 1.0.1
intel-openmp 2018.0.0 8
intervaltree 2.1.0
jinja2 2.10 py36ha16c418_0
jmespath 0.9.3
kiwisolver 1.0.1
libedit 3.1 heed3624_0
libffi 3.2.1 hd88cf55_4 libgcc-ng 7.2.0 hdf63c60_3 [38/577] libgfortran-ng 7.2.0 hdf63c60_3
libstdcxx-ng 7.2.0 hdf63c60_3
locket 0.2.0 py36h787c0ad_1
Logbook 1.3.3
lru-dict 1.1.6
lxml 4.2.1
lzo 2.10 h49e0be7_2
Mako 1.0.7
markupsafe 1.0 py36hd9260cd_1
matplotlib 2.2.2
mkl 2018.0.2 1
mpld3 0.3
msgpack-python 0.5.5 py36h6bb024c_0
multidict 4.2.0
multipledispatch 0.5.0
ncurses 6.0 h9df7e31_2
networkx 2.1
numexpr 2.6.4 py36hc4a3f9a_0
numpy 1.14.2
numpy 1.14.2 py36hdbf6ddf_0
openssl 1.0.2n hb7f436b_0
packaging 17.1 py36_0
pandas 0.22.0 py36hf484d3e_0
pandas 0.19.2
pandas-datareader 0.6.0
partd 0.3.8 py36h36fd896_0
patsy 0.5.0
patsy 0.5.0 py36_0
pip 10.0.0
pip 9.0.1 py36_5
psutil 5.4.3 py36h14c3975_0
pycares 2.3.0
pycryptodome 3.6.1
pyparsing 2.2.0 py36hee85983_1
pytables 3.4.2 py36h3b5282a_2
python 3.6.4 hc3d631a_3
python-dateutil 2.7.2
python-editor 1.0.3
pytz 2018.4
readline 7.0 ha6073c6_4
redo 1.6
scipy 1.0.1
setuptools 39.0.1
sortedcontainers 1.5.9 py36_0
SQLAlchemy 1.2.6
statsmodels 0.8.0
tabulate 0.8.2
tk 8.6.7 hc745277_3
toolz 0.9.0 py36_0
tornado 5.0 py36_0
urllib3 1.22
wrapt 1.10.11
yaml 0.1.7 had09818_2
yarl 1.1.0
zlib 1.2.11 ha838bed_2
Now that you know a little about me, let me tell you about the issue I am having:
Description of Issue
There was a timeout while Catalyst was trying to fetch the balances on Poloniex. Poloniex is apparently under maintenance right now. This caused the algorithm to crash.
I feel that in the case of a timeout, Catalyst should not crash, but rather just continue trying to connect while providing warnings, maybe with a decreasing frequency, until the problem disappears. You don't want a trading algorithm to just crash, leaving positions open.
I had similar issues when fetching price data, which I solved by explicitly catching the exceptions and taking appropriate action in my algorithm. But the problem above lie outside the scope of the algorithm.
Here is how you can reproduce this issue on your machine:
Reproduction Steps
Sincerely, Samuel