scrtlabs / catalyst

An Algorithmic Trading Library for Crypto-Assets in Python
http://enigma.co
Apache License 2.0
2.48k stars 724 forks source link

The introduction of bat_btc on Poloniex made Catalyst crash #442

Open sam31415 opened 6 years ago

sam31415 commented 6 years ago

Hi,

I'm using Catalyst 0.5.17. My algorithm crashed with the following traceback:

Traceback (most recent call last):                        
  File "algo.py", line 1109, in <module>        
    simulate_orders=PAPER_TRADE,                          
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/utils/run_algo.py", line 596, in run_algorithm
    stats_output=stats_output                             
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/utils/run_algo.py", line 358, in _run
    overwrite_sim_params=False,                           
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange_algorithm.py", line 1051, in run
    data, overwrite_sim_params                            
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange_algorithm.py", line 359, in run
    data, overwrite_sim_params                            
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/algorithm.py", line 725, in run
    for perf in self.get_generator():                     
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/gens/tradesimulation.py", line 224, in transform
    for capital_change_packet in every_bar(dt):           
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/gens/tradesimulation.py", line 137, in every_bar
    handle_data(algo, current_data, dt_to_use)            
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/utils/events.py", line 216, in handle_data
    dt,                      
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/utils/events.py", line 235, in handle_data
    self.callback(context, data)                          
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange_algorithm.py", line 895, in handle_data
    cleanup=lambda: log.warn('Syncing portfolio again.')  
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/redo/__init__.py", line 162, in retry
    return action(*args, **kwargs)                        
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange_algorithm.py", line 718, in synchronize_portfolio
    cash=required_cash,      
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange.py", line 739, in sync_positions
    tickers = self.tickers(assets)                        
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/ccxt/ccxt_exchange.py", line 1245, in tickers
    results = self.api.fetch_tickers(symbols=symbols)     
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/ccxt/poloniex.py", line 309, in fetch_tickers
    market = self.markets_by_id[id]                       
KeyError: 'BTC_BAT'

Note that this only involves code from Catalyst and its dependencies, not my own code. The crash seems to be due to the introduction of the bat_btc trading pair on Poloniex. A mechanism to deal with new pairs and avoid crashing the algos in such situations would be useful.

Best,

Samuel

EmbarAlmog commented 6 years ago

Hi @sam31415 , I have tried to replicate your issue but wasn't successful. Could you please share more information about your use case. I guess that you were not trying to trade the new added bat_btc as its trading is not yet supported. Thanks

sam31415 commented 6 years ago

Hi @EmbarAlmog . Thanks for trying to reproduce it. I can't reproduce it either. It happened while the algorithm was running, when the bat_btc pair got added.

My wild guess is that Catalyst fetched a list of pairs from Poloniex, among which the new bat_btc pair was present, but for some reason this pair was not present in the list "market_by_id", which should be the member of some class in ccxt/poloniex.py, according to the trackback. So the issue probably involves CCXT.

sam31415 commented 6 years ago

Actually I forgot to answer your question. No, I was not trying to trade bat_btc. As mentioned, this error arose in a part of the code that did not involve my algorithm.

EmbarAlmog commented 6 years ago

Thanks for the update. I am closing this, please reopen if this issue arises again. Thanks

sam31415 commented 6 years ago

I don't see a reason for closing this issue.

sam31415 commented 6 years ago

Here you are. Poloniex added some USDT pairs and Catalyst crashed. Please reopen the issue, I can't.

Traceback (most recent call last):                                                                                
  File "algo.py", line 1109, in <module>       
    simulate_orders=PAPER_TRADE,                         
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/utils/run_algo.py", lin
e 596, in run_algorithm     
    stats_output=stats_output                            
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/utils/run_algo.py", lin
e 358, in _run                                           
    overwrite_sim_params=False,                          
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange_algor
ithm.py", line 1051, in run 
    data, overwrite_sim_params      
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange_algor
ithm.py", line 359, in run
    data, overwrite_sim_params                           
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/algorithm.py", line 725
, in run
    for perf in self.get_generator():                    
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/gens/tradesimulation.py
", line 224, in transform
    for capital_change_packet in every_bar(dt):          
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/gens/tradesimulation.py
", line 137, in every_bar
    handle_data(algo, current_data, dt_to_use)           
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/utils/events.py", line 
216, in handle_data
    dt,                     
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/utils/events.py", line 
235, in handle_data
    self.callback(context, data)                         
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange_algor
ithm.py", line 895, in handle_data
    cleanup=lambda: log.warn('Syncing portfolio again.') 
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/redo/__init__.py", line 162, in 
retry
    return action(*args, **kwargs)                       
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange_algor
ithm.py", line 718, in synchronize_portfolio
    cash=required_cash,     
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/exchange.py", 
line 739, in sync_positions
    tickers = self.tickers(assets)                       
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/catalyst/exchange/ccxt/ccxt_exch
ange.py", line 1245, in tickers
    results = self.api.fetch_tickers(symbols=symbols)    
  File "/home/user/miniconda3/envs/catalyst/lib/python3.6/site-packages/ccxt/poloniex.py", line 309, in 
fetch_tickers
    market = self.markets_by_id[id]                      
KeyError: 'USDT_DOGE'
lenak25 commented 6 years ago

Thanks for reporting @sam31415 . It's a hard one in terms of reproduction, we will continue investigating.

sam31415 commented 6 years ago

Thanks for reopening. I think that in order to reproduce it, all you need to do is have an algorithm running live on Poloniex (not even necessarily trading), and wait for Poloniex to add some new pair. As I mentioned, this error arises before the user-defined functions are called, so it should be completely independent of which algorithm you are running.

It looks like Catalyst gets information about the traded pairs from two different sources, and for a short time after Poloniex added new pairs, these two sources do not agree for some reason, what creates the crash.