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.
- fix "Default argument value is mutable" error of
subscribe_from_stream()
- Exception handling for
websockets.exceptions.NegotiationError
in connection class.
- Logging of
restclient._request()
- No data received from binance.com-futures with websockets==10.0 issue#199
- Bump websockets from 9.1 to 10.0 - Drop support for Python 3.6, added support for Python 3.10! PR#195
- Logging websockets version on start up (logging level: INFO)
print_summary()
"most" to "peak".
- More accurate measurement of the received data quantity.
process_stream_signals
callback support issue#160
self.stream_signal_buffer
is not a list anymore, its changed tocollections.deque()
Now stream_buffer
can be used as FIFO or LIFO stack and its possible to define a max length for it.
clear_stream_buffer()
to delete all items on thestream_buffer
stack.get_stream_buffer_maxlen()
to get the maxlen value of the stack.- Support for
stream_buffer_maxlen
in 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")
get_used_weight()
replacesget_binance_api_status()
self.stream_buffer
andself.stream_buffer[xxx]
are not lists anymore, their type has changed tocollections.deque()
- Added partial support for wss://dstream.binance.com - perpetual coin futures! PR#163 - Thanks to M3tz3l
- Bump websockets from 8.1 to 9.1 PR#176
- Exception Handling listen_key issue#143
- Unsubscribe_from_stream method doesn't handle uppercase symbols while subscribe_to_stream does issue#167
- binance.je support (Binance Jersey has ceased operations.)
get_event_loop_by_stream_id()
disable_colorama
inBinanceWebSocketApiManager()
: This is needed to make ubwa compatible with SwiftBar
- 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
General Exception
handling instart_socket()
PR#142 thx @gronastech and @lordofserenity- Support for trbinance.com Websockets
UnboundLocalError: local variable 'market' referenced before assignment
increate_websocket_uri()
PR#142 thx @gronastech and @lordofserenity
- the stream signal
DISCONNECT
includeslast_received_data_record
which returns nowNone
if there is no record available
- Cannot use
in
with RuntimeError, must convert to string first. PR#136 thx @Bosma
- Deprecated methods
set_private_api_config()
andget_websocket_uri_length()
timeout=10
toget_result_by_request_id()
: Wait fortimeout
seconds to receive the requested result or returnFalse
- logging the use of stream_buffer or process_stream_data and the used OS plattform
- individual
max_subscriptions_per_stream
for each endpoint stream_signal_buffer
to receive signals if a stream gets connected or disconnected- 'add_to_stream_signal_buffer()'
- 'pop_stream_signal_from_stream_signal_buffer()'
- Support for stream signals:
CONNECT
,DISCONNECT
,FIRST_RECEIVED_DATA
- max subscriptions of futures endpoints to 200 issue#127
- max subscriptions of jex endpoint to 10
- Added a gracefull shutdown if the Python interpreter dies issue#131
- parameter
ping_interval
,ping_timeout
,close_timeout
tomanager.create_stream()
andreplace_stream()
- show
ping_interval
,ping_timeout
,close_timeout
inprint_stream_info()
manager.set_heartbeat()
toconnection.send()
get_result_by_request_id()
- log warning about high cpu usage is logged after 5 seconds if > 95%
get_stream_subscriptions()
returns now the usedrequest_id
instead ofTrue
output_default
toBinanceWebSocketApiManager
- unused import of
ujson
in connection class - 4 parameters from
_create_stream_thread
- timestamp to
receiving_speed_peak
in manager - log warning if the cpu usage is > 95%
- logging.info if new
highest_receiving_speed
is reached
listen_key
was printed to logfileslisten_key
cache time was not set inget_listen_key()
so it pinged immediately after its creation again, which caused a higher weight- restart stream if "The future belongs to a different loop than the one specified as the loop argument" issue#121
- renamed
_add_socket_to_socket_list
to_add_stream_to_stream_list
get_current_receiving_speed_global()
- better logging in socket class
highest_receiving_speed
inprint_summary()
- renamed variable
ubwa
tomanager
in restclient class - renamed variable
unicorn_binance_websocket_api_manager
tomanager
in socket class - renamed variable
total_receiving_speed
toaverage_receiving_speed
- renamed variable
unicorn_binance_websocket_api_connection
toconnection
- renamed variable
unicorn_binance_websocket_api_socket
tosocket
- shorted user agent string for rest and websocket client
- removed the sending of the payload in aenter in connection class, from now on its only done in the socket class!
is_update_availabe_unicorn_fy()
andget_version_unicorn_fy()
new_output
toreplace_stream()
- 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#111 time.sleep()
in_frequent_checks()
from 0.1 to 0.3 seconds
RuntimeError
exception in_create_stream_thread()
- no handling added, only logging and a "Todo"
dict
tocreate_stream(output='dict')
- StreamBuffer reset on restart issue#119
- Links in docstrings
- added KeyError exception and
return False
to a few methods - binance endpoints expects
symbol
notsymbols
- RuntimeException in
close()
- restclient:
symbol
tosymbols
- binance.com testnets (spot, margin, isolated_margin, future)
show_secrets_in_logs
parameter
symbol
tosymbols
(isolated_margin)
- update
binance_api_status
replace_stream()
: new_stream_label=None, new_stream_buffer_name=False, new_symbol=False, new_api_key=False, new_api_secret=False
- reconnect counter (bug since 1.17.0)
- Handling of unknown error msg from Binance if uri = dict in connection class
- reference of api_key and secret in connection class
- Isolated margin endpoints issue #109
- Support for
@arr@@s1
issue #101 - Added
symbol
toprint_stream_info()
- Added
api_key
andapi_secret
tocreate_stream()
issue #84
- Restart to ssl.SSLError exception in connection
- error 2 code PR #98 (Thanks Flowelcat)
- Restart again if OSError in
BinanceWebSocketApiConnection()
- Logging in
BinanceWebSocketApiConnection()
- Loglevels
- Fixed exception that thrown when api key is real but was deleted from binance. PR #96 (Thanks Flowelcat)
- Package configuration is wrong. Currently one needs to have the bin-folder of the venv in the PATH. That is not feasible since you often have one venv per project. PR #97 (Thanks uggel)
- REMOVED
- Loglevels
- Fixed double slash bug when getting listen key for userDataStream. PR #87
- Fixed RuntimeError in connection row 243 (added restart)
- restart if "with connection" in socket gets closed
- exception json.decoder.JSONDecodeError: respond = request_handler.json()
- Exception AttributeError Info: module 'asyncio.base_futures' has no attribute 'InvalidStateError' issue #72
- exception in
print_suammary()
- stream_buffer control: create_stream(channels, markets, stream_buffer_name=None):
If
False
the data is going to get written to the default stream_buffer, set toTrue
to 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()
- renamed
restart_stream()
to_restart_stream
and execute it only with a valid restart_request
- Ensure that during a restart, only the recent thread is able to send the payload for subscription
- psutil (new requirement)
- exception handling of
websockets.exceptions.InvalidMessage
issue #72 - general exception handling
- show threads, memory and cpu usage in
print_summary()
get_process_usage_memory()
get_process_usage_cpu()
get_process_usage_threads()
- Close WS only if open in connection class row 190 issue #72
- some code in connection row 206 which is not needed anymore and is causing a coroutine error
is_websocket_uri_length_valid()
- new parameter
stream_label
inmanager.create_stream()
issue #60 manager.get_stream_label()
issue #60manager.get_stream_id_by_label()
issue #60manager.set_stream_label()
issue #60- added
stream_label
tomanager.print_stream_info()
issue #60 - added
stream_label
tomanager.print_summary()
issue #60 manager.help()
unicorn_binance_websocket_api_exceptions.py
with exceptionStreamRecoveryError
andUnknownExchange
fill_up_space_right()
self.restart_timeout
- raising
UnknownExchange
orStreamRecoveryError
instead ofValueError
fill_up_space()
tofill_up_space_left()
- 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
RuntimeWarning
in class connection at row 189
- code to start new
_keepalive_streams()
and_frequent_checks()
threads
disable_print
inprint_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()
- ping listen_key if "!userData" is in
channels
, not only inmarkets
. - format of some logs
- stream buffer size issue #51, pull #51
- 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)
- raiseStreamRecoveryError
if a stream is not repairable (invalid api-key format or exceeding the 1024 subscription limit)
- loglevel
connection.send()
loglevels from error to critical. - loglevel
manager.create_websocket_uri()
of known errors from error to critical.
OSError
exception forself.monitoring_api_server.start()
if its already startedfor keepalive_streams_id in self.keepalive_streams_list:
added threadding lock (issue #47)
- binance jex
- dependency websockets from 7.0 to 8.1 which needs python>=3.6.1 (issue #11)
- expception handling of send() (issue #43)
- thread lock for
frequent_checks_list
(comment #590914274) current_receiving_speed
did not reset to 0 if all streams are offline
- fill_up_space_centered()
- update check on manager start
- print_stream_info() and print_summary(): unicorn-binance-websocket-api_-python_ in top boarder row
- count subscriptions
- lower for cex and upper for dex with exceptions for arr, $all, ! and array channels
lower()
markets increate_payload()
and exception for!userData
- get_active_stream_list() took len() of false item
- reconnect handling in send() (issue #40)
- making
self.stream_buffer
thread safe
- removed simplejson exception in restclient
- set OSError from error to critical
['receives_statistic_last_second']
dict is changing size during iteration. (issue #37)
- Using ujson instead of stock json lib
- cleaning
create_payload()
for CEX
Important infos, please read!
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()
- The 8004 char limit for URIs on websocket connect is bypassed via subscriptions with websocket.send() and
is_websocket_uri_length_valid()
allways returnsTrue
now!
- Subscribe/unsubscribe items of DEX websockets (card #5)
['receives_statistic_last_second']
dict is changing size during iteration. (issue #37)
- Python version in print_stream_info() and print_summary()
- Typo in text string
- Endpoints for www.binance.com margin UserData listenkey (issue #35)
- Endpoints for www.binance.com spot UserData listenkey (issue #35)
- Endpoints for www.binance.com futures UserData listenkey (issue #35)
- Errors when creating private DEX streams (issue #34)
- Moved docs to github pages
- binance.com Futures websocket support and example_binance_futures.py and example_bookticker.py (issue#32)
- binance.us websocket support and example_binance_us.py (issue#22)
- Trailing / is no longer accepted by the endpoints: LUCIT-Systems-and-Development#31
- 'websockets>=7.0' to 'websockets==7.0': Websockets 8 is released and it seems to be not compatible
- Amount of active streams to icinga status msg
- RuntimeError in _frequent_checks
- 'except websockets.exceptions.InvalidStatusCode as error_msg:' moved to right place
- 'except websockets.exceptions.InvalidStatusCode as error_msg:' in connnection line 97 with restart
- 'except KeyError:' in connection line 162
- get_monitoring_status_plain(): exception for outdated UnicornFy
- is_update_availabe_check_command()
- get_latest_version_check_command()
- get_latest_release_info_check_command()
- get_monitoring_status_plain()
- get_monitoring_status_icinga()
- _start_monitoring_api()
- https://github.com/oliver-zehentleitner/unicorn-binance-websocket-api/blob/master/tools/icinga/ (to https://github.com/oliver-zehentleitner/check_unicorn_monitoring_api)
- 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! Its not clean and will get rewritten and maybe change behaviour)
- unsubscribe_from_stream() - (dont use in productive! Its not clean and will get rewritten and maybe change change behaviour)
- _create_payload()
- 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
- support for binance.je (Binance Jersey) websockets
- logging on failure in
create_stream()
add_string
inprint_summary()
andprint_stream_info()
warn_on_update
inget_monitoring_status_icinga()
,get_monitoring_status_plain()
andstart_monitoring_api()
- support for binance jersey LUCIT-Systems-and-Development#21
- show the used exchange in
print_summary()
andprint_stream_info()
- removed space from
total_received_length
inget_monitoring_status_icinga()
to avoid 'no data' error in ICINGA
- exception for
asyncio.base_futures.InvalidStateError
by DaWe35 LUCIT-Systems-and-Development#18
- create_stream() returns False if websocket URL is to long
is_websocket_uri_length_valid()
to work with !userData on the pre test increate_stream()
without api secrets
- Docstrings for
markets
andchannels
to support: str, tuple, list, set - Fine tuning of perfdata output in
get_monitoring_status_plain()
andget_monitoring_status_icinga()
get_stream_buffer_length()
by DaWe35 LUCIT-Systems-and-Development#12
- the
stream_buffer
FIFO stack was a LIFO stack (Thanks to DaWe35 for recognizing and fixing this issue LUCIT-Systems-and-Development#12) get_stream_buffer_byte_size
returns now the real size of the stream_buffer
- added round received items to 2 decimals instead of 0
- wrong version in manager class ...
- is_manager_stopping()
- is_update_available returns False if github API is not available.
- get_monitoring_status_icinga(): update check
- 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()
- ./tools/icinga/check_binance_websocket_api_manager (check_command for ICINGA)
- example_monitoring.py
- example_monitoring.py and tools/check_binance_websocket_api_manager
- get_monitoring_status_icinga tests for available updates and changes the
return_code
to 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 ...
- get_monitoring_status_icinga: changed
status
dict node toreturn_code
- changing output of get_monitoring_status_icinga
- get_monitoring_status_icinga() in manager class
- lib version to print_summary()
- Typo in text in print_summary()
- KeyError in manager class row 148
- Bug in class UnicornFy: kline_close_time had the value kline_start_time
- Moved UnicornFy from UNICORN Binance WebSocket API to its own repository
- connection handling (improved)
markets
in 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
- "UTC" text to printed times
- listen_key 30 min cache
- method to delete a listen_key
- binance_api_status added to print_stream_info()
- README.md
- rewrite coloring for status_code in print_summary
- ping_interval from None to 20 seconds
- listen_key keepalive didnt work propper
- TypeError in print_summary()
- handling for status_code and used_weight from the binance REST Api (used for listen_key) - see
get_binance_api_status()
- reconnect issues
- log levels
- 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
- show stream_buffer content if items len > 50
- removed stream_buffer log
- renamed get_stream_data_from_stream_buffer to pop_stream_data_from_stream_buffer
- IndexError in pop_stream_data_from_stream_buffer
- _forward_stream_buffer_data: system change - no pushing anymore, its better to buffer everything and run a import class in a separate thread, that is able to reconnect to the database
- rewrite of keepalive and frequentchecks restarts
- stream_buffer logging: log amount of items in buffer
- stream_buffer logging: log amount of items in buffer
- added two mac os specific exceptions to connection class for better reconnect management
- 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
- changed the waiting time before setting a restart request on 400 error to 5 seconds in connection class
- replaced tabs in print_summary() with blanks
- KeyError in unicorn_binance_websocket_api_connection.py error exception 414
- UnicornFy was very buggy with ticker and miniTicker handling
- KeyError in unicorn_binance_websocket_api_manager.py
- restarting streams row to print_summary()
- show active restarting and stopped streams only if not 0
- error message handling for userData streams
- reconnect depends from disconnect reason now (network or api-settings)
- del restart request in stop_stream()
- !miniTicker and !userData didnt work in cause of lower case all currencies. added an exception for them.
- pypi_install_packaging_tools.sh
- README.md
- Removed 2nd argument from binance_websocket_api_manager.stream_is_stopping()
- Tabs in print_summary() for windows platform
- Fixing format errors from auto reformat in unicorn_binance_websocket_api_connection
- Catching "ssl.SSLError" BinanceWebSocketApiConnection.receive()
- Improvment of reconnect on invalid URI caused by no network issue and a missing listen_key from Binance
- 30 min cache for Binance "listenKey" from rest api to avoid weight costs and hammering the Binance API on a flapping network connection
- 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