From 5fd22409a42cfac659825213e9836483004537e9 Mon Sep 17 00:00:00 2001 From: vslee Date: Fri, 8 Nov 2019 16:03:26 -0800 Subject: [PATCH 1/2] BL3P: added Trade stream (websocket) - simplified BL3P namespace - account for null or empty marketSymbols param in OrderBook and Trades WS - fixed capitalization in BL3PResponsePayloadError.cs --- .../API/Exchanges/BL3P/BL3PException.cs | 3 +- .../BL3P/Converters/BL3PResponseConverter.cs | 3 +- .../Exchanges/BL3P/Enums/BL3PCurrencyFee.cs | 2 +- .../Exchanges/BL3P/Enums/BL3POrderStatus.cs | 2 +- .../API/Exchanges/BL3P/Enums/BL3POrderType.cs | 2 +- .../Exchanges/BL3P/Enums/BL3PResponseType.cs | 2 +- .../API/Exchanges/BL3P/ExchangeBL3PAPI.cs | 40 ++++++++++++++----- .../BL3P/Extensions/BL3PExtensions.cs | 5 +-- .../API/Exchanges/BL3P/Models/BL3PAmount.cs | 2 +- .../Exchanges/BL3P/Models/BL3POrderBook.cs | 2 +- .../Exchanges/BL3P/Models/BL3POrderRequest.cs | 2 +- .../API/Exchanges/BL3P/Models/BL3PResponse.cs | 3 +- .../BL3P/Models/BL3PResponsePayload.cs | 2 +- ...adError.cs => BL3PResponsePayloadError.cs} | 2 +- .../Models/Orders/Add/BL3POrderAddResponse.cs | 3 +- .../Models/Orders/Add/BL3POrderAddSuccess.cs | 2 +- .../Orders/Result/BL3POrderResultResponse.cs | 3 +- .../Orders/Result/BL3POrderResultSuccess.cs | 3 +- .../Exchanges/_Base/ExchangeAPIExtensions.cs | 4 +- 19 files changed, 49 insertions(+), 38 deletions(-) rename ExchangeSharp/API/Exchanges/BL3P/Models/{Bl3PResponsePayloadError.cs => BL3PResponsePayloadError.cs} (85%) diff --git a/ExchangeSharp/API/Exchanges/BL3P/BL3PException.cs b/ExchangeSharp/API/Exchanges/BL3P/BL3PException.cs index c9d42809..95277524 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/BL3PException.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/BL3PException.cs @@ -1,8 +1,7 @@ using System; using System.Runtime.Serialization; -using ExchangeSharp.API.Exchanges.BL3P.Models; -namespace ExchangeSharp.API.Exchanges.BL3P +namespace ExchangeSharp.BL3P { [Serializable] internal class BL3PException : Exception diff --git a/ExchangeSharp/API/Exchanges/BL3P/Converters/BL3PResponseConverter.cs b/ExchangeSharp/API/Exchanges/BL3P/Converters/BL3PResponseConverter.cs index f6cbb206..147177e9 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Converters/BL3PResponseConverter.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Converters/BL3PResponseConverter.cs @@ -1,8 +1,7 @@ -using ExchangeSharp.API.Exchanges.BL3P.Models; using ExchangeSharp.Dependencies.Converters; using Newtonsoft.Json; -namespace ExchangeSharp.API.Exchanges.BL3P.Converters +namespace ExchangeSharp.BL3P { internal class BL3PResponseConverter : JsonComplexObjectConverter where TSuccess : BL3PResponsePayload, new() diff --git a/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3PCurrencyFee.cs b/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3PCurrencyFee.cs index 78965fb3..f833a38d 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3PCurrencyFee.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3PCurrencyFee.cs @@ -1,4 +1,4 @@ -namespace ExchangeSharp.API.Exchanges.BL3P.Enums +namespace ExchangeSharp.BL3P { public enum BL3PCurrencyFee : byte { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3POrderStatus.cs b/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3POrderStatus.cs index ff92e3e0..ee53f9f6 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3POrderStatus.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3POrderStatus.cs @@ -1,4 +1,4 @@ -namespace ExchangeSharp.API.Exchanges.BL3P.Enums +namespace ExchangeSharp.BL3P { internal enum BL3POrderStatus { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3POrderType.cs b/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3POrderType.cs index 8bd8a8fb..305ca89b 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3POrderType.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3POrderType.cs @@ -1,4 +1,4 @@ -namespace ExchangeSharp.API.Exchanges.BL3P.Enums +namespace ExchangeSharp.BL3P { internal enum BL3POrderType { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3PResponseType.cs b/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3PResponseType.cs index bc07f438..9a8085ca 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3PResponseType.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Enums/BL3PResponseType.cs @@ -1,4 +1,4 @@ -namespace ExchangeSharp.API.Exchanges.BL3P.Enums +namespace ExchangeSharp.BL3P { internal enum BL3PResponseType { diff --git a/ExchangeSharp/API/Exchanges/BL3P/ExchangeBL3PAPI.cs b/ExchangeSharp/API/Exchanges/BL3P/ExchangeBL3PAPI.cs index 046ca5c2..26802ffc 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/ExchangeBL3PAPI.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/ExchangeBL3PAPI.cs @@ -5,12 +5,7 @@ using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; -using ExchangeSharp.API.Exchanges.BL3P; -using ExchangeSharp.API.Exchanges.BL3P.Enums; -using ExchangeSharp.API.Exchanges.BL3P.Extensions; -using ExchangeSharp.API.Exchanges.BL3P.Models; -using ExchangeSharp.API.Exchanges.BL3P.Models.Orders.Add; -using ExchangeSharp.API.Exchanges.BL3P.Models.Orders.Result; +using ExchangeSharp.BL3P; using ExchangeSharp.Utility; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -127,10 +122,10 @@ protected override async Task OnGetDeltaOrderBookWebSocketAsync( params string[] marketSymbols ) { - if (marketSymbols == null) - throw new ArgumentNullException(nameof(marketSymbols)); - if (marketSymbols.Length == 0) - throw new ArgumentException("Value cannot be an empty collection.", nameof(marketSymbols)); + if (marketSymbols == null || marketSymbols.Length == 0) + { + marketSymbols = (await GetMarketSymbolsAsync()).ToArray(); + } Task MessageCallback(IWebSocket _, byte[] msg) { @@ -170,6 +165,31 @@ await Task.WhenAll( ); } + protected override async Task OnGetTradesWebSocketAsync(Func, Task> callback, params string[] marketSymbols) + { + if (marketSymbols == null || marketSymbols.Length == 0) + { + marketSymbols = (await GetMarketSymbolsAsync()).ToArray(); + } + Task MessageCallback(IWebSocket _, byte[] msg) + { // {{ "date": 1573255932, "marketplace": "BTCEUR", "price_int": 802466000, "type": "buy", "amount_int": 6193344 } } + JToken token = JToken.Parse(msg.ToStringFromUTF8()); + var symbol = token["marketplace"].ToStringInvariant(); + ExchangeTrade trade = token.ParseTrade(amountKey: "amount_int", priceKey: "price_int", typeKey: "type", timestampKey: "date", + timestampType: TimestampType.UnixSeconds, + idKey: null, // + TODO: add Id Key when BL3P starts providing this info + typeKeyIsBuyValue: "buy"); + callback(new KeyValuePair(symbol, trade)); + return Task.CompletedTask; + } + + return new MultiWebsocketWrapper( + await Task.WhenAll( + marketSymbols.Select(ms => ConnectWebSocketAsync($"{ms}/trades", MessageCallback)) + ).ConfigureAwait(false) + ); + } + protected override bool CanMakeAuthenticatedRequest(IReadOnlyDictionary payload) { return !(PublicApiKey is null) && !(PrivateApiKey is null); diff --git a/ExchangeSharp/API/Exchanges/BL3P/Extensions/BL3PExtensions.cs b/ExchangeSharp/API/Exchanges/BL3P/Extensions/BL3PExtensions.cs index 37a11680..0cb7aac8 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Extensions/BL3PExtensions.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Extensions/BL3PExtensions.cs @@ -1,7 +1,4 @@ -using ExchangeSharp.API.Exchanges.BL3P.Enums; -using ExchangeSharp.API.Exchanges.BL3P.Models; - -namespace ExchangeSharp.API.Exchanges.BL3P.Extensions +namespace ExchangeSharp.BL3P { internal static class BL3PExtensions { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PAmount.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PAmount.cs index 3bc19ffb..5c9b3975 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PAmount.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PAmount.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace ExchangeSharp.API.Exchanges.BL3P.Models +namespace ExchangeSharp.BL3P { internal class BL3PAmount { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3POrderBook.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3POrderBook.cs index db80817c..4e64bb43 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3POrderBook.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3POrderBook.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace ExchangeSharp.API.Exchanges.BL3P.Models +namespace ExchangeSharp.BL3P { // ReSharper disable once InconsistentNaming internal class BL3POrderBook diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3POrderRequest.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3POrderRequest.cs index 3bad1e7a..b01fb607 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3POrderRequest.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3POrderRequest.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace ExchangeSharp.API.Exchanges.BL3P.Models +namespace ExchangeSharp.BL3P { // ReSharper disable once InconsistentNaming internal class BL3POrderRequest diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponse.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponse.cs index ae913c1f..d32b22b7 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponse.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponse.cs @@ -1,7 +1,6 @@ -using ExchangeSharp.API.Exchanges.BL3P.Enums; using Newtonsoft.Json; -namespace ExchangeSharp.API.Exchanges.BL3P.Models +namespace ExchangeSharp.BL3P { internal class BL3PEmptyResponse : BL3PResponse diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponsePayload.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponsePayload.cs index 7c0c11d8..41c9babd 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponsePayload.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponsePayload.cs @@ -1,4 +1,4 @@ -namespace ExchangeSharp.API.Exchanges.BL3P.Models +namespace ExchangeSharp.BL3P { internal class BL3PResponsePayload { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/Bl3PResponsePayloadError.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponsePayloadError.cs similarity index 85% rename from ExchangeSharp/API/Exchanges/BL3P/Models/Bl3PResponsePayloadError.cs rename to ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponsePayloadError.cs index 3479dbbe..e3351bda 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/Bl3PResponsePayloadError.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/BL3PResponsePayloadError.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace ExchangeSharp.API.Exchanges.BL3P.Models +namespace ExchangeSharp.BL3P { internal class BL3PResponsePayloadError : BL3PResponsePayload { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Add/BL3POrderAddResponse.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Add/BL3POrderAddResponse.cs index 135b9284..b3841f79 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Add/BL3POrderAddResponse.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Add/BL3POrderAddResponse.cs @@ -1,7 +1,6 @@ -using ExchangeSharp.API.Exchanges.BL3P.Converters; using Newtonsoft.Json; -namespace ExchangeSharp.API.Exchanges.BL3P.Models.Orders.Add +namespace ExchangeSharp.BL3P { internal class BL3POrderAddResponse : BL3PResponse { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Add/BL3POrderAddSuccess.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Add/BL3POrderAddSuccess.cs index b8ff2be4..62bebf3c 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Add/BL3POrderAddSuccess.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Add/BL3POrderAddSuccess.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace ExchangeSharp.API.Exchanges.BL3P.Models.Orders.Add +namespace ExchangeSharp.BL3P { internal class BL3POrderAddSuccess : BL3PResponsePayload { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Result/BL3POrderResultResponse.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Result/BL3POrderResultResponse.cs index c116ece3..621317ad 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Result/BL3POrderResultResponse.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Result/BL3POrderResultResponse.cs @@ -1,7 +1,6 @@ -using ExchangeSharp.API.Exchanges.BL3P.Converters; using Newtonsoft.Json; -namespace ExchangeSharp.API.Exchanges.BL3P.Models.Orders.Result +namespace ExchangeSharp.BL3P { internal class BL3POrderResultResponse : BL3PResponse { diff --git a/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Result/BL3POrderResultSuccess.cs b/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Result/BL3POrderResultSuccess.cs index 36eebaa6..4bfcb326 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Result/BL3POrderResultSuccess.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/Models/Orders/Result/BL3POrderResultSuccess.cs @@ -1,9 +1,8 @@ using System; -using ExchangeSharp.API.Exchanges.BL3P.Enums; using Newtonsoft.Json; using Newtonsoft.Json.Converters; -namespace ExchangeSharp.API.Exchanges.BL3P.Models.Orders.Result +namespace ExchangeSharp.BL3P { internal class BL3POrderResultSuccess : BL3PResponsePayload { diff --git a/ExchangeSharp/API/Exchanges/_Base/ExchangeAPIExtensions.cs b/ExchangeSharp/API/Exchanges/_Base/ExchangeAPIExtensions.cs index 16641632..f9e96c62 100644 --- a/ExchangeSharp/API/Exchanges/_Base/ExchangeAPIExtensions.cs +++ b/ExchangeSharp/API/Exchanges/_Base/ExchangeAPIExtensions.cs @@ -532,7 +532,7 @@ internal static async Task ParseTickerAsync(this ExchangeAPI api /// Type key buy value /// Trade internal static ExchangeTrade ParseTrade(this JToken token, object amountKey, object priceKey, object typeKey, - object timestampKey, TimestampType timestampType, object idKey, string typeKeyIsBuyValue = "buy") + object timestampKey, TimestampType timestampType, object? idKey, string typeKeyIsBuyValue = "buy") { return ParseTradeComponents(token, amountKey, priceKey, typeKey, timestampKey, timestampType, idKey, typeKeyIsBuyValue); @@ -610,7 +610,7 @@ internal static ExchangeTrade ParseTradeNDAX(this JToken token, object amountKey } internal static T ParseTradeComponents(this JToken token, object amountKey, object priceKey, object typeKey, - object timestampKey, TimestampType timestampType, object idKey, string typeKeyIsBuyValue = "buy") + object timestampKey, TimestampType timestampType, object? idKey, string typeKeyIsBuyValue = "buy") where T : ExchangeTrade, new() { var isBuy = token[typeKey].ToStringInvariant().EqualsWithOption(typeKeyIsBuyValue); From 6d182f2c267ff26f910c32c7b9bba197912dce61 Mon Sep 17 00:00:00 2001 From: vslee Date: Fri, 8 Nov 2019 16:06:31 -0800 Subject: [PATCH 2/2] one more namespace --- ExchangeSharp/API/Exchanges/BL3P/MultiWebsocketWrapper.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ExchangeSharp/API/Exchanges/BL3P/MultiWebsocketWrapper.cs b/ExchangeSharp/API/Exchanges/BL3P/MultiWebsocketWrapper.cs index 717116f8..24e393eb 100644 --- a/ExchangeSharp/API/Exchanges/BL3P/MultiWebsocketWrapper.cs +++ b/ExchangeSharp/API/Exchanges/BL3P/MultiWebsocketWrapper.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Threading.Tasks; -namespace ExchangeSharp.API.Exchanges.BL3P +namespace ExchangeSharp.BL3P { internal sealed class MultiWebsocketWrapper : IWebSocket {