diff --git a/CryptoExchange.Net/CryptoExchange.Net.csproj b/CryptoExchange.Net/CryptoExchange.Net.csproj index dab827b..83a39b6 100644 --- a/CryptoExchange.Net/CryptoExchange.Net.csproj +++ b/CryptoExchange.Net/CryptoExchange.Net.csproj @@ -6,12 +6,12 @@ CryptoExchange.Net JKorf A base package for implementing cryptocurrency exchange API's - 3.0.11 + 3.0.12 false https://github.com/JKorf/CryptoExchange.Net en true - 3.0.11 - Added support for checksum in SymbolOrderBook + 3.0.12 - Named parameters on SymbolOrderBook events enable 8.0 MIT diff --git a/CryptoExchange.Net/CryptoExchange.Net.xml b/CryptoExchange.Net/CryptoExchange.Net.xml index fa58cf8..ed94e55 100644 --- a/CryptoExchange.Net/CryptoExchange.Net.xml +++ b/CryptoExchange.Net/CryptoExchange.Net.xml @@ -1,3074 +1,2962 @@ - - - - CryptoExchange.Net - - - - - Used for conversion in ArrayConverter - - - - - Marks property as optional - - - - - Api credentials info - - - - - The api key to authenticate requests - - - - - The api secret to authenticate requests - - - - - The private key to authenticate requests - - - - - Create Api credentials providing a private key for authentication - - The private key used for signing - - - - Create Api credentials providing a api key and secret for authentication - - The api key used for identification - The api secret used for signing - - - - Create Api credentials providing a api key and secret for authentication - - The api key used for identification - The api secret used for signing - - - - Copy the credentials - - - - - - Create Api credentials providing a stream containing json data. The json data should include two values: apiKey and apiSecret - - The stream containing the json data - A key to identify the credentials for the API. For example, when set to `binanceKey` the json data should contain a value for the property `binanceKey`. Defaults to 'apiKey'. - A key to identify the credentials for the API. For example, when set to `binanceSecret` the json data should contain a value for the property `binanceSecret`. Defaults to 'apiSecret'. - - - - Try get the value of a key from a JToken - - - - - - - - Dispose - - - - - Base class for authentication providers - - - - - The provided credentials - - - - - ctor - - - - - - Add authentication to the parameter list - - - - - - - - - - - - Add authentication to the header dictionary - - - - - - - - - - - - Sign a string - - - - - - - Sign a byte array - - - - - - - Convert byte array to hex - - - - - - - Private key info - - - - - The private key - - - - - The private key's pass phrase - - - - - Indicates if the private key is encrypted or not - - - - - Create a private key providing an encrypted key information - - The private key used for signing - The private key's passphrase - - - - Create a private key providing an encrypted key information - - The private key used for signing - The private key's passphrase - - - - Create a private key providing an unencrypted key information - - The private key used for signing - - - - Create a private key providing an encrypted key information - - The private key used for signing - - - - Copy the private key - - - - - - Dispose - - - - - The base for all clients - - - - - The address of the client - - - - - The log object - - - - - The api proxy - - - - - The auth provider - - - - - The last used id - - - - - Lock for id generating - - - - - Last is used - - - - - ctor - - - - - - - Set the authentication provider - - - - - - Tries to parse the json data and returns a token - - The data to parse - - - - - Deserialize a string into an object - - The type to deserialize into - The data to deserialize - Whether or not the parsing should be checked for missing properties (will output data to the logging if log verbosity is Debug) - A specific serializer to use - - - - - Deserialize a JToken into an object - - The type to deserialize into - The data to deserialize - Whether or not the parsing should be checked for missing properties (will output data to the logging if log verbosity is Debug) - A specific serializer to use - - - - - Deserialize a stream into an object - - The type to deserialize into - The stream to deserialize - A specific serializer to use - - - - - Generate a unique id - - - - - - Fill parameters in a path. Parameters are specified by '{}' and should be specified in occuring sequence - - The total path string - The values to fill - - - - - Dispose - - - - - Converter for arrays to properties - - - - - - - - - - - - - - Mark property as an index in the array - - - - - The index in the array - - - - - ctor - - - - - - Base class for enum converters - - Type of enum to convert - - - - The enum->string mapping - - - - - ctor - - - - - - - - - - - - Convert a string value - - - - - - - - - - converter for milliseconds to datetime - - - - - - - - - - - - - - Converter for nanoseconds to datetime - - - - - - - - - - - - - - Converter for seconds to datetime - - - - - - - - - - - - - - Converter for utc datetime - - - - - - - - - - - - - - Helper methods - - - - - Add a parameter - - - - - - - - Add a parameter - - - - - - - - Add an optional parameter. Not added if value is null - - - - - - - - Add an optional parameter. Not added if value is null - - - - - - - - Create a query string of the specified parameters - - The parameters to use - Whether or not the values should be url encoded - How to serialize array parameters - - - - - Get the string the secure string is representing - - The source secure string - - - - - Create a secure string from a string - - - - - - - Wait one async - - - - - - - - - Wait one async - - - - - - - - String to JToken - - - - - - - - Validates an int is one of the allowed values - - Value of the int - Name of the parameter - Allowed values - - - - Validates an int is between two values - - The value of the int - Name of the parameter - Min value - Max value - - - - Validates a string is not null or empty - - The value of the string - Name of the parameter - - - - Validates an object is not null - - The value of the object - Name of the parameter - - - - Validates a list is not null or empty - - The value of the object - Name of the parameter - - - - Rate limiter interface - - - - - Limit the request if needed - - - - - - - - - Request interface - - - - - Accept header - - - - - Content - - - - - Method - - - - - Uri - - - - - internal request id for tracing - - - - - Set byte content - - - - - - Set string content - - - - - - - Add a header to the request - - - - - - - Get the response - - - - - - - Request factory interface - - - - - Create a request for an uri - - - - - - - - Configure the requests created by this factory - - Request timeout to use - Proxy settings to use - - - - Response object interface - - - - - The response status code - - - - - Whether the status code indicates a success status - - - - - The response headers - - - - - Get the response stream - - - - - - Close the response - - - - - Base class for rest API implementations - - - - - The factory for creating requests. Used for unit testing - - - - - What should happen when hitting a rate limit - - - - - List of active rate limiters - - - - - The total amount of requests made - - - - - The base address of the API - - - - - Adds a rate limiter to the client. There are 2 choices, the and the . - - The limiter to add - - - - Removes all rate limiters from this client - - - - - Ping to see if the server is reachable - - The roundtrip time of the ping request - - - - Ping to see if the server is reachable - - The roundtrip time of the ping request - - - - Base class for socket API implementations - - - - - The factory for creating sockets. Used for unit testing - - - - - The time in between reconnect attempts - - - - - Whether the client should try to auto reconnect when losing connection - - - - - The base address of the API - - - - - - - - - - - The max amount of concurrent socket connections - - - - - - - - Unsubscribe from a stream - - The subscription to unsubscribe - - - - - Unsubscribe all subscriptions - - - - - - Interface for order book - - - - - The status of the order book. Order book is up to date when the status is `Synced` - - - - - Last update identifier - - - - - The symbol of the order book - - - - - Event when the state changes - - - - - Event when order book was updated. Be careful! It can generate a lot of events at high-liquidity markets - - - - - Event when the BestBid or BestAsk changes ie a Pricing Tick - - - - - Timestamp of the last update - - - - - The number of asks in the book - - - - - The number of bids in the book - - - - - The list of asks - - - - - The list of bids - - - - - The best bid currently in the order book - - - - - The best ask currently in the order book - - - - - BestBid/BesAsk returned as a pair - - - - - Start connecting and synchronizing the order book - - - - - - Start connecting and synchronizing the order book - - - - - - Stop syncing the order book - - - - - - Stop syncing the order book - - - - - - Interface for order book entries - - - - - The quantity of the entry - - - - - The price of the entry - - - - - Interface for order book entries - - - - - Sequence of the update - - - - - Interface for websocket interaction - - - - - Websocket closed - - - - - Websocket message received - - - - - Websocket error - - - - - Websocket opened - - - - - Id - - - - - Origin - - - - - Reconnecting - - - - - Handler for byte data - - - - - Handler for string data - - - - - Socket url - - - - - State - - - - - Is closed - - - - - Is open - - - - - Supported ssl protocols - - - - - Timeout - - - - - Connect the socket - - - - - - Send data - - - - - - Reset socket - - - - - Close the connecting - - - - - - Set proxy - - - - - - - Websocket factory interface - - - - - Create a websocket for an url - - - - - - - - Create a websocket for an url - - - - - - - - - - Default log writer, writes to debug - - - - - - - - - - - Log implementation - - - - - The verbosity of the logging - - - - - ctor - - - - - Set the writers - - - - - - Write a log entry - - - - - - - The log verbosity - - - - - Debug logging - - - - - Info logging - - - - - Warning logging - - - - - Error logging - - - - - None, used for disabling logging - - - - - File writer - - - - - - - - ctor - - - - - - - - - Dispose - - - - - - Proxy info - - - - - The host address of the proxy - - - - - The port of the proxy - - - - - The login of the proxy - - - - - The password of the proxy - - - - - Create new settings for a proxy - - The proxy hostname/ip - The proxy port - - - - Create new settings for a proxy - - The proxy hostname/ip - The proxy port - The proxy login - The proxy password - - - - Create new settings for a proxy - - The proxy hostname/ip - The proxy port - The proxy login - The proxy password - - - - Comparer for byte order - - - - - Compare function - - - - - - - - The result of an operation - - - - - - The data returned by the call - - - - - An error if the call didn't succeed - - - - - Whether the call was successful - - - - - ctor - - - - - - - Overwrite bool check so we can use if(callResult) instead of if(callResult.Success) - - - - - - The result of a request - - - - - - The status code of the response. Note that a OK status does not always indicate success, check the Success parameter for this. - - - - - The response headers - - - - - ctor - - - - - - - - - Create an error result - - - - - - - Create an error result - - - - - - - - - Constants - - - - - Json content type header - - - - - Form content type header - - - - - What to do when a request would exceed the rate limit - - - - - Fail the request - - - - - Wait till the request can be send - - - - - Where the post parameters should be added - - - - - Post parameters in body - - - - - Post parameters in url - - - - - The format of the request body - - - - - Form data - - - - - Json - - - - - Status of the order book - - - - - Not connected - - - - - Connecting - - - - - Reconnecting - - - - - Syncing data - - - - - Data synced, order book is up to date - - - - - Order book entry type - - - - - Ask - - - - - Bid - - - - - Define how array parameters should be send - - - - - Send multiple key=value for each entry - - - - - Create an []=value array - - - - - Base class for errors - - - - - The error code - - - - - The message for the error that occured - - - - - Optional data for the error - - - - - ctor - - - - - - - - String representation - - - - - - Cant reach server error - - - - - ctor - - - - - No api credentials provided while trying to access private endpoint - - - - - ctor - - - - - Error returned by the server - - - - - ctor - - - - - - - ctor - - - - - - - - Web error returned by the server - - - - - ctor - - - - - - Error while deserializing data - - - - - ctor - - Deserializing data - - - - Unknown error - - - - - ctor - - Error data - - - - An invalid parameter has been provided - - - - - ctor - - - - - - Rate limit exceeded - - - - - ctor - - - - - - Cancellation requested - - - - - ctor - - - - - Base options - - - - - The log verbosity - - - - - The log writers - - - - - - - - Base for order book options - - - - - The name of the order book implementation - - - - - Whether each update should have a consecutive id number. Used to identify and reconnect when numbers are skipped. - - - - - Whether or not a level should be removed from the book when it's pushed out of scope of the limit. For example with a book of limit 10, - when a new bid is added which makes the total amount of bids 11, should the last bid entry be removed - - - - - - The name of the order book implementation - Whether each update should have a consecutive id number. Used to identify and reconnect when numbers are skipped. - Whether or not a level should be removed from the book when it's pushed out of scope of the limit. For example with a book of limit 10, - when a new bid is added which makes the total amount of bids 11, should the last bid entry be removed - Amount of levels for this order book - - - - - - - Base client options - - - - - The base address of the client - - - - - The api credentials - - - - - Proxy to use - - - - - ctor - - - - - - - - - Base for rest client options - - - - - List of rate limiters to use - - - - - What to do when a call would exceed the rate limit - - - - - The time the server has to respond to a request before timing out - - - - - ctor - - - - - - Create a copy of the options - - - - - - - - - - Base for socket client options - - - - - Whether or not the socket should automatically reconnect when losing connection - - - - - Time to wait between reconnect attempts - - - - - The time to wait for a socket response - - - - - The time after which the connection is assumed to be dropped - - - - - The amount of subscriptions that should be made on a single socket connection. Not all exchanges support multiple subscriptions on a single socket. - Setting this to a higher number increases subscription speed, but having more subscriptions on a single connection will also increase the amount of traffic on that single connection. - - - - - ctor - - - - - - Create a copy of the options - - - - - - - - - - Buffer entry with a first and last update id - - - - - First update id - - - - - Last update id - - - - - List of asks - - - - - List of bids - - - - - Base for order book implementations - - - - - The process buffer, used while syncing - - - - - The ask list - - - - - The bid list - - - - - Order book implementation id - - - - - The log - - - - - If order book is set - - - - - The amount of levels for this book - - - - - The status of the order book. Order book is up to date when the status is `Synced` - - - - - Last update identifier - - - - - The symbol of the order book - - - - - Event when the state changes - - - - - Event when the BestBid or BestAsk changes ie a Pricing Tick - - - - - Event when order book was updated, containing the changed bids and asks. Be careful! It can generate a lot of events at high-liquidity markets - - - - - Timestamp of the last update - - - - - The number of asks in the book - - - - - The number of bids in the book - - - - - The list of asks - - - - - The list of bids - - - - - The best bid currently in the order book - - - - - The best ask currently in the order book - - - - - BestBid/BesAsk returned as a pair - - - - - ctor - - - - - - - Start connecting and synchronizing the order book - - - - - - Start connecting and synchronizing the order book - - - - - - Stop syncing the order book - - - - - - Stop syncing the order book - - - - - - Start the order book - - - - - - Reset the order book - - - - - Resync the order book - - - - - - Validate a checksum with the current order book - - - - - - - Set the initial data for the order book - - The last update sequence number - List of asks - List of bids - - - - Update the order book using a single id for an update - - - - - - - - Add a checksum to the process queue - - - - - - Update the order book using a first/last update id - - - - - - - - - Update the order book using sequenced entries - - List of bids - List of asks - - - - Check and empty the process buffer; see what entries to update the book with - - - - - Update order book with an entry - - Sequence number of the update - Type of entry - The entry - - - - Wait until the order book has been set - - Max wait time - - - - - Dispose the order book - - - - - String representation of the top 3 entries - - - - - - String representation of the top x entries - - - - - - Limits the amount of requests per time period to a certain limit, counts the request per API key. - - - - - Create a new RateLimiterAPIKey. This rate limiter limits the amount of requests per time period to a certain limit, counts the request per API key. - - The amount to limit to - The time period over which the limit counts - - - - - - - Limits the amount of requests per time period to a certain limit, counts the request per endpoint. - - - - - Create a new RateLimiterPerEndpoint. This rate limiter limits the amount of requests per time period to a certain limit, counts the request per endpoint. - - The amount to limit to - The time period over which the limit counts - - - - - - - Limits the amount of requests per time period to a certain limit, counts the total amount of requests. - - - - - Create a new RateLimiterTotal. This rate limiter limits the amount of requests per time period to a certain limit, counts the total amount of requests. - - The amount to limit to - The time period over which the limit counts - - - - - - - Rate limiting object - - - - - Lock - - - - - ctor - - - - - Get time to wait for a specific time - - - - - - - - - Add an executed request time - - - - - - Request object - - - - - Create request object for web request - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - WebRequest factory - - - - - - - - - - - HttpWebResponse response object - - - - - - - - - - - - - - Create response for a http response message - - The actual response - - - - - - - - - - Base rest client - - - - - The factory for creating requests. Used for unit testing - - - - - Where to place post parameters - - - - - Request body content type - - - - - Whether or not we need to manually parse an error instead of relying on the http status code - - - - - How to serialize array parameters - - - - - What request body should be when no data is send - - - - - Timeout for requests - - - - - Rate limiting behaviour - - - - - List of rate limiters - - - - - Total requests made - - - - - ctor - - - - - - - Adds a rate limiter to the client. There are 2 choices, the and the . - - The limiter to add - - - - Removes all rate limiters from this client - - - - - Ping to see if the server is reachable - - The roundtrip time of the ping request - - - - Ping to see if the server is reachable - - The roundtrip time of the ping request - - - - Execute a request - - The expected result type - The uri to send the request to - The method of the request - Cancellation token - The parameters of the request - Whether or not the request should be authenticated - Whether or not the resulting object should be checked for missing properties in the mapping (only outputs if log verbosity is Debug) - Where the post parameters should be placed - How array paramters should be serialized - - - - - Executes the request and returns the string result - - The request object to execute - Cancellation token - - - - - Can be used to parse an error even though response status indicates success. Some apis always return 200 OK, even though there is an error. - This can be used together with ManualParseError to check if it is an error before deserializing to an object - - Received data - Null if not an error, Error otherwise - - - - Creates a request object - - The uri to send the request to - The method of the request - The parameters of the request - Whether or not the request should be authenticated - Where the post parameters should be placed - How array paramters should be serialized - - - - - Writes the parameters of the request to the request object, either in the query string or the request body - - - - - - - - Parse an error response from the server. Only used when server returns a status other than Success(200) - - The string the request returned - - - - - Base for socket client implementations - - - - - The factory for creating sockets. Used for unit testing - - - - - List of socket connections currently connecting/connected - - - - - - - - - - - - - - - - - - - - - The max amount of concurrent socket connections - - - - - - - - Handler for byte data - - - - - Handler for string data - - - - - Generic handlers - - - - - Periodic task - - - - - Periodic task event - - - - - Is disposing - - - - - If true; data which is a response to a query will also be distributed to subscriptions - If false; data which is a response to a query won't get forwarded to subscriptions as well - - - - - Create a socket client - - Client options - Authentication provider - - - - Set a function to interpret the data, used when the data is received as bytes instead of a string - - Handler for byte data - Handler for string data - - - - Subscribe - - The expected return data - The request to send - The identifier to use - If the subscription should be authenticated - The handler of update data - - - - - Subscribe using a specif URL - - The type of the expected data - The URL to connect to - The request to send - The identifier to use - If the subscription should be authenticated - The handler of update data - - - - - Sends the subscribe request and waits for a response to that request - - The connection to send the request on - The request to send - The subscription the request is for - - - - - Query for data - - Expected result type - The request to send - Whether the socket should be authenticated - - - - - Query for data - - The expected result type - The url for the request - The request to send - Whether the socket should be authenticated - - - - - Sends the query request and waits for the result - - The expected result type - The connection to send and wait on - The request to send - - - - - Checks if a socket needs to be connected and does so if needed - - The connection to check - Whether the socket should authenticated - - - - - Needs to check if a received message was an answer to a query request (preferable by id) and set the callResult out to whatever the response is - - The type of response - The socket connection - The request that a response is awaited for - The message - The interpretation (null if message wasn't a response to the request) - True if the message was a response to the query - - - - Needs to check if a received message was an answer to a subscription request (preferable by id) and set the callResult out to whatever the response is - - The socket connection - - The request that a response is awaited for - The message - The interpretation (null if message wasn't a response to the request) - True if the message was a response to the subscription request - - - - Needs to check if a received message matches a handler. Typically if an update message matches the request - - The received data - The subscription request - - - - - Needs to check if a received message matches a handler. Typically if an received message matches a ping request or a other information pushed from the the server - - The received data - The string identifier of the handler - - - - - Needs to authenticate the socket so authenticated queries/subscriptions can be made on this socket connection - - - - - - - Needs to unsubscribe a subscription, typically by sending an unsubscribe request. If multiple subscriptions per socket is not allowed this can just return since the socket will be closed anyway - - The connection on which to unsubscribe - The subscription to unsubscribe - - - - - Optional handler to interpolate data before sending it to the handlers - - - - - - - Add a handler for a subscription - - The type of data the subscription expects - The request of the subscription - The identifier of the subscription (can be null if request param is used) - Whether or not this is a user subscription (counts towards the max amount of handlers on a socket) - The socket connection the handler is on - The handler of the data received - - - - - Adds a generic message handler. Used for example to reply to ping requests - - The name of the request handler. Needs to be unique - The action to execute when receiving a message for this handler (checked by ) - - - - Gets a connection for a new subscription or query. Can be an existing if there are open position or a new one. - - The address the socket is for - Whether the socket should be authenticated - - - - - Connect a socket - - The socket to connect - - - - - Create a socket for an address - - The address the socket should connect to - - - - - Periodically sends an object to a socket - - How often - Method returning the object to send - - - - Unsubscribe from a stream - - The subscription to unsubscribe - - - - - Unsubscribe all subscriptions - - - - - - Dispose the client - - - - - Socket implementation - - - - - Socket - - - - - Log - - - - - Error handlers - - - - - Open handlers - - - - - Close handlers - - - - - Message handlers - - - - - Id - - - - - If is reconnecting - - - - - Origin - - - - - Url - - - - - Is closed - - - - - Is open - - - - - Protocols - - - - - Interpreter for bytes - - - - - Interpreter for strings - - - - - Last action time - - - - - Timeout - - - - - Socket state - - - - - ctor - - - - - - - ctor - - - - - - - - - On close - - - - - On message - - - - - On error - - - - - On open - - - - - Handle - - - - - - Handle - - - - - - - - Checks if timed out - - - - - - Close socket - - - - - - Reset socket - - - - - Send data - - - - - - Connect socket - - - - - - Set a proxy - - - - - - - Dispose - - - - - Socket connecting - - - - - Connection lost event - - - - - Connecting restored event - - - - - The connection is paused event - - - - - The connection is unpaused event - - - - - Connecting closed event - - - - - The amount of handlers - - - - - If connection is authenticated - - - - - If connection is made - - - - - The socket - - - - - If should reconnect upon closing - - - - - Time of disconnecting - - - - - If activity is paused - - - - - New socket connection - - The socket client - The socket - - - - Add handler - - - - - - Send data - - The data type - The object to send - The timeout for response - The response handler - - - - - Send data to the websocket - - The type of the object to send - The object to send - How null values should be serialized - - - - Send string data to the websocket - - The data to send - - - - Handler for a socket closing. Reconnects the socket if needed, or removes it from the active socket list if not - - - - - Close the connection - - - - - - Close the subscription - - Subscription to close - - - - - Socket subscription - - - - - Exception event - - - - - Message handlers for this subscription. Should return true if the message is handled and should not be distributed to the other handlers - - - - - Request object - - - - - Subscription identifier - - - - - Is user subscription or generic - - - - - If the subscription has been confirmed - - - - - Create SocketSubscription for a request - - - - - - - - - Create SocketSubscription for an identifier - - - - - - - - - Invoke the exception event - - - - - - Subscription - - - - - Event when the connection is lost. The socket will automatically reconnect when possible. - - - - - Event when the connection is restored. Timespan parameter indicates the time the socket has been offline for before reconnecting - - - - - Event when the connection to the server is paused. No operations can be performed while paused - - - - - Event when the connection to the server is unpaused - - - - - Event when an exception happened - - - - - The id of the socket - - - - - ctor - - - - - - - Close the subscription - - - - - - Close the socket to cause a reconnect - - - - - - Factory implementation - - - - - - - - - - -ember name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute"> - - Specifies that the method will not return if the associated - parameter is passed the specified value. - - - - - Gets the condition parameter value. - Code after the method is considered unreachable by diagnostics if the argument - to the associated parameter matches this value. - - - - - Initializes a new instance of the - class with the specified parameter value. - - - The condition parameter value. - Code after the method is considered unreachable by diagnostics if the argument - to the associated parameter matches this value. - - - - - Specifies that an output may be even if the - corresponding type disallows it. - - - - - Initializes a new instance of the class. - - - - - Specifies that when a method returns , - the parameter may be even if the corresponding type disallows it. - - - - - Gets the return value condition. - If the method returns this value, the associated parameter may be . - - - - - Initializes the attribute with the specified return value condition. - - - The return value condition. - If the method returns this value, the associated parameter may be . - - - - - Specifies that an output is not even if the - corresponding type allows it. - - - - - Initializes a new instance of the class. - - - - - Specifies that the output will be non- if the - named parameter is non-. - - - - - Gets the associated parameter name. - The output will be non- if the argument to the - parameter specified is non-. - - - - - Initializes the attribute with the associated parameter name. - - - The associated parameter name. - The output will be non- if the argument to the - parameter specified is non-. - - - - - Specifies that when a method returns , - the parameter will not be even if the corresponding type allows it. - - - - - Gets the return value condition. - If the method returns this value, the associated parameter will not be . - - - - - Initializes the attribute with the specified return value condition. - - - The return value condition. - If the method returns this value, the associated parameter will not be . - - - - + + + + CryptoExchange.Net + + + + + Used for conversion in ArrayConverter + + + + + Marks property as optional + + + + + Api credentials info + + + + + The api key to authenticate requests + + + + + The api secret to authenticate requests + + + + + The private key to authenticate requests + + + + + Create Api credentials providing a private key for authentication + + The private key used for signing + + + + Create Api credentials providing a api key and secret for authentication + + The api key used for identification + The api secret used for signing + + + + Create Api credentials providing a api key and secret for authentication + + The api key used for identification + The api secret used for signing + + + + Copy the credentials + + + + + + Create Api credentials providing a stream containing json data. The json data should include two values: apiKey and apiSecret + + The stream containing the json data + A key to identify the credentials for the API. For example, when set to `binanceKey` the json data should contain a value for the property `binanceKey`. Defaults to 'apiKey'. + A key to identify the credentials for the API. For example, when set to `binanceSecret` the json data should contain a value for the property `binanceSecret`. Defaults to 'apiSecret'. + + + + Try get the value of a key from a JToken + + + + + + + + Dispose + + + + + Base class for authentication providers + + + + + The provided credentials + + + + + ctor + + + + + + Add authentication to the parameter list + + + + + + + + + + + + Add authentication to the header dictionary + + + + + + + + + + + + Sign a string + + + + + + + Sign a byte array + + + + + + + Convert byte array to hex + + + + + + + Private key info + + + + + The private key + + + + + The private key's pass phrase + + + + + Indicates if the private key is encrypted or not + + + + + Create a private key providing an encrypted key information + + The private key used for signing + The private key's passphrase + + + + Create a private key providing an encrypted key information + + The private key used for signing + The private key's passphrase + + + + Create a private key providing an unencrypted key information + + The private key used for signing + + + + Create a private key providing an encrypted key information + + The private key used for signing + + + + Copy the private key + + + + + + Dispose + + + + + The base for all clients + + + + + The address of the client + + + + + The log object + + + + + The api proxy + + + + + The auth provider + + + + + The last used id + + + + + Lock for id generating + + + + + Last is used + + + + + ctor + + + + + + + Set the authentication provider + + + + + + Tries to parse the json data and returns a token + + The data to parse + + + + + Deserialize a string into an object + + The type to deserialize into + The data to deserialize + Whether or not the parsing should be checked for missing properties (will output data to the logging if log verbosity is Debug) + A specific serializer to use + + + + + Deserialize a JToken into an object + + The type to deserialize into + The data to deserialize + Whether or not the parsing should be checked for missing properties (will output data to the logging if log verbosity is Debug) + A specific serializer to use + + + + + Deserialize a stream into an object + + The type to deserialize into + The stream to deserialize + A specific serializer to use + + + + + Generate a unique id + + + + + + Fill parameters in a path. Parameters are specified by '{}' and should be specified in occuring sequence + + The total path string + The values to fill + + + + + Dispose + + + + + Converter for arrays to properties + + + + + + + + + + + + + + Mark property as an index in the array + + + + + The index in the array + + + + + ctor + + + + + + Base class for enum converters + + Type of enum to convert + + + + The enum->string mapping + + + + + ctor + + + + + + + + + + + + Convert a string value + + + + + + + + + + converter for milliseconds to datetime + + + + + + + + + + + + + + Converter for nanoseconds to datetime + + + + + + + + + + + + + + Converter for seconds to datetime + + + + + + + + + + + + + + Converter for utc datetime + + + + + + + + + + + + + + Helper methods + + + + + Add a parameter + + + + + + + + Add a parameter + + + + + + + + Add an optional parameter. Not added if value is null + + + + + + + + Add an optional parameter. Not added if value is null + + + + + + + + Create a query string of the specified parameters + + The parameters to use + Whether or not the values should be url encoded + How to serialize array parameters + + + + + Get the string the secure string is representing + + The source secure string + + + + + Create a secure string from a string + + + + + + + Wait one async + + + + + + + + + Wait one async + + + + + + + + String to JToken + + + + + + + + Validates an int is one of the allowed values + + Value of the int + Name of the parameter + Allowed values + + + + Validates an int is between two values + + The value of the int + Name of the parameter + Min value + Max value + + + + Validates a string is not null or empty + + The value of the string + Name of the parameter + + + + Validates an object is not null + + The value of the object + Name of the parameter + + + + Validates a list is not null or empty + + The value of the object + Name of the parameter + + + + Rate limiter interface + + + + + Limit the request if needed + + + + + + + + + Request interface + + + + + Accept header + + + + + Content + + + + + Method + + + + + Uri + + + + + internal request id for tracing + + + + + Set byte content + + + + + + Set string content + + + + + + + Add a header to the request + + + + + + + Get the response + + + + + + + Request factory interface + + + + + Create a request for an uri + + + + + + + + Configure the requests created by this factory + + Request timeout to use + Proxy settings to use + Should generate unique id for requests + + + + Response object interface + + + + + The response status code + + + + + Whether the status code indicates a success status + + + + + The response headers + + + + + Get the response stream + + + + + + Close the response + + + + + Base class for rest API implementations + + + + + The factory for creating requests. Used for unit testing + + + + + What should happen when hitting a rate limit + + + + + List of active rate limiters + + + + + The total amount of requests made + + + + + The base address of the API + + + + + Adds a rate limiter to the client. There are 2 choices, the and the . + + The limiter to add + + + + Removes all rate limiters from this client + + + + + Ping to see if the server is reachable + + The roundtrip time of the ping request + + + + Ping to see if the server is reachable + + The roundtrip time of the ping request + + + + Base class for socket API implementations + + + + + The factory for creating sockets. Used for unit testing + + + + + The time in between reconnect attempts + + + + + Whether the client should try to auto reconnect when losing connection + + + + + The base address of the API + + + + + + + + + + + The max amount of concurrent socket connections + + + + + + + + Unsubscribe from a stream + + The subscription to unsubscribe + + + + + Unsubscribe all subscriptions + + + + + + Interface for order book + + + + + The status of the order book. Order book is up to date when the status is `Synced` + + + + + Last update identifier + + + + + The symbol of the order book + + + + + Event when the state changes + + + + + Event when order book was updated. Be careful! It can generate a lot of events at high-liquidity markets + + + + + Event when the BestBid or BestAsk changes ie a Pricing Tick + + + + + Timestamp of the last update + + + + + The number of asks in the book + + + + + The number of bids in the book + + + + + The list of asks + + + + + The list of bids + + + + + The best bid currently in the order book + + + + + The best ask currently in the order book + + + + + BestBid/BesAsk returned as a pair + + + + + Start connecting and synchronizing the order book + + + + + + Start connecting and synchronizing the order book + + + + + + Stop syncing the order book + + + + + + Stop syncing the order book + + + + + + Interface for order book entries + + + + + The quantity of the entry + + + + + The price of the entry + + + + + Interface for order book entries + + + + + Sequence of the update + + + + + Interface for websocket interaction + + + + + Websocket closed + + + + + Websocket message received + + + + + Websocket error + + + + + Websocket opened + + + + + Id + + + + + Origin + + + + + Reconnecting + + + + + Handler for byte data + + + + + Handler for string data + + + + + Socket url + + + + + State + + + + + Is closed + + + + + Is open + + + + + Supported ssl protocols + + + + + Timeout + + + + + Connect the socket + + + + + + Send data + + + + + + Reset socket + + + + + Close the connecting + + + + + + Set proxy + + + + + + + Websocket factory interface + + + + + Create a websocket for an url + + + + + + + + Create a websocket for an url + + + + + + + + + + Default log writer, writes to debug + + + + + + + + + + + Log implementation + + + + + The verbosity of the logging + + + + + ctor + + + + + Set the writers + + + + + + Write a log entry + + + + + + + The log verbosity + + + + + Debug logging + + + + + Info logging + + + + + Warning logging + + + + + Error logging + + + + + None, used for disabling logging + + + + + File writer + + + + + + + + ctor + + + + + + + + + Dispose + + + + + + Proxy info + + + + + The host address of the proxy + + + + + The port of the proxy + + + + + The login of the proxy + + + + + The password of the proxy + + + + + Create new settings for a proxy + + The proxy hostname/ip + The proxy port + + + + Create new settings for a proxy + + The proxy hostname/ip + The proxy port + The proxy login + The proxy password + + + + Create new settings for a proxy + + The proxy hostname/ip + The proxy port + The proxy login + The proxy password + + + + Comparer for byte order + + + + + Compare function + + + + + + + + The result of an operation + + + + + + The data returned by the call + + + + + An error if the call didn't succeed + + + + + Whether the call was successful + + + + + ctor + + + + + + + Overwrite bool check so we can use if(callResult) instead of if(callResult.Success) + + + + + + The result of a request + + + + + + The status code of the response. Note that a OK status does not always indicate success, check the Success parameter for this. + + + + + The response headers + + + + + ctor + + + + + + + + + Create an error result + + + + + + + Create an error result + + + + + + + + + Constants + + + + + Json content type header + + + + + Form content type header + + + + + What to do when a request would exceed the rate limit + + + + + Fail the request + + + + + Wait till the request can be send + + + + + Where the post parameters should be added + + + + + Post parameters in body + + + + + Post parameters in url + + + + + The format of the request body + + + + + Form data + + + + + Json + + + + + Status of the order book + + + + + Not connected + + + + + Connecting + + + + + Reconnecting + + + + + Syncing data + + + + + Data synced, order book is up to date + + + + + Order book entry type + + + + + Ask + + + + + Bid + + + + + Define how array parameters should be send + + + + + Send multiple key=value for each entry + + + + + Create an []=value array + + + + + Base class for errors + + + + + The error code + + + + + The message for the error that occured + + + + + Optional data for the error + + + + + ctor + + + + + + + + String representation + + + + + + Cant reach server error + + + + + ctor + + + + + No api credentials provided while trying to access private endpoint + + + + + ctor + + + + + Error returned by the server + + + + + ctor + + + + + + + ctor + + + + + + + + Web error returned by the server + + + + + ctor + + + + + + Error while deserializing data + + + + + ctor + + Deserializing data + + + + Unknown error + + + + + ctor + + Error data + + + + An invalid parameter has been provided + + + + + ctor + + + + + + Rate limit exceeded + + + + + ctor + + + + + + Cancellation requested + + + + + ctor + + + + + Base options + + + + + The log verbosity + + + + + The log writers + + + + + + + + Base for order book options + + + + + The name of the order book implementation + + + + + Whether each update should have a consecutive id number. Used to identify and reconnect when numbers are skipped. + + + + + Whether or not a level should be removed from the book when it's pushed out of scope of the limit. For example with a book of limit 10, + when a new bid is added which makes the total amount of bids 11, should the last bid entry be removed + + + + + + The name of the order book implementation + Whether each update should have a consecutive id number. Used to identify and reconnect when numbers are skipped. + Whether or not a level should be removed from the book when it's pushed out of scope of the limit. For example with a book of limit 10, + when a new bid is added which makes the total amount of bids 11, should the last bid entry be removed + + + + + + + Base client options + + + + + The base address of the client + + + + + The api credentials + + + + + Proxy to use + + + + + ctor + + + + + + + + + Base for rest client options + + + + + List of rate limiters to use + + + + + What to do when a call would exceed the rate limit + + + + + The time the server has to respond to a request before timing out + + + + + ctor + + + + + + Create a copy of the options + + + + + + + + + + Base for socket client options + + + + + Whether or not the socket should automatically reconnect when losing connection + + + + + Time to wait between reconnect attempts + + + + + The time to wait for a socket response + + + + + The time after which the connection is assumed to be dropped + + + + + The amount of subscriptions that should be made on a single socket connection. Not all exchanges support multiple subscriptions on a single socket. + Setting this to a higher number increases subscription speed, but having more subscriptions on a single connection will also increase the amount of traffic on that single connection. + + + + + ctor + + + + + + Create a copy of the options + + + + + + + + + + Buffer entry with a first and last update id + + + + + First update id + + + + + Last update id + + + + + List of asks + + + + + List of bids + + + + + Base for order book implementations + + + + + The process buffer, used while syncing + + + + + The ask list + + + + + The bid list + + + + + Order book implementation id + + + + + The log + + + + + If order book is set + + + + + The amount of levels for this book + + + + + The status of the order book. Order book is up to date when the status is `Synced` + + + + + Last update identifier + + + + + The symbol of the order book + + + + + Event when the state changes + + + + + Event when the BestBid or BestAsk changes ie a Pricing Tick + + + + + Event when order book was updated, containing the changed bids and asks. Be careful! It can generate a lot of events at high-liquidity markets + + + + + Timestamp of the last update + + + + + The number of asks in the book + + + + + The number of bids in the book + + + + + The list of asks + + + + + The list of bids + + + + + The best bid currently in the order book + + + + + The best ask currently in the order book + + + + + BestBid/BesAsk returned as a pair + + + + + ctor + + + + + + + Start connecting and synchronizing the order book + + + + + + Start connecting and synchronizing the order book + + + + + + Stop syncing the order book + + + + + + Stop syncing the order book + + + + + + Start the order book + + + + + + Reset the order book + + + + + Resync the order book + + + + + + Validate a checksum with the current order book + + + + + + + Set the initial data for the order book + + The last update sequence number + List of asks + List of bids + + + + Update the order book using a single id for an update + + + + + + + + Add a checksum to the process queue + + + + + + Update the order book using a first/last update id + + + + + + + + + Update the order book using sequenced entries + + List of bids + List of asks + + + + Check and empty the process buffer; see what entries to update the book with + + + + + Update order book with an entry + + Sequence number of the update + Type of entry + The entry + + + + Wait until the order book has been set + + Max wait time + + + + + Dispose the order book + + + + + String representation of the top 3 entries + + + + + + String representation of the top x entries + + + + + + Limits the amount of requests per time period to a certain limit, counts the request per API key. + + + + + Create a new RateLimiterAPIKey. This rate limiter limits the amount of requests per time period to a certain limit, counts the request per API key. + + The amount to limit to + The time period over which the limit counts + + + + + + + Limits the amount of requests per time period to a certain limit, counts the request per endpoint. + + + + + Create a new RateLimiterPerEndpoint. This rate limiter limits the amount of requests per time period to a certain limit, counts the request per endpoint. + + The amount to limit to + The time period over which the limit counts + + + + + + + Limits the amount of requests per time period to a certain limit, counts the total amount of requests. + + + + + Create a new RateLimiterTotal. This rate limiter limits the amount of requests per time period to a certain limit, counts the total amount of requests. + + The amount to limit to + The time period over which the limit counts + + + + + + + Rate limiting object + + + + + Lock + + + + + ctor + + + + + Get time to wait for a specific time + + + + + + + + + Add an executed request time + + + + + + Request object + + + + + Create request object for web request + + + + if true, should assign unique id for request + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + WebRequest factory + + + + + + + + + + + HttpWebResponse response object + + + + + + + + + + + + + + Create response for a http response message + + The actual response + + + + + + + + + + Base rest client + + + + + The factory for creating requests. Used for unit testing + + + + + Where to place post parameters + + + + + Request body content type + + + + + Whether or not we need to manually parse an error instead of relying on the http status code + + + + + How to serialize array parameters + + + + + What request body should be when no data is send + + + + + Timeout for requests + + + + + Rate limiting behaviour + + + + + List of rate limiters + + + + + Total requests made + + + + + ctor + + + + + + + Adds a rate limiter to the client. There are 2 choices, the and the . + + The limiter to add + + + + Removes all rate limiters from this client + + + + + Ping to see if the server is reachable + + The roundtrip time of the ping request + + + + Ping to see if the server is reachable + + The roundtrip time of the ping request + + + + Execute a request + + The expected result type + The uri to send the request to + The method of the request + Cancellation token + The parameters of the request + Whether or not the request should be authenticated + Whether or not the resulting object should be checked for missing properties in the mapping (only outputs if log verbosity is Debug) + Where the post parameters should be placed + How array paramters should be serialized + + + + + Executes the request and returns the string result + + The request object to execute + Cancellation token + + + + + Can be used to parse an error even though response status indicates success. Some apis always return 200 OK, even though there is an error. + This can be used together with ManualParseError to check if it is an error before deserializing to an object + + Received data + Null if not an error, Error otherwise + + + + Creates a request object + + The uri to send the request to + The method of the request + The parameters of the request + Whether or not the request should be authenticated + Where the post parameters should be placed + How array paramters should be serialized + + + + + Writes the parameters of the request to the request object, either in the query string or the request body + + + + + + + + Parse an error response from the server. Only used when server returns a status other than Success(200) + + The string the request returned + + + + + Base for socket client implementations + + + + + The factory for creating sockets. Used for unit testing + + + + + List of socket connections currently connecting/connected + + + + + + + + + + + + + + + + + + + + + The max amount of concurrent socket connections + + + + + + + + Handler for byte data + + + + + Handler for string data + + + + + Generic handlers + + + + + Periodic task + + + + + Periodic task event + + + + + Is disposing + + + + + If true; data which is a response to a query will also be distributed to subscriptions + If false; data which is a response to a query won't get forwarded to subscriptions as well + + + + + Create a socket client + + Client options + Authentication provider + + + + Set a function to interpret the data, used when the data is received as bytes instead of a string + + Handler for byte data + Handler for string data + + + + Subscribe + + The expected return data + The request to send + The identifier to use + If the subscription should be authenticated + The handler of update data + + + + + Subscribe using a specif URL + + The type of the expected data + The URL to connect to + The request to send + The identifier to use + If the subscription should be authenticated + The handler of update data + + + + + Sends the subscribe request and waits for a response to that request + + The connection to send the request on + The request to send + The subscription the request is for + + + + + Query for data + + Expected result type + The request to send + Whether the socket should be authenticated + + + + + Query for data + + The expected result type + The url for the request + The request to send + Whether the socket should be authenticated + + + + + Sends the query request and waits for the result + + The expected result type + The connection to send and wait on + The request to send + + + + + Checks if a socket needs to be connected and does so if needed + + The connection to check + Whether the socket should authenticated + + + + + Needs to check if a received message was an answer to a query request (preferable by id) and set the callResult out to whatever the response is + + The type of response + The socket connection + The request that a response is awaited for + The message + The interpretation (null if message wasn't a response to the request) + True if the message was a response to the query + + + + Needs to check if a received message was an answer to a subscription request (preferable by id) and set the callResult out to whatever the response is + + The socket connection + + The request that a response is awaited for + The message + The interpretation (null if message wasn't a response to the request) + True if the message was a response to the subscription request + + + + Needs to check if a received message matches a handler. Typically if an update message matches the request + + The received data + The subscription request + + + + + Needs to check if a received message matches a handler. Typically if an received message matches a ping request or a other information pushed from the the server + + The received data + The string identifier of the handler + + + + + Needs to authenticate the socket so authenticated queries/subscriptions can be made on this socket connection + + + + + + + Needs to unsubscribe a subscription, typically by sending an unsubscribe request. If multiple subscriptions per socket is not allowed this can just return since the socket will be closed anyway + + The connection on which to unsubscribe + The subscription to unsubscribe + + + + + Optional handler to interpolate data before sending it to the handlers + + + + + + + Add a handler for a subscription + + The type of data the subscription expects + The request of the subscription + The identifier of the subscription (can be null if request param is used) + Whether or not this is a user subscription (counts towards the max amount of handlers on a socket) + The socket connection the handler is on + The handler of the data received + + + + + Adds a generic message handler. Used for example to reply to ping requests + + The name of the request handler. Needs to be unique + The action to execute when receiving a message for this handler (checked by ) + + + + Gets a connection for a new subscription or query. Can be an existing if there are open position or a new one. + + The address the socket is for + Whether the socket should be authenticated + + + + + Connect a socket + + The socket to connect + + + + + Create a socket for an address + + The address the socket should connect to + + + + + Periodically sends an object to a socket + + How often + Method returning the object to send + + + + Unsubscribe from a stream + + The subscription to unsubscribe + + + + + Unsubscribe all subscriptions + + + + + + Dispose the client + + + + + Socket implementation + + + + + Socket + + + + + Log + + + + + Error handlers + + + + + Open handlers + + + + + Close handlers + + + + + Message handlers + + + + + Id + + + + + If is reconnecting + + + + + Origin + + + + + Url + + + + + Is closed + + + + + Is open + + + + + Protocols + + + + + Interpreter for bytes + + + + + Interpreter for strings + + + + + Last action time + + + + + Timeout + + + + + Socket state + + + + + ctor + + + + + + + ctor + + + + + + + + + On close + + + + + On message + + + + + On error + + + + + On open + + + + + Handle + + + + + + Handle + + + + + + + + Checks if timed out + + + + + + Close socket + + + + + + Reset socket + + + + + Send data + + + + + + Connect socket + + + + + + Set a proxy + + + + + + + Dispose + + + + + Socket connecting + + + + + Connection lost event + + + + + Connecting restored event + + + + + The connection is paused event + + + + + The connection is unpaused event + + + + + Connecting closed event + + + + + The amount of handlers + + + + + If connection is authenticated + + + + + If connection is made + + + + + The socket + + + + + If should reconnect upon closing + + + + + Time of disconnecting + + + + + If activity is paused + + + + + New socket connection + + The socket client + The socket + + + + Add handler + + + + + + Send data + + The data type + The object to send + The timeout for response + The response handler + + + + + Send data to the websocket + + The type of the object to send + The object to send + How null values should be serialized + + + + Send string data to the websocket + + The data to send + + + + Handler for a socket closing. Reconnects the socket if needed, or removes it from the active socket list if not + + + + + Close the connection + + + + + + Close the subscription + + Subscription to close + + + + + Socket subscription + + + + + Exception event + + + + + Message handlers for this subscription. Should return true if the message is handled and should not be distributed to the other handlers + + + + + Request object + + + + + Subscription identifier + + + + + Is user subscription or generic + + + + + If the subscription has been confirmed + + + + + Create SocketSubscription for a request + + + + + + + + + Create SocketSubscription for an identifier + + + + + + + + + Invoke the exception event + + + + + + Subscription + + + + + Event when the connection is lost. The socket will automatically reconnect when possible. + + + + + Event when the connection is restored. Timespan parameter indicates the time the socket has been offline for before reconnecting + + + + + Event when the connection to the server is paused. No operations can be performed while paused + + + + + Event when the connection to the server is unpaused + + + + + Event when an exception happened + + + + + The id of the socket + + + + + ctor + + + + + + + Close the subscription + + + + + + Close the socket to cause a reconnect + + + + + + Factory implementation + + + + + + + + + + diff --git a/CryptoExchange.Net/Objects/Options.cs b/CryptoExchange.Net/Objects/Options.cs index 8249f5d..577de1e 100644 --- a/CryptoExchange.Net/Objects/Options.cs +++ b/CryptoExchange.Net/Objects/Options.cs @@ -56,7 +56,6 @@ namespace CryptoExchange.Net.Objects /// Whether each update should have a consecutive id number. Used to identify and reconnect when numbers are skipped. /// Whether or not a level should be removed from the book when it's pushed out of scope of the limit. For example with a book of limit 10, /// when a new bid is added which makes the total amount of bids 11, should the last bid entry be removed - /// Amount of levels for this order book public OrderBookOptions(string name, bool sequencesAreConsecutive, bool strictLevels) { OrderBookName = name; diff --git a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs index 63bd74b..cb15451 100644 --- a/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs +++ b/CryptoExchange.Net/OrderBook/SymbolOrderBook.cs @@ -38,7 +38,7 @@ namespace CryptoExchange.Net.OrderBook private readonly bool sequencesAreConsecutive; private readonly bool strictLevels; - private Task _processTask; + private Task? _processTask; private AutoResetEvent _queueEvent; private ConcurrentQueue _processQueue; @@ -146,7 +146,7 @@ namespace CryptoExchange.Net.OrderBook public decimal Price { get { return 0m; } set {; } } } - private static ISymbolOrderBookEntry emptySymbolOrderBookEntry = new EmptySymbolOrderBookEntry(); + private static readonly ISymbolOrderBookEntry emptySymbolOrderBookEntry = new EmptySymbolOrderBookEntry(); /// /// The best bid currently in the order book @@ -284,7 +284,7 @@ namespace CryptoExchange.Net.OrderBook log.Write(LogVerbosity.Debug, $"{Id} order book {Symbol} stopping"); Status = OrderBookStatus.Disconnected; _queueEvent.Set(); - _processTask.Wait(); + _processTask?.Wait(); if(subscription != null) await subscription.Close().ConfigureAwait(false); } diff --git a/README.md b/README.md index 5df343d..56dadd7 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,9 @@ The order book will automatically reconnect when the connection is lost and resy To stop synchronizing an order book use the `Stop` method. ## Release notes +* Version 3.0.12 - 12 Aug 2020 + * Named parameters on SymbolOrderBook events + * Version 3.0.11 - 20 Jun 2020 * Added support for checksum in SymbolOrderBook