Giter Site home page Giter Site logo

cryptoexchange.net's Introduction

.CryptoExchange.Net CryptoExchange.Net

.NET Nuget downloads License

CryptoExchange.Net is a base library which is used to implement different cryptocurrency (exchange) API's. It provides a standardized way of implementing different API's, which results in a very similar experience for users of the API implementations. Note that the CryptoExchange.Net package itself can not be used directly for accessing API's. Either install a client library from the list below or use CryptoClients.Net which includes access to all exchange API's.

For more information on what CryptoExchange.Net and it's client libraries offers see the Documentation.

Current implementations

The following API's are directly supported. Note that there are 3rd party implementations going around, but only these are created and supported by me:

Exchange Repository Nuget
Binance JKorf/Binance.Net Nuget version
BingX JKorf/BingX.Net Nuget version
Bitfinex JKorf/Bitfinex.Net Nuget version
Bitget JKorf/Bitget.Net Nuget version
BitMart JKorf/BitMart.Net Nuget version
Bybit JKorf/Bybit.Net Nuget version
CoinEx JKorf/CoinEx.Net Nuget version
CoinGecko JKorf/CoinGecko.Net Nuget version
Gate.io JKorf/GateIo.Net Nuget version
Huobi/HTX JKorf/Huobi.Net Nuget version
Kraken JKorf/Kraken.Net Nuget version
Kucoin JKorf/Kucoin.Net Nuget version
Mexc JKorf/Mexc.Net Nuget version
OKX JKorf/OKX.Net Nuget version

Any of these can be installed independently or install CryptoClients.Net which includes all exchange API's.

Discord

Nuget version
A Discord server is available here. Feel free to join for discussion and/or questions around the CryptoExchange.Net and implementation libraries.

Support the project

I develop and maintain this package on my own for free in my spare time, any support is greatly appreciated.

Donate

Make a one time donation in a crypto currency of your choice. If you prefer to donate a currency not listed here please contact me.

Btc: bc1q277a5n54s2l2mzlu778ef7lpkwhjhyvghuv8qf
Eth: 0xcb1b63aCF9fef2755eBf4a0506250074496Ad5b7
USDT (TRX) TKigKeJPXZYyMVDgMyXxMf17MWYia92Rjd

Sponsor

Alternatively, sponsor me on Github using Github Sponsors.

Release notes

  • Version 7.11.0 - 07 Aug 2024

    • Added ParseString static method on EnumConverter for parsing strings manually
    • Added support for decimal values in System.Text.Json NumberStringConverter
    • Added support for null string values in System.Text.Json DecimalConverter
    • Added support for number deserialization when requesting string in System.Text.Json MessageAccessor.GetValue
    • Added deserialization handling of json values too big to fit decimal value
    • Decreased some memory allocations during rest request authentication
    • Fixed subscriptions trying to send unsubscribe request when the socket connection will be closed anyway
    • Removed SecureString usage in credentials; it's not recommended to be used
    • Removed some extension methods no longer relevant
    • Improved testing checks
  • Version 7.10.0 - 26 Jul 2024

    • Added System.Text.Json NumberStringConverter
    • Added integration testing base class
    • Added AddSecondsString and AddOptionalSecondsString to ParameterCollection
    • Added Decompress method for ReadOnlyMemory using non-GZip deflate
    • Added SocketConnection parameter to SocketConnection PreprocessStreamMessage
    • Fixed websocket reconnect/unsubscribe timing bug
    • Fixed issue in System.Text.Json array object deserialization skipping property when skipping an index
    • Fixed order book logging bug
    • Fixed bug in ParameterCollection AddEnumAsInt
  • Version 7.9.0 - 16 Jul 2024

    • Added some checks in websocket connection handling
    • Added As and AsError methods on untyped WebCallResult
    • Updated System.Text.Json package to version 8.0.4 to fix vulnerability
    • Updated websocket subscription response handling to remove the thread blocking ManualResetEvent usage
    • Updated static logging classes access modifier from internal to public so they can be called in overriden methods
    • Updated some testing object implementations
    • Fixed authentication error when reconnecting an unauthenticated connection which was marked as dedicated query connection
    • Small improvements in SystemTextJsonMessageAccessor
    • Fixed System.Text.Json ArrayConverter implementation nullable value types handling
  • Version 7.8.0 - 02 Jul 2024

    • Updated single endpoint limit configuration
    • Added LongConverter for nullable longs
    • Updated SystemTextJsonComparer logic
  • Version 7.7.3 - 26 Jun 2024

    • Fixed request ids not matching in logging
    • Added nullable int converter for System.Text.Json
    • Small fixes in tests
  • Version 7.7.2 - 25 Jun 2024

    • Fixed ratelimiting issue possibly creating negative delays
  • Version 7.7.1 - 23 Jun 2024

    • Fixes for caching implementation
  • Version 7.7.0 - 23 Jun 2024

    • Caching support
      • Caching is supported for GET requests within a certain time frame
      • Enable caching by setting CachingEnabled to true in the client options
      • Added DataSource to CallResult object
    • Dedicated websocket connection
      • Added functionality for always having a connection open which can then be used for order operations
      • This eliminates the initial connection time for the first request
      • WebSocket connection can be prepared by calling PrepareConnectionsAsync on the Api client, for example await binanceSocketClient.SpotApi.PrepareConnectionsAsync(). This is only needed initially; it will be reconnected when connection is lost.
    • Added CancellationToken support for websocket queries
    • Added SocketConnection parameter to SocketApiClient.GetAuthenticationRequest method
    • Added ObjectStringConverter base converter for deserializing nested json strings
    • Fixed websocket issue with ratelimiting and reconnecting interaction
    • Fixed rate limiting issue with sub-millisecond delays
    • Fixed websocket connection will now close if authentication fails because of not set credentials
    • Updated websocket reconnection handling and options, added backoff policy
    • Removed check for confirmed subscription as data often is pushed before the subscription is confirmed
  • Version 7.6.0 - 11 Jun 2024

    • Added support for specifying seperate uri and body parameters
    • Added support for different message and handling generic types on socket queries
    • Added support for PATCH http method requests
    • Added support for setting http request body to a specific type directly
    • Split DataEvent.Topic into StreamId and Symbol properties
    • Added support for negative time values parsing
    • Added some helper methods for converting DataEvent to CallResult
    • Added support for GZip/Deflate automatic decompressing in the default HttpClient
    • Updated some testing methods
  • Version 7.5.2 - 07 May 2024

    • Fixed SetApiCredentials not correctly being used by rate limiter causing exception
  • Version 7.5.1 - 03 May 2024

    • Some small improvements in unit testing components
  • Version 7.5.0 - 01 May 2024

    • Added testing implementations
    • Small refactor AuthenticationProvider to allow better testing
    • Change result of MessageAccessor.Read methods to CallResult so error can be returned
    • Moved some DateTimeConverter logic to seperate methods to allow access from outside converters
  • Version 7.4.0 - 28 Apr 2024

    • Added FormatSymbol on IBaseApiClient interface
    • Added IOrderBookFactory interface
    • Removed ExchangeOptions as base class for OrderBookOptions
  • Version 7.3.3 - 23 Apr 2024

    • Added support for new DateTime format parsing
    • Updated some logging
    • Fixed concurrency issue in rest request sending
  • Version 7.3.2 - 19 Apr 2024

    • Fix for endpoint specific rate limiting throwing exception
  • Version 7.3.1 - 18 Apr 2024

    • Fixed websocket system subscriptions getting marked as unconfirmed when reconnecting
  • Version 7.3.0 - 17 Apr 2024

    • Added new method for sending Rest requests which splits the static and dynamic parameters
    • Refactored rate limiting implementation
      • Ratelimiters now statically applied for all clients
      • Added support for different rate limit window types
      • Added modular configuration of rate limits
      • Added rate limit check when creating websocket connections
      • Added automatic handling and retry for Retry-After responses
      • Added configuration for setting ratelimit for each individual endpoint
      • Added event for when rate limit is triggered
    • Added SocketClient GetSocketApiClientStates method
  • Version 7.2.1 - 05 Apr 2024

    • Improved websocket reconnect logic
    • Simplified SystemTextJsonMessageAccessor value retrieval
    • Fixed System.Text.Json BoolConverter value writing
  • Version 7.2.0 - 24 Mar 2024

    • Added ArrayParametersSerialization.JsonArray support
    • Refactored to high-performance logging for hot paths
    • Updated SymbolOrderBook to use LoggerFactory
    • Performance improvements
    • Small bug fixes
    • Updated logging
  • Version 7.1.0 - 16 Mar 2024

    • Added initial System.Text.Json deserialization support
    • Added support for setting MessageSendSizeLimit for websocket clients to limit message size
    • Added Exchange name property to IRestClient and ISocketClient interface
    • Abstracted out rest client deserialization so different (de)serializers can be used
    • Cleaned up rest client response handling
    • Continued update of websocket message handling
      • Use ReadonlyMemory to represent message data to prevent copying data multiple times
      • Switched back to non-async websocket message handling to remove tasks overhead
    • Updated package dependencies to latest versions
    • Updated unit test package dependencies and updated tests accordingly
    • Moved some properties used by the RestApiClient from the BaseApiClient
    • Fixed issue with multiple concurrent subscribe calls in socket client
  • Version 7.0.0 - 24 Feb 2024

    • Full overhaul of Websocket message handling
    • Abstracted out Newtonsoft.Json references in preparation of moving to System.Text.Json
    • Updated SendPeriodic to operate on connection level instead of client level to prevent looping when there are no connections
    • Added check to not send an unsubscribe message if there is another subscription listening to the same events
    • Added CryptoRestClient and CryptoSocketClient as aggregate for accessing different exchange APIs
    • Updated socket client log messages
    • Updated socket client GetSubscriptionState output
  • Version 6.2.5 - 09 Jan 2024

    • Added support for deserializing null and empty string values to BoolConverter
  • Version 6.2.4 - 04 Jan 2024

    • Fixed parsing of DateTime value of zero with additional zero decimal places
  • Version 6.2.3 - 02 Dec 2023

    • Fixed requestBodyFormat parameter handling
  • Version 6.2.2 - 02 Dec 2023

    • Added support for specifying the request body content type on a per request basis
    • Added DecimalStringWriterConverter
    • Added RequestId to WebCallResult model
    • Updated response logging
  • Version 6.2.1 - 28 Oct 2023

    • Utility methods
  • Version 6.2.0 - 24 Oct 2023

    • Added SerializerOptions helper class for setting a default serializer
    • Added ParameterCollection helper class for easier parameter definition
    • Added extra helper methods AuthenticationProvider
    • Remove interface entries meant for internal use
    • Added support for writing int values to the EnumConverter
  • Version 6.1.5 - 08 Oct 2023

    • Added UpdateType to socket DataEvent
    • Added additional scenarios for BoolConverter
    • Updated some logging
  • Version 6.1.4 - 23 Sep 2023

    • Added BoolConverter
    • Added parameter for logging warning message on missing enum entry to EnumConverter
  • Version 6.1.3 - 18 Sep 2023

    • Fix for concurrency exception in socket subscription
  • Version 6.1.2 - 11 Sep 2023

    • Added support for multiple of the same ratelimiting type in the same rate limiter
    • Fixed nullreference on rate limit error if no Retry-After header is returned
  • Version 6.1.1 - 04 Sep 2023

    • Fixes for json converters
  • Version 6.1.0 - 24 Aug 2023

    • Added support for ratelimiting on socket connections
    • Added rest ratelimit handling and parsing
    • Added ServerRatelimitError error
  • Version 6.0.3 - 23 Jul 2023

    • Fixed Proxy not getting applied in rest clients when not using DI
  • Version 6.0.2 - 05 Jul 2023

    • Added properties generic dictionary to SocketConnection
  • Version 6.0.1 - 29 Jun 2023

    • Added LogLevel optional parameter to TraceLoggerProvider
  • Version 6.0.0 - 25 Jun 2023

    • Updated ApiCredentials to support RSA signing as well as the default Hmac signature
    • Removed custom logging implementation in favor of using Microsoft.Extensions.Logging ILogger directly
    • Refactored client options for easier use
    • Added easier way of switching environments
    • Added ResponseLength and ToString() override on WebCallResult object
    • Fixed memory leak in AsyncResetEvent
  • Version 5.4.3 - 14 Apr 2023

    • Fixed potential threading exception in socket connection
  • Version 5.4.2 - 01 Apr 2023

    • Reverted socket changes as it seems to cause reconnect to hang
  • Version 5.4.1 - 18 Mar 2023

    • Added CalculateTradableAmount to SymbolOrderBook
    • Improved socket reconnect robustness
    • Fixed api rate limiter not working correctly
  • Version 5.4.0 - 14 Feb 2023

    • Added unsubscribing when receiving subscribe answer after the request timeout has passed
    • Fixed socket options copying
    • Made TimeSync implementation optional
    • Cleaned up ApiCredentials and added better support for extending ApiCredentials
  • Version 5.3.1 - 08 Dec 2022

    • Added default request parameter ordering before applying authentication
    • Fixed possible issue where a socket would reconnect when it should close if it was already in reconnecting
  • Version 5.3.0 - 14 Nov 2022

    • Reworked client architecture, shifting funcationality to the ApiClient
    • Fixed ArrayConverter exponent parsing
    • Fixed ArrayConverter not checking null
    • Added optional delay setting after establishing socket connection
    • Added callback for revitalizing a socket request when reconnecting
    • Fixed proxy setting websocket
  • Version 5.2.4 - 31 Jul 2022

    • Added handling of PlatformNotSupportedException when trying to use websocket from WebAssembly
    • Changed DataEvent to have a public constructor for testing purposes
    • Fixed EnumConverter serializing values without proper quotes
    • Fixed websocket connection reconnecting too quickly when resubscribing/reauthenticating fails
  • Version 5.2.3 - 19 Jul 2022

    • Fixed socket getting disconnected when no data timeout is reached instead of being reconnected
  • Version 5.2.2 - 17 Jul 2022

    • Added support for retrieving a new url when socket connection is lost and reconnection will happen
  • Version 5.2.1 - 16 Jul 2022

    • Fixed socket reconnect issue
    • Fixed message not handled messages after unsubscribing
    • Fixed error returning for non-json error responses
  • Version 5.2.0 - 10 Jul 2022

    • Refactored websocket code, removed some clutter and simplified
    • Added ReconnectAsync and GetSubscriptionsState methods on socket clients
  • Version 5.1.12 - 12 Jun 2022

    • Changed time sync so requests no longer wait for it to complete unless it's the first time
    • Made log client options changable after client creation
    • Fixed proxy setting not used when reconnecting socket
    • Changed MaxSocketConnections to a client options
    • Updated socket reconnection logic
  • Version 5.1.12 - 12 Jun 2022

    • Changed time sync so requests no longer wait for it to complete unless it's the first time
    • Made log client options changable after client creation
    • Fixed proxy setting not used when reconnecting socket
    • Updated socket reconnection logic
  • Version 5.1.11 - 24 May 2022

    • Added KeepAliveInterval setting
    • Fixed port not being copied when setting parameters on request
    • Fixed inconsistent PackageReference casing in csproj
  • Version 5.1.10 - 22 May 2022

    • Fixed order book reconnecting while Diposed
    • Fixed exception when disposing socket client while reconnecting
    • Added additional null/default checking in DateTimeConverter
    • Changed ConnectionLost subscription event to run in seperate task to prevent exception/longer operations from intervering with reconnecting
  • Version 5.1.9 - 08 May 2022

    • Added latency to the timesync calculation
    • Small fix for exception in socket close handling
  • Version 5.1.8 - 01 May 2022

    • Cleanup socket code, fixed an issue which could cause connections to never reconnect when connection was lost
    • Added support for sending requests which expect an empty response
    • Fixed issue with the DateTimeConverter date interpretation
  • Version 5.1.7 - 14 Apr 2022

    • Moved some Rest parameters from BaseRestClient to RestApiClient to allow different implementations for sub clients
  • Version 5.1.6 - 10 Mar 2022

    • Updated EnumConverter to properly handle emtpy/null and default values
  • Version 5.1.5 - 09 Mar 2022

    • Removed ResubscribeMaxRetries default value of 5
    • Updated logging and log verbosity
  • Version 5.1.4 - 04 Mar 2022

    • Fixed ArraySerialization handling
    • Added check for invalid rate limit configured for a request
  • Version 5.1.3 - 01 Mar 2022

    • Fixed some issues in websocket reconnection, should be more robust now
    • Prevent duplicate data reading on error in rest request
    • Added ApiName to time sync state to improve log feedback
  • Version 5.1.2 - 27 Feb 2022

    • Fixed issue where the rate limiter was messing with time syncing
    • Added support for delegate parameters
    • Added ignoreRateLimit paramter in SendRequestAsync
  • Version 5.1.1 - 24 Feb 2022

    • Fixed issue ApiCredentials
  • Version 5.1.0 - 24 Feb 2022

    • Improved dispose handling in SymbolOrderBook
    • Fixed TimeSync RecalculationInterval not being respected
    • Small rework client options
  • Version 5.0.0

    • Added Github.io page for documentation: https://jkorf.github.io/CryptoExchange.Net/
    • Added single DateTimeConverter replacing the different timestamp converters
    • Added additional request related properties to WebCallResult
    • Added CancelationToken support for websockets
    • Added CancelationToken support for SymbolOrderBook starting
    • Added TimeSync support
    • Refactored base client classes into BaseClient and ApiClient to provide a more defined client structure
    • Refactored client options to have better control over each different ApiClient
    • Refactored authentication provider to be more flexible
    • Refactored rate limiter implementation
    • Refactored IExchangeClient interface to ISpotClient and IFuturesClient
    • Refactored socket reconnection to immediately try to reconnect before waiting the ReconnectTimeout
    • Improved SymbolOrderBook stability
    • Updated code docs
  • Version 4.2.8 - 08 Oct 2021

    • Fixed deadlock in socket receive
    • Fixed issue in reconnection handling when the client is disconnected again during resubscribing
    • Added some additional checking of socket state to prevent sending/expecting data when socket is not connected
  • Version 4.2.7 - 06 Oct 2021

    • Made receivedMessages protected again to allow implementations with custom transport (Bittrex) to use it again
  • Version 4.2.6 - 06 Oct 2021

    • Fixed an issue causing socket client to stop processing data in .NET Framework
  • Version 4.2.5 - 05 Oct 2021

    • Added custom async wait event implementation as previous method seems to not work 100% of the time
  • Version 4.2.4 - 30 Sep 2021

    • Fix for InvalidOperationExceptions when running socket connections from .Net framework
  • Version 4.2.3 - 29 Sep 2021

    • Added IncomingKbps property to socket/socket client
    • Updated logging
    • Socket performance improvements
  • Version 4.2.2 - 23 Sep 2021

    • Restored missing request parameters log
  • Version 4.2.1 - 22 Sep 2021

    • Fìx for websocket not automatically reconnecting when connection is closed unexpectedly
  • Version 4.2.0 - 20 Sep 2021

    • Prevent reconnect spamming when invalid checksum is calculated in SymbolOrderBook
    • Added default nonce provider implementation
  • Version 4.1.0 - 15 Sep 2021

    • Added overload for UnsubscribeAsync with id parameter
    • Added parameter position configuration per HttpMethod type
    • Added option to send custom headers with each requets
    • Added option to send custom headers with individual requests
    • Added debug data on error
  • Version 4.0.8 - 26 Aug 2021

    • Added rate limiting option for outgoing messages per socket
  • Version 4.0.7 - 24 Aug 2021

    • Additional error info on websocket exception
  • Version 4.0.6 - 24 Aug 2021

    • Removed some debug logging
  • Version 4.0.5 - 24 Aug 2021

    • Added ConnectionClosed event on UpdateSubscriptions to signal the connection was closed and no reconnecting is happening
  • Version 4.0.4 - 24 Aug 2021

    • Websocket connection fixes/improvements
    • Added ChecksumValidationEnabled option for controlling checksum validation in SymbolOrderBook
    • Added MaxReconnectTries option
    • Added MaxResubscribeTries option
    • Added MaxConcurrentResubscriptionsPerSocket option
    • Fix for TimestampSecondsConverter rounding to nearest millisecond
  • Version 4.0.3 - 20 Aug 2021

    • Fix for concurrent sent socket issue
  • Version 4.0.2 - 20 Aug 2021

    • Fixed socket client continuing before the send/receive loops have been started, which could cause issues when doing concurrent connections
  • Version 4.0.1 - 13 Aug 2021

    • Fixed OperationCancelledException when closing socket from a project targeting .net framework
  • Version 4.0.0 - 12 Aug 2020

    • Release version, summed up changes from previous beta releases:
      • Removed Websocket4Net dependency in favor of a ClientWebSocket native implementation for websocket connections
      • Socket events now always come wrapped in a DataEvent<> object which contain the timestamp of the data, and optionally the originally received json string
      • Implemented usage of the Microsoft.Extensions.Logging.Abstractions ILogger interface instead of a custom implementation
      • Added some properties to the IExchangeClient interface
        • ICommonOrder.CommonOrderTime
        • ICommonOrder.CommonOrderStatus enum
        • ICommonTrade.CommonTradeTime
      • Added OnOrderPlaced and OnOrderCanceled events on the IExchangeClient interface
      • Added ExchangeHelpers static class for various helper methods
      • Removed non-async methods due to too much overhead in development/maintainance
        • If you were previously using non-async methods you can add .Result to the end of the async call to get the same result
      • Added Book property to SymbolOrderBook for a book snapshot
      • Added CalculateAverageFillPrice to SymbolOrderBook to calculate the average fill price for an order with the current order book state
      • Various fixes
  • Version 4.0.0-beta15 - 12 Aug 2021

    • Conditional version Logging.Abstractions
  • Version 4.0.0-beta14 - 09 Aug 2021

    • Fix for bug in processing order in SymbolOrderBook
  • Version 4.0.0-beta13 - 31 Jul 2021

    • Fix for socket connection
  • Version 4.0.0-beta12 - 26 Jul 2021

    • Fix for socket connection
  • Version 4.0.0-beta11 - 09 Jul 2021

    • Added CalculateAverageFillPrice to SymbolOrderBook
    • Added Book property to SymbolOrderBook
    • Added Async postfix to async methods
  • Version 4.0.0-beta10 - 07 Jul 2021

    • Updated BaseConverter to be case sensitive
    • Added ExchangeHelpers class containing some helper methods
    • Fixed responses not being logged on Trace log level
    • Added some code docs
  • Version 4.0.0-beta9 - 17 Jun 2021

    • Small fixes
  • Version 4.0.0-beta8 - 08 Jun 2021

    • Fixed exception socket buffer size in .net framework
  • Version 4.0.0-beta7 - 07 Jun 2021

    • Added CommonOrderTime to IOrder
    • Added OrderStatus enum for IOrder
    • Added OnOrderPlaced and OnOrderCanceled events on IExchangeClient
    • Added CommonTradeTime to ICommonTrade
  • Version 4.0.0-beta6 - 01 jun 2021

    • Some logging adjustments
    • Fixed some async issues
  • Version 4.0.0-beta5 - 26 May 2021

    • Added DataEvent wrapper for socket updates
    • Added optional original json output
    • Changed logging implementation to use ILogger
  • Version 4.0.0-beta4 - 06 mei 2021

    • Added analyzers
    • Fixed some warnings
  • Version 4.0.0-beta3 - 30 Apr 2021

    • Updated socket closing
  • Version 4.0.0-beta2 - 30 apr 2021

    • Fix for closing socket without timeout task
  • Version 4.0.0-beta1 - 30 apr 2021

    • Removed Websocket4Net dependency
    • Added custom ClientWebSocket implementation
    • Renamed handler -> subscription internally
    • Renamed socket -> socketConenction when type is socketConnection
  • Version 3.9.0 - 28 apr 2021

    • Added optional JsonSerializer parameter to SendRequest to use during deserialization
    • Fix for unhandled message warning when unsubscribing a socket subscription
  • Version 3.8.1 - 19 apr 2021

    • Added debug logs
    • Added ValidateNullOrNotEmpty extension method
  • Version 3.8.0 - 30 mrt 2021

    • Better handling of json errors while deserializing stream
    • Added string datetime converter
  • Version 3.7.1 - 10 mrt 2021

    • Performance improvemnt for the ArrayConverter
  • Version 3.7.0 - 01 mrt 2021

    • Changed GetResponse in RestClient to protected
    • Added configuration for deterministic build
  • Version 3.6.1 - 16 feb 2021

    • Fix for timing related exception when stopping an symbol order book
  • Version 3.6.0 - 22 jan 2021

    • Added CommonVolume and CommonOpenTime to ICommonKline interface
  • Version 3.5.0 - 11 jan 2021

    • Additional info on exception messages
    • Added support for rate limiting using credits
  • Version 3.4.0 - 21 dec 2020

    • Updated IExchangeClient interface
    • Fix for dropping message after timeout on socket
    • Added virtual HandleUnhandledMessage method in SocketClient
  • Version 3.3.0 - 10 dec 2020

    • Added client name
    • Added common interfaces
    • Fixed api key plain text storing in RateLimitterApiKey
  • Version 3.2.1 - 19 nov 2020

    • Fixed error code parsing
  • Version 3.2.0 - 19 nov 2020

    • Fix for multiple socket subscriptions re-using the same socket connection
    • Updated errors
  • Version 3.1.0 - 08 Oct 2020

    • Added CallResult without type parameter for calls which don't return data
    • Added GetErrorOrResult method on CallResult to support proper nullability checking
    • Fix for reading credentials from file
    • Fix for setting custom base addresses in clients
  • Version 3.0.15 - 06 Oct 2020

    • Changed default ShouldCheckObjects to false to prevent spam in logging
  • Version 3.0.14 - 24 Aug 2020

    • Updated exception message logging
  • Version 3.0.13 - 24 Aug 2020

    • Added request tracing id for logging
    • Added shared HttpClient option
  • 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
  • Version 3.0.10 - 16 Jun 2020

    • Fix for order book synchronization
  • Version 3.0.9 - 07 Jun 2020

    • Added arraySerialization and postParameterPosition to AuthenticationProvider interface
    • Fixed array serialization in request body
  • Version 3.0.8 - 02 Jun 2020

    • Added requestBodyEmptyContent setting for rest client
    • Added TryParseError for rest implementations to check for error with success status code
  • Version 3.0.7 - 20 May 2020

    • Added error debug output
    • Fix for unsubscribe causing possible deadlock
  • Version 3.0.6 - 03 Mar 2020

    • Added BestOffer to SymbolOrderBook, removed invalid check on proxy
  • Version 3.0.5 - 05 Feb 2020

    • Added PausedActivity events on socket subscriptions
  • Version 3.0.4 - 29 Jan 2020

    • Removed unnecessary json serialization
  • Version 3.0.3 - 23 Jan 2020

    • Added OnBestOffersChanged event to order book implementations
  • Version 3.0.2 - 10 Dec 2019

    • Removed invalid check for unauthenticated proxy
  • Version 3.0.1 - 14 Nov 2019

    • Re-enabled debug response logging
  • Version 3.0.0 - 23 Oct 2019

    • Updated to C# 8.0
    • Added .NetStandard2.1 support
    • Added Nullability support
    • Now using HttpClient instead of WebRequest, should result in faster consequtive requests
    • Added CancellationToken support
    • Added bool compare override to CallResult (now possible to if(callresult) instead of if(callresult.Success))
    • Added input validation methods
      • Wrong input will now throw exceptions rather than error results
    • OnOrderBookUpdate event added to SymbolOrderBook
  • Version 2.1.8 - 29 Aug 2019

    • Added array serialization options for implementations
  • Version 2.1.7 - 07 Aug 2019

    • Fixed bug with socket connection not being disposed after lost connection
    • Resubscribing after reconnecting socket now in parallel
  • Version 2.1.6 - 06 Aug 2019

    • Fix for missing subscription events if they are also a request response, added code docs
  • Version 2.1.5 - 09 jul 2019

    • Updated SymbolOrderBook
  • Version 2.1.4 - 24 jun 2019

    • Added checks for json deserialization issues
  • Version 2.1.3 - 16 may 2019

    • Refactored SymbolOrderBook
    • Added BestBid/BestAsk properties for order book
  • Version 2.1.2 - 14 may 2019

    • Added order book base class for easy implementation
    • Added additional constructor to ApiCredentials to be able to read from file

cryptoexchange.net's People

Contributors

alokym86 avatar andriibratanin avatar asolomatin avatar bdasimcorp avatar bendavison avatar burakoner avatar d-ugarov avatar ericgarnier avatar fuzzlebuck avatar hkooiker avatar jkorf avatar jkorf-bloemert avatar jonnern avatar kir-antipov avatar kulikov-dev avatar martyix avatar mohammadj22 avatar mql4coder avatar nikkozp avatar ridicoulous avatar rodrigobelo avatar tekr avatar zebio21 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cryptoexchange.net's Issues

Add a UpdateSubscription<T> for subscribe API with a return value

Hi,
during the development of LiveCoin.NET, I needed to return a value from the subscribe call. This is du to the API design of LiveCoin.

So I created this type UpdateSubscription< T >

public class UpdateSubscription<T> : CryptoExchange.Net.Sockets.UpdateSubscription where T : class

with a property

/// <summary>
/// Server answer
/// </summary>
public T? SubscriptionResponse { get; set; }

Maybe it would be a good idea to move this in CryptoExchange.Net.

Have a look here : https://github.com/EricGarnier/LiveCoin.Net/blob/master/LiveCoin.Net/Sockets/UpdateSubscription.cs

Thanks.
Eric

Problem with KrakenSymbolOrderBook

Hello - I am trying to use KrakenSymbolOrderBook (see code below).

The problem is, that "ob.LastSequenceNumber" is not changing (in fact, I can see that I have a data flow of around 20kByte/s into my app, but no data gets updatet in the "ob" object).

In main, I am doing this:

var api = new Kraken(
"...",
"..."
);

  api.subscribe( "ETH/EUR" );

What is going on? - Am I using your class in a wrong way?
Please help me and point out my error - or have I found a bug?

Many thanks in advance,
Andreas Pfeil

Kraken.cs:

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;

// https://github.com/JKorf/Kraken.Net
// Install-Package KrakenExchange.Net

using Kraken.Net;
using CryptoExchange.Net.Authentication;

namespace KrakenLink {
  class Kraken {
    KrakenClient        rest;
    KrakenSocketClient  ws;
   
    public Kraken( string key, string secret ) {
      rest = new KrakenClient( new KrakenClientOptions {
        ApiCredentials = new ApiCredentials( key, secret )
      } );

      if( rest.Ping().Success ) {
        Console.WriteLine( $"Connected to Kraken Server at: {rest.GetServerTime().Data}" );

        ws = new KrakenSocketClient( new KrakenSocketClientOptions {
          ApiCredentials = new ApiCredentials( key, secret )
        } );

        return;
      }
      rest = null;
      ws   = null;
      throw new Exception();
    }

    public async Task<bool> subscribe( string pair, int limit = 100 ) {
      if( ws == null ) return false;

      var ob = new KrakenSymbolOrderBook( pair, limit, new KrakenOrderBookOptions( ws ) );

      ob.OnStatusChange += ( oldStatus, newStatus ) => Console.WriteLine( $"Book state changed from {oldStatus} to {newStatus}" );

      ob.OnOrderBookUpdate += ( changedBids ) => Console.WriteLine( "Book updated" );

      ob.OnBestOffersChanged += ( changedOfferes ) => {
        Console.WriteLine( changedOfferes.BestAsk.Price + " " + changedOfferes.BestAsk.Quantity );
        Console.WriteLine( changedOfferes.BestBid.Price + " " + changedOfferes.BestBid.Quantity );
      };

      var startResult = await ob.StartAsync();
      if( !startResult.Success ) {
        Console.WriteLine( "Error starting order book synchronization: " + startResult.Error );
        return false;
      }

      // I do not get any new data updates...
      while( true ) {
        Console.WriteLine( ob.LastSequenceNumber );
        System.Threading.Thread.Sleep( 500 );
      }

      return true;
    }

  }
}

Exceptions thrown in SymbolOrderBook flow

Hi,

I have been using SymbolOrderBook cache to maintain a local order book but Im getting exceptions like the one below...

2020/02/10 10:01:12:320 | Info | Socket 133 error: Microsoft.AspNet.SignalR.Client.Infrastructure.SlowCallbackException: Possible deadlock detected. A callback registered with "HubProxy.On" or "Connection.Received" has been executing for at least 10 seconds.

  • To reproduce this easily Im connecting to 60pairs all with their own "new BittrexSymbolOrderBook(exchangeSymbol)" even once all pairs are synced these exceptions happen on a regular basis and cause resynchronization. Note Im also seeing this for other exchanges but it appears more frequently on the pairs Im connecting to on Bittrex. My guess is it is common SymbolOrderBook cache (or my use of it) rather than Bittrex specific.

Im starting a little digging of my own but wanted to know if this is something you have seen or are working on?

Thanks

Ben

Ftx Authentication

Hi,
I'm trying to implement ftx exchange API, I inspired a lot from the existing implementations and get it almost working.
My problem is about the authenticated requests, I cannot get them, still getting "Server error: Received error from server...:{
"error": "Not logged in",
"success": false
} "
This sample is working fine :

httpClient = new HttpClient
{
BaseAddress = new Uri("https://ftx.com/"),
Timeout = TimeSpan.FromSeconds(30)
};
_hashMaker = new HMACSHA256(Encoding.UTF8.GetBytes("api-secret"));
var account = GetAccountInfoAsync();

public async Task GetAccountInfoAsync()
{
var resultString = $"api/account";
var sign = GenerateSignature(HttpMethod.Get, "/api/account", "");

        var result = await CallAsyncSign(HttpMethod.Get, resultString, sign);

        return ParseResponce(result);
    }

    private dynamic ParseResponce(string responce)
    {
        return (dynamic)responce;
    }

    private async Task<string> CallAsyncSign(HttpMethod method, string endpoint, string sign, string body = null)
    {
        var request = new HttpRequestMessage(method, endpoint);

        if (body != null)
        {
            request.Content = new StringContent(body, Encoding.UTF8, "application/json");
        }

        request.Headers.Add("FTX-KEY", "api-key");
        request.Headers.Add("FTX-SIGN", sign);
        request.Headers.Add("FTX-TS", _nonce.ToString());

        var response = await _httpClient.SendAsync(request).ConfigureAwait(false);

        var result = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

        return result;
    }

    private string GenerateSignature(HttpMethod method, string url, string requestBody)
    {
        _nonce = GetNonce();
        var signature = $"{_nonce}{method.ToString().ToUpper()}{url}{requestBody}";
        var hash = _hashMaker.ComputeHash(Encoding.UTF8.GetBytes(signature));
        var hashStringBase64 = BitConverter.ToString(hash).Replace("-", string.Empty);
        return hashStringBase64.ToLower();
    }
    private readonly HMACSHA256 _hashMaker;
    private long _nonce;
    private HttpClient _httpClient;

    private long GetNonce()
    {
        return Util.GetMillisecondsFromEpochStart();
    }

And my implementation for the FtxAuthenticationProvider cryptoexchange.net is the following:
`internal class FtxAuthenticationProvider : AuthenticationProvider
{
private readonly HMACSHA256 _hashMaker;
private long _nonce;

    public FtxAuthenticationProvider(ApiCredentials credentials) : base(credentials)
    {
        if (credentials.Secret == null)
            throw new ArgumentException("No valid API credentials provided. Key/Secret needed.");

        string secret = new System.Net.NetworkCredential(string.Empty, Credentials.Secret).Password;

        _hashMaker = new HMACSHA256(Encoding.UTF8.GetBytes(secret));
    }

    public override Dictionary<string, object> AddAuthenticationToParameters(string uri, HttpMethod method, Dictionary<string, object> parameters, bool signed, PostParameters postParameterPosition, ArrayParametersSerialization arraySerialization)
    {
        //Nothing
        return parameters;
    }
   

    private string GenerateSignature(HttpMethod method, string url, string requestBody)
    {
        
        _nonce = GetNonce();
        var signature = $"{_nonce}{method.ToString().ToUpper()}{url}{requestBody}";
        var hash = _hashMaker.ComputeHash(Encoding.UTF8.GetBytes(signature));
        var hashStringBase64 = BitConverter.ToString(hash).Replace("-", string.Empty);
        return hashStringBase64.ToLower();
    }

    private long GetNonce()
    {
        return Util.Util.GetMillisecondsFromEpochStart();
    }

    public override Dictionary<string, string> AddAuthenticationToHeaders(string uri, HttpMethod method, Dictionary<string, object> parameters, bool signed, PostParameters postParameterPosition, ArrayParametersSerialization arraySerialization)
    {
        if (Credentials.Key == null)
            throw new ArgumentException("No valid API credentials provided. Key/Secret needed.");
        string key = new System.Net.NetworkCredential(string.Empty, Credentials.Key).Password;
        
        string signature = GenerateSignature(method, uri, "");
        return new Dictionary<string, string>
        {
           
           
            { "FTX-KEY", key },
            { "FTX-SIGN",signature },
            { "FTX-TS",_nonce.ToString() }
        };

    }
}`

Does someone already realized that or have any idea from where the problem could be ?

hedge mode

Is the hedge mode (Binance API update of 2020-5-18) supported?

they added a new field to:

    POST /fapi/v1/order
    POST /fapi/v1/batchOrders
    GET /fapi/v1/order
    DELETE /fapi/v1/order
    DELETE /fapi/v1/batchOrders
    GET /fapi/v1/openOrder
    GET /fapi/v1/openOrders
    GET /fapi/v1/allOrders

so that we can hold several independent positions on the same instruments, and close them independently.

High CPU usage when subscribed to full depth for a number of instruments

Using the OkEx wrapper (from here) built on top of this library, I observe very high CPU usage when subscribed to updates for relatively few order books (~20, while OkEx has hundreds of instruments available). This really limits the scalability of any system using this library for handling a large number of messages.

Profiling shows that over half our market data recorder's total CPU time is spent inside ArrayConverter.ParseObject(), and mostly calling System.Attribute.GetCustomAttributes() (see highlighted line in below screenshot).

ArrayConverterPerfBeforeOptimisation

Custom attributes do not change at runtime, hence a cache is likely to hugely improve performance here. I'll have a go at it.

file list with keys not work

Hi
I would use the CryptoExchange.Net.Authentication.ApiCredentials with file json list:
{ "binanceKey":"actualBinanceApiKey", "binanceSecret":"actualBinanceApiSecret", "bittrexKey":"actualBittrexApiKey", "bittrexSecret":"actualBittrexApiSecret" }

but he tells me that an invalid json format. I debug the
using var reader = new StreamReader(inputStream, Encoding.ASCII, false, 512, true);

        var stringData = reader.ReadToEnd(); <--- the stringdata conatains three ??? at first signs
        var jsonData = stringData.ToJToken();

Kraken support?

First: Great library! Awesome work!

Is anybody currently working on a Kraken version? If so, need any help?

"Can't connect to the server" when doing multiple SymbolOrderBook requests

First of all I would like to thank you for this amazing project.

I try to fetch all the orderbooks for different exchanges using SymbolOrderBook. In order to achieve that, I get all the symbols for an exchange and for each of them I do a SymbolOrderBook.StartAsync().

I keep getting a "Can't connect to the server" error message which I don't get when I try to retrieve retrieve a small number (10) of SymbolOrderBook. In the output window of VS I start getting messages for sockets closed.

image

Let me know if you need any more information or have any suggestion/solution.

Create order fails "A mandatory parameter was not sent". Full request/response attached

Describe the bug

2021/02/17 11:46:02:124 | Binance    | Debug | [3] Sending POST signed request to https://api.binance.com/sapi/v1/margin/order with request body isIsolated=True&price=55000&quantity=0.000181&recvWindow=5000&side=SELL&signature=XXX&symbol=BTCUSDT&timestamp=1613562362923&type=LIMIT
2021/02/17 11:46:02:423 | Binance    | Debug | [3] Error received: {"code":-1102,"msg":"A mandatory parameter was not sent, was empty/null, or malformed."}

Orderbook message Price duplication detected

hi there,
lately i am getting lots of messages like this:
| Warning | Price duplication detected
where this warning is fired. trying to clean the orderbook and refetch the complete orderbook if something like this is happening.

kind regards

RestClient.GetResponse private to protected

Hi,
I need to create custom POST responce instead of SendRequest with both PostParameters.InUri and PostParameters.Post parameters. I can use ConstructRequest and WriteParamBody, However, it will be nice to move RestClient.GetResponse to protected to use it after ConstructRequest
Thanks

startTime/endTime parameters not working

        parameters.AddOptionalParameter("startAt", startTime.HasValue ? JsonConvert.SerializeObject(startTime, new TimestampSecondsConverter()) : null);
        parameters.AddOptionalParameter("endAt", startTime.HasValue ? JsonConvert.SerializeObject(endTime, new TimestampSecondsConverter()) : null);

Hi, KuCoin wants Unix time in milliseconds, not seconds.

Connection lost & time-limited subscription

Hi,

I'm curious about this line:

log.Write(LogVerbosity.Debug, "Resubscribing all subscriptions failed on reconnected socket. Disconnecting and reconnecting.");

What would happen when one of those subscriptions is Binance User Data Stream? I'm asking because for that subscription you have to first obtain a listen key (string) via REST request and the listen key is valid only 60 minutes. I guess that if connection is lost at minute 61, then re-subscription must fail and it can never succeed, right? Will current implementation lead to infinite re-connecting or am I missing something?

Rate Limiters for API Keys

Hi @JKorf ,

Is is possible to add an extra rate limiter option for Api Key? It's more important than Total or EndPoint in Huobi.

Have a nice day

Kraken StartAsync() method not async

When i try to use:

var startResult = await orderBook.StartAsync();

i get an error: "CS4033 The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'. "

It seems that the KrakenSymbolOrderBook.StartAsync() method is not async.

SetApiCredential for KuCoinClient available?

With the BinanceClient there is a function like:
binanceClient.SetApiCredentials

But with the KuCoin client there is no such option available, only the 'SetDefaultOptions'.
I want to use the kucoinclient for multiple background workers each with a different API connection.
What function can I use to use a similair SetApiCredentials function for KuCoin?

MarketData issue : bid-ask discrepancy between spread and bookorder

Hello there,

I hope you are well,

I am dealing with a marketdata issue using KrakenSymbolOrderBook.
I found a significant discrepancy between the Spread.bid & ask and the OrderBook BestAsk & BestBid.
The spread is relevant with the true kraken bid-ask marketdata, unfortunatly the Orderbook is not.

Here is an example :

KrakenSocketClient KrakenSocketClient = new KrakenSocketClient();
await KrakenSocketClient.SubscribeToSpreadUpdatesAsync("BTC/EUR", data => spread = data.Data);
var orderBook = new KrakenSymbolOrderBook("BTC/EUR", 100);
orderBook.OnStatusChange += (oldStatus, newStatus) => Console.WriteLine($"Book state changed from {oldStatus} to {newStatus}");
await orderBook.StartAsync();
while (true) {
var bestBid = orderBook.BestBid;
var bestAsk = orderBook.BestAsk;
Console.WriteLine(DateTime.UtcNow + "Spread Ask=" + spread.Ask + " Bid=" + spread.Bid);
Console.WriteLine(DateTime.UtcNow + "OrderBook Ask=" + bestAsk.Price + " Bid=" + bestBid.Price);
Console.WriteLine(DateTime.UtcNow + "Diff " + (spread.Ask - bestAsk.Price) + " Bid=" + (spread.Bid-bestBid.Price));
if (bestAsk.Price < bestBid.Price) {
Console.WriteLine(DateTime.UtcNow + " ERROR orderBook Crossed Ask=" + bestAsk.Price + " Bid=" + bestBid.Price);
}
}

Console :
bookorder_bestBidAsk_synchro_issue_2020-march-23

Your help would be welcome :)

Thanks

After a pending request timeout, the next message is silently ignored

On a socket client, when a request time out, the next message is not properly processed.
To reproduce, the scenario is the following.

  1. on a SocketConnection send a request with SendAndWait. This add a PendingRequest to the pendingRequests list, and return a pending.Event.WaitOneAsync(timeout)

var pending = new PendingRequest(handler, timeout);
pendingRequests.Add(pending);
Send(obj);
return pending.Event.WaitOneAsync(timeout);

  1. the server never respond, so the pending.Event.WaitOneAsync(timeout) return, and the normal processing continue. But the PendingRequest is still in the pendingRequests list;

  2. the server send an unrelated message. This message is passed to the Check method of the PendingRequest still in the pendingRequests list. This method detects the timeout condition, and return true.
    if (DateTime.UtcNow - startTime > Timeout)
    {
    // Timed out
    Event.Set();
    return true;
    }

  3. the controlling loop in ProcessMessage break, and stop processing the message. It is lost.
    foreach (var pendingRequest in pendingRequests.ToList())
    {
    if (pendingRequest.Check(tokenData))
    {
    pendingRequests.Remove(pendingRequest);
    if (!socketClient.ContinueOnQueryResponse)
    return;
    handledResponse = true;
    break;

I will try to propose a fix for this. #72

Eric

Reconnection issue

If my internet connection goes down, after a while i can get data from client socket. But when i check logs, i see that it tries to reconnect all the time even i can get data.
Here is the log after i get connected :

2020.12.10 23:37:40.3886 : Binance - 2020.12.10 23:37:40:388 | Info | Socket 27 reconnected after 00:00:06.0993857
2020.12.10 23:37:44.8641 : Binance - 2020.12.10 23:37:44:864 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:37:45.1965 : Binance - 2020.12.10 23:37:45:196 | Info | Socket 1 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:37:45.8805 : Binance - 2020.12.10 23:37:45:880 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:37:45.9036 : Binance - 2020.12.10 23:37:45:903 | Info | Socket 7 reconnected after 00:00:06.1142623
2020.12.10 23:37:46.2538 : Binance - 2020.12.10 23:37:46:253 | Info | Socket 5 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:37:50.9244 : Binance - 2020.12.10 23:37:50:924 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:37:51.2017 : Binance - 2020.12.10 23:37:51:201 | Info | Socket 2 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:37:51.3551 : Binance - 2020.12.10 23:37:51:355 | Info | Socket 1 reconnected after 00:00:06.1586506
2020.12.10 23:37:52.4126 : Binance - 2020.12.10 23:37:52:412 | Info | Socket 5 reconnected after 00:00:06.1587551
2020.12.10 23:37:55.6912 : Binance - 2020.12.10 23:37:55:691 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:37:56.0367 : Binance - 2020.12.10 23:37:56:036 | Info | Socket 26 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:37:57.1593 : Binance - 2020.12.10 23:37:57:159 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:37:57.3122 : Binance - 2020.12.10 23:37:57:312 | Info | Socket 2 reconnected after 00:00:06.1104772
2020.12.10 23:37:57.4667 : Binance - 2020.12.10 23:37:57:466 | Info | Socket 3 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:38:00.4735 : Binance - 2020.12.10 23:38:00:473 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:38:00.7467 : Binance - 2020.12.10 23:38:00:746 | Info | Socket 6 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:38:02.2421 : Binance - 2020.12.10 23:38:02:242 | Info | Socket 26 reconnected after 00:00:06.2054164
2020.12.10 23:38:03.6086 : Binance - 2020.12.10 23:38:03:608 | Info | Socket 3 reconnected after 00:00:06.1419027
2020.12.10 23:38:06.0329 : Binance - 2020.12.10 23:38:06:032 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:38:06.4585 : Binance - 2020.12.10 23:38:06:458 | Info | Socket 7 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:38:06.8372 : Binance - 2020.12.10 23:38:06:837 | Info | Socket 6 reconnected after 00:00:06.0904978
2020.12.10 23:38:12.5472 : Binance - 2020.12.10 23:38:12:547 | Info | Socket 7 reconnected after 00:00:06.0886499
2020.12.10 23:38:12.5962 : Binance - 2020.12.10 23:38:12:596 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:38:12.9971 : Binance - 2020.12.10 23:38:12:997 | Info | Socket 5 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:38:19.1650 : Binance - 2020.12.10 23:38:19:165 | Info | Socket 5 reconnected after 00:00:06.1680516
2020.12.10 23:38:22.7089 : Binance - 2020.12.10 23:38:22:708 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:38:22.7782 : Binance - 2020.12.10 23:38:22:778 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:38:22.9988 : Binance - 2020.12.10 23:38:22:998 | Info | Socket 26 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:38:23.0680 : Binance - 2020.12.10 23:38:23:068 | Info | Socket 1 Connection lost, will try to reconnect after 00:00:05
2020.12.10 23:38:23.8011 : Binance - 2020.12.10 23:38:23:800 | Warning | No data received for 00:00:20, reconnecting socket
2020.12.10 23:38:24.1686 : Binance - 2020.12.10 23:38:24:168 | Info | Socket 3 Connection lost, will try to reconnect after 00:00:05

ApiProxy - difference btw BinanceClient and BinanceSocketClient in handling Host value

Encountered while working with Binance.Net 5.0.7 Nuget package, but the problem is within CryptoExchange.Net, thus submitting to CryptoExchange.Net issues.
Same problem with the lastest version cloned from master branch.

ApiProxy ctor requires host parameter to start with "http". From ApiProxy.cs:

if (!host.StartsWith("http"))
    throw new ArgumentException("Proxy host should start with either http:// or https://");

It works fine for BinanceClient, but BinanceSocketClient attempts to DNS resolve this host value (starting with "http") and fails since "http://x.x.x.x" is not a valid host name.

Either ApiProxy shouldn't require host to start with "http" or BinanceSocketClient should properly chop protocol prefix from specified host value.

My current workaround is to add a fake host name to hosts file which starts with "http" and is resolved to HTTP proxy's IP.

Request for Strong Name signing of DLL

Would it be possible to strong sign the release DLL as part of creating the nuget package? I am having to recompile this and sign it myself, before I can load the combined assembly into Microsoft Excel.

I also have to do this for Binance.Net, and will probably need to sign Bitfinex.Net, when I add.

ChangeMarginTypeAsync() & ChangeInitialLeverageAsync() not working

The mentioned endpoints are currently not working because the library calls them with a GET request but this are POST endpoints. Change this line:

return await SendRequest<BinanceFuturesChangeMarginTypeResult>(GetUrl(ChangeMarginTypeEndpoint, Api, SignedVersion), HttpMethod.Get, ct, parameters, true).ConfigureAwait(false);

return await SendRequest<BinanceFuturesInitialLeverageChangeResult>(GetUrl(ChangeInitialLeverageEndpoint, Api, SignedVersion), HttpMethod.Get, ct, parameters, true).ConfigureAwait(false);

to

return await SendRequest<BinanceFuturesChangeMarginTypeResult>(GetUrl(ChangeMarginTypeEndpoint, Api, SignedVersion), HttpMethod.Post, ct, parameters, true).ConfigureAwait(false);

return await SendRequest<BinanceFuturesInitialLeverageChangeResult>(GetUrl(ChangeInitialLeverageEndpoint, Api, SignedVersion), HttpMethod.Post, ct, parameters, true).ConfigureAwait(false);

and it works!

Attention JKorf: Please can this project enforce semantic versioning?

Hi there!

I am an avid consumer of both CryptoExchange.NET and the derivative projects. I first would like to say that I enjoy using them and appreciate the work very much.

My app depends on several of them. I understand that you maintain most implementations, but some, such as OKEx.NET depend on CryptoExchange.Net.

As you are no doubt aware, there were breaking changes from NuGet package version 3.0.5 to version 3.0.14. Might I suggest that API-breaking changes result in an increment of the major number in the NuGet package?

Also, while we are on the topic of versioning, .NET ambiguously allows NuGet package versions to differ from assembly versions. Please can you also enforce semantic versioning of the assembly version? It does not appear to be set by default, and is 1.0.0.0 across multiple, incompatible versions.

ClientOptions BaseAddress Ending Slash Problem

I am developing a SDK for bitmax.io. I have a problem with websocket client. Because bitmax.io ws feed url doesnt end with a slash and It give 404 error if I put slash. But on ClientOptions (CryptoExchange.Net.Objects.ClientOptions) there is a rule for ending with slash.

Is there a way to remove ending slash in BaseAddress?

Working Url: wss://bitmax.io/1/api/pro/v1/stream
Not Working Url: wss://bitmax.io/1/api/pro/v1/stream/

Bybit

Hi, anyone is planning to bring Bybit on board?

KrakenOrderbookOptions error messages

Code (this is basicly from the examples):
KrakenSymbolOrderBook orderBook = new KrakenSymbolOrderBook("XXBTZEUR", 1, new KrakenOrderBookOptions(20));

Gives an error message:
CS1503 Argument 1: cannot convert from 'int' to 'Kraken.Net.Interfaces.IKrakenSocketClient'

When i change it like this:

var client = new KrakenSocketClient(options);
KrakenSymbolOrderBook orderBook = new KrakenSymbolOrderBook("XXBTZEUR", 1, new KrakenOrderBookOptions(client));

The error is gone But now when connecting using the following:

 var startResult = await orderBook.StartAsync();

            if (!startResult.Success)
            {
                Console.WriteLine("Error starting order book synchronization: " + startResult.Error);
               return;
            }

It stops, because startResult.Error is:
{3: Server error: Subscription depth not supported}

Which makes sense because a client is not a depth :)
Is this an issue, or a user error ?

No help unless documentation provided

This is exactly the type of thing I'm looking for, spent all day trying to get an API working.

You must of spent hours writing this code, and I would LOVE to donate, but it seems you don't want anyone to use your code unless they are professional programmers.

I as a trader would of donated, but you havent even spent an hour putting up a video on how to get started or anything.

Add a NotHandledMessage method to allow a more informative processing of unhandled message

Hi,
In SocketConnection, when a message is not handled, it produce an entry in the log: https://github.com/JKorf/CryptoExchange.Net/blob/master/CryptoExchange.Net/Sockets/SocketConnection.cs#L163
if (!HandleData(tokenData) && !handledResponse)
{
log.Write(LogVerbosity.Debug, "Message not handled: " + tokenData);
}

I would like to have a more elaborate handling. Typically log as an error, not debug, and expand the message, as message in my case are json wrapper around base64 encoded binary format.
Is is possible to have either an event or a protected method in SocketClient for this?

Can you imagine a better way to achieve this result?

Thanks.
Eric

problem with requests

Hi.

How is it that I create a request earlier but send it later? because of this, there is a problem with nonce

2019.10.14 01:07:04:236 | Debug | Creating request for https://btc-trade.com.ua/api/remove/order/88213808
2019.10.14 01:07:04:268 | Debug | Creating request for https://btc-trade.com.ua/api/sell/btc_uah
2019.10.14 01:07:04:314 | Debug | Sending POST signed request to https://btc-trade.com.ua/api/sell/btc_uah with request body count=0.002467&nonce=637066120242682189&out_order_id=330&price=202655.22965311
2019.10.14 01:07:04:580 | Debug | Sending POST signed request to https://btc-trade.com.ua/api/remove/order/88213808 with request body nonce=637066120242362125&out_order_id=612

nonce I only use once

private static long nonce => DateTime.Now.Ticks;

public override Dictionary<string, object> AddAuthenticationToParameters(string uri, string method, Dictionary<string, object> parameters, bool signed)
{
   if (!signed)
         return parameters;

    lock (locker)
    {
          parameters.Add("out_order_id", new Random().Next(1000));
          parameters.Add("nonce", nonce);
     }

     return parameters = parameters.OrderBy(p => p.Key).ToDictionary(p => p.Key, p => p.Value);
}

Local object doesn't have property...

Using the Binance.NET 5.1.14 with CryptoExchange.Net 3.0.14 I get messages such as:

[8] Local object doesn't have property `permissions` expected in type `BinanceAccountInfo`
[8] Local object has property `` but was not found in received object of type `BinanceAccountInfo`

Not exactly sure what is causing them though.

Questions and suggestions

Hey. There are some questions.

  1. client.AddRateLimiter() a limit on the number of requests? for example, for Binance I need to declare it as a client.AddRateLimiter(new RateLimiterTotal (20, TimeSpan.FromSeconds (1))) ?
    And if that's all right, can you add an event to the number of requests executed per second?

  2. you can add to client.Ping() ping time. For example client.Ping(out int ping)

  3. I'm trying to update CryptoExchange.Net to v0.0.36 but I can't. Because dependencies cannot be resolved. "CryptoExchange.Net 0.0.36" not compatible with Binance.Net 3.1.15 limitation: CryptoExchange.Net (=0.0.31). Is it supposed to?

Can not connect with credentials: Kraken SetDefaultOptions not available

Following your example at CryptoExchange.Net the following code does not work:

using Kraken.Net;
using CryptoExchange.Net;
using CryptoExchange.Net.Authentication;

KrakenClient.SetDefaultOptions(new KrakenClientOptions
	{
		ApiCredentials = new ApiCredentials("apiKey", "apiSecret")
	});

SetDefaultOptions is not available or missing.

Thanks for this nice API wrapper, love your work thus far.

api_key_default

Managing local order book using SubscribeToDepthUpdatesAsync

Hi,
Im trying to maintain a synchronized orderbook using the SocketClient provided in your API wrapper however there is no Nonce information in KrakenStreamOrderBook or KrakenOrderBook and no clear indication on how this might work without one. I cannot find any documentation on the Kraken API FAQs etc that help. Have you got this working and if so could you please provide a little information on the flow or point me at existing documentation that might help.

Good work with the .Net wrappers I am already using your Binance and Bittrex offerings. Once my application is up and running I will make a donation.

Many thanks

Ben

Issues with GetOpenPositionsAsync()

Hi,

I encountered an deserialization error while executing GetOpenPositionsAsync().

The issue is the field "maxNotionalValue" from the "positionRisk" endpoint.
For some reasons binance could return a string value here with the value "inf" (perhaps if the value is infinity).

Here is the json payload where one of the positions contains this value. The other positions have an integer value:

"[{\"symbol\":\"BTCUSDT\",\"positionAmt\":\"0.000\",\"entryPrice\":\"0.00000\",\"markPrice\":\"6129.77693896\",\"unRealizedProfit\":\"0.00000000\",\"liquidationPrice\":\"0\",\"leverage\":\"10\",\"maxNotionalValue\":\"20000000\",\"marginType\":\"isolated\",\"isolatedMargin\":\"0.00000000\",\"isAutoAddMargin\":\"false\",\"positionSide\":\"BOTH\"},{\"symbol\":\"XRPUSDT\",\"positionAmt\":\"0.0\",\"entryPrice\":\"0.00000\",\"markPrice\":\"0.17314956\",\"unRealizedProfit\":\"0.00000000\",\"liquidationPrice\":\"0\",\"leverage\":\"20\",\"maxNotionalValue\":\"250000\",\"marginType\":\"cross\",\"isolatedMargin\":\"0.00000000\",\"isAutoAddMargin\":\"false\",\"positionSide\":\"BOTH\"},{\"symbol\":\"EOSUSDT\",\"positionAmt\":\"0.0\",\"entryPrice\":\"0.0000\",\"markPrice\":\"2.17963976\",\"unRealizedProfit\":\"0.00000000\",\"liquidationPrice\":\"0\",\"leverage\":\"10\",\"maxNotionalValue\":\"1000000\",\"marginType\":\"isolated\",\"isolatedMargin\":\"0.00000000\",\"isAutoAddMargin\":\"false\",\"positionSide\":\"BOTH\"},{\"sy mbol\":\"LTCUSDT\",\"positionAmt\":\"0.000\",\"entryPrice\":\"0.00000\",\"markPrice\":\"38.36273888\",\"unRealizedProfit\":\"0.00000000\",\"liquidationPrice\":\"0\",\"leverage\":\"2\",\"maxNotionalValue\":\"inf\",\"marginType\":\"isolated\",\"isolatedMargin\":\"0.00000000\",\"isAutoAddMargin\":\"false\",\"positionSide\":\"BOTH\"},{\"symbol\":\"TRXUSDT\",\"positionAmt\":\"50\",\"entryPrice\":\"0.01111\",\"markPrice\":\"0.01111154\",\"unRealizedProfit\":\"0.00007700\",\"liquidationPrice\":\"0.01007\",\"leverage\":\"10\",\"maxNotionalValue\":\"1000000\",\"marginType\":\"isolated\",\"isolatedMargin\":\"0.05540480\",\"isAutoAddMargin\":\"false\",\"positionSide\":\"BOTH\"},{\"symbol\":\"ADAUSDT\",\"positionAmt\":\"0\",\"entryPrice\":\"0.00000\",\"markPrice\":\"0.02927060\",\"unRealizedProfit\":\"0.00000000\",\"liquidationPrice\":\"0\",\"leverage\":\"10\",\"maxNotionalValue\":\"1000000\",\"marginType\":\"isolated\",\"isolatedMargin\":\"0.00000000\",\"isAutoAddMargin\":\"false\",\"positionSide\":\"BOTH\"},{\"symbol\": \"BATUSDT\",\"positionAmt\":\"0.0\",\"entryPrice\":\"0.00000\",\"markPrice\":\"0.13558396\",\"unRealizedProfit\":\"0.00000000\",\"liquidationPrice\":\"0\",\"leverage\":\"10\",\"maxNotionalValue\":\"100000\",\"marginType\":\"isolated\",\"isolatedMargin\":\"0.00000000\",\"isAutoAddMargin\":\"false\",\"positionSide\":\"BOTH\"}]"

I fixed the issue in my version by changing the property "MaxNotionalValue" from decimal to string

EDIT:

This issue occurs in the method "ChangeMarginTypeAsync()" too, because the result type contains the "MaxNotionalValue" as well. A change to string fix that.

NullReferenceException when disposing

System.AggregateException: One or more errors occurred. ---> System.NullReferenceException: Object reference not set to an instance of an object.
at CryptoExchange.Net.Sockets.BaseSocket.b__72_0()
at System.Threading.Tasks.Task.Execute()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
at CryptoExchange.Net.Sockets.BaseSocket.d__72.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
at CryptoExchange.Net.Sockets.SocketConnection.d__57.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
at CryptoExchange.Net.SocketClient.<b__59_1>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwaiter.GetResult()
at CryptoExchange.Net.SocketClient.d__59.MoveNext()
--- End of inner exception stack trace ---
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
at System.Threading.Tasks.Task.Wait()
at CryptoExchange.Net.SocketClient.Dispose()

Logs on file

Hey.

How can I write logs (log.Write(LogVerbosity.Debug, message);) to a file?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.