alpacahq/Momentum-Trading-Example

TypeError: unhashable type: 'list'

Opened this issue · 1 comments

I have been getting this error consistently at the end of each day while it is trying to liquidate the day's remaining positions. Any thoughts?

Log below:

Jan 08 12:45:10 alpaca-momentum app/worker.1 Trading over, liquidating remaining position in FVE
Jan 08 12:45:10 alpaca-momentum app/worker.1 Task exception was never retrieved
Jan 08 12:45:10 alpaca-momentum app/worker.1 future: <Task finished coro=<StreamConn._consume_msg() done, defined at /app/.heroku/python/lib/python3.6/site-packages/alpaca_trade_api/polygon/streamconn.py:99> exception=TypeError("unhashable type: 'list'",)>
Jan 08 12:45:10 alpaca-momentum app/worker.1 Traceback (most recent call last):
Jan 08 12:45:10 alpaca-momentum app/worker.1 File "/app/.heroku/python/lib/python3.6/site-packages/alpaca_trade_api/polygon/streamconn.py", line 103, in _consume_msg
Jan 08 12:45:10 alpaca-momentum app/worker.1 await self._dispatch(data)
Jan 08 12:45:10 alpaca-momentum app/worker.1 File "/app/.heroku/python/lib/python3.6/site-packages/alpaca_trade_api/polygon/streamconn.py", line 240, in _dispatch
Jan 08 12:45:10 alpaca-momentum app/worker.1 await handler(self, channel, ent)
Jan 08 12:45:10 alpaca-momentum app/worker.1 File "algo.py", line 336, in handle_second_bar
Jan 08 12:45:10 alpaca-momentum app/worker.1 'AM.{}'.format(symbol)
Jan 08 12:45:10 alpaca-momentum app/worker.1 File "/app/.heroku/python/lib/python3.6/site-packages/alpaca_trade_api/polygon/streamconn.py", line 253, in deregister
Jan 08 12:45:10 alpaca-momentum app/worker.1 self._handler_symbols.pop(self._handlers[channel_pat], None)
Jan 08 12:45:10 alpaca-momentum app/worker.1 TypeError: unhashable type: 'list'
Jan 08 14:04:26 alpaca-momentum heroku/worker.1 State changed from up to down
Jan 08 14:04:28 alpaca-momentum heroku/worker.1 Stopping all processes with SIGTERM
Jan 08 14:04:28 alpaca-momentum heroku/worker.1 Process exited with status 143

I haven't spun this up yet, so I can't say for sure.
However, I can say that:
self._handlers in alpaca_trade_api/polygon/streamconn.py is a dictionary. Attempting to use a list as a key to a dictionary results in this error. We see where this could happen in the pattern (self._handlers[channel_pat], None), if channel_pat is a list.
It looks like lines 333-336 in algo.py always pass a list as the argument to streamconn.deregister():
conn.deregister([ 'A.{}'.format(symbol), 'AM.{}'.format(symbol) ])

so this error should always occur.