Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Binance websocket support #211

Closed
wants to merge 7 commits into from
Closed

Conversation

j-waters
Copy link
Contributor

@j-waters j-waters commented Mar 16, 2021

Continuation of #205, thank you so much to @ryansonshine for the initial implementation!

A cache of the current ticker prices and the user's current balance are now stored in the BinanceApiManager. This cache is updated live by two webscoket connections.

Eventually we'll also be able to use this to wait for trades to complete, but I don't want to add anything that will conflict with #195 too much.

In the event of the socket disconnecting, it will attempt to reconnect. I had to extend the binance library a bit to make sure that was working. If it can reconnect, it will clear the caches to make sure new data is fetched, just in case a socket event was missed. If it can't, currently the bot will just continue running without the sockets. Since ticker prices will never update, the bot won't buy anything, so this won't do too much damage. I'll think of how to best handle this, any ideas would be appreciated.

This massively reduces the number of API calls we have to make, and makes scouting so much faster. The get_fees method also runs instantly now.

@rel-s rel-s linked an issue Mar 17, 2021 that may be closed by this pull request
@rel-s rel-s added the enhancement New feature or request label Mar 17, 2021
@j-waters j-waters force-pushed the websockets branch 2 times, most recently from d3ce995 to cb30875 Compare March 18, 2021 12:14
@mattangus
Copy link

mattangus commented Mar 21, 2021

I was doing some profiling of this and I found that in the case where the ticker between a coin and BNB doesn't exist (for example ETHBNB) the get_ticker_price function takes ages. It's called multiple times per loop so it really adds up.

I added some prints to show how drastic this is. Here is the output before:

2021-03-21 14:33:37.523306 - CONSOLE - INFO - scouting for the best trades. Current coin: <ETH>-<USDT>
scout took: 8.3141s
2021-03-21 14:33:50.836235 - CONSOLE - INFO - scouting for the best trades. Current coin: <ETH>-<USDT>
scout took: 2.7265s
2021-03-21 14:33:58.596999 - CONSOLE - INFO - scouting for the best trades. Current coin: <ETH>-<USDT>
scout took: 2.9063s
2021-03-21 14:34:06.479624 - CONSOLE - INFO - scouting for the best trades. Current coin: <ETH>-<USDT>
scout took: 2.7374s
2021-03-21 14:34:14.217068 - CONSOLE - INFO - scouting for the best trades. Current coin: <ETH>-<USDT>
scout took: 2.7266s

And after:

2021-03-21 14:32:30.202917 - CONSOLE - INFO - scouting for the best trades. Current coin: <ETH>-<USDT>
scout took: 4.5743s
2021-03-21 14:32:39.760891 - CONSOLE - INFO - scouting for the best trades. Current coin: <ETH>-<USDT>
scout took: 0.0034s
2021-03-21 14:32:44.764429 - CONSOLE - INFO - scouting for the best trades. Current coin: <ETH>-<USDT>
scout took: 0.0035s
2021-03-21 14:32:49.768002 - CONSOLE - INFO - scouting for the best trades. Current coin: <ETH>-<USDT>
scout took: 0.0035s

From 3 seconds to basically 0!

How I fixed it was like this, but I'm sure there are any number of ways to cache this value (possibly with a timeout in case they add the ticker later).

diff --git a/binance_trade_bot/binance_api_manager.py b/binance_trade_bot/binance_api_manager.py
index 8e6f686..5a05eac 100644
--- a/binance_trade_bot/binance_api_manager.py
+++ b/binance_trade_bot/binance_api_manager.py
@@ -24,6 +24,7 @@ class BinanceAPIManager:
         self.logger = logger
         self.cache = BinanceCache()
         self.stream_manager = BinanceStreamManager(self.cache, self.binance_client, self.logger)
+        self.non_existent_tickers = set()
 
     @cached(cache=TTLCache(maxsize=1, ttl=43200))
     def get_trade_fees(self) -> Dict[str, float]:
@@ -65,12 +66,16 @@ class BinanceAPIManager:
         """
         Get ticker price of a specific coin
         """
+        if ticker_symbol in self.non_existent_tickers:
+            return None
         price = self.cache.ticker_values.get(ticker_symbol, None)
         if price is None:
             self.cache.ticker_values = {
                 ticker["symbol"]: float(ticker["price"]) for ticker in self.binance_client.get_symbol_ticker()
             }
             price = self.cache.ticker_values.get(ticker_symbol, None)
+            if price is None:
+                self.non_existent_tickers.add(ticker_symbol)
 
         return price
 
diff --git a/binance_trade_bot/crypto_trading.py b/binance_trade_bot/crypto_trading.py

I'll test next with a ticker that exists.

Edit: When ticker exists loop time is around 0.0045s. Very reasonable.

@j-waters
Copy link
Contributor Author

Good catch, I don't have any coins enabled that don't have a pair with BNB! I used your fix, integrating it into the BinanceCache class. I think them adding a ticker later isn't something we have to worry too much about, but yeah in the future we'll add a timeout. Either that, or we'll instead cache all the coins that do exist on startup, so we don't even have to make API requests in the first place.

I also modified the get_fees method slightly, so now it should be running even faster! My profiling results:
image

The orange block is the get_fees method. Most of our time scouting is now spent updating the database, which is a whole other issue that is fixed in another PR I think.

@GrigorovskyA
Copy link

GrigorovskyA commented Mar 22, 2021

I tried this brunch and I got stuck several times when jumping from one currency to another.

2021-03-22 12:41:27,051 - crypto_trading_logger - INFO - Will be jumping from <VTHO> to KEY
2021-03-22 12:41:30,429 - crypto_trading_logger - INFO - Selling 7069.0 of VTHO
2021-03-22 12:41:30,430 - crypto_trading_logger - INFO - Balance is 7069.923
2021-03-22 12:41:30,707 - crypto_trading_logger - INFO - order
2021-03-22 12:41:30,708 - crypto_trading_logger - INFO - {'symbol': 'VTHOUSDT', 'orderId': 47665046, 'orderListId': -1, 'clientOrderId': 'WvzRGGjSHwkS8OwNvfAedB', 'transactTime': 1616406091270, 'price': '0.00000000', 'origQty': '7069.00000000', 'executedQty': '7069.00000000', 'cummulativeQuoteQty': '150.21625000', 'status': 'FILLED', 'timeInForce': 'GTC', 'type': 'MARKET', 'side': 'SELL', 'fills': [{'price': '0.02125000', 'qty': '7069.00000000', 'commission': '0.15021625', 'commissionAsset': 'USDT', 'tradeId': 6884859}]}
2021-03-22 12:41:33,112 - crypto_trading_logger - INFO - Waiting for Binance
2021-03-22 12:41:33,393 - crypto_trading_logger - INFO - {'symbol': 'VTHOUSDT', 'orderId': 47665046, 'orderListId': -1, 'clientOrderId': 'WvzRGGjSHwkS8OwNvfAedB', 'price': '0.00000000', 'origQty': '7069.00000000', 'executedQty': '7069.00000000', 'cummulativeQuoteQty': '150.21625000', 'status': 'FILLED', 'timeInForce': 'GTC', 'type': 'MARKET', 'side': 'SELL', 'stopPrice': '0.00000000', 'icebergQty': '0.00000000', 'time': 1616406091270, 'updateTime': 1616406091270, 'isWorking': True, 'origQuoteOrderQty': '0.00000000'}
2021-03-22 12:41:33,394 - crypto_trading_logger - INFO - Sold VTHO
2021-03-22 12:41:39,087 - crypto_trading_logger - INFO - BUY QTY 5615.0
2021-03-22 12:41:39,362 - crypto_trading_logger - INFO - {'symbol': 'KEYUSDT', 'orderId': 63435866, 'orderListId': -1, 'clientOrderId': 'xOEuSNfwYy44FYKwZQso0Q', 'transactTime': 1616406099922, 'price': '0.02672900', 'origQty': '5615.00000000', 'executedQty': '0.00000000', 'cummulativeQuoteQty': '0.00000000', 'status': 'NEW', 'timeInForce': 'GTC', 'type': 'LIMIT', 'side': 'BUY', 'fills': []}
2021-03-22 12:41:41,976 - crypto_trading_logger - INFO - {'symbol': 'KEYUSDT', 'orderId': 63435866, 'orderListId': -1, 'clientOrderId': 'xOEuSNfwYy44FYKwZQso0Q', 'price': '0.02672900', 'origQty': '5615.00000000', 'executedQty': '0.00000000', 'cummulativeQuoteQty': '0.00000000', 'status': 'NEW', 'timeInForce': 'GTC', 'type': 'LIMIT', 'side': 'BUY', 'stopPrice': '0.00000000', 'icebergQty': '0.00000000', 'time': 1616406099922, 'updateTime': 1616406099922, 'isWorking': True, 'origQuoteOrderQty': '0.00000000'}

At the same time, there was no order on binance. and there all the currency was USDT

upd; Hmm. I hurried to turn it off. this transaction went through. just walked for a long time.
But the previous one hung for more than 20 minutes - and nothing happened.

@j-waters
Copy link
Contributor Author

@GrigorovskyA yeah that happens sometimes, I don't think this PR should have changed anything in that area

@GrigorovskyA
Copy link

Yeah, I agree, just keeping up with my observation of the work of this branch.

@j-waters
Copy link
Contributor Author

Now orders are being fetched using the websocket, which means the wait_for_order method can update much more quickly. Also rebased

@Blaklis
Copy link
Contributor

Blaklis commented Mar 23, 2021

@GrigorovskyA yeah that happens sometimes, I don't think this PR should have changed anything in that area

It happens sometimes that the bot got stuck in the loop to get balance in sell_alt here :

        while new_balance >= origin_balance:
            new_balance = self.get_currency_balance(origin_symbol)

It didn't happen without this PR (at least, for me), so I guess this might be related?

@j-waters j-waters force-pushed the websockets branch 2 times, most recently from dc9cf65 to 898093b Compare March 23, 2021 13:18
@j-waters
Copy link
Contributor Author

@Blaklis ah good catch. I've added some code to force a balance update when we want to be sure we've got the right values.

I've also added more debug logs, that will show up in the log file but not in the console. Hopefully they'll make issues like this easier to debug.

@cornytrace
Copy link

For me it shows the following:

2021-03-23 15:11:59,483 - crypto_trading_logger - DEBUG - Getting balance for ADA: 0.0265
2021-03-23 15:11:59,483 - crypto_trading_logger - DEBUG - Getting balance for BNB: 0.0
2021-03-23 15:11:59,484 - crypto_trading_logger - DEBUG - Getting balance for USDT: 0.88115523
2021-03-23 15:11:59,484 - crypto_trading_logger - DEBUG - Getting balance for BNB: 0.0
2021-03-23 15:11:59,773 - crypto_trading_logger - DEBUG - Getting balance for ATOM: 22.33974
2021-03-23 15:11:59,773 - crypto_trading_logger - DEBUG - Getting balance for BNB: 0.0
2021-03-23 15:11:59,773 - crypto_trading_logger - DEBUG - Getting balance for USDT: 0.88115523
2021-03-23 15:11:59,773 - crypto_trading_logger - DEBUG - Getting balance for BNB: 0.0
2021-03-23 15:12:00,269 - crypto_trading_logger - DEBUG - Getting balance for ATOM: 22.33974
2021-03-23 15:12:00,270 - crypto_trading_logger - DEBUG - Getting balance for BNB: 0.0
2021-03-23 15:12:00,270 - crypto_trading_logger - DEBUG - Getting balance for USDT: 0.88115523
2021-03-23 15:12:00,270 - crypto_trading_logger - DEBUG - Getting balance for BNB: 0.0
2021-03-23 15:12:00,971 - crypto_trading_logger - DEBUG - Getting balance for ATOM: 22.33974
2021-03-23 15:12:00,971 - crypto_trading_logger - DEBUG - Getting balance for BNB: 0.0

Is it normal for it to be running get_currency_balance multiple times a second?

@j-waters
Copy link
Contributor Author

@cornytrace yes, that's part of the get_fees method. It's just a dictionary lookup, no API calls. I think I'll remove that log though since that's gonna make the logfile pretty big! I added it to debug the previous issue.

@cornytrace
Copy link

Maybe it's an idea to only print debug to log or console when the program is started with a --debug option or similar.

Copy link
Collaborator

@rel-s rel-s left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, while reviewing this I noticed that a bunch of seemingly unrelated stuff was also changed - for the better, I believe. Although these changes don't necessairly belong in this PR, they should be accepted and it would probably be too much of a hassle to take them out now. In the future we should probably seperate these changes though... I left some comments, but this looks generally ok to me.
Started testing...

binance_trade_bot/database.py Outdated Show resolved Hide resolved
@@ -21,7 +21,7 @@ def __init__(self, logging_service="crypto_trading"):

# logging to console
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setLevel(logging.INFO)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense I guess, but is this the right PR for this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right it's probably not, although we don't use any DEBUG logs anywhere else so it won't affect anything. My logic here was that with the introduction of websockets there is the possibility of hard to debug issues being reported down the line, and it would be good to log as much as possible so that we get more information from users reporting issues. Logging all this extra information to the console isn't very helpful which is what this change prevents

binance_trade_bot/binance_api_manager.py Outdated Show resolved Hide resolved
@Blaklis
Copy link
Contributor

Blaklis commented Apr 8, 2021

@a202037 @CTetford This is the problem discussed above by me, solved by running pip install --upgrade --no-deps --force-reinstall git+git://github.com/sammchardy/python-binance.git and restarting the bot.

@rhcp31204 I think with a market order the bot needs to manually add and average the prices from the array instead of using the price field. Unless someone adds this, you cannot use the market price feature with this pull request.

I also had the problem with the updated version of python-binance. Seems like it happens less frequently, but it's still a problem. We might need to investigate this and at least mitigate for the rare cases it happens.

@bobwng
Copy link

bobwng commented Apr 9, 2021

Here is my changes based on this PR for the issue (infinity waiting order complete) mentioned above, and I didn't meet the issue at least in last 7 days:

https://pastebin.com/4fu25Wzx

The main idea is check the order status manually instead of waiting the order status change event.

But please take it in mind that it also includes below changes:

  • Fixed an issue that bridge_scout may try to buy 0.0 qty target coin, not sure the issue was introduced by my changes or not
  • Added a changes that will auto buy BNB if current BNB balance is not enough to pay the fee...you may want to remove it from the diff before apply it.

@cornytrace
Copy link

Unfortunately I can confirm that the problem of the bot not receiving user socket messages is still not solved. The problem seems to be that the websocket somehow times out or is unreliable.

@erenatas
Copy link
Contributor

erenatas commented Apr 22, 2021

@j-waters can you rebase your change on top of master?

PR for rebase is open in: j-waters#1

@j-waters
Copy link
Contributor Author

Thanks @erenatas, I'll try and look at that properly soon, if anyone else that's familiar with this PR could look at it as well I'd appreciate it as I'm still rather busy

@Blaklis
Copy link
Contributor

Blaklis commented Apr 27, 2021

I'll have a look at it too.

@j-waters
Copy link
Contributor Author

j-waters commented Apr 27, 2021

That should be rebased, thank you very much for the help @erenatas. I haven't tested it too thoroughly and I haven't added any of the previous suggestions yet, again please make a PR on my fork or take over the PR completely if you'd like to try fixing some of the problems I'm still rather busy

Also is it just me or is the multiple_coins strategy a bit broken?

j-waters and others added 7 commits April 27, 2021 23:36
Squashed as some commits were broken by the rebase:

Add stream manager class

Remove all_tickers

Add method for starting all mark price socket

Add handler for closing websockets on exit

whitespace refactor

Refactor naming and move sleep timer

Update connect_args

Disable check for same thread

Add initial implementation of websockets for getting all mark prices

Co-authored-by: Ryan Sonshine <sonshine@amazon.com>
@AnasAlmomany
Copy link

Currently using this branch and its working great 👍 thanks guys

@erenatas
Copy link
Contributor

That should be rebased, thank you very much for the help @erenatas. I haven't tested it too thoroughly and I haven't added any of the previous suggestions yet, again please make a PR on my fork or take over the PR completely if you'd like to try fixing some of the problems I'm still rather busy

Also is it just me or is the multiple_coins strategy a bit broken?

Would be glad if you can give credit as a co-author in commit message. Thanks.

@bloodf
Copy link

bloodf commented Apr 28, 2021

@j-waters the multiple is broken

@GrigorovskyA
Copy link

@j-waters the multiple is broken

@bloodf what issue do you have?
My bot working on that branch correctly

@Blaklis
Copy link
Contributor

Blaklis commented Apr 28, 2021

@bloodf This doesn't seems to be related to this pull request. Also, please be specific next time, instead of just saying it's broken.

@bloodf
Copy link

bloodf commented Apr 28, 2021

@Blaklis

need to change

this

  print(
                f"{datetime.now()} - CONSOLE - INFO - I am scouting the best trades. "
                f"Current coin: {current_coin + self.config.BRIDGE}",
                end="\r",
            )

to this

  print(
                f"{datetime.now()} - CONSOLE - INFO - I am scouting the best trades. "
                f"Current coin: {current_coin} {self.config.BRIDGE}",
                end="\r",
            )

@Blaklis
Copy link
Contributor

Blaklis commented Apr 28, 2021

This is definitely not related to this PR.

@AnasAlmomany
Copy link

@j-waters when bot jumps between coins its stuck , but not always ,
it sells the current coin and doesnt put an order on the other-one

and the logs displays that the bot is trying to buy

2021-04-29 15:42:57,871 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:42:58,872 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:42:59,872 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:00,873 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:01,874 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:02,874 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:03,875 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:04,875 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:05,876 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:06,876 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:07,877 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:08,878 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:09,878 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:10,879 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:11,880 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:12,880 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:13,882 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:14,883 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:15,885 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:16,886 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:17,887 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:18,889 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:19,890 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:20,892 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:21,893 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:22,895 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:23,896 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:24,898 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:25,899 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:26,901 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:27,902 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:28,904 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:29,905 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:30,907 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:31,908 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:32,910 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:33,911 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:34,913 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:35,914 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created
2021-04-29 15:43:36,916 - crypto_trading_logger - DEBUG - Waiting for order 622088162 to be created

@HuanYuanHe
Copy link

HuanYuanHe commented May 1, 2021

@ j-waters,当漫游器在其卡住的硬币之间跳转时,但并非总是如此,
它会出售当前的硬币,而不会在另一个上下订单

并且日志显示该机器人正在尝试购买

2021-04-29 15:42:57,871-crypto_trading_logger-调试-等待创建订单622088162
2021-04-29 15:42:58,872-crypto_trading_logger-DEBUG-等待创建订单622088162

2021-04-29 15:43:21,893-crypto_trading_logger-DEBUG-等待创建订单622088162
2021-04-29 15:43:22,895-crypto_trading_logger -调试-等待创建订单622088162
2021-04-29 15:43:23,896-crypto_trading_logger-调试-等待创建订单622088162
2021-04-29 15:43:24,898-crypto_trading_logger-调试-等待订单622088162将被创建
2021-04-29 15:43:25,899-crypto_trading_logger-调试-等待创建订单622088162
2021-04-29 15:43:26,901-crypto_trading_logger-DEBUG-等待创建订单622088162
2021-04-29 15 :43:27,902-crypto_trading_logger-调试-等待创建订单622088162
2021-04-29 15:43:28,904-crypto_trading_logger-DEBUG-等待创建订单622088162
2021-04-29 15:43:29,905-crypto_trading_logger -调试-等待创建订单622088162
2021-04-29 15:43:30,907-crypto_trading_logger-调试-等待创建订单622088162
2021-04-29 15:43:31,908-crypto_trading_logger-调试-等待订单622088162将被创建
2021-04-29 15:43:32,910-crypto_trading_logger-调试-等待创建订单622088162
2021-04-29 15:43:33,911-crypto_trading_logger-DEBUG-等待创建订单622088162
2021-04-29 15 :43:34,913-crypto_trading_logger-调试-等待创建订单622088162
2021-04-29 15:43:35,914-crypto_trading_logger-DEBUG-等待创建订单622088162
2021-04-29 15:43:36,916-crypto_trading_logger -调试-等待创建订单622088162

me too

pip install --upgrade --no-deps --force-reinstall git+git://github.com/sammchardy/python-binance.git and restarting the bot cant fix this bug

@j-waters
Copy link
Contributor Author

j-waters commented May 4, 2021

Closing this in favor of #312.

To see any changes from my PR: j-waters/binance-trade-bot@websockets...erenatas:websockets-eren

@j-waters j-waters closed this May 4, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet