From f4c9a9f15010c19327cecddf80a34ba8f9211400 Mon Sep 17 00:00:00 2001 From: Shayne van Asperen Date: Mon, 27 Jan 2025 21:29:39 +0000 Subject: [PATCH 1/2] Fix deserialization for PrivateTrade --- .../Responses/TradesPrivate/PrivateTrade.cs | 191 +++++++++--------- .../TradesPrivate/PrivateTradeConverter.cs | 61 +++--- 2 files changed, 130 insertions(+), 122 deletions(-) diff --git a/src/Bitfinex.Client.Websocket/Responses/TradesPrivate/PrivateTrade.cs b/src/Bitfinex.Client.Websocket/Responses/TradesPrivate/PrivateTrade.cs index 55d0151..50c97f9 100644 --- a/src/Bitfinex.Client.Websocket/Responses/TradesPrivate/PrivateTrade.cs +++ b/src/Bitfinex.Client.Websocket/Responses/TradesPrivate/PrivateTrade.cs @@ -1,5 +1,6 @@ using System; using System.Reactive.Subjects; +using Bitfinex.Client.Websocket.Json; using Bitfinex.Client.Websocket.Responses.Configurations; using Bitfinex.Client.Websocket.Responses.Orders; using Bitfinex.Client.Websocket.Responses.Trades; @@ -9,95 +10,101 @@ namespace Bitfinex.Client.Websocket.Responses.TradesPrivate { - /// - /// The order that causes the trade determines if it is a buy or a sell. - /// - [JsonConverter(typeof(PrivateTradeConverter))] - public class PrivateTrade : ResponseBase - { - /// - /// Trade id - /// - public long Id { get; set; } - - /// - /// Symbol (tBTCUSD, etc) - /// - public string Symbol { get; set; } - - /// - /// Execution timestamp - /// - public DateTime MtsCreate { get; set; } - - /// - /// Order id - /// - public long OrderId { get; set; } - - /// - /// How much was bought (positive) or sold (negative). - /// - public double ExecAmount { get; set; } - - /// - /// Price at which the trade was executed - /// - public double ExecPrice { get; set; } - - /// - /// Origin order type - /// - public OrderType OrderType { get; set; } - - /// - /// Origin order target price - /// - public double OrderPrice { get; set; } - - /// - /// True if maker order (post-only) - /// - public bool IsMaker { get; set; } - - /// - /// Taken fee - /// - public double? Fee { get; set; } - - /// - /// Taken fee currency - /// - public string FeeCurrency { get; set; } - - /// - /// Type of the trade - /// - [JsonIgnore] - public TradeType Type { get; set; } - - /// - /// Target pair - /// - [JsonIgnore] - public string Pair => BitfinexSymbolUtils.ExtractPair(Symbol); - - - internal static void Handle(JToken token, ConfigurationState config, Subject subject, TradeType type) - { - var data = token[2]; - if (data?.Type != JTokenType.Array) - { - return; - } - - var trade = data.ToObject(); - if (trade != null) - { - trade.Type = type; - SetGlobalData(trade, config, token, 2, true); - subject.OnNext(trade); - } - } - } -} + /// + /// The order that causes the trade determines if it is a buy or a sell. + /// + [JsonConverter(typeof(PrivateTradeConverter))] + public class PrivateTrade : ResponseBase + { + /// + /// Trade id + /// + public long Id { get; set; } + + /// + /// Client Order ID + /// + public long? Cid { get; set; } + + /// + /// Symbol (tBTCUSD, etc) + /// + public string Symbol { get; set; } + + /// + /// Execution timestamp + /// + [JsonConverter(typeof(UnixDateTimeConverter))] + public DateTime MtsCreate { get; set; } + + /// + /// Order id + /// + public long OrderId { get; set; } + + /// + /// How much was bought (positive) or sold (negative). + /// + public double ExecAmount { get; set; } + + /// + /// Price at which the trade was executed + /// + public double ExecPrice { get; set; } + + /// + /// Origin order type + /// + public OrderType OrderType { get; set; } + + /// + /// Origin order target price + /// + public double OrderPrice { get; set; } + + /// + /// True if maker order (post-only) + /// + public bool IsMaker { get; set; } + + /// + /// Taken fee + /// + public double? Fee { get; set; } + + /// + /// Taken fee currency + /// + public string FeeCurrency { get; set; } + + /// + /// Type of the trade + /// + [JsonIgnore] + public TradeType Type { get; set; } + + /// + /// Target pair + /// + [JsonIgnore] + public string Pair => BitfinexSymbolUtils.ExtractPair(Symbol); + + + internal static void Handle(JToken token, ConfigurationState config, Subject subject, TradeType type) + { + var data = token[2]; + if (data?.Type != JTokenType.Array) + { + return; + } + + var trade = data.ToObject(); + if (trade != null) + { + trade.Type = type; + SetGlobalData(trade, config, token, 2, true); + subject.OnNext(trade); + } + } + } +} \ No newline at end of file diff --git a/src/Bitfinex.Client.Websocket/Responses/TradesPrivate/PrivateTradeConverter.cs b/src/Bitfinex.Client.Websocket/Responses/TradesPrivate/PrivateTradeConverter.cs index 90253f2..faf5fd3 100644 --- a/src/Bitfinex.Client.Websocket/Responses/TradesPrivate/PrivateTradeConverter.cs +++ b/src/Bitfinex.Client.Websocket/Responses/TradesPrivate/PrivateTradeConverter.cs @@ -7,42 +7,43 @@ namespace Bitfinex.Client.Websocket.Responses.TradesPrivate { internal class PrivateTradeConverter : JsonConverter +{ + public override bool CanConvert(Type objectType) { - public override bool CanConvert(Type objectType) - { - return objectType == typeof(PrivateTrade); - } + return objectType == typeof(PrivateTrade); + } - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, - JsonSerializer serializer) - { - var array = JArray.Load(reader); - return JArrayToTradingTicker(array); - } + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, + JsonSerializer serializer) + { + var array = JArray.Load(reader); + return JArrayToTradingTicker(array); + } - public override bool CanWrite => false; + public override bool CanWrite => false; - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) - { - throw new NotImplementedException(); - } + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } private PrivateTrade JArrayToTradingTicker(JArray array) + { + return new PrivateTrade { - return new PrivateTrade - { - Id = (long)array[0], - Symbol = (string)array[1], - MtsCreate = BitfinexTime.ConvertToTime((long)array[2]), - OrderId = (long)array[3], - ExecAmount = (double)array[4], - ExecPrice = (double)array[5], - OrderType = OrderConverter.ParseType((string)array[6]), - OrderPrice = (double)array[7], - IsMaker = (int)array[8] > 0, - Fee = (double?)array[9], - FeeCurrency = (string)array[10] - }; - } + Id = (long)array[0], + Symbol = (string)array[1], + MtsCreate = BitfinexTime.ConvertToTime((long)array[2]), + OrderId = (long)array[3], + ExecAmount = (double)array[4], + ExecPrice = (double)array[5], + OrderType = OrderConverter.ParseType((string)array[6]), + OrderPrice = (double)array[7], + IsMaker = (int)array[8] > 0, + Fee = (double?)array[9], + FeeCurrency = (string)array[10], + Cid = (long?)array[11] + }; + } } } From 9d294359d7b903aab68e98c1278a87851d20bd34 Mon Sep 17 00:00:00 2001 From: Shayne van Asperen Date: Tue, 28 Jan 2025 01:24:03 +0000 Subject: [PATCH 2/2] Change type of injected logger to plain ILogger --- .../Client/BitfinexWebsocketClient.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Bitfinex.Client.Websocket/Client/BitfinexWebsocketClient.cs b/src/Bitfinex.Client.Websocket/Client/BitfinexWebsocketClient.cs index 4422e45..5943391 100644 --- a/src/Bitfinex.Client.Websocket/Client/BitfinexWebsocketClient.cs +++ b/src/Bitfinex.Client.Websocket/Client/BitfinexWebsocketClient.cs @@ -21,7 +21,7 @@ namespace Bitfinex.Client.Websocket.Client /// public class BitfinexWebsocketClient : IDisposable { - private readonly ILogger _logger; + private readonly ILogger _logger; private readonly IBitfinexCommunicator _communicator; private readonly IDisposable _messageReceivedSubscription; private readonly IDisposable _configurationSubscription; @@ -32,7 +32,7 @@ public class BitfinexWebsocketClient : IDisposable private readonly BitfinexPublicHandler _publicHandler; /// - public BitfinexWebsocketClient(IBitfinexCommunicator communicator, ILogger? logger = null) + public BitfinexWebsocketClient(IBitfinexCommunicator communicator, ILogger? logger = null) { BfxValidations.ValidateInput(communicator, nameof(communicator)); @@ -58,7 +58,7 @@ public BitfinexWebsocketClient(IBitfinexCommunicator communicator, ILogger /// Expose logger for this client /// - public ILogger Logger => _logger; + public ILogger Logger => _logger; /// /// Cleanup everything