diff --git a/src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs b/src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs index 9ebef848..736fd26d 100644 --- a/src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs +++ b/src/ExchangeSharp/API/Exchanges/BinanceGroup/BinanceGroupCommon.cs @@ -1135,6 +1135,36 @@ protected override async Task OnUserDataWebSocketAsync(Action OnGetCandlesWebSocketAsync(Func callbackAsync, int periodSeconds, params string[] marketSymbols) + { + //Candlesticks are received each 2s. Miniticker method is faster (1s), but you can't aggregate by period. + //https://github.com/binance/binance-spot-api-docs/blob/master/web-socket-streams.md#klinecandlestick-streams + + if (marketSymbols == null || marketSymbols.Length == 0) + throw new ArgumentNullException(nameof(marketSymbols)); + + //only one symbol per connection + var symbol = marketSymbols[0].ToStringLowerInvariant(); + + var period = PeriodSecondsToString(periodSeconds); + + return await ConnectPublicWebSocketAsync($"/stream?streams={symbol}@kline_{period}", async (_socket, msg) => + { + JToken token = JToken.Parse(msg.ToStringFromUTF8()); + + if (token != null && token["data"] != null && token["data"]["k"] != null) + { + var candle = this.ParseCandle(token["data"]["k"], symbol, periodSeconds, "o", "h", "l", "c", "t", + TimestampType.UnixMilliseconds, "v", "q"); + + if (candle != null) + { + callbackAsync(candle); + } + } + }); + } + public async Task GetListenKeyAsync() { JToken response = await MakeJsonRequestAsync("/userDataStream", BaseUrlApi, null, "POST");