unicorn-binance-websocket-api Change Log¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
Discussions about unicorn-binance-websocket-api releases!
How to upgrade to the latest version!
2.10.2.dev (development stage/unreleased/unstable)¶
2.10.2¶
Fixed¶
restclient.py - Removed lucit licensing
2.10.1¶
Added¶
build_wheels.yml:
CIBW_ARCHS_LINUX: “x86_64 aarch64” CIBW_ARCHS_MACOS: “x86_64 arm64 universal2” CIBW_ARCHS_WINDOWS: “AMD64” CIBW_MUSLLINUX_X86_64_IMAGE: “musllinux_1_1”
2.10.0¶
Changed¶
Moved from https://github.com/LUCIT-Systems-and-Development/ to https://github.com/oliver-zehentleitner
Removed¶
LUCIT Licensing Manager
2.9.0¶
Added¶
New
Websocket API Spotfunctions:manager.api.spot.cancel_and_replace_order()manager.api.spot.get_aggregate_trades()manager.api.spot.get_current_average_price()manager.api.spot.get_historical_trades()manager.api.spot.get_klines()manager.api.spot.get_ui_klines()manager.api.spot.get_recent_trades()manager.api.spot.get_unfilled_order_count()
Full Support for
Websocket API Futures:manager.api.futures.cancel_order()manager.api.futures.create_order()manager.api.futures.get_account_balance()(v1+v2)manager.api.futures.get_account_position()(v1+v2)manager.api.futures.get_account_status()(v1+v2)manager.api.futures.get_listen_key()manager.api.futures.get_order()manager.api.futures.get_order_book()manager.api.futures.get_ticker_order_book()manager.api.futures.get_ticker_price()manager.api.futures.get_server_time()manager.api.futures.modify_order()manager.api.futures.ping()
Error handling if someone tries to use the WebSocket API Feature with an unsupported exchange.
Changed¶
ujson has been replaced by orjson (faster!)
Websocket API functions are no longer available under
manager.apibut undermanager.api.spot. In addition, there is now alsomanager.api.futures.No more use of deepcopy in ws api (faster!)
Enhanced logging in WS API
2.8.1¶
Changed¶
Log levels in
send_with_stream()to be less verbose.Dropping support for Python 3.7
Fixed¶
AttributeError: 'NoneType' object has no attribute 'get'inget_latest_version().
2.8.0¶
Added¶
clear_asyncio_queue()
Changed¶
Made the logic of
is_exchange_type()better readable.Type of parameter
stream_buffer_namein all methods.
Fixed¶
get_latest_version()KeyError.
Removed¶
Obsolete import
from __future__ import print_functioninsockets.py.
2.7.2¶
Fixed¶
Stream Data is always returned in
raw_dataformat. issue#380
2.7.1¶
Added¶
Parameter
footertoprint_summary(),print_summary_to_png()andprint_stream_info()
Changed¶
Improved text of
MaximumSubscriptionsExceededexception.Updated description text in all files.
Fixed¶
Import in
licensing_manager.py.Type of global
loggerandconnectvariable.
Security¶
Set higher minimum version
2.31.0forrequests, as vulnerabilities were found in earlier versions:CVE-2023-32681, Score: 6.1 (Medium)
Requests is a HTTP library. Requests has been leaking Proxy-Authorization headers to destination servers when redirected to an HTTPS endpoint. This is a product of how we use
rebuild_proxiesto reattach theProxy-Authorizationheader to requests. For HTTP connections sent through the tunnel, the proxy will identify the header in the request itself and remove it prior to forwarding to the destination server. However when sent over HTTPS, theProxy-Authorizationheader must be sent in the CONNECT request as the proxy has no visibility into the tunneled request. This results in Requests forwarding proxy credentials to the destination server unintentionally, allowing a malicious actor to potentially exfiltrate sensitive information. This issue affects versions 2.3.0 through 2.30.0.https://devhub.checkmarx.com/cve-details/CVE-2023-32681/
Set higher minimum version
2.5.1forunicorn-binance-rest-apiare affected by vulnerabilities in used dependencies!Dependency
certifi:CVE-2023-37920, Score: 9.8 (High)
Certifi is a curated collection of Root Certificates for validating the trustworthiness of SSL certificates while verifying the identity of TLS hosts. Certifi 1.0.1 through 2023.5.7 recognizes “e-Tugra” root certificates. e-Tugra’s root certificates were subject to an investigation prompted by reporting of security issues in their systems. Certifi 2023.07.22 removes root certificates from “e-Tugra” from the root store.
https://devhub.checkmarx.com/cve-details/CVE-2023-37920/
Dependency
cryptography:CVE-2023-38325, Score: 7.5 (High)
The cryptography package versions prior to 41.0.2 for Python mishandles SSH certificates that have critical options.
https://devhub.checkmarx.com/cve-details/CVE-2023-38325/
CVE-2023-49083, Score: 7.5 (High)
Cryptography is a package designed to expose cryptographic primitives and recipes to Python developers. Calling
load_pem_pkcs7_certificatesorload_der_pkcs7_certificatescould lead to a NULL-pointer dereference and segfault. Exploitation of this vulnerability poses a serious risk of Denial of Service (DoS) for any application attempting to deserialize a PKCS7 blob/certificate. The consequences extend to potential disruptions in system availability and stability. This issue affects versions 3.1 through 41.0.5.https://devhub.checkmarx.com/cve-details/CVE-2023-49083/
CVE-2023-50782, Score: 7.5 (High)
A flaw was found in the python cryptography package versions prior to 42.0.0. This issue may allow a remote attacker to decrypt captured messages in TLS servers that use RSA key exchanges, which may lead to exposure of confidential or sensitive data. This issue is an incomplete fix of CVE-2020-25659.
https://devhub.checkmarx.com/cve-details/CVE-2023-50782/
CVE-2024-26130, Score: 7.5 (High)
cryptography is a package designed to expose cryptographic primitives and recipes to Python developers. Starting in version 38.0.0 and prior to version 42.0.4, if
pkcs12.serialize_key_and_certificatesis called with both a certificate whose public key did not match the provided private key and anencryption_algorithmwithhmac_hashset (viaPrivateFormat.PKCS12.encryption_builder().hmac_hash(...), then a NULL pointer dereference would occur, crashing the Python process. This has been resolved in version 42.0.4, the first version in which aValueErroris properly raised.https://devhub.checkmarx.com/cve-details/CVE-2024-26130/
Dependency
requests:CVE-2023-32681, Score: 6.1 (Medium)
Requests is a HTTP library. Requests has been leaking Proxy-Authorization headers to destination servers when redirected to an HTTPS endpoint. This is a product of how we use
rebuild_proxiesto reattach theProxy-Authorizationheader to requests. For HTTP connections sent through the tunnel, the proxy will identify the header in the request itself and remove it prior to forwarding to the destination server. However when sent over HTTPS, theProxy-Authorizationheader must be sent in the CONNECT request as the proxy has no visibility into the tunneled request. This results in Requests forwarding proxy credentials to the destination server unintentionally, allowing a malicious actor to potentially exfiltrate sensitive information. This issue affects versions 2.3.0 through 2.30.0.https://devhub.checkmarx.com/cve-details/CVE-2023-32681/
2.7.0¶
Added¶
Exception
MaximumSubscriptionsExceededthrown bysubscribe_to_stream().print_summary()andprint_stream_info()now displaybinance_api_status_codein color! Green at 200 otherwise red.
Changed¶
subscribe_to_stream()now throws the exceptionMaximumSubscriptionsExceededinstand of returningFalseif
the number of allowed subscriptions per stream is exceeded.
Fixed¶
Typing of
create_stream()parameters.Type of parameter
stream_labelinget_stream_id_by_label().Type of first return variable in
restclient.get_listen_key().Typo in
is_update_availabe_unicorn_fy()tois_update_available_unicorn_fy().Typo in
is_update_availabe_check_command()tois_update_available_check_command().A couple of small text typos.
2.6.0¶
Added¶
Better Logging to investigate issue#374
send_with_stream()- Send a payload with a specific stream.Since UBWA is delivered as a compiled C extension, IDEs such as Pycharm and Visual Code cannot use information about available methods, parameters and their types for autocomplete and other intellisense functions. As a solution, from now on stub files (PYI) will be created in the build process and attached to the packages. The IDEs can automatically obtain the required information from these.
Changed¶
Replaced all calls of
add_payload_to_stream()inmanager.py,api.pywithsend_with_stream().Calling
set_socket_is_not_ready()insockets.__aexit__().Consistent use of
stream_list_lockand replacement ofstream_threading_lockbystream_list_lockinmanager.py.
2.5.0¶
Functionally, nothing changes with this update. However, there are now sensible error messages if errors occur in the
code of the process_asyncio_queue-coroutine.
Added¶
Solved
Tracebacks of process_asyncio_queue-coroutinesissue#375
2.4.0¶
Optimization of the performance and revision of the life support of the ListenKey.
Changed¶
The management methods are no longer started individually in threads but together in an event loop in ‘run()’. By switching from threads to AsyncIO tasks, some
time.sleep()could be replaced byasyncio.sleep()
Fixed¶
In
_run_sockets()time.sleep()was mistakenly used instead ofasyncio.sleep().Keeping the ListenKey alive has been revised and now runs as an asyncIO task in the event loop of the stream. In the event of an exception due to an IP ban, the time window until the ban is lifted is extracted from the Binance response and now waits until then to continue. issue#330
Added exception handling for
TypeErrortosubscribe_to_stream()andunsubscribe_from_stream().
2.3.0¶
Redesign and rewrite of connection.py, sockets.py as well as the loop and exception handling in manager.py and
support for await get_stream_data_from_asyncio_queue(stream_id).
Runs perfectly on Python 3.7 to 3.12 on Windows, Linux and Mac!
Added¶
ubwa.api.get_listen_key()Unit tests for python 3.7 to 3.12, extension of the tests.
Support and use of an
asyncio.queue(). The parameter “process_asyncio_queue” forBinanceWebSocketApiManager()andcreate_stream()can be passed an async function, which is automatically added to the event loop of the websocket as an async task. Received websocket data can be conveniently awaited withawait get_stream_data_from_asyncio_queue(stream_id)as an AsyncIO alternative topop_stream_data_from_stream_buffer(). This is probably the smartest way to process data from the websocket and should be preferred to the stream_buffer and the callback function.is_socket_ready()
Changed¶
Updated from websockets 10.4 to 11.0.3.
pop_stream_data_from_stream_buffer()returnsNoneinstead ofFalseThe parameter
throw_exception_if_unrepairablewas removed by the UBWA Manager and replaced by the stream_signalSTREAM_UNREPAIRABLE.
Info: https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/wiki/%60stream_signals%60Many
Falsevalues have been changed toNonevalues in accordance with Python conventions.shutdown_asyncgens()to_shutdown_asyncgens()run_socket()to_run_socket()_auto_data_cleanup_stopped_streams()now performs a check every 60 seconds and deletes the data from streams that have been stopped for more than 900 seconds.datetime.utcfromtimestamp(stream_info['start_time']).strftime('%Y-%m-%d, %H:%M:%S UTC'))is obsolete and has been replaced bydatetime.fromtimestamp(timestamp, timezone.utc).strftime('%Y-%m-%d, %H:%M:%S UTC').Renamed
stop_stream_as_crash()with_crash_stream()Renamed
is_stop_as_crash_request()withis_crash_request()Renamed
stream_is_crashing()with_stream_is_crashing()Renamed
stream_is_stopping()with_stream_is_stopping()
Fixed¶
In Websocket API wrong method names were used in logging.
Logging info in
connection.pyrevised.ubwa.api.get_open_orders()can now be used without thesymbolparameter to query all open orders.Completely revised the error handling.
Removed¶
Parameter
throw_exception_if_unrepairableofBinanceWebSocketApiManager().Exception
StreamRecoveryError.set_restart_request()_restart_stream()_keepalive_streams()kill_stream()
2.2.0¶
This update is primarily aimed at stabilization. The loop management has been improved and runs absolutely fine in tests!
unicorn-binance-websocket-api can now also be installed on all architectures on which there are no precompiled
packages from LUCIT. PIP now automatically recognises whether there is a suitable precompiled package and if not,
the source is automatically compiled on the target system during the installation process with Cython. Even if you
don’t have to do anything special, please note that this process takes some time!
Added¶
Parameter
process_stream_data_asyncinmanager.pytoBinanceWebSocketApiManager()as global setting parameter and tocreate_stream()as stream specific parameter. This means it is possible to provide a global and a stream specific asyncio function as “process_stream_data” function.Support for
process_stream_data_asyncandspecific_process_stream_data_async[stream_id]tosocket.py.Support for
with-contexttoBinanceWebSocketApiSocket().run_socket()tomanager.py.shutdown_asyncgens()tomanager.py.timeoutparameter (float) todelete_stream_from_stream_list(),wait_till_stream_has_stopped()andwait_till_stream_has_started()with default value 10.0 seconds.Automatic data cleanup of stopped web streams. issue#307 The UBWA Manager can be informed via the parameter
auto_data_cleanup_stopped_streams=Truethat all remaining data within the UBWA of a stopped stream should be automatically and completely deleted (duration 60 sec). Default value isFalse. Also added the functionremove_all_data_of_stream_id()and_auto_data_cleanup_stopped_streams()which are doing the cleaning up job.
Changed¶
Parameter
process_stream_datainmanager.pyfromFalsetoNone.Parameter
process_stream_signalsinmanager.pyfromFalsetoNone.Usage of
BinanceWebSocketApiSocket()inmanager.pyby using the newwith-contextandubwa.run_socket()to close every websocket connection when leaving.Now using
wait_till_stream_has_stopped()indelete_stream_from_stream_list(). This avoids many errors ;)Rewrite of the
try-exceptand thefinallycode part for the loop handling in_create_stream_thread().
Fixed¶
Missing
awaitofwebsocket.close()insocket.py.Event loops were not closed in rare situations. Adjustments to
_create_stream_thread(),create_stream()and_restart_stream()In
connection.pysys.exit()statements were used within an asyncio loop, this prevented the correct closing of the asyncio loops in rare cases and was replaced byreturn False.
Removed¶
import sysinsockets.py
2.1.4¶
Added¶
Websocket API:
create_order()andcreate_test_order()- Support of parameterquoteOrderQty, Behavior: If activated, it replaces thequantityparameter.
Fixed¶
2.1.3¶
Fixed¶
Troubleshooting restart problems
manager.delete_listen_key_by_stream_id()usedFalseinstead ofNone
2.1.2¶
Fixed¶
RuntimeError: dictionary changed size during iterationinmanager.stop_manager().Stopping
manager._restart_stream()if manager is stopping.
2.1.1¶
Changed¶
Rewrite of
restclient.pyand implementing usage of**paramswithUBRA.FalseandNonewas used incorrectly in some cases, this has been unified.
Fixed¶
manager.wait_till_stream_has_stopped()
2.1.0¶
Added¶
Handling of not retrieved error messages in AsyncIO loops
Debug mode for AsyncIO tasks
manager.stop_manager()alias formanager.stop_manager_with_all_streams()Support for
with-context
Fixed¶
Exceptions in
socket.start_stocket() coroutine and replacedsys.exit()withreturn False`AsyncIO Loop handling and closing
Graceful shutdown in exception
UnknownExchangemanager.wait_till_stream_has_started()
2.0.0¶
Added¶
Support for Python 3.11 and 3.12
Integration of the
lucit-licensing-pythonlibrary for verifying the UNICORN Binance Suite license. A license can be purchased in the LUCIT Online Shop: https://shop.lucit.services/software/unicorn-binance-suiteLicense change from MIT to LSOSL - LUCIT Synergetic Open Source License: https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/blob/master/LICENSE
Conversion to a C++ compiled Cython package with precompiled as well as PyPy and source code wheels.
Setup of a “Trusted Publisher” deployment chain. The source code is transparently packaged into wheels directly from the GitHub repository by a GitHub action for all possible platforms and published directly as a new release on GitHub and PyPi. A second process from Conda-Forge then uploads it to Anaconda. Thus, the entire deployment process is transparent and the user can be sure that the compilation of a version fully corresponds to the source code.
Changed¶
Added
@staticmethodto many static mehtods.
Fixed¶
Typos and formatting
Shadow of a Python built-in in
manager.get_human_bytesize():bytestoamount_bytesmanager.get_new_uuid_id()returned not str()
1.46.2¶
Fixed¶
Issue in
api.get_exchange_info(): https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/issues/346
1.46.1¶
Fixed¶
Issue with separation of spot and margin accounts: https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/issues/331
1.46.0¶
Added¶
get_the_one_active_websocket_api()to manger.pyLogging to
get_stream_id_by_label()process_responseparameter toubwa.apimethods to provide specific callback functions for specific responsesreturn_responseparameter toubwa.apimethods to let the used method wait till the requested data is received via websocket, and then it returns it.
Changed¶
Use UnicornFy only for non api requests in sockets.py - if
output="UnicornFy"is used for api then its just converted to a python dict.ubwa.apimethods do not need astream_id/stream_labelif there is only one valid websocket api. (Self-discovery of uniquely identifiable websocket api streams if nostream_idorstream_labelwas specified for identification.)Renamed
ubwa.api.test_create_order()toubwa.api.create_test_order()Entire WS API implementation reworked
Fixed¶
Support for
new_client_order_idincreate_test_order()Get listenKey from Binance API for futures and coin futures userData stream
Removed¶
jex.com support
1.45.2¶
Fixed¶
Python 3.7+ Support
Renamed¶
ws_api.py to api.py
1.45.1¶
Changed¶
Revised ws_api.py …. Websocket API is still BETA and not fully ready!! Please share your experience and ideas to improve the implementation: https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/issues/319
1.45.0¶
Added¶
This is the first code part to support the new Binance Websocket API issue#319:
WEBSOCKET_API_BASE_URIto connection_settings.py and added URI for spot and testnet:wss://ws-api.binance.com/ws-api/v3andwss://testnet.binance.vision/ws-api/v3Upgraded
print_stream_info()to show if a userData stream is a Websocket API stream or not.New methods to manager.py
get_timestamp(),generate_signature(),order_params(),add_payload_to_streamws_api.py to provide Binance websocket api functions in
ubwa.api.method(stream_id=stream_id).ubwa.api.cancel_open_orders()ubwa.api.cancel_order()ubwa.api.create_order()ubwa.api.get_account_status()ubwa.api.get_exchange_info()ubwa.api.get_open_orders()ubwa.api.get_order()ubwa.api.get_order_book()ubwa.api.get_server_time()ubwa.api.ping()
Changed¶
create_stream(channels=[], markets=[])initiated as lists and are not mandatory anymore to enable the use of parameterapito create a Websocket API stream.
1.44.1¶
Added¶
Passing the variable
warn_on_updateto UBRA
Fixing¶
Saving
binance_api_statusupdate indelete_listen_key()andkeepalive_listenkey()did not work after the integration of UBRA
1.44.0¶
Added¶
BinanceRestApiManager()- New parameter:socks5_proxy_userandsocks5_proxy_passDependency
unicorn-binance-rest-apitosetup.py,requirements.txt,environment.ymland conda feedstock recipesocks5_proxy_userandsocks5_proxy_passtoBinanceWebSocketApiManagerFull SOCKS5 Proxy support to REST API in
get_listen_key(),keepalive_listen_key()anddelete_listen_key()Show proxy info in
print_summary()andprint_stream_info()
Changed¶
restclient.pynow relies onunicorn-binance-rest-api>=1.8.0. REST config removed inconnection_settings.pyStructure of
CONNECTION_SETTINGS
Fixed¶
RuntimeError: dictionary changed size during iteration in manger.py line 788, https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/commit/f189b9a8420133ffe34e9c9948e461a06d92f0a2
keepalive_listen_key()anddelete_listen_key()for isolated marginActivated functionality of
restful_base_uriin rest clientSOCKS5 proxy support only worked with one stream. Now it works with multiple streams.
Removed¶
restful_path_userdatafromBinanceWebSocketApiManager
1.43.3¶
Fixed¶
Restore backward compatibility Python >= 3.7 issue#311
1.43.2¶
Changed¶
Remove “Assignment Expressions in f-strings” to restore Python Support 3.7+.
Fixed¶
Added whitespace between left “=” and title in first line of
manager.print_summary()output.
1.43.1¶
Fixed¶
Fix typo “bug” in dependencies of setup.py
1.43.0¶
Added¶
Official support for Python 3.11
Socks5 proxy support for websocket only:
socks5_proxy_serverandsocks5_proxy_ssl_verificationand exceptionSocks5ProxyConnectionError- Currently, no REST support forlistenKey(needed for userData streams), this will be added later after the next UBRA update!Logging to
manager.wait_till_stream_has_started()Logging to
manager.wait_till_stream_has_stoped()Added PR#305 of issue#304 thx to @dima-dmytruk23: New parameters to override connection settings to
BinanceWebSocketApiManager:websocket_base_uri,max_subscriptions_per_stream,restful_base_uri,restful_path_userdata,exchange_type
Changed¶
“binance.com-coin-futures” to choose coin futures is deprecated. Use “binance.com-coin_futures” instead!
Fixed¶
Better “stop” measuring in
manager.wait_till_stream_has_stoped()discussion#279
1.42.0¶
Added¶
Parameter
delete_listen_keytostop_stream(), so it’s possible to disable the deletion of thelisten_key
Changed¶
Fixed¶
socket.py typo in
unicorn_fy.trbinance_com_websocket()manager.get_stream_buffer_byte_size()avoid division by zero error“Stream data not udpated after got event “listenKeyExpired” issue#275
1.41.0¶
Added¶
debug(bool) parameter toBinanceWebSocketApiManager()manager.get_debug_log()manager.set_socket_is_ready()manager.set_socket_is_not_ready()_handle_task_result()- a callback for eventtasks to retrive exceptions from within the asyncio loop.
Changed¶
get_new_stream_id()toget_new_uuid_id()Improved exception handling and restarts. This should have also positive effects to exection handling within the callback functions.
Fixing¶
AsyncIO implementation and a temporary workaround for stopping userData streams
TRBinance replaced old URL
stream.binance.ccby the new URLstream-cloud.trbinance.comissue#249
1.40.7¶
Codebase equal to 1.40.5, testing azure pipe
Changed¶
Exclude
toolsfolder from package
1.40.6¶
Codebase equal to 1.40.5, just preparing conda-forge packaging
1.40.5¶
Fixed¶
Restart of error
sent 1011 (unexpected error) keepalive ping timeoutin sockets.py
1.40.4¶
Changed¶
Rebalanced default ping interval and timeout as well as closing timeout
Removed¶
Passing of
stream_buffer_name=stream_buffer_nametospecific_process_stream_data()
1.40.3¶
Changed¶
Not catching general eception anymore - we must catch the specific exceptions: https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/blob/324f9fa191608946fb2973acc7de484e15f5030a/unicorn_binance_websocket_api/sockets.py#L220
Fixed¶
Catch KeyError before the general exception in sockets to give better feedback within the callback function.
Error in coroutine loop handling
1.40.2¶
Changed¶
default ping interval and timeout
Fixed¶
TypeErrorinprint_summary()typo in
print_summary()titletextCallback implementation of
create_stream()
1.40.1¶
test release
1.40.0¶
Added¶
close_timeout_default,ping_interval_default,ping_timeout_defaultsocket_is_readysystem to_restart_stream()process_stream_dataparameter for callback function tocreate_stream()high_performanceparameter to makecreate_stream()a non blockingtitletoprint_summary()andprint_stream_info()
Fixed¶
BinanceWebSocketApiManager.stop_stream()doesn’t stop the stream immediately issue#161
1.39.0¶
Changed¶
Send the
DISCONNECTstream_signal only on status change (one time!) and if previous status is not None
Fixed¶
KeyError in
get_listen_key_from_restclient()ifstream_idinvalidAdded
socket_is_readytostream_is_crashing()
1.38.1¶
Fixed¶
Websocket fails to reconnect issue#131
1.38.0¶
Added¶
is_stream_signal_buffer_enabled()
1.37.2¶
Fixed¶
stream_is_crashing()did not send stream_signalDISCONNECT- Without this fix no stream_signal was sent in some disconnect cases!
Changed¶
Replaced the time.sleep() in create_stream with self.socket_is_ready system
1.37.1¶
Fixed¶
Catching
KeyErrorinmanager.get_stream_buffer_length()if buffer_name not exits
1.37.0¶
Added¶
get_stream_buffer_length()can now return the size of all stream_buffers and also of a specific stream_buffer.
Changed¶
Bump websockets from 10.1 to 10.2 PR#237
1.36.1¶
Fixed¶
UnboundLocalError: local variable ‘error_msg’ referenced before assignment in sockets.py line 209 reported in issue#235
Avoid error 2 of this post: https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/issues/131#issuecomment-1042747365
1.36.0¶
Changed¶
removed “unicorn_binance_websocket_api_”-part of the module file names (more info: Discussions)
renamed logger name of all modules to “unicorn_binance_websocket_api”, in the implementation of PR#223 every module has had its own logger name.
1.35.0¶
Added¶
manager.get_new_stream_id()to avoid security alerts like “CodeQL py/clear-text-logging-sensitive-data”
Changed¶
Fixed¶
asyncio.TimeoutError issue#221
Removed¶
Support for the new compression feature introduced in websockets10.0 because the new feature is removed in further websockets versions
1.34.2¶
Changed¶
“binance.com-coin-futures” to “binance.com-coin_futures”
Fixed¶
fix “Default argument value is mutable” error of
subscribe_from_stream()No data received from binance.com-coin-futures with websockets==10.0 issue#208
1.34.1¶
Added¶
Exception handling for
websockets.exceptions.NegotiationErrorin connection class.
Changed¶
Logging of
restclient._request()
Fixed¶
No data received from binance.com-futures with websockets==10.0 issue#199
1.34.0¶
Changed¶
Bump websockets from 9.1 to 10.0 - Drop support for Python 3.6, added support for Python 3.10! PR#195
1.33.1¶
Added¶
Logging websockets version on start up (logging level: INFO)
Changed¶
print_summary()“most” to “peak”.
Fixed¶
More accurate measurement of the received data quantity.
1.33.0¶
Added¶
process_stream_signalscallback support issue#160
Changed¶
self.stream_signal_bufferis not a list anymore, it’s changed tocollections.deque()
1.32.0¶
Now stream_buffer can be used as FIFO or LIFO stack, and it’s possible to define a max length for it.
Added¶
clear_stream_buffer()to delete all items on thestream_bufferstack.get_stream_buffer_maxlen()to get themaxlenvalue of the stack.Support for
stream_buffer_maxlenin methods ofBinanceWebSocketApiManager()class_create_stream_thread(),print_stream_info(),__init__(),_add_stream_to_stream_list(),_create_stream_thread(),create_stream(),replace_stream().Support for FIFO and LIFO in
pop_stream_data_from_stream_buffer(mode="FIFO")
Changed¶
get_used_weight()replacesget_binance_api_status()self.stream_bufferandself.stream_buffer[xxx]are not lists anymore, their type has changed tocollections.deque()
1.31.0¶
Added¶
Changed¶
Bump websockets from 8.1 to 9.1 PR#176
Fixed¶
Removed¶
binance.je support (Binance Jersey has ceased operations.)
1.30.0¶
Added¶
get_event_loop_by_stream_id()disable_coloramainBinanceWebSocketApiManager(): This is needed to make ubwa compatible with SwiftBar
Changed¶
The asyncio event loop is now saved to
self.stream_list[stream_id]['event_loop']added
delete_listen_key_by_stream_id()tostop_stream()issue#161
1.29.0¶
Added¶
General Exceptionhandling instart_socket()PR#142 thx @gronastech and @lordofserenitySupport for trbinance.com Websockets
Fixed¶
UnboundLocalError: local variable 'market' referenced before assignmentincreate_websocket_uri()PR#142 thx @gronastech and @lordofserenity
1.28.0¶
Changed¶
the stream signal
DISCONNECTincludeslast_received_data_recordwhich returns nowNoneif there is no record available
Fixed¶
Cannot use
inwith RuntimeError, must convert to string first. PR#136 thx @Bosma
Removed¶
Deprecated methods
set_private_api_config()andget_websocket_uri_length()
1.27.0¶
Added¶
timeout=10toget_result_by_request_id(): Wait fortimeoutseconds to receive the requested result or returnFalselogging the use of stream_buffer or process_stream_data and the used OS plattform
individual
max_subscriptions_per_streamfor each endpointstream_signal_bufferto receive signals if a stream gets connected or disconnectedSupport for stream signals:
CONNECT,DISCONNECT,FIRST_RECEIVED_DATA
Changed¶
max subscriptions of futures endpoints to 200 issue#127
max subscriptions of jex endpoint to 10
Fixed¶
Added a gracefull shutdown if the Python interpreter dies issue#131
1.26.0¶
Added¶
parameter
ping_interval,ping_timeout,close_timeouttomanager.create_stream()andreplace_stream()show
ping_interval,ping_timeout,close_timeoutinprint_stream_info()manager.set_heartbeat()toconnection.send()
Changed¶
log warning about high cpu usage is logged after 5 seconds if > 95%
1.25.0¶
Added¶
Changed¶
get_stream_subscriptions()returns now the usedrequest_idinstead ofTrue
1.24.0¶
Added¶
output_defaulttoBinanceWebSocketApiManager
Removed¶
unused import of
ujsonin connection class4 parameters from
_create_stream_thread
1.23.0¶
Added¶
timestamp to
receiving_speed_peakin managerlog warning if the cpu usage is > 95%
logging.info if new
highest_receiving_speedis reached
Fixed¶
listen_keywas printed to logfileslisten_keycache time was not set inget_listen_key()so it pinged immediately after its creation again, which caused a higher weightrestart stream if “The future belongs to a different loop than the one specified as the loop argument” issue#121
Changed¶
renamed
_add_socket_to_socket_listto_add_stream_to_stream_list
1.22.0¶
Added¶
get_current_receiving_speed_global()better logging in socket class
highest_receiving_speedinprint_summary()
Changed¶
renamed variable
ubwatomanagerin restclient classrenamed variable
unicorn_binance_websocket_api_managertomanagerin socket classrenamed variable
total_receiving_speedtoaverage_receiving_speedrenamed variable
unicorn_binance_websocket_api_connectiontoconnectionrenamed variable
unicorn_binance_websocket_api_sockettosocketshorted user agent string for rest and websocket client
Removed¶
removed the sending of the payload in aenter in connection class, from now on its only done in the socket class!
1.21.0¶
Added¶
is_update_availabe_unicorn_fy()andget_version_unicorn_fy()new_outputtoreplace_stream()
Changed¶
Rewrite of
BinanceWebSocketApiRestclient(), its more or less stateless but compatible to the current system. Now we use one instance globally instead of creating a new one every time we need it. It will help to implement isolated margin with more than one symbol. issue#111time.sleep()in_frequent_checks()from 0.1 to 0.3 seconds
Fixed¶
RuntimeErrorexception in_create_stream_thread()- no handling added, only logging and a “Todo”
1.20.0¶
Added¶
dicttocreate_stream(output='dict')
Fixed¶
StreamBuffer reset on restart issue#119
1.19.0¶
Added¶
Changed¶
Links in docstrings
1.18.2¶
Fixed¶
added KeyError exception and
return Falseto a few methodsbinance endpoints expects
symbolnotsymbolsRuntimeException in
close()
1.18.1¶
Fixed¶
restclient:
symboltosymbols
1.18.0¶
Added¶
binance.com testnets (spot, margin, isolated_margin, future)
show_secrets_in_logsparameter
Changed¶
symboltosymbols(isolated_margin)
Fixed¶
update
binance_api_status
1.17.4¶
Added¶
replace_stream(): new_stream_label=None, new_stream_buffer_name=False, new_symbol=False, new_api_key=False, new_api_secret=False
Fixed¶
reconnect counter (bug since 1.17.0)
1.17.3¶
Fixed¶
1.17.2¶
Added¶
Handling of unknown error msg from Binance if uri = dict in connection class
1.17.1¶
Fixed¶
reference of api_key and secret in connection class
1.17.0¶
Added¶
Isolated margin endpoints issue #109
Support for
@arr@@s1issue #101Added
symboltoprint_stream_info()Added
api_keyandapi_secrettocreate_stream()issue #84
1.16.9¶
Added¶
Restart to ssl.SSLError exception in connection
Removed¶
error 2 code PR #98 (Thanks Flowelcat)
1.16.7¶
Added¶
Restart again if OSError in
BinanceWebSocketApiConnection()
Changed¶
Logging in
BinanceWebSocketApiConnection()
1.16.6¶
Changed¶
Loglevels
Fixed¶
1.16.5¶
REMOVED
1.16.4¶
Changed¶
Loglevels
Fixed¶
Fixed double slash bug when getting listen key for userDataStream. PR #87
Fixed RuntimeError in connection row 243 (added restart)
1.16.3¶
Fixed¶
restart if “with connection” in socket gets closed
exception json.decoder.JSONDecodeError: respond = request_handler.json()
1.16.2¶
Fixed¶
Exception AttributeError Info: module ‘asyncio.base_futures’ has no attribute ‘InvalidStateError’ issue #72
1.16.1¶
Fixed¶
exception in
print_suammary()
1.16.0¶
Added¶
stream_buffer control: create_stream(channels, markets, stream_buffer_name=None): If
Falsethe data is going to get written to the default stream_buffer, set toTrueto read the data viapop_stream_data_from_stream_buffer(stream_id)or provide a string to create and use a shared stream_buffer and read it viapop_stream_data_from_stream_buffer('string').add_to_ringbuffer_error()add_to_ringbuffer_result()set_ringbuffer_error_max_size()set_ringbuffer_result_max_size()get_errors_from_endpoints()get_results_from_endpoints()get_ringbuffer_error_max_size()get_ringbuffer_result_max_size()
Changed¶
renamed
restart_stream()to_restart_streamand execute it only with a valid restart_request
Fixed¶
Ensure that during a restart, only the recent thread is able to send the payload for subscription
1.15.0¶
Added¶
psutil (new requirement)
exception handling of
websockets.exceptions.InvalidMessageissue #72general exception handling
show threads, memory and cpu usage in
print_summary()get_process_usage_memory()get_process_usage_cpu()get_process_usage_threads()
Fixed¶
Close WS only if open in connection class row 190 issue #72
Removed¶
some code in connection row 206 which is not needed anymore and is causing a coroutine error
is_websocket_uri_length_valid()
1.14.0¶
Added¶
new parameter
stream_labelinmanager.create_stream()issue #60manager.get_stream_label()issue #60manager.get_stream_id_by_label()issue #60manager.set_stream_label()issue #60added
stream_labeltomanager.print_stream_info()issue #60added
stream_labeltomanager.print_summary()issue #60manager.help()unicorn_binance_websocket_api_exceptions.pywith exceptionStreamRecoveryErrorandUnknownExchangefill_up_space_right()self.restart_timeout
Changed¶
raising
UnknownExchangeorStreamRecoveryErrorinstead ofValueErrorfill_up_space()tofill_up_space_left()
Fixed¶
reset the payloads of a stream at a stream restart
moved some code for a stream restart from
_keepalive_streams()torestart_stream()which caused that the direct call ofrestart_stream()worked only inside of_keepalive_streams()handling of
RuntimeWarningin class connection at row 189
Removed¶
code to start new
_keepalive_streams()and_frequent_checks()threads
1.13.0¶
Added¶
disable_printinprint_summary()pull #48print_summary_export_path- if provided, the lib is going to export the output ofprint_summary()to a PNG image.get_number_of_all_subscriptions()and show all subscriptions number inprint_summary()
Fixed¶
1.12.0¶
RECOMMENDED UPDATE!¶
https://github.com/binance-exchange/binance-official-api-docs/blob/5fccfd572db2f530e25e302c02be5dec12759cf9/CHANGELOG.md#2020-04-23
Added¶
avoid sending more than 5 messages per stream per second issue #45
stop streams and set status to “crashed” if they exceed the limit of 1024 subscriptions per stream issue #45
is_stop_as_crash_request()stop_stream_as_crash()
get_limit_of_subscriptions_per_stream()get_number_of_free_subscription_slots()BinanceWebSocketApiManager(throw_exception_if_unrepairable=True)- raiseStreamRecoveryErrorif a stream is not repairable (invalid api-key format or exceeding the 1024 subscription limit)
Changed¶
loglevel
connection.send()loglevels from error to critical.loglevel
manager.create_websocket_uri()of known errors from error to critical.
Fixed¶
OSErrorexception forself.monitoring_api_server.start()if its already startedfor keepalive_streams_id in self.keepalive_streams_list:added threadding lock (issue #47)
1.11.0¶
Added¶
binance jex
Changed¶
dependency websockets from 7.0 to 8.1 which needs python>=3.6.1 (issue #11)
Fixed¶
expception handling of send() (issue #43)
thread lock for
frequent_checks_list(comment #590914274)current_receiving_speeddid not reset to 0 if all streams are offline
1.10.6¶
Added¶
fill_up_space_centered()
update check on manager start
Changed¶
print_stream_info() and print_summary(): unicorn-binance-websocket-api_
-python_ in top boarder row count subscriptions
Fixed¶
lower for cex and upper for dex with exceptions for arr, $all, ! and array channels
1.10.5¶
Fixed¶
lower()markets increate_payload()and exception for!userDataget_active_stream_list() took len() of false item
reconnect handling in send() (issue #40)
1.10.4¶
Changed¶
making
self.stream_bufferthread safe
1.10.3¶
Changed¶
removed simplejson exception in restclient
set OSError from error to critical
1.10.2¶
Fixed¶
['receives_statistic_last_second']dict is changing size during iteration. (issue #37)
1.10.1¶
Changed¶
Using ujson instead of stock json lib
cleaning
create_payload()for CEX
1.10.0¶
Important infos, please read!¶
Added¶
unicorn_binance_websocket_api_manager.is_exchange_type()support for subscribe/unsubscribe for CEX websockets
unicorn_binance_websocket_api_manager.get_stream_subscriptions()unicorn_binance_websocket_api_manager.increase_transmitted_counter()and added output toprint_summary()andprint_stream_info()split_payload()
Changed¶
The 8004 char limit for URIs on websocket connect is bypassed via subscriptions with websocket.send() and
is_websocket_uri_length_valid()allways returnsTruenow!
Fixed¶
1.9.1¶
Added¶
Python version in print_stream_info() and print_summary()
Fixed¶
Typo in text string
1.9.0¶
Added¶
Endpoints for www.binance.com margin UserData listenkey (issue #35)
Changed¶
1.8.2¶
Fixed¶
Errors when creating private DEX streams (issue #34)
1.8.1¶
Changed¶
Moved docs to GitHub pages
1.8.0¶
Added¶
binance.com Futures websocket support and example_binance_futures.py and example_bookticker.py (issue#32)
1.7.0¶
Added¶
binance.us websocket support and example_binance_us.py (issue#22)
1.6.6¶
Fixed¶
Trailing / is no longer accepted by the endpoints: https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/issues/31
1.6.5¶
Fixed¶
‘websockets>=7.0’ to ‘websockets==7.0’: Websockets 8 is released, and it seems to be not compatible
1.6.4¶
Added¶
Amount of active streams to icinga status msg
Fix¶
RuntimeError in _frequent_checks
1.6.3¶
Fix¶
‘except websockets.exceptions.InvalidStatusCode as error_msg:’ moved to right place
1.6.2¶
Fix¶
‘except websockets.exceptions.InvalidStatusCode as error_msg:’ in connnection line 97 with restart
‘except KeyError:’ in connection line 162
1.6.1¶
Fix¶
get_monitoring_status_plain(): exception for outdated UnicornFy
1.6.0¶
Added¶
is_update_availabe_check_command()
get_latest_version_check_command()
get_latest_release_info_check_command()
Changed¶
get_monitoring_status_plain()
get_monitoring_status_icinga()
_start_monitoring_api()
Removed!¶
https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/blob/master/tools/icinga/ (to https://github.com/oliver-zehentleitner/check_unicorn_monitoring_api)
1.5.0¶
Added¶
support for binance.org and testnet.binance.org websockets
exchange name to icinga status msg
binance_manager init: throw exception for unknown exchanges
get_current_receiving_speed()
exchange name and lib version to print_stream_info()
current_receiving_speed to print_summary() and print_stream_info()
get_exchange()
set_private_dex_config() (not in use for now)
subscribe_to_stream() - (dont use in productive! It’s not clean and will get rewritten and maybe change behaviour)
unsubscribe_from_stream() - (dont use in productive! It’s not clean and will get rewritten and maybe change behaviour)
_create_payload()
Changed¶
rewrite create_websocket_url():
a multiplex socket now returns false if it includes a single stream type like !userData, !Ticker or !miniTicker
added support for binance.org Binance Chain DEX
is_websocket_uri_length_valid() now always returns True for DEX websockets
1.4.0¶
Added¶
support for binance.je (Binance Jersey) websockets
logging on failure in
create_stream()add_stringinprint_summary()andprint_stream_info()warn_on_updateinget_monitoring_status_icinga(),get_monitoring_status_plain()andstart_monitoring_api()support for binance jersey https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/issues/21
show the used exchange in
print_summary()andprint_stream_info()
Fixed¶
removed space from
total_received_lengthinget_monitoring_status_icinga()to avoid ‘no data’ error in ICINGA
1.3.10¶
Added¶
exception for
asyncio.base_futures.InvalidStateErrorby DaWe35 https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/issues/18
Changed¶
create_stream() returns False if websocket URL is too long
Fixed¶
is_websocket_uri_length_valid()to work with !userData on the pre-test increate_stream()without api secrets
1.3.9¶
Changed¶
Docstrings for
marketsandchannelsto support: str, tuple, list, setFine-tuning of perfdata output in
get_monitoring_status_plain()andget_monitoring_status_icinga()
1.3.8¶
Added¶
get_stream_buffer_length()by DaWe35 https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/pull/12
Fixed¶
the
stream_bufferFIFO stack was a LIFO stack (Thanks to DaWe35 for recognizing and fixing this issue https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/pull/12)get_stream_buffer_byte_sizereturns now the real size of the stream_buffer
1.3.7¶
Changed¶
added round received items to 2 decimals instead of 0
1.3.6¶
wrong version in manager class …
1.3.5¶
Added¶
is_manager_stopping()
Fixed¶
is_update_available returns False if github API is not available.
1.3.4¶
Changed¶
get_monitoring_status_icinga(): update check
1.3.3¶
Added¶
get_monitoring_status_icinga(): reconnects and update check
get_monitoring_status_plain()
start_monitoring_api()
1 hour cache for release checks on GitHub
stop_monitoring_api()
Rewrite¶
./tools/icinga/check_binance_websocket_api_manager (check_command for ICINGA)
Changed¶
example_monitoring.py
1.3.2¶
Added¶
example_monitoring.py and tools/check_binance_websocket_api_manager
get_monitoring_status_icinga tests for available updates and changes the
return_codeto WARNING if an update is available. but I recognized an API ban from GitHub in cause of too many requests. I have to extend it …
Changed¶
get_monitoring_status_icinga: changed
statusdict node toreturn_code
1.3.1¶
Changed¶
changing output of get_monitoring_status_icinga
1.3.0¶
Added¶
get_monitoring_status_icinga() in manager class
1.2.8¶
Added¶
lib version to print_summary()
Fixed¶
Typo in text in print_summary()
KeyError in manager class row 148
1.2.7¶
Fixed¶
Bug in class UnicornFy: kline_close_time had the value kline_start_time
Changed¶
Moved UnicornFy from UNICORN Binance WebSocket API to its own repository
connection handling (improved)
1.2.6¶
Fixed¶
marketsin keepalive listen_key can come as str or as list and the routine only handled it as list, now str gets converted to list to keep the function working
1.2.5¶
Added¶
“UTC” text to printed times
Fixed¶
listen_key 30 min cache
1.2.4¶
Added¶
method to delete a listen_key
binance_api_status added to print_stream_info()
Changed¶
README.md
1.2.3¶
Changed¶
rewrite coloring for status_code in print_summary
ping_interval from None to 20 seconds
Fixed¶
listen_key keepalive didnt work propper
1.2.2¶
Fixed¶
TypeError in print_summary()
1.2.1¶
Added¶
handling for status_code and used_weight from the binance REST Api (used for listen_key) - see
get_binance_api_status()
Fixed¶
reconnect issues
Changed¶
log levels
1.2.0¶
Changed¶
if no method is provided to BinanceWebSocketApiManager when creating the instance, then all data will be written to the stream_buffer.
comments and code in examples
1.1.20¶
Changed¶
show stream_buffer content if items len > 50
Removed¶
removed stream_buffer log
1.1.19¶
Change¶
renamed get_stream_data_from_stream_buffer to pop_stream_data_from_stream_buffer
Fixed¶
IndexError in pop_stream_data_from_stream_buffer
1.1.18¶
Removed¶
_forward_stream_buffer_data: system change - no pushing anymore, it’s better to buffer everything and run an import class in a separate thread, that is able to reconnect to the database
1.1.17¶
Changed¶
rewrite of keepalive and frequentchecks restarts
1.1.16¶
Changed¶
stream_buffer logging: log amount of items in buffer
1.1.15¶
Changed¶
stream_buffer logging: log amount of items in buffer
Fixed¶
added two macOS specific exceptions to connection class for better reconnect management
1.1.14¶
Fixed¶
updated the “update” methods in manager class (error handling while no internet connection)
trying other behaviour on “400 - bad request” error
added handling for -2015 error from get_listen_key_from_restclient in create_websocket_uri
1.1.13¶
Changed¶
changed the waiting time before setting a restart request on 400 error to 5 seconds in connection class
Fixed¶
replaced tabs in print_summary() with blanks
1.1.12¶
Fixed¶
KeyError in unicorn_binance_websocket_api_connection.py error exception 414
UnicornFy was very buggy with ticker and miniTicker handling
1.1.11¶
Fixed¶
KeyError in unicorn_binance_websocket_api_manager.py
1.1.10¶
Added¶
restarting streams row to print_summary()
show active restarting and stopped streams only if not 0
error message handling for userData streams
reconnect depends on disconnect reason now (network or api-settings)
Fixed¶
del restart request in stop_stream()
1.1.9¶
Fixed¶
!miniTicker and !userData didn’t work in cause of lower case all currencies. added an exception for them.
1.1.8¶
Added¶
pypi_install_packaging_tools.sh
Changed¶
README.md
Removed 2nd argument from binance_websocket_api_manager.stream_is_stopping()
Fixed¶
Tabs in print_summary() for windows platform
Fixing format errors from auto reformat in unicorn_binance_websocket_api_connection
1.1.7 failed build¶
1.1.6¶
Fixed¶
Catching “ssl.SSLError” BinanceWebSocketApiConnection.receive()
Improvment of reconnect on invalid URI caused by no network issue and a missing listen_key from Binance
1.1.5¶
Added¶
30 min cache for Binance “listenKey” from rest api to avoid weight costs and hammering the Binance API on a flapping network connection
Fixed¶
Reconnect issue on userData stream
Reset “has_stopped” attr from “stream_list” after a conncection restart
Modyfied docstrings descriptions
Tabs in print_summary() on windows

