I am building my first trading bot, and I have the pseudo code below, my issue is in run_connection() I think. Basically I need a way for the user to change the state of the system somehow while the stream is running, so that I can go from state 1 (buying/selling) to 2 (just selling). Essentially, I need a way to gracefully get the bot to exit after a while. The only way I can think of to accept user input while the stream is running is to catch KeyboardInterrupt exceptions, and change the state based on the current state, but I cannot get it to do that properly. Any help with this or other ways of accomplishing the same thing are much appreciated!
async def trade_bars(bars):
# if the state is 1:
# do BOTH buying (add buys to a holdings dictionary) and selling
# if the state is 2:
# do ONLY selling of items in the holdings dictionary
# if all holdings are sold:
# raise a keyboard interrupt programatically to stop running the stream
def run_connection(stream):
try:
stream.run()
except KeyboardInterrupt:
# if the state is 1:
# change the state to 2 and then CONTINUE (not stop), running the stream
# if the state is 2:
# stop running the stream
except Exception as e:
print(f'Exception from websocket connection: {e}')
# restart the stream
if __name__ == "__main__":
# set the "state" to 1
stream = Stream(
d_globals['ALPACA_API_KEY'], d_globals['ALPACA_SECRET_KEY'],
base_url=d_globals['API_URL'], raw_data=False,
data_feed='iex', crypto_exchanges = ['CBSE']
)
stream.subscribe_crypto_bars(trade_bars, d_globals['symbol'])
run_connection(stream)